exponenta event banner

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

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

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

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

  3. Запустите помощник по рабочим процессам HDL для проекта MATLAB.

  4. Выполните преобразование с фиксированной точкой и создание кода HDL.

  5. Создайте тестовый стенд HDL из тестового стенда MATLAB.

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

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

Конструкция фильтра FIR 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

Испытательный стенд FIR-фильтра 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 для генерации кода, настройте траекторию инструмента синтеза. Чтобы настроить путь к инструменту синтеза, используйте функцию hdlsetuptoolpath. Например, если инструментом синтеза является Xilinx Vivado:

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

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

!vivado

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

Создание проекта кодера HDL

Для создания проекта кодера HDL:

1. Создайте проект, выполнив следующую команду:

coder -hdlcoder -new sfir_project

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

3. Щелкните Автоопределение типов (Autodefine types) и используйте рекомендуемые типы для конструкции MATLAB. Генератор кода выводит типы данных путем запуска тестового стенда.

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

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

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

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

Выбор параметров генерации кода и создание кода HDL

Перед созданием кода HDL, если требуется развернуть код на целевой платформе, укажите средство синтеза. В задаче Цель создания кода оставьте Workflow to Generic ASIC/FPGA и указать Xilinx Vivado в качестве инструмента синтеза. Если инструмент синтеза не отображается, щелкните Обновить список. Запустите эту задачу.

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

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

  2. Чтобы создать отчет о создании кода со ссылками комментариев и отслеживания, на вкладке Стиль кодирования выберите Включить исходный код MATLAB в качестве комментариев и «Создать отчет *».

  3. Для оптимизации конструкции можно использовать распределенную оптимизацию конвейеров. На вкладке «Оптимизации» укажите 1 для параметров Входная конвейерная обработка и Выходная конвейерная обработка, а затем выберите Распределить регистры трубопроводов. Дополнительные сведения см. в разделе Распределенная конвейерная обработка.

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

Просмотрите окно журнала и щелкните ссылки для просмотра созданного кода и отчетов.

Создание тестового стенда HDL и моделирование сгенерированного кода

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

Чтобы создать стенд для тестирования ЛПВП и смоделировать сгенерированный код, в разделе Проверка ЛПВП > Проверка с помощью стенда для тестирования ЛПВП:

  1. На вкладке Output Settings выберите Generate HDL test stench.

  2. Для моделирования созданного стенда установите для инструмента моделирования значение ModelSim. Необходимо установить ModelSim.

  3. Чтобы задать генерацию кода тестового стенда HDL и данных тестового стенда в отдельных файлах, на вкладке «Параметры тестового стенда» выберите «Многофайловый стенд».

  4. Нажмите кнопку Run (Выполнить).

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

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

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

Для синтеза сгенерированного кода HDL:

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

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

2. Выберите и запустите задачу «Выполнить синтез».

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

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

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

Очистка созданных файлов

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

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