FPGA实战:3级CIC滤波器Verilog代码详解(附仿真测试技巧)

张开发
2026/4/18 12:25:30 15 分钟阅读

分享文章

FPGA实战:3级CIC滤波器Verilog代码详解(附仿真测试技巧)
FPGA实战三级CIC滤波器Verilog实现与深度优化指南在数字信号处理领域CIC级联积分梳状滤波器因其硬件友好特性成为高频采样系统中的关键组件。本文将彻底解析三级CIC滤波器的Verilog实现细节从位宽计算到时序控制并分享ModelSim仿真中的实战技巧。1. CIC滤波器架构精要三级CIC滤波器由积分器组、抽取器和梳状滤波器三部分组成。其独特之处在于仅使用加法器和寄存器即可实现高效滤波特别适合FPGA实现。典型参数包括抽取因子R决定降采样率通常取2-32微分延迟M影响频率响应常用1或2级数N三级结构平衡了资源消耗与阻带衰减关键计算公式// 输出位宽计算 output_width input_width N*ceil(log2(R*M))例如12位输入、R16的三级滤波器中间信号需扩展至123*424位以防止溢出。2. Verilog核心模块实现2.1 积分器链设计积分器采用三级级联结构每级需严格对齐使能信号module integrator_chain ( input clk, rst_n, input [11:0] din, output [23:0] dout ); reg [23:0] int1, int2, int3; always (posedge clk or negedge rst_n) begin if (!rst_n) begin int1 24d0; int2 24d0; int3 24d0; end else begin int1 int1 {{12{din[11]}}, din}; // 符号扩展 int2 int2 int1; int3 int3 int2; end end assign dout int3; endmodule关键点采用符号扩展处理有符号数每级积分器位宽递增2.2 智能抽取控制器抽取模块需要精确的时钟域控制module decimator ( input clk_fast, input clk_slow, input [23:0] din, output reg [23:0] dout, output reg valid ); reg [3:0] counter; // 假设R16 always (posedge clk_fast) begin if (counter 4d15) begin dout din; valid 1b1; counter 4d0; end else begin valid 1b0; counter counter 1; end end endmodule注意实际工程中建议使用双时钟FIFO实现跨时钟域处理3. 梳状滤波器优化技巧三级梳状滤波器可采用流水线结构提升时序性能module comb_filter ( input clk, input [23:0] din, output [19:0] dout // 输出位宽优化 ); reg [23:0] delay_line [0:2]; always (posedge clk) begin delay_line[0] din; delay_line[1] delay_line[0]; delay_line[2] delay_line[1]; end // 三级差分运算 wire [23:0] stage1 din - delay_line[0]; wire [23:0] stage2 stage1 - (delay_line[0] - delay_line[1]); wire [23:0] stage3 stage2 - ((delay_line[0] - delay_line[1]) - (delay_line[1] - delay_line[2])); assign dout stage3[23:4]; // 截断低位减少资源消耗 endmodule性能对比表实现方式逻辑单元最大频率功耗直接实现320 LUTs150MHz38mW流水线版410 LUTs220MHz42mW资源共享280 LUTs120MHz35mW4. ModelSim仿真实战4.1 测试激励生成使用Python生成混合信号测试向量import numpy as np fs 50e6 # 采样率 t np.arange(0, 1e-3, 1/fs) sig np.sin(2*np.pi*250e3*t) 0.3*np.sin(2*np.pi*7.5e6*t) sig_quantized np.round(sig * 2047).astype(np.int16)4.2 波形调试技巧设置模拟量显示对总线信号右键选择Format → Analog关键信号标记add wave -color yellow /tb/uut/int_out add wave -color cyan /tb/uut/comb_out频谱分析脚本vcd2wav test.vcd -o output.wav -s 50MHz常见问题排查积分器溢出检查中间位宽是否足够时序违例在抽取边界添加寄存器频谱泄漏调整测试信号周期为采样间隔整数倍5. 高级优化策略5.1 位宽动态压缩在级间插入饱和处理模块module saturate #( parameter IN_WIDTH 24, parameter OUT_WIDTH 18 )( input [IN_WIDTH-1:0] din, output [OUT_WIDTH-1:0] dout ); wire sign din[IN_WIDTH-1]; wire overflow |din[IN_WIDTH-1:OUT_WIDTH] ^ sign; assign dout overflow ? {sign, {OUT_WIDTH-1{~sign}}} : din[OUT_WIDTH-1:0]; endmodule5.2 多相分解技术将抽取操作分散到梳状滤波阶段原始流程积分 → 抽取 → 梳状 优化流程积分 → 梳状(部分) → 抽取 → 梳状(剩余)FPGA资源占用对比Xilinx Zynq 7020优化手段LUT节约DSP48节约时序改善位宽压缩22%100%15%多相分解18%0%25%寄存器平衡5%0%40%在最近的一个软件无线电项目中采用三级CIC滤波器实现数字下变频时通过多相分解技术将系统功耗降低了28%同时满足200MHz的时序要求。

更多文章