В этом примере показано, как использовать оптимизацию совместного использования ресурсов в 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');