Разделение ресурсов множителей, чтобы уменьшать область

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

Введение

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

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

Пользователь задает 'N' с помощью 'опции' Фактора Разделения ресурсов в панели оптимизации.

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

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

Проект 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_sharing_tb.m' как Испытательный стенд MATLAB.

Обратитесь к Началу работы с MATLAB к Рабочему процессу HDL для более полного примера при создании и заполнении проектов HDL Coder MATLAB.

Поймите отображение N-1 множителей

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

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

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

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

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

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

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

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

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

Запустите Советника по вопросам Рабочего процесса и щелкните правой кнопкой по шагу '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');