В этом примере показано, как проверить сгенерированный код HDL с использованием косимуляции HDL и FPGA-in-the-Loop в качестве шагов в рабочем процессе создания кода HDL для MATLAB-HDL.
Продукты, необходимые для этого примера:
MATLAB
Конструктор фиксированных точек
Верификатор HDL
ПО для проектирования FPGA (ПО для проектирования Xilinx ® ISE ® или Vivado ® или Intel ® Quartus ® II)
Одна из поддерживаемых плат и аксессуаров для разработки FPGA
Для подключения с использованием Ethernet: Gigabit Ethernet адаптер, установленный на хост-компьютере, Gigabit Ethernet кросс-кабель
Для подключения с использованием кабеля JTAG: USB Blaster I или II и драйвера для плат Intel FPGA. Кабель и драйвер Digilent ® JTAG для плат Xilinx FPGA.
Предпосылки:
Программное обеспечение MATLAB ® и FPGA можно установить на компьютере или на сетевом устройстве. Если вы используете программное обеспечение из сети, вам потребуется второй сетевой адаптер, установленный на вашем компьютере, чтобы предоставить частную сеть для платы разработки FPGA. Чтобы узнать, как установить сетевой адаптер, обратитесь к руководству по оборудованию и сети для компьютера.
Код MATLAB, используемый в этом примере, реализует простой симметричный фильтр FIR и использует dsp. Задержка объекта System до состояния модели. В этом примере также показан тестовый стенд MATLAB с фильтром.
design_name = 'mlhdlc_sysobj_ex.m'; testbench_name = 'mlhdlc_sysobj_ex_tb.m'; wavefile_name = 'wave.do';
Выполните следующие строки кода для копирования необходимых файлов примеров.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); copyfile(fullfile(mlhdlc_demo_dir, design_name), pwd, 'f'); copyfile(fullfile(mlhdlc_demo_dir, testbench_name), pwd, 'f');
Рассмотрим дизайн 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_sysobj_ex_tb


Для создания нового проекта введите следующую команду:
coder -hdlcoder -new mlhdlv_cosimFIL_prj
Затем добавьте файл «mlhdlc _ sysobj _ ex.m» в проект в качестве функции MATLAB и «mlhdlc _ sysobj _ ex _ tb.m» в качестве тестового стенда MATLAB.
Более подробное руководство по созданию и заполнению проектов кодера MATLAB HDL можно найти в учебном пособии «Начало работы с программой MATLAB-HDL Workflow» (Кодер HDL).
Для этого объекта системы MATLAB с плавающей запятой все входы являются двойными скалярными. Укажите их как таковые с помощью раскрывающихся меню, предоставляемых для функции MATLAB.

Запустите помощник по рабочим процессам. В помощнике по рабочим процессам щелкните правой кнопкой мыши шаг «Создание кода HDL». Выберите опцию «Run to selected task» для выполнения всех шагов от начала до создания кода HDL.
Проверьте созданный код HDL, щелкнув ссылки на панели журнала помощника по рабочим процессам.
Выберите шаг «Проверить с косимуляцией».
Установите флажок «Создать стенд для косимуляции». Это действие активирует другие варианты в диалоговом окне, позволяя выбрать запись выходных данных для сравнения, выбрать предпочтительный имитатор ЛПВП и смоделировать созданный стенд для тестирования косимуляции. Установите оба оставшихся флажка и выберите предпочтительный имитатор ЛПВП.
Выберите «GUI» в качестве режима работы имитатора HDL.

Щелкните «Выполнить» (Run) и просмотрите графики, сравнивающие выходы косимуляции с выходами объекта System с фиксированной точкой. Также обратите внимание на переходы сигналов в устройстве просмотра сигналов имитатора ЛПВП.


Сведения о настройке платы FPGA и компьютера для обмена данными для моделирования FPGA-in-the-Loop см. в разделе Настройка платы разработки FPGA.
Выберите шаг «Проверить с помощью FPGA-in-the-Loop» на левой панели помощника по рабочим процессам.
Установите все 3 флажка (для формирования тестового стенда FPGA-in-the-Loop, регистрации выходных данных, моделирования сформированного тестового стенда FIL.
Выберите выбранную плату разработки FPGA.

Нажмите «Выполнить» и просмотрите графики сравнения выходов FPGA с выходами объекта System с фиксированной точкой.
Выполните следующие команды для очистки временной папки проекта.
clear mex; cd (hdlverif_demo_dir); rmdir(mlhdlv_temp_dir, 's');