Quick Start
- 步骤一:在 MATLAB 中设计滤波器系数(使用 fdatool 或 fir1 函数),导出系数为 .coe 文件。
- 步骤二:创建 Vivado 工程,选择器件(如 xc7a35tcsg324-1)。
- 步骤三:编写 Verilog 模块,例化 FIR 滤波器(直接型或转置型),使用 .coe 文件初始化 ROM 或 RAM。
- 步骤四:编写 Testbench,读取 MATLAB 生成的激励数据(.txt 或 .dat),送入滤波器模块。
- 步骤五:运行行为级仿真,观察输出波形与 MATLAB 理论输出对比。
- 步骤六:综合实现,检查资源利用率和时序(Fmax 应 > 设计时钟频率的 1.2 倍)。
- 步骤七:上板验证,使用 ILA 或逻辑分析仪捕获输出,确认与仿真一致。
前置条件与环境
| 项目/推荐值 | 说明 | 替代方案 |
|---|---|---|
| 器件/板卡 | Xilinx Artix-7 (XC7A35T) | Intel Cyclone IV / Lattice ECP5 |
| EDA 版本 | Vivado 2020.2 或更高 | Quartus Prime 18.1+ |
| 仿真器 | Vivado Simulator 或 ModelSim | QuestaSim / VCS |
| 时钟/复位 | 系统时钟 50 MHz,异步低有效复位 | PLL 生成时钟,同步复位 |
| 接口依赖 | AXI4-Stream 或自定义并行接口 | UART / SPI 串行输入 |
| 约束文件 | XDC 约束:时钟周期 20 ns,输入/输出延迟 2 ns | SDC 约束(Intel) |
| MATLAB 版本 | R2020a 或更高(含 DSP System Toolbox) | Python + SciPy 替代 |
目标与验收标准
- 功能点:实现 16 阶低通 FIR 滤波器,通带 0–10 MHz,阻带 > 15 MHz,通带纹波 40 dB。
- 性能指标:数据吞吐率 ≥ 50 MSPS,Fmax ≥ 100 MHz,逻辑资源 < 500 LUT + 500 FF。
- 验收方式:仿真输出与 MATLAB 理论输出误差 < 1 LSB(量化后);上板后 ILA 捕获数据与仿真一致。
实施步骤
工程结构与顶层模块
// top_fir.v 顶层模块
module top_fir (
input wire clk,
input wire rst_n,
input wire [7:0] din,
output wire [15:0] dout
);
fir_fixed #(
.N_TAPS(16),
.WIDTH(8),
.COEFF_WIDTH(16)
) u_fir (
.clk(clk),
.rst_n(rst_n),
.din(din),
.dout(dout)
);
endmodule说明:顶层模块仅实例化滤波器,便于仿真和综合。参数化设计便于重用。
关键模块:转置型 FIR 滤波器
// fir_fixed.v 转置型 FIR
module fir_fixed #(
parameter N_TAPS = 16,
parameter WIDTH = 8,
parameter COEFF_WIDTH = 16
)(
input wire clk,
input wire rst_n,
input wire [WIDTH-1:0] din,
output wire [WIDTH+COEFF_WIDTH-1:0] dout
);
reg [WIDTH+COEFF_WIDTH-1:0] acc [N_TAPS-1:0];
wire signed [COEFF_WIDTH-1:0] coeff [N_TAPS-1:0];
// 从 .coe 文件加载系数(使用 $readmemh 或 IP 核)
initial begin
$readmemh("coeff.hex", coeff);
end
// 转置型结构:输入同时馈入所有乘法器
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
for (int i=0; i<N_TAPS; i=i+1) acc[i] <= 0;
end else begin
acc[0] <= din * coeff[N_TAPS-1];
for (int i=1; i<N_TAPS; i=i+1)
acc[i] <= acc[i-1] + din * coeff[N_TAPS-1-i];
end
end
assign dout = acc[N_TAPS-1];
endmodule注意:转置型比直接型流水线延迟更小,但资源稍多。系数需预先量化并存储为十六进制文件。
时序与约束
# fir_constraints.xdc
create_clock -period 20.000 -name sys_clk [get_ports clk]
set_input_delay -clock sys_clk -max 2.000 [get_ports din]
set_output_delay -clock sys_clk -max 2.000 [get_ports dout]约束要点:输入延迟应小于时钟周期的 10%,输出延迟同理。若 Fmax 不足,可插入流水线寄存器。



