Основная Генерация HDL-кода и синтез FPGA из MATLAB

В этом примере показов, как создать проект HDL Coder™, сгенерировать код для вашего проекта MATLAB и синтезировать HDL-код. В этом примере вы:

  1. Создайте проект MATLAB HDL Coder.

  2. Добавьте к проекту файлы дизайна и испытательного стенда.

  3. Запустите HDL Workflow Advisor для проекта MATLAB.

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

  5. Сгенерируйте испытательный стенд HDL на испытательном стенде MATLAB.

  6. Проверьте сгенерированный HDL-код при помощи Симулятора HDL. Этот пример использует ModelSim ® в качестве инструмента.

  7. Синтезируйте сгенерированный HDL-код с помощью инструмента синтеза. В этом примере в качестве инструмента используется Xilinx ® Vivado ®.

Конечная импульсная характеристика фильтра MATLAB Проекта

Проект MATLAB mlhdlc_sfir является простым симметричным конечная импульсная характеристика.

design_name = 'mlhdlc_sfir';
testbench_name = 'mlhdlc_sfir_tb';

Проверьте проект MATLAB.

open(design_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB design: Symmetric FIR Filter
% 
% Introduction:
%
% We can reduce the complexity of the FIR filter by leveraging its symmetry. 
% Symmetry for an n-tap filter implies, coefficient h0 = coefficient hn-1, 
% coefficient, h1 = coefficient hn-2, etc. In this case, the number of 
% multipliers can be approximately halved. The key is to add the 
% two data values that need to be multiplied with the same coefficient 
% prior to performing the multiplication. 
%
% Key Design pattern covered in this example: 
% (1) Filter states represented using the persistent variables
% (2) Filter coefficients passed in as parameters

%   Copyright 2011-2019 The MathWorks, Inc.

%#codegen
function [y_out, delayed_xout] = mlhdlc_sfir(x_in,h_in1,h_in2,h_in3,h_in4)   
% Symmetric FIR Filter

% declare and initialize the delay registers
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

% access the previous value of states/registers
a1 = ud1 + ud8; a2 = ud2 + ud7;
a3 = ud3 + ud6; a4 = ud4 + ud5;

% multiplier chain
m1 = h_in1 * a1; m2 = h_in2 * a2;
m3 = h_in3 * a3; m4 = h_in4 * a4;

% adder chain
a5 = m1 + m2; a6 = m3 + m4;

% filtered output
y_out = a5 + a6;

% delayout input signal
delayed_xout = ud8;

% update the delay line
ud8 = ud7; 
ud7 = ud6;
ud6 = ud5;
ud5 = ud4;
ud4 = ud3;
ud3 = ud2;
ud2 = ud1;
ud1 = x_in;
end

Конечная импульсная характеристика MATLAB Испытательный стенд

Тестовый набор MATLAB mlhdlc_sfir_tb выполняет создание фильтра с помощью репрезентативной входной области значений. Проверьте испытательный стенд MATLAB mlhdlc_sfir_tb.

open(testbench_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB test bench for the FIR filter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%   Copyright 2011-2019 The MathWorks, Inc.
clear mlhdlc_sfir;
T = 2;
dt = 0.001;
N = T/dt+1;
sample_time = 0:dt:T;

df = 1/dt;
sample_freq = linspace(-1/2,1/2,N).*df;

% input signal with noise
x_in = cos(2.*pi.*(sample_time).*(1+(sample_time).*75)).';

% filter coefficients
h1 = -0.1339; h2 = -0.0838; h3 = 0.2026; h4 = 0.4064;

len = length(x_in);
y_out = zeros(1,len);
x_out = zeros(1,len);

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_sfir(data, h1, h2, h3, h4);
end

figure('Name', [mfilename, '_plot']);
subplot(3,1,1);
plot(1:len,x_in,'-b');
xlabel('Time (ms)')

ylabel('Amplitude')
title('Input Signal (with noise)')
subplot(3,1,2); plot(1:len,y_out,'-b');
xlabel('Time (ms)')
ylabel('Amplitude')
title('Output Signal (filtered)')

freq_fft = @(x) abs(fftshift(fft(x)));

subplot(3,1,3); semilogy(sample_freq,freq_fft(x_in),'-b');
hold on
semilogy(sample_freq,freq_fft(y_out),'-r')
hold off
xlabel('Frequency (Hz)')
ylabel('Amplitude (dB)')
title('Input and Output Signals (Frequency domain)')
legend({'FilterIn', 'FilterOut'}, 'Location','South')
axis([-500 500 1 100])


Протестируйте исходный алгоритм MATLAB

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

mlhdlc_sfir_tb

Создайте папку и скопируйте соответствующие файлы

Чтобы скопировать файлы примера во временную папку, запустите следующие команды:

design_name = 'mlhdlc_sfir';
testbench_name = 'mlhdlc_sfir_tb';

Создайте временную папку

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_sfir'];
cd(tempdir);
[~, ~, ~] = rmdir(mlhdlc_temp_dir, 's');
mkdir(mlhdlc_temp_dir);
cd(mlhdlc_temp_dir);

Скопируйте файлы MATLAB.

copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir);
copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);

Настройка Симулятора HDL и пути инструмента синтеза

