В этом примере показано, как использовать оптимизацию совместного использования ресурсов в HDL- Coder™. Эта оптимизация идентифицирует функционально эквивалентные операции умножения в коде MATLAB ® и разделяет их, чтобы оптимизировать область проекта. Вы имеете контроль над количеством умножителей, которые будут использоваться совместно в проекте.
Совместное использование ресурсов является оптимизацией всего проекта, поддерживаемой HDL- Coder™, для реализации экономичного оборудования.
Эта оптимизация позволяет пользователям совместно использовать аппаратные ресурсы путем отображения функционально эквивалентных операторов MATLAB, в этом случае умножителей, на одного оператора.
Пользователь задает 'N', используя параметр 'Resource Sharing Factor' на панели оптимизации.
Рассмотрим следующую примеру модель симметричной конечной импульсной характеристики фильтра. Он содержит 4 блока продукта, которые являются функционально эквивалентными и которые сопоставлены с 4 умножителями на оборудовании. Отчет по использованию ресурсов показывает количество умножителей, выведенных из проекта.
В этом примере вы запустите преобразование с фиксированной точкой в проекте MATLAB 'mlhdlc _ совместное использование', за которым следует HDL-кодер. Этот предварительный шаг нормализует все умножители, используемые в коде с фиксированной точкой. Вы введете 'предлагаемые настройки типа' во время этой фазы преобразования с фиксированной точкой.
Код MATLAB, используемый в примере, является простым симметричным конечная импульсная характеристика, записанным в 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);
Выполните следующую команду для создания нового проекта:
coder -hdlcoder -new mlhdlc_sfir_sharing
Затем добавьте файл 'mlhdlc _ sharing.m' к проекту в качестве функции MATLAB и 'mlhdlc _ совместное использование _ tb.m' в качестве испытательного стенда MATLAB.
Более полное руководство по созданию и заполнению проектов MATLAB HDL Coder см. в разделе «Начало работы с MATLAB в HDL».
Включите оптимизацию совместного использования ресурсов, задав положительное целое значение для параметра «Коэффициент совместного использования ресурсов».
Этот параметр задает 'N' в N-to-1 аппаратном отображении. Выберите значение N > 1.

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

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

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

Запустите Workflow Advisor и щелкните правой кнопкой мыши шаг 'Генерация Кода'. Выберите опцию «Run to selected task», чтобы выполнить все шаги от начала до генерации HDL-кода.
Подробный пример «Преобразование типов с фиксированной точкой» и «Производные области значений» содержит руководство по обновлению настроек предложения типов во время преобразования с фиксированной точкой.
Обратите внимание, что для совместного использования множителей разного размера слова на вкладке Optimization - > Resource Sharing в HDL Configuration Parameters задайте порог продвижения мультипликатора. Для получения дополнительной информации см. документацию по совместному использованию ресурсов.
Синтезируйте сгенерированный код из проекта с отключенной оптимизацией, затем с включенным, и исследуйте номера областей в отчете ресурса.
Выполните следующие команды, чтобы очистить временную папку проекта.
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');