主要内容

从 MATLAB 进行基本 HDL 代码生成和 FPGA 综合

此示例说明如何创建一个 HDL Coder™ 工程,为您的 MATLAB® 设计生成代码,并综合 HDL 代码。在此示例中,您将:

  1. 创建一个 MATLAB HDL Coder 工程。

  2. 将设计和测试平台文件添加到工程。

  3. 为 MATLAB 设计启动 HDL 工作流顾问。

  4. 运行定点转换和 HDL 代码生成。

  5. 从 MATLAB 测试平台生成 HDL 测试平台。

  6. 使用 HDL 仿真器验证生成的 HDL 代码。您可以使用 ModelSim® 或 Xilinx® Vivado® Simulator 作为仿真工具。

  7. 使用综合工具综合生成的 HDL 代码。此示例使用 Xilinx® Vivado® 作为工具。

FIR 滤波器 MATLAB 设计

MATLAB 设计 mlhdlc_sfir 是简单的对称 FIR 滤波器。

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

设置 HDL 仿真器和综合工具路径

如果您要综合生成的 HDL 代码,在使用 HDL Coder 生成代码之前,请设置您的综合工具路径。要设置综合工具的路径,请使用 hdlsetuptoolpath 函数。例如,如果您的综合工具是 Xilinx Vivado:

hdlsetuptoolpath('ToolName','Xilinx Vivado','ToolPath',...
               vivadopath);

您必须已安装 Xilinx Vivado。要检查您的 Xilinx Vivado 综合工具设置,请通过运行以下命令启动此工具:

!vivado

如果您要使用 HDL 测试平台对生成的 HDL 代码进行仿真,可以使用诸如 ModelSim® 之类的 HDL 仿真器。您必须已安装 HDL 仿真器。

创建 HDL Coder 工程

要创建一个 HDL Coder 工程,请执行以下操作:

1.通过运行以下命令创建一个工程:

coder -hdlcoder -new sfir_project

2.对于 MATLAB Function,添加 MATLAB 设计 mlhdlc_sfir。添加 mlhdlc_sfir_tb.m 作为 MATLAB 测试平台。

3.点击 Autodefine types 并对 MATLAB 设计使用推荐的类型。代码生成器通过运行测试平台来推断数据类型。

创建算法和测试平台的定点版本

  1. 点击工作流顾问按钮以打开工作流顾问。您会看到定义输入类型任务已通过。

  2. 运行定点转换任务。定点转换工具在右窗格中打开。

当您运行定点转换时,为了建议浮点数据类型的小数长度,HDL Coder 使用默认字长。在本教程中,默认字长14。顾问提供的默认仿真最小值/最大值的安全裕度0%。顾问通过此安全系数调整数据的范围。例如,值 4 指定您要使范围增大至少 4%。另请参阅Floating-Point to Fixed-Point Conversion

选择代码生成选项并生成 HDL 代码

在生成 HDL 代码之前,如果您要将代码部署到目标平台上,请指定综合工具。在代码生成目标任务中,将工作流保留为 Generic ASIC/FPGA 并指定 Xilinx Vivado 作为综合工具。如果您没有看到综合工具,请点击刷新列表。运行此任务。

HDL 代码生成任务中,通过使用此任务右侧的选项卡,您可以指定其他代码生成选项。

  1. 默认情况下,HDL Coder 生成 VHDL® 代码。要生成 Verilog 或 SystemVerilog 代码,请在目标选项卡的语言部分选择 VerilogSystemVerilog

  2. 要生成具有注释和可追溯性链接的代码生成报告,请在编码风格选项卡中,选择包括 MATLAB 源代码作为注释生成报告

  3. 要优化您的设计,您可以使用分布式流水线优化。在优化选项卡中,为输入流水线输出流水线指定 1,然后选择分布流水线寄存器。要了解详细信息,请参阅Distributed Pipelining

  4. 点击运行以生成 Verilog 或 SystemVerilog 代码。

检查日志窗口并点击链接以浏览生成的代码和报告。

生成 HDL 测试平台并仿真生成的代码

HDL Coder 会生成一个 HDL 测试平台,使用 HDL 仿真器运行该 HDL 测试平台,并验证 HDL 仿真是否与定点 MATLAB 仿真的数值和延迟一致。

要生成 HDL 测试平台并仿真生成的代码,请在 HDL 验证 > HDL 测试平台验证任务中执行以下操作:

  1. 输出设置选项卡中,选择生成 HDL 测试平台

  2. 要仿真生成的测试平台,请将仿真工具设置为 ModelSimXilinx Vivado Simulator。您必须已安装所需的仿真工具并在 MATLAB 系统路径中设置该工具。

  3. 要指定在单独的文件中生成 HDL 测试平台代码和测试平台数据,请在测试平台选项选项卡中,选择多文件测试平台

  4. 点击运行按钮。

该任务生成一个 HDL 测试平台,然后使用选定仿真工具仿真定点设计,并生成编译报告和仿真报告。

综合生成的 HDL 代码

HDL Coder 在目标平台上综合 HDL 代码,并根据您指定的目标器件为您的设计生成面积和时序报告。

要综合生成的 HDL 代码,请执行以下操作:

1.运行创建工程任务。

此任务为 HDL 代码创建一个 Xilinx Vivado 综合工程。HDL Coder 在下一个任务中使用此工程来综合设计。

2.选择并运行运行综合任务。

此任务在后台启动综合工具,打开综合工程,编译 HDL 代码,综合设计,并生成网表以及面积和时序报告。

3.选择并运行运行实现任务。

此任务在后台启动综合工具,对设计运行布局布线,并生成用于关键路径分析和源模型回注的布线前和布线后时序信息。