В этом примере показано, как использовать оптимизацию разделения ресурсов в HDL Coder™. Эта оптимизация идентифицирует функционально эквивалентные операции множителя в коде MATLAB® и совместно использует их для того, чтобы оптимизировать область проектирования. Вы управляете количеством множителей, которые будут совместно использованы в проекте.
Разделение ресурсов является оптимизацией всего проекта, поддержанной HDL Coder™ для реализации эффективного областью оборудования.
Эта оптимизация позволяет пользователям совместно использовать аппаратные ресурсы путем отображения 'N' функционально эквивалентные операторы MATLAB, в этом случае множители, к одному оператору.
Пользователь задает 'N' с помощью 'опции' Фактора Разделения ресурсов в панели оптимизации.
Рассмотрите следующую модель в качестве примера симметричного КИХ-фильтра. Это содержит 4 блока продукта, которые функционально эквивалентны и которые сопоставлены с 4 множителями в оборудовании. Отчет Использования Ресурса показывает количество множителей, выведенных из проекта.
В этом примере вы запустите преобразование фиксированной точки на проекте MATLAB 'mlhdlc_sharing' сопровождаемый HDL Coder. Этот необходимый как условие шаг нормирует все множители, используемые в фиксированной точке. Вы введете 'сделанный предложение тип настройки во время этой фазы преобразования фиксированной точки.
Код 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_sharing_tb.m' как Испытательный стенд MATLAB.
Обратитесь к Началу работы с MATLAB к Рабочему процессу HDL для более полного примера при создании и заполнении проектов HDL Coder MATLAB.
Включите оптимизацию разделения ресурсов путем устанавливания 'Коэффициент Разделения ресурсов' на положительное целочисленное значение.
Этот параметр задает 'N' в аппаратном отображении N-1. Выберите значение N> 1.
В этом проекте в качестве примера существует 4 оператора умножения. Генерация HDL с 'SharingFactor' 4 приведет только к одному множителю в сгенерированном коде.
Следующий рисунок показывает, как алгоритм реализован в оборудовании, когда мы синтезируем сгенерированный код, не включая оптимизацию совместного использования.
Следующий рисунок показывает архитектуру совместного использования, автоматически реализованную HDL Coder, когда опция оптимизации совместного использования включена.
Входные параметры к разделяемому множителю мультиплексированы временем на более быстром уровне (в этом случае 4x быстрее и обозначены в красном). Выходные параметры затем направляются соответствующим потребителям на более медленном уровне (в зеленом).
Запустите Советника по вопросам Рабочего процесса и щелкните правой кнопкой по шагу 'Code Generation'. Выберите опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию HDL-кода.
Подробное Преобразование Фиксированной точки в качестве примера и Выведенные Области значений предоставляют пример для обновления настроек предложения по типу во время преобразования фиксированной точки.
Обратите внимание на то, что, чтобы совместно использовать множители различного размера слова, во вкладке Optimization-> Resource Sharing Параметров конфигурации 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');