主要内容

使用 HDL 工作流顾问为对称 FIR 滤波器生成并综合 HDL 代码

此示例说明如何创建一个 HDL Coder™ 工程,并使用 MATLAB HDL 工作流顾问从 MATLAB® 设计生成代码,使用 HDL 测试平台验证 MATLAB 设计,以及综合生成的 HDL 代码。此示例使用 ModelSim® 作为 HDL 仿真工具,并使用 Xilinx® Vivado® 作为第三方综合工具。有关以编程方式生成 HDL 代码和执行 FPGA 综合的详细信息,请参阅Programmatically Generate, Verify, and Synthesize HDL Code from MATLAB Code

检查 MATLAB 设计

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

design_name = "mlhdlc_sfir";
testbench_name = "mlhdlc_sfir_tb";
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-2026 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 测试平台

mlhdlc_sfir_tb 测试平台定义低通滤波器系数,并应用具有代表性的输入范围。该测试平台使用这些输入运行设计,以测试滤波器响应。有关 MATLAB 测试平台要求和最佳做法的详细信息,请参阅Using Test Benches With HDL and HLS Code Generation

打开测试平台。

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

%   Copyright 2011-2026 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", string(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 设计

在生成 HDL 代码之前,验证 mlhdlc_sfir 能够无错误地处理采样流并满足滤波要求。使用 mlhdlc_sfir_tb 运行设计,以生成啁啾输入并提供低通滤波器系数。测试平台将采样流式传输到 mlhdlc_sfir,然后绘制输入和输出信号在时域和频域中的行为。

比较图显示,在时域中滤波后的输出比输入更平滑。在频域中,滤波后的输出在高频处的幅值低于输入。测试平台结果证实 mlhdlc_sfir 能够根据滤波器系数按预期实现低通滤波器。

mlhdlc_sfir_tb

设置第三方综合工具和 HDL 仿真器

接下来,设置您的第三方综合工具和 HDL 仿真器。有关支持的第三方工具版本列表,请参阅HDL 语言支持以及支持的第三方工具和硬件

此示例使用 Xilinx Vivado。要设置第三方综合工具的路径,请使用 hdlsetuptoolpath 函数。在 MATLAB 命令行窗口中,使用以下命令,并将路径替换为您的安装路径:

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

要检查您的 Xilinx Vivado 综合工具设置,请通过运行以下命令启动 Xilinx Vivado:

!vivado

要使用 HDL 测试平台对生成的 HDL 代码进行仿真,请使用 HDL 仿真器,例如 ModelSim®。有关设置第三方 FPGA 综合工具和 HDL 仿真器的详细信息,请参阅Set Up Tools

注意

不要在文件名或路径中使用空格,以防止代码生成失败。您可以使用 openExample 函数的 workDir 名称-值参量,在名称较短且不含空格或特殊字符的目录中打开此示例。例如,以下代码将当前工作目录设置为系统的临时文件夹目录,并打开此示例。

tempdir
openExample("hdlcoder/BasicHDLCodeGenAndFPGASynthesisFromMATLABExample",workDir=tempdir)

创建 HDL Coder 工程

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

1.在 MATLAB 命令行窗口中,通过运行以下命令创建一个 HDL Coder 工程:

coder -hdlcoder -new sfir_project

2.点击添加 MATLAB 函数。在对话框中,选择 MATLAB 设计 mlhdlc_sfir。仅添加顶层 MATLAB 函数。

3.点击添加文件。在对话框中,选择测试平台 mlhdlc_sfir_tb

4.在 MATLAB 函数部分中,点击 Autodefine types 以定义输入类型。在对话框中,点击运行。在“自动定义输入类型”窗口中,点击使用以下类型。HDL Coder 运行测试平台以推断 MATLAB 设计 mlhdlc_sfir 的输入数据类型。

5.通过点击工作流顾问打开 HDL 工作流顾问。

创建 MATLAB 设计的定点版本

接下来,通过建议定点小数长度并添加安全裕度,将 MATLAB 设计中的浮点数据类型转换为定点数据类型。在定点转换任务中,您可以使用默认字长属性指定浮点数据类型的字长。对于此示例,将默认字长设置为 14

要为仿真推导范围添加安全裕度,并基于扩展范围提供定点数据类型建议,请使用仿真最小值/最大值的安全裕度属性。对于此示例,点击高级,然后将仿真最小值/最大值的安全裕度设置为 10

右键点击定点转换任务,然后选择运行此任务

有关浮点到定点转换的详细信息,请参阅Floating-Point to Fixed-Point Conversion

定义代码生成目标和平台

要将生成的 HDL 代码部署到目标平台上,请在生成 HDL 代码之前指定目标和第三方综合工具。

选择代码生成目标任务中,设置以下参数:

  • 工作流设置为 Generic ASIC/FPGA

  • 综合工具设置为 Xilinx Vivado。如果您没有看到综合工具,请点击刷新列表

  • 目标频率(MHz) 设置为 200

当您将综合工具设置为 Xilinx Vivado 时,HDL 工作流顾问会公开这些属性并将它们设置为以下设置:

  • 芯片系列设置为 Artix UltraScale+

  • 设备设置为 xaau7p-fcva289-1-i

右键点击选择代码生成目标任务,然后选择运行此任务

设置代码生成选项并生成 HDL 代码

接下来,设置 HDL 代码生成选项并生成代码。在 HDL 代码生成任务中,设置以下选项。

要生成 Verilog 代码,请在目标选项卡中,将语言设置为 Verilog

要生成具有注释和可追溯性链接的代码生成报告,请执行以下操作:

  • 目标选项卡中,选择生成报告

  • 编码风格选项卡中,选择包括 MATLAB 源代码作为注释

要通过使用分布式流水线来优化您的设计,请执行以下操作:

  • 优化选项卡中,将输入流水线输出流水线设置为 1

  • 优化选项卡中,选择分布流水线寄存器

要了解有关分布式流水线优化的更多信息,请参阅Specify Distributed Pipelining Settings

点击运行

生成 Verilog 代码后,请在右窗格的底部点击查看报告链接,以在 HDL Coder 报告查看器中打开 HDL 代码生成报告。有关 HDL 代码生成报告的详细信息,请参阅Code Generation Reports

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

接下来,生成 HDL 测试平台,使用 HDL 仿真器运行 HDL 测试平台,并验证 HDL 仿真是否与定点 MATLAB 仿真的数值和延迟一致。有关使用 HDL 测试平台验证生成的 HDL 代码的详细信息,请参阅Verify Code with HDL Test Bench

验证 > HDL 测试平台验证任务中:

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

  2. 选择 Simulate generated test bench

  3. 仿真工具设置为 ModelSim

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

  5. 点击运行

综合生成的 HDL 代码

接下来,使用 HDL Coder 以便于在目标平台上综合生成的 HDL 代码,并根据目标设备为您的设计生成面积和时序报告。

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

1.右键点击综合与分析 > 创建工程任务,然后选择运行此任务

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

2.右键点击综合与分析 > 运行综合任务,然后选择运行此任务

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

3.右键点击综合与分析 > 运行实现任务,然后选择运行此任务

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

另请参阅

主题