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

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

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

  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);

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

Если вы хотите синтезировать сгенерированный HDL-код, прежде чем вы будете использовать HDL Coder, чтобы сгенерировать код, настройте свой инструмент path синтеза. Чтобы создать путь к вашему инструменту синтеза, используйте функцию 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. Нажмите кнопку Workflow Advisor, чтобы открыть Советника по вопросам Рабочего процесса. Вы видите, что Входная Define задача Типов передала.

  2. Запустите задачу Преобразования Фиксированной точки. Инструмент Fixed-Point Conversion открывается на правой панели.

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

Выберите Code Generation Options и Generate HDL Code

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

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

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

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

  3. Чтобы оптимизировать ваш проект, можно использовать распределенную оптимизацию конвейеризации. Во вкладке Optimizations задайте 1 для Входной конвейеризации конвейеризации и Выхода и затем выбирают конвейерные регистры Distribute. Чтобы узнать больше, смотрите Распределенную Конвейеризацию.

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

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

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

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

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

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

  2. Чтобы симулировать сгенерированный испытательный стенд, установите Инструмент Симуляции на ModelSim. Вы, должно быть, уже установили ModelSim.

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

  4. Щелкните по кнопке Run.

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

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

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

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

1. Запустите Создать задачу проекта.

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

2. Выберите и запустите задачу Синтеза Запуска.

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

3. Выберите и запустите задачу Реализации Запуска.

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

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

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

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');