Если вы хотите синтезировать сгенерированный HDL-код, прежде чем использовать HDL Coder для генерации кода, настройте путь инструмента синтеза. Чтобы настроить путь к инструменту синтеза, используйте функцию hdlsetuptoolpath. Для примера, если вашим инструментом синтеза является Xilinx Vivado:

hdlsetuptoolpath('ToolName','Xilinx Vivado','ToolPath',...
               'C:\Xilinx\Vivado\2018.3\bin\vivado.bat');

Вы, должно быть, уже установили Xilinx Vivado. Чтобы проверить настройку инструмента синтеза Xilinx Vivado, запустите инструмент, запустив эту команду:

!vivado

Если вы хотите симулировать сгенерированный HDL-код с помощью HDL-теста, можно использовать HDL-симулятор, такой как ModelSim ®. Вы, должно быть, уже установили симулятор HDL.

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

Чтобы создать проект HDL Coder:

1. Создайте проект путем выполнения этой команды:

coder -hdlcoder -new sfir_project

2. Для функции MATLAB добавьте проект MATLAB mlhdlc_sfir. Добавить mlhdlc_sfir_tb.m в качестве испытательного стенда MATLAB.

3. Щелкните Типы Autodefine и используйте рекомендуемые типы для проекта MATLAB. Генератор кода выводит типы данных путем запуска испытательных стендов.

Создайте версии алгоритма и испытательного стенда с фиксированной точкой

  1. Нажмите кнопку Советник по рабочему процессу, чтобы открыть Советник по рабочему процессу. Вы видите, что задача Задать входные типы прошла.

  2. Выполните задачу преобразования фиксированной точки. На правой панели откроется инструмент преобразования точек с фиксированной точкой.

Когда вы запускаете преобразование с фиксированной точкой, чтобы предложить длины дробей для типов данных с плавающей точкой, HDL Coder использует размер слова по умолчанию. В этом руководстве значение по умолчанию размер слова 14. Советник предоставляет запас прочности по умолчанию для Simulation Min/Max of 0%. Консультант корректирует область значений данных по этому коэффициенту надежности. Для примера значение 4 задает, что вам нужен область значений не менее 4 процент больше. См. также раздел «Преобразование из плавающей запятой в фиксированную запятую».

Выберите опции генерации кода и сгенерируйте HDL-код

Прежде чем вы сгенерируете HDL-код, если хотите развернуть код на целевой платформе, укажите инструмент синтеза. В задаче Генерации кода Target оставьте Рабочий процесс Generic ASIC/FPGA и задайте Xilinx Vivado как инструмент синтеза. Если вы не видите инструмент синтеза, щелкните Обновить список. Запустите эту задачу.

В Генерацию HDL-кода задаче при помощи вкладок с правой стороны этой задачи можно задать дополнительные опции генерации кода.

  1. По умолчанию HDL Coder генерирует код VHDL ®. Чтобы сгенерировать код Verilog, на вкладке Target, выберите Verilog как язык.

  2. Чтобы сгенерировать отчет генерации кода с комментариями и ссылками на трассируемость, на вкладке Стиль кодирования, выберите Включить исходный код MATLAB в качестве комментариев и 'Сгенерировать отчет *.

  3. Для оптимизации проекта можно использовать распределенную оптимизацию конвейеризации. На вкладке Оптимизации задайте 1 для Input pipelining и Output pipelining, а затем выберите Distribute pipeline registers. Дополнительные сведения см. в разделе Распределять конвейеризации.

  4. Нажмите запуск, чтобы сгенерировать код Verilog.

Исследуйте окно журнала и щелкните ссылки, чтобы исследовать сгенерированный код и отчеты.

Сгенерируйте HDL- Испытательного стенда и симулируйте сгенерированный код

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

Чтобы сгенерировать HDL- испытательного стенда и симулировать сгенерированный код, в Верификацию HDL-кода > Задача верификации с HDL- Испытательного стенда:

  1. На вкладке Выхода Settings выберите Generate HDL испытательного стенда.

  2. Чтобы симулировать сгенерированный испытательный стенд, установите значение Simulation Tool на ModelSim. Вы, должно быть, уже установили ModelSim.

  3. Чтобы указать генерацию тестового кода HDL и тестовых данных в отдельных файлах, на вкладке Test Bench Options выберите Multi-file test stench.

  4. Нажмите кнопку Run.

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

Синтезируйте сгенерированный HDL-код

HDL Coder синтезирует HDL-код на целевой платформе и генерирует отчеты о области и времени для вашего проекта на основе заданного целевого устройства.

Чтобы синтезировать сгенерированный HDL-код:

1. Запустите задачу Create project.

Эта задача создает проект синтеза Xilinx Vivado для HDL-кода. HDL Coder использует этот проект в следующей задаче, чтобы синтезировать дизайн.

2. Выберите и запустите задачу Run Synthesis.

Эта задача запускает инструмент синтеза в фоновом режиме, открывает проект синтеза, компилирует HDL-код, синтезирует дизайн и генерирует сетевые списки, а также отчеты по области и времени.

3. Выберите и запустите задачу Run Implementation.

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

Очистка сгенерированных файлов

Чтобы очистить временную папку проекта, запустите следующие команды:

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_sfir'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');