基于 FPGA 的五级积分梳状 CIC 滤波器 Verilog 设计
在数字信号处理领域,积分梳状(CIC)滤波器因其无需乘法器、结构规整且资源占用低的特点,在抽取和插值应用中极为常见。本文将探讨如何在 FPGA 上实现一个五级 CIC 滤波器,重点分析位宽扩展策略与溢出处理。
1. 系统架构与参数选择
本设计采用五级 CIC 滤波器结构。其基本组成包含积分器和梳状部分,中间通过延迟单元连接。在降采样过程中,滤波器两侧的延迟单元数量通常等于级数。
1.1 级数选择考量
硬件资源是 FPGA 设计中的关键约束。CIC 滤波器的输出位宽随级数增加而显著增长。经验表明,当级数超过 5 时,输出位宽往往超过 50 位,这会大量消耗 DSP 资源和寄存器。反之,若级数过低(如 1-2 级),滤波效果难以满足指标要求。综合仿真验证,4 至 5 级是平衡性能与资源的合理区间,因此本设计选定为 5 级。
1.2 位宽扩展与精度保护
CIC 滤波过程中的增益会导致数据位宽急剧膨胀。若直接在中间阶段截位,会引入量化噪声,影响系统信噪比。本设计中,输入中频信号经 ADC 采样后为 14 位,下变频处理后仍保持 14 位。为防止内部运算溢出并保证精度,我们将输入数据在进入滤波器前进行符号位扩展,将位宽提升至 40 位。这种处理方式既规避了中间过程的数据丢失,又确保了最终输出的有效性。
2. Verilog 实现细节
以下是基于 SystemVerilog 风格的五级 CIC 滤波器核心代码。为了便于综合,我们采用了生成块(generate block)来实例化各级延迟,而非使用不可综合的循环语句。
module cic_filter (
input wire clk,
input wire rst_n, // 低电平复位
input wire [13:0] din, // 14 位有符号输入
output reg [39:0] dout // 40 位输出
);
// 内部寄存器定义:每级积分/梳状路径需保存状态
// 此处简化展示积分器部分逻辑,实际需完整级联
reg [39:0] int_stage [0:4];
reg [39:0] comb_stage [0:4];
// 输入数据符号扩展:14 位转 40 位
wire [39:0] din_ext = {{26{din[13]}}, din};
// 第一级积分器
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
int_stage[0] <= 40'd0;
end else begin
int_stage[0] <= din_ext;
end
end
// 后续级联逻辑 (以第二级为例,实际需展开至第 5 级)
// 注意:实际工程中建议使用 generate 块自动展开以减少代码冗余
integer i;
always @(*) begin
for (i = 1; i < 5; i = i + 1) begin
int_stage[i] = int_stage[i-1] + din_ext;
end
end
// 梳状部分与输出
// 梳状滤波器通常涉及减法操作:y[n] = x[n] - x[n-R]
// 此处为示意结构,具体延迟 R 需根据抽取率设定
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
dout <= 40'd0;
end else begin
// 简化输出逻辑,实际应包含完整的梳状延迟线
dout <= int_stage[4];
end
end
endmodule
代码说明:
- 复位逻辑:采用异步复位,确保系统上电时所有累加器清零,避免初始状态错误。
- 位宽处理:
din_ext利用 Verilog 的拼接操作符{{...}}完成符号位扩展。这是防止负数溢出的关键步骤。 - 级联结构:虽然代码中使用了
for循环描述组合逻辑,但在实际综合时,建议将其改写为generate块或手动实例化模块,以确保时序收敛和资源映射符合预期。 - 资源优化:CIC 滤波器通常配合抽取器使用。在实际部署时,需注意时钟频率与数据吞吐率的匹配,必要时可在积分器后插入抽头计数器。
3. 仿真与验证思路
设计完成后,需通过仿真验证功能正确性。推荐使用 Matlab 建立数学模型,对比 Verilog 仿真波形。


