В этом примере показано, как сгенерировать HDL-код из кода MATLAB®, который содержит Системные объекты.
Код MATLAB, используемый в этом примере, реализует простой симметричный КИХ-фильтр и использует dsp.Delay Системный объект для состояния модели. Этот пример также показывает испытательный стенд MATLAB, который осуществляет фильтр.
design_name = 'mlhdlc_sysobj_ex'; testbench_name = 'mlhdlc_sysobj_ex_tb';
Давайте смотреть на проект MATLAB.
type(design_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB design: Symmetric FIR Filter
%
% Design pattern covered in this example:
% Filter states modeled using DSP System object (dsp.Delay)
% Filter coefficients passed in as parameters to the design
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright 2011-2015 The MathWorks, Inc.
%#codegen
function [y_out, delayed_xout] = mlhdlc_sysobj_ex(x_in, h_in1, h_in2, h_in3, h_in4)
% Symmetric FIR Filter
persistent h1 h2 h3 h4 h5 h6 h7 h8;
if isempty(h1)
h1 = dsp.Delay;
h2 = dsp.Delay;
h3 = dsp.Delay;
h4 = dsp.Delay;
h5 = dsp.Delay;
h6 = dsp.Delay;
h7 = dsp.Delay;
h8 = dsp.Delay;
end
h1p = step(h1, x_in);
h2p = step(h2, h1p);
h3p = step(h3, h2p);
h4p = step(h4, h3p);
h5p = step(h5, h4p);
h6p = step(h6, h5p);
h7p = step(h7, h6p);
h8p = step(h8, h7p);
a1 = h1p + h8p;
a2 = h2p + h7p;
a3 = h3p + h6p;
a4 = h4p + h5p;
m1 = h_in1 * a1;
m2 = h_in2 * a2;
m3 = h_in3 * a3;
m4 = h_in4 * a4;
a5 = m1 + m2;
a6 = m3 + m4;
% filtered output
y_out = a5 + a6;
% delayout input signal
delayed_xout = h8p;
end
type(testbench_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB test bench for the FIR filter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright 2011-2015 The MathWorks, Inc.
clear mlhdlc_sysobj_ex;
x_in = cos(2.*pi.*(0:0.001:2).*(1+(0:0.001:2).*75)).';
h1 = -0.1339;
h2 = -0.0838;
h3 = 0.2026;
h4 = 0.4064;
len = length(x_in);
y_out_sysobj = zeros(1,len);
x_out_sysobj = zeros(1,len);
a = 10;
for ii=1:len
data = x_in(ii);
% call to the design 'sfir' that is targeted for hardware
[y_out_sysobj(ii), x_out_sysobj(ii)] = mlhdlc_sysobj_ex(data, h1, h2, h3, h4);
end
figure('Name', [mfilename, '_plot']);
subplot(2,1,1);
plot(1:len,x_in); title('Input signal with noise');
subplot(2,1,2);
plot(1:len,y_out_sysobj); title('Filtered output signal');
Выполните следующие строки кода, чтобы скопировать необходимые файлы в качестве примера во временную папку.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_sysobj_intro']; % 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);
Симулируйте проект с испытательным стендом до генерации кода, чтобы убедиться, что нет никаких ошибок периода выполнения.
mlhdlc_sysobj_ex_tb

Чтобы создать новый проект, введите следующую команду:
coder -hdlcoder -new mlhdlc_sysobj_prj
Затем добавьте файл 'mlhdlc_sysobj_ex.m' в проект как функция MATLAB и 'mlhdlc_sysobj_ex_tb.m' как Испытательный стенд MATLAB.
Обратитесь к Началу работы с MATLAB к Рабочему процессу HDL для более полного примера при создании и заполнении проектов HDL Coder MATLAB.
Запустите Советника по вопросам Рабочего процесса. В Советнике по вопросам Рабочего процесса щелкните правой кнопкой по шагу 'Code Generation'. Выберите опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию HDL-кода.
Исследуйте сгенерированный HDL-код путем щелчка по ссылкам в логарифмическом окне.
Для списка Системных объектов, поддержанных для генерации HDL-кода, смотрите Предопределенные Системные объекты, Поддержанные для генерации HDL-кода.
Запустите следующие команды, чтобы очистить временную папку проекта.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_sysobj_intro']; clear mex; cd (mlhdlc_demo_dir); rmdir(mlhdlc_temp_dir, 's');