基于FPGA的五级积分梳状(CIC)滤波器设计
1. 系统概述
在数字信号处理领域,积分梳状(CIC)滤波器因其结构简单、无需乘法器且效率高等特性,广泛应用于抽取和插值场景。本次设计针对 FPGA 平台实现了一个五阶 CIC 滤波器。
CIC 滤波器的基本结构包含积分器和梳状滤波器两部分,通常位于降采样或升采样的前后。由于 CIC 滤波器在运算过程中会产生较大的增益,导致中间信号的位宽显著增加。若直接对中间信号进行截位,会引入量化噪声,影响系统性能。因此,设计中首先对输入信号进行位宽扩展。
本设计输入的中频信号经 ADC 采样后为 14 位,下变频处理后仍保持 14 位。为确保中间计算精度并防止溢出,我们将 CIC 滤波器的输入位宽扩展至 40 位。
2. 级数选择与资源权衡
CIC 滤波器的级数直接影响输出位宽和硬件资源占用。经验证,当级数大于 5 时,输出位宽可能超过 50 位,这将大量消耗 FPGA 的逻辑资源和存储单元。反之,若级数过小(如 1 级或 2 级),则无法达到预期的滤波滚降效果。综合仿真分析与资源评估,选择 5 级结构在性能与资源之间取得了较好的平衡。
3. Verilog 实现细节
以下是基于 SystemVerilog 实现的五级 CIC 滤波器核心模块。该设计采用了并行流水线结构,确保时钟频率下的稳定运行。
module cic_filter_5stage (
input wire clk,
input wire rst_n,
input wire [13:0] din,
output reg [39:0] dout
);
// 内部寄存器定义
// 积分器部分延迟链
reg [39:0] int_reg [0:4];
// 梳状滤波器部分延迟链
reg [39:0] comb_reg [0:4];
// 输入数据符号扩展
wire [39:0] din_ext = {26{din[13]}, din};
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
for (integer i = 0; i < 5; i = i + 1) begin
int_reg[i] <= 40'd0;
comb_reg[i] <= 40'd0;
end
dout <= 40'd0;
end else begin
// 积分器级联
int_reg[0] <= din_ext;
for (integer i = 1; i < 5; i = i + 1) begin
int_reg[i] <= int_reg[i - 1] + int_reg[i];
end
// 梳状滤波器级联 (差分操作)
comb_reg[0] <= int_reg[4];
for (integer i = 1; i < 5; i = i + 1) begin
comb_reg[i] <= comb_reg[i - 1] - comb_reg[i];
end
dout <= comb_reg[4];
end
end
endmodule
上述代码中,int_reg 数组实现了积分器的累加功能,comb_reg 数组实现了梳状滤波器的延迟相减功能。注意在实际应用中,需根据具体的抽取率(R)调整延迟单元的数量,此处展示的是基础架构。输入数据的符号位扩展({26{din[13]}, din})是防止负数溢出的关键步骤。
4. 仿真与验证
在实际部署前,建议结合仿真工具对滤波器的频谱响应进行测试。重点观察通带平坦度、阻带衰减以及输出位宽是否满足后续处理模块的需求。通过波形分析,可以确认滤波器是否有效滤除了不需要的频率成分,同时保证了信号完整性。


