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

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

Введение

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

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

Пользователь задает 'N', используя параметр 'Resource Sharing Factor' на панели оптимизации.

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

В этом примере вы запустите преобразование с фиксированной точкой в проекте MATLAB 'mlhdlc _ совместное использование', за которым следует HDL-кодер. Этот предварительный шаг нормализует все умножители, используемые в коде с фиксированной точкой. Вы введете 'предлагаемые настройки типа' во время этой фазы преобразования с фиксированной точкой.

MATLAB- Проекта

Код 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);

Создайте новый HDL Coder проект

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

coder -hdlcoder -new mlhdlc_sfir_sharing

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

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

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

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

Этот параметр задает 'N' в N-to-1 аппаратном отображении. Выберите значение N > 1.

Исследуйте отчет о ресурсах

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

Совместное использование архитектуры

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

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

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

Запуск преобразования с фиксированной точкой и генерации HDL-кода

Запустите 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');