exponenta event banner

Совместное использование ресурсов множителей для уменьшения площади

В этом примере показано, как использовать оптимизацию совместного использования ресурсов в Coder™ HDL. Эта оптимизация определяет функционально эквивалентные операции множителя в коде MATLAB ® и совместно использует их для оптимизации области проектирования. Вы можете управлять количеством множителей, которые будут использоваться совместно в проекте.

Введение

Совместное использование ресурсов - это общепроектная оптимизация, поддерживаемая Coder™ HDL для внедрения оборудования, эффективного по площади.

Эта оптимизация позволяет пользователям совместно использовать аппаратные ресурсы путем сопоставления «N» функционально эквивалентных операторов MATLAB, в данном случае множителей, с одним оператором.

Пользователь указывает «N» с помощью параметра «Коэффициент совместного использования ресурсов» на панели оптимизации.

Рассмотрим следующий пример модели симметричного КИХ-фильтра. Он содержит 4 блока продукта, которые являются функционально эквивалентными и которые сопоставляются с 4 умножителями в аппаратном обеспечении. Отчет об использовании ресурсов показывает количество множителей, выведенных из конструкции.

В этом примере выполняется преобразование с фиксированной точкой в конструкции MATLAB «mlhdlc _ sharing» с последующим кодером HDL. Этот шаг предварительного условия нормализует все множители, используемые в коде с фиксированной точкой. Во время этой фазы преобразования с фиксированной точкой необходимо ввести «параметры настройки предлагаемого типа».

Проектирование MATLAB

Код MATLAB, используемый в примере, представляет собой простой симметричный фильтр FIR, написанный в MATLAB, а также имеет средство тестирования, которое выполняет фильтр.

design_name = 'mlhdlc_sharing';
testbench_name = 'mlhdlc_sharing_tb';

Рассмотрим дизайн MATLAB.

type(design_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB design: Symmetric FIR Filter
% 
% Key Design pattern covered in this example: 
% (1) Filter states represented using the persistent variables
% (2) Filter coefficients passed in as parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%   Copyright 2011-2015 The MathWorks, Inc.

%#codegen
function [y_out, x_out] = mlhdlc_sharing(x_in, h)
% Symmetric FIR Filter

persistent ud1 ud2 ud3 ud4 ud5 ud6 ud7 ud8;
if isempty(ud1)
    ud1 = 0; ud2 = 0; ud3 = 0; ud4 = 0; ud5 = 0; ud6 = 0; ud7 = 0; ud8 = 0;
end

x_out = ud8;


a1 = ud1 + ud8;
a2 = ud2 + ud7;
a3 = ud3 + ud6;
a4 = ud4 + ud5;

% filtered output
y_out = (h(1) * a1 + h(2) * a2) + (h(3) * a3 + h(4) * a4);


% update the delay line
ud8 = ud7; 
ud7 = ud6;
ud6 = ud5;
ud5 = ud4;
ud4 = ud3;
ud3 = ud2;
ud2 = ud1;
ud1 = x_in;

end
type(testbench_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB test bench for the FIR filter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%   Copyright 2011-2015 The MathWorks, Inc.

clear mlhdlc_sharing;
 
% input signal with noise
x_in = cos(3.*pi.*(0:0.001:2).*(1+(0:0.001:2).*75)).';

len = length(x_in);
y_out = zeros(1,len);
x_out = zeros(1,len);

% Define a regular MATLAB constant array:
%
% filter coefficients
h = [-0.1339 -0.0838 0.2026 0.4064];

for ii=1:len
    data = x_in(ii);
    % call to the design 'mlhdlc_sfir' that is targeted for hardware
    [y_out(ii), x_out(ii)] = mlhdlc_sharing(data, h);    
end

figure('Name', [mfilename, '_plot']);
plot(1:len,y_out);

Создание новой папки и копирование соответствующих файлов

Выполните следующие строки кода, чтобы скопировать необходимые файлы примеров во временную папку.

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_sfir_sharing'];

% create a temporary folder and copy the MATLAB files
cd(tempdir);
[~, ~, ~] = rmdir(mlhdlc_temp_dir, 's');
mkdir(mlhdlc_temp_dir);
cd(mlhdlc_temp_dir);

copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir);
copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);

Создание нового проекта кодера HDL

Для создания нового проекта выполните следующую команду:

coder -hdlcoder -new mlhdlc_sfir_sharing

Затем добавьте файл «mlhdlc _ sharing.m» в проект в качестве функции MATLAB и «mlhdlc _ sharing _ tb.m» в качестве тестового стенда MATLAB.

Более подробное руководство по созданию и заполнению проектов кодера MATLAB HDL см. в разделе Начало работы с MATLAB в Workflow-процессе HDL.

Реализация N-to-1 отображения множителей

Включите оптимизацию совместного использования ресурсов, установив для коэффициента совместного использования ресурсов положительное целое значение.

Этот параметр указывает «N» в сопоставлении оборудования N-to-1. Выберите значение N > 1.

Анализ отчета о ресурсах

В этом примере конструкции имеется 4 оператора умножения. Создание HDL с «SharingFactor», равным 4, приведет только к одному множителю в сгенерированном коде.

Архитектура совместного использования

На следующем рисунке показано, как алгоритм реализуется в аппаратном обеспечении при синтезе сгенерированного кода без включения оптимизации совместного использования.

На следующем рисунке показана архитектура совместного использования, автоматически реализованная кодером HDL при включении опции оптимизации совместного использования.

Входные сигналы совместно используемого множителя мультиплексируются по времени с более высокой скоростью (в данном случае 4 раза быстрее и обозначены красным цветом). Затем выходные сигналы направляются соответствующим потребителям с более низкой скоростью (зеленым цветом).

Выполнение преобразования с фиксированной точкой и создание кода HDL

Запустите помощник по рабочим процессам и щелкните правой кнопкой мыши шаг «Создание кода». Выберите опцию «Run to selected task» для выполнения всех шагов от начала до создания кода HDL.

Подробный пример «Преобразование типов с фиксированной точкой» и «Производные диапазоны» содержит учебное пособие по обновлению настроек предложений по типам при преобразовании с фиксированной точкой.

Обратите внимание, что для совместного использования множителей различной длины слов на закладке Оптимизация - > Совместное использование ресурсов в параметрах конфигурации HDL укажите «Порог продвижения множителя». Дополнительные сведения см. в документации по совместному использованию ресурсов.

Выполнение синтеза и анализ результатов синтеза

Синтезируйте созданный код из проекта, отключив эту оптимизацию, затем включив ее и изучив номера областей в отчете о ресурсах.

Очистка созданных файлов

Выполните следующие команды для очистки временной папки проекта.

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_sfir_sharing'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');