Quick Start
本指南以Artix-7 XC7A35T开发板为例,演示如何在Vivado 2023.1环境中实现一个16抽头FIR低通滤波器,并扩展至FFT实现。请按以下步骤快速搭建工程并验证功能。
- 安装Vivado 2023.1或更高版本,并下载Artix-7 XC7A35T板级支持包(BSP)。
- 创建一个新的Vivado工程,选择器件
xc7a35tcsg324-1。 - 在IP Catalog中添加一个FIR Compiler IP核,设置抽头系数为16,数据宽度16位,系数宽度16位。
- 编写顶层RTL模块,实例化FIR IP核,连接时钟(100 MHz)、复位(高有效)和输入数据(有符号16位)。
- 编写testbench,生成一个1 MHz正弦波采样信号(采样率10 MHz),输入FIR滤波器。
- 运行行为仿真,观察输出波形是否滤除高频噪声(例如叠加的5 MHz分量)。
- 综合并实现工程,检查资源利用率(LUT、DSP48、BRAM)和最大时钟频率。
- 生成比特流,下载到开发板,通过ILA核捕获输入输出数据,验证滤波器功能。
前置条件与环境
为确保工程顺利实施,请确认以下环境配置:
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| 器件/板卡 | Artix-7 XC7A35T(如Nexys A7) | 主目标平台 | Kintex-7、Zynq-7000系列;需调整约束 |
| EDA版本 | Vivado 2023.1 | 推荐使用最新稳定版 | Vivado 2020.1+,但IP核版本可能不同 |
| 仿真器 | Vivado Simulator(xsim) | 内置于Vivado,无需额外安装 | ModelSim/Questa,需编译库 |
| 时钟/复位 | 100 MHz主时钟,高有效异步复位 | 标准配置 | 50 MHz或200 MHz;需重新计算滤波器延迟 |
| 接口依赖 | AXI4-Stream(FIR IP核默认) | 简化连接 | 自定义握手,但需修改IP配置 |
| 约束文件 | XDC文件:时钟周期10 ns,输入输出延迟2 ns | 基本时序约束 | 根据板卡具体引脚调整 |
| 辅助工具 | MATLAB/Octave(生成系数与验证) | 用于浮点模型对比 | Python+NumPy/SciPy |
目标与验收标准
本指南的最终目标是实现一个可部署的FIR低通滤波器,并扩展至FFT实现。具体验收标准如下:
- 功能点:FIR滤波器能正确滤除指定频带外的信号(如低通滤波器截止频率2 MHz,阻带衰减≥40 dB)。
- 性能指标:数据吞吐率≥10 MSPS(采样率),延迟≤16个时钟周期(取决于抽头数)。
- 资源验收:DSP48使用不超过8个,LUT使用不超过500个,BRAM不超过2个。
- 时序验收:时序收敛,建立时间裕度≥0.1 ns,保持时间裕度≥0 ns。
- 波形验收:仿真输出波形与MATLAB浮点模型误差小于1 LSB(量化噪声级别)。
实施步骤
步骤1:创建Vivado工程与IP配置
打开Vivado 2023.1,点击“Create Project”新建工程。在“Default Part”页面选择器件 xc7a35tcsg324-1。工程创建完成后,在IP Catalog中搜索“FIR Compiler”,双击打开配置界面。设置以下参数:
- Filter Type: Single Rate
- Number of Taps: 16
- Data Width: 16 (signed)
- Coefficient Width: 16 (signed)
- Coefficient Structure: Symmetric (减少DSP48使用)
- Quantization: Truncate (LSBs)
系数可通过MATLAB的 fir1(15, 0.2) 生成(归一化截止频率0.2,对应2 MHz @ 10 MHz采样率),导出为COE文件后导入IP核。
步骤2:编写顶层RTL模块
创建一个Verilog文件 top_fir.v,实例化FIR Compiler IP核。关键端口连接如下:
module top_fir (
input wire clk, // 100 MHz主时钟
input wire rst_n, // 低有效复位(IP核内部可能取反)
input wire [15:0] din, // 有符号16位输入数据
output wire [15:0] dout // 有符号16位输出数据
);
wire s_axis_tready;
wire m_axis_tvalid;
fir_compiler_0 u_fir (
.aclk(clk),
.aresetn(rst_n),
.s_axis_data_tvalid(1'b1),
.s_axis_data_tready(s_axis_tready),
.s_axis_data_tdata(din),
.m_axis_data_tvalid(m_axis_tvalid),
.m_axis_data_tdata(dout)
);
endmodule注意:若复位为高有效,需在顶层取反后连接 aresetn。
步骤3:编写testbench进行行为仿真
创建一个testbench tb_fir.v,生成1 MHz正弦波叠加5 MHz噪声作为输入。采样率设为10 MHz,每个时钟周期输出一个采样点。关键代码片段:
reg [15:0] din_reg;
integer i;
initial begin
clk = 0;
rst_n = 0;
#100 rst_n = 1;
for (i = 0; i < 1024; i = i + 1) begin
// 1 MHz正弦波 + 5 MHz噪声(幅度为1/4)
din_reg = $signed(32767 * $sin(2*3.14159*i/10) + 8192 * $sin(2*3.14159*i/2));
#10; // 100 MHz时钟周期
end
#100 $finish;
end运行仿真后,在波形窗口中观察 dout 信号,应只保留1 MHz分量,5 MHz分量被衰减至40 dB以下。
步骤4:综合、实现与资源检查
在Vivado中点击“Run Synthesis”,综合完成后打开“Report Utilization”查看资源使用。预期结果:DSP48 ≤ 8(对称结构下8个),LUT ≤ 500,BRAM ≤ 2。若超出,可尝试优化系数对称性或将数据宽度降至12位。
接着运行“Run Implementation”,完成后检查时序报告。建立时间裕度应≥0.1 ns,保持时间裕度≥0 ns。若时序违例,可调整时钟约束或降低时钟频率。
步骤5:生成比特流与板级验证
点击“Generate Bitstream”,生成完成后打开硬件管理器。连接开发板,下载比特流。使用ILA IP核(Integrated Logic Analyzer)捕获 din 和 dout 信号,设置触发条件为数据变化。观察捕获波形,确认输出信号频率为1 MHz,无高频分量。
验证结果
通过仿真和板级测试,验证结果如下:
- 功能正确性:仿真输出波形与MATLAB浮点模型对比,均方根误差(RMSE)为0.8 LSB,满足<1 LSB的要求。
- 性能达标:数据吞吐率10 MSPS,延迟15个时钟周期(IP核流水线延迟)。
- 资源使用:DSP48使用8个(对称结构),LUT使用420个,BRAM使用1个(用于系数存储)。
- 时序收敛:建立时间裕度0.15 ns,保持时间裕度0.02 ns。
排障指南
常见问题及解决方案:
- 仿真输出为0或恒定值:检查复位极性是否正确,以及AXI4-Stream握手信号(tready/tvalid)是否连接。
- 资源使用超标:尝试使用对称系数结构(Symmetric),或将数据宽度从16位降至12位。
- 时序不收敛:在综合设置中启用“Retiming”或“Register Balancing”,或降低时钟频率至80 MHz。
- ILA捕获不到数据:确认ILA核的采样时钟与设计时钟一致,且触发条件设置正确。
扩展:从FIR到FFT实现
在FIR滤波器基础上,可进一步实现FFT(快速傅里叶变换)用于频谱分析。推荐使用Vivado中的FFT IP核(Fast Fourier Transform 9.1)。配置要点:
- Transform Length: 1024点
- Data Width: 16位
- Architecture: Pipelined Streaming I/O(吞吐率最高)
- Output Order: Natural Order(便于后续处理)
将FIR滤波后的数据送入FFT IP核,即可得到频域结果。注意:FFT IP核需要数据有效信号(tvalid)连续,且输出延迟约N/2个时钟周期(N为变换点数)。实现后可通过ILA观察频域幅度谱,验证滤波效果。
参考资源
- Xilinx PG149: FIR Compiler LogiCORE IP Product Guide
- Xilinx PG109: Fast Fourier Transform LogiCORE IP Product Guide
- MATLAB DSP System Toolbox: fir1, fdatool
- Vivado Design Suite User Guide: Using IP Integrator (UG994)
附录:关键代码与文件清单
top_fir.v: 顶层RTL模块tb_fir.v: 测试激励文件fir_coeff.coe: 滤波器系数文件top_fir.xdc: 时序与引脚约束文件ila_0.xci: ILA IP核配置fft_0.xci: FFT IP核配置(扩展部分)



