引言在数字信号处理DSP应用中有限长单位冲激响应FIR滤波器因其线性相位、稳定性和易于实现等优点被广泛使用。Xilinx Vivado 提供了FIR CompilerIP 核能够高效地生成针对 FPGA 架构优化的 FIR 滤波器电路。本文将详细介绍如何使用该 IP 核快速搭建一个 16 位输入、40 位输出的 FIR 滤波模块并编写完整的 Testbench 进行功能仿真。通过本文读者可以掌握 FIR Compiler IP 的例化方法、顶层模块的封装技巧以及如何设计覆盖多种输入情况正负交替、大动态范围的测试激励。一、功能点概述输入数据16 位有符号整数signed [15:0] i_din输出数据40 位有符号整数signed [39:0] o_dout时钟与复位系统时钟i_clk周期 10ns高有效复位i_rstIP 核内部为低有效复位已做取反处理滤波功能通过 FIR Compiler IP 配置的系数完成对输入序列的线性卷积滤波。仿真激励提供 80 多个不同幅值和符号的测试向量覆盖正数、负数、零值以及大跳变场景用于验证滤波器的响应特性。二、顶层模块设计top.v2.1 模块结构顶层模块tops仅做三件事声明输入输出端口实例化 Xilinx FIR Compiler IP 核fir_compiler_0将 IP 核的输出数据直接连接到模块输出端口。2.2 关键连接说明IP 核端口顶层连接说明aclki_clk系统时钟aresetn~i_rst低有效复位因此取反顶层的高有效复位s_axis_data_tvalid1b1输入通道一直有效s_axis_data_tdatai_din输入数据m_axis_data_tdataw_fir_tdata滤波输出数据o_dout直接赋值w_fir_tdata模块输出注意IP 核的s_axis_data_tready和m_axis_data_tvalid在本设计中未使用因为数据流是连续的且我们只关心输出数据值。2.3 完整代码timescale 1ns / 1ps module tops ( input i_clk, input i_rst, input signed [15:0] i_din, output signed [39:0] o_dout ); // wire wire [39:0] w_fir_tdata; // assign assign o_dout w_fir_tdata; // inst fir_compiler_0 fir_compiler_0_u0 ( .aresetn (~i_rst ), // 低有效复位 .aclk (i_clk ), .s_axis_data_tvalid (1b1 ), // 持续有效 .s_axis_data_tready ( ), .s_axis_data_tdata (i_din ), .m_axis_data_tvalid ( ), .m_axis_data_tdata (w_fir_tdata ) ); endmodule三、Testbench 设计tb.v3.1 设计要点时钟生成always #5 i_clk ~i_clk;产生周期 10ns 的时钟。复位时序i_rst初始为高100ns 后拉低保证滤波器内部状态正确初始化。激励序列每 40ns即 4 个时钟周期改变一次输入数据便于观察输出响应。数据覆盖正数1000, 2000, 5000, 1200, 4500, ...负数-3000, -2000, -2300, -4500, -5000, ...绝对值较小的数值50, 200, 300, ...交替正负模拟真实信号变化。3.2 为什么这样做充分激励多种数值类型可以测试滤波器在不同输入幅度下的线性响应验证是否出现溢出或饱和错误。周期变化40ns 的间隔留出足够的滤波建立时间滤波器抽头数决定延迟便于波形观察。长序列80 多个数据点可以观察到滤波器从暂态到稳态的完整过程。3.3 完整代码timescale 1ns / 1ps module test_tops; reg i_clk; reg i_rst; reg signed[15:0] i_din; wire signed[39:0] o_dout; tops tops_u( .i_clk (i_clk), .i_rst (i_rst), .i_din (i_din), .o_dout (o_dout) ); initial begin i_clk 1b1; i_rst 1b1; i_din 16d0; #100 i_rst 1b0; i_din 16d1000; #40 i_din 16d2000; #40 i_din -3000; #40 i_din 16d5000; #40 i_din 16d1000; #40 i_din 16d1200; #40 i_din 16d300; #40 i_din 16d4500; #40 i_din -2000; #40 i_din -2300; #40 i_din 16d50; #40 i_din 16d1500; #40 i_din 16d200; #40 i_din 16d1200; #40 i_din 16d4200; #40 i_din -2000; #40 i_din -3000; #40 i_din 16d5000; #40 i_din 16d1000; #40 i_din 16d1200; #40 i_din 16d300; #40 i_din -4500; #40 i_din -2000; #40 i_din 16d2300; #40 i_din 16d50; #40 i_din 16d1500; #40 i_din -200; #40 i_din 16d1200; #40 i_din 16d4200; #40 i_din -2000; #40 i_din -3000; #40 i_din 16d5000; #40 i_din 16d1000; #40 i_din 16d1200; #40 i_din 16d300; #40 i_din -4500; #40 i_din -2000; #40 i_din -2300; #40 i_din 16d50; #40 i_din 16d1500; #40 i_din 16d200; #40 i_din 16d1200; #40 i_din -4200; #40 i_din 16d2000; #40 i_din 16d3000; #40 i_din -5000; #40 i_din -1000; #40 i_din 16d1200; #40 i_din 16d300; #40 i_din 16d4500; #40 i_din -2000; #40 i_din -2300; #40 i_din 16d50; #40 i_din 16d1500; #40 i_din 16d200; #40 i_din 16d1200; #40 i_din -4200; #40 i_din 16d2000; #40 i_din 16d3000; #40 i_din -5000; #40 i_din 16d1000; #40 i_din 16d1200; #40 i_din 16d300; #40 i_din 16d4500; #40 i_din -2000; #40 i_din 16d2300; #40 i_din 16d50; #40 i_din 16d1500; #40 i_din -200; #40 i_din 16d1200; #40 i_din 16d4200; #40 i_din 16d2000; #40 i_din -3000; #40 i_din 16d5000; #40 i_din 16d1000; #40 i_din 16d1200; #40 i_din 16d300; #40 i_din -4500; #40 i_din 16d2000; #40 i_din 16d2300; #40 i_din -50; #40 i_din 16d1500; #40 i_din 16d200; #40 i_din -1200; #40 i_din 16d4200; end always #5 i_clk ~i_clk; endmodule四、创新点与亮点极简顶层封装只需 3 行代码完成 IP 核集成端口声明、连线、实例化将复杂的 AXI4-Stream 接口简化为简单的输入输出信号便于系统级调用。复位极性自适应巧妙地利用~i_rst将顶层高有效复位转换为 IP 核所需的低有效复位无需额外逻辑。高覆盖率的 Testbench超过 80 组测试数据包含正数、负数、零、大绝对值和小绝对值充分检验滤波器线性范围和饱和特性。每 40ns 切换数据与 10ns 时钟配合产生稳定的 4 个时钟周期输入间隔符合典型滤波器数据率。初始 100ns 复位保证所有寄存器进入已知状态。便于仿真调试代码中未使用复杂的文件操作或任务直接在 initial 块中编写激励易于修改和移植适合教学演示和快速原型验证。五、仿真结果预期运行 ModelSim / Vivado Simulator 后可以观察到复位期间输出为 0复位释放后前几个周期输出仍保持为 0滤波器初始延时随着有效数据输入输出开始跟随输入的变化但幅度和波形受滤波器系数平滑作用而变得缓和当输入出现正负大跳变时输出呈现逐渐过渡的特性无毛刺。读者可自行在仿真软件中加载波形对比i_din和o_dout信号。六、总结本文通过一个完整的 FIR 滤波器设计实例展示了 Xilinx FIR Compiler IP 的使用方法、顶层模块的简洁封装以及高度结构化的 Testbench 编写技巧。该设计可以直接用于语音处理、通信信道均衡、传感器信号滤波等场景。关键收获理解 FIR Compiler IP 的信号含义tvalid, tdata, aresetn 等。学会用取反方式匹配复位极性。掌握编写覆盖正负大动态范围的激励序列。扩展建议根据实际需求修改 IP 核的系数文件.coe以实现低通、高通或带通滤波。增加s_axis_data_tready和m_axis_data_tvalid的握手逻辑用于与非连续数据源对接。将输出截位为 16 位以匹配 DAC 等外设。希望本文能帮助读者快速上手 FPGA 数字滤波器设计。若有疑问欢迎在评论区交流讨论。附录完整工程文件top.v– 顶层模块tb.v– 仿真测试激励fir_compiler_0.xci– IP 核配置文件需在 Vivado 中生成注文中 FIR Compiler IP 的系数由用户根据滤波器指标自行配置本文示例不限定具体系数。