目录
引言
级联积分-梳状(Cascaded Integrator-Comb, CIC)滤波器是一种 无乘法(Multiplier-Free) 的数字滤波器,广泛应用于 数字下变频(DDC)、数字上变频(DUC)、采样率变换(Interpolation & Decimation) 以及 FPGA/ASIC 低功耗信号处理 领域。
CIC 滤波器的 最大优势 在于:
- 不需要乘法运算,仅由 加法器和寄存器 组成,适用于 FPGA 硬件加速。
- 适用于 高倍率抽取(Decimation)和插值(Interpolation) 的应用场景,如 无线通信和软件无线电(SDR)。
本文介绍 Verilog 实现 CIC 滤波器的方法,并提供 完整代码示例。
CIC 滤波器基本概念
3.1 CIC 滤波器的数学模型
CIC 滤波器由 积分(Integrator)部分 和 梳状(Comb)部分 组成,其数学模型如下:
- 积分部分(N 级积分器)y[n]=y[n−1]+x[n]
- 累加输入数据,相当于 低通滤波器。
- 梳状部分(N 级梳状滤波器)z[n]=y[n]−y[n−R]
- 计算当前采样值与延迟 R 个采样点的差值,用于 补偿积分器的相位滞后。
- CIC 滤波器的抽取(Decimation)
- 抽取因子 R 决定数据的 降采样倍数,输出速率为 输入速率的 1/R。
- 适用于 数字下变频(DDC),如 无线电信号处理。
3.2 CIC 滤波器的级联结构
CIC 滤波器通常 串联多个积分器和梳状滤波器,形成 N 级(N-Stage)CIC 结构。
CIC 3 级滤波器结构示意图(R=2):
输入 → [积分器1] → [积分器2] → [积分器3] → ↓R(降采样) → [梳状1] → [梳状2] → [梳状3] → 输出
- 积分器 累加输入信号,实现低通滤波。
- 梳状滤波器 进行差分运算,补偿积分器的相位滞后。
- 抽取(降采样) 以因子 R 进行采样率降低。
3.3 CIC 滤波器的资源优化
- 移位运算代替乘法,降低硬件复杂度。
- 流水线优化,提高数据吞吐量。
- 寄存器复用,降低存储开销。
Verilog CIC 滤波器实现
4 级 CIC 滤波器(R=2, N=4)Verilog 代码
module cic_filter #(
parameter WIDTH = 16, // 数据位宽
parameter STAGES = 4, // 级数
parameter DECIMATION = 2 // 抽取因子 R
)(
input clk,
input rst,
input signed [WIDTH-1:0] din, // 输入数据
output reg signed [WIDTH-1:0] dout // 输出数据
);
// 积分器部分
reg signed [WIDTH+STAGES-1:0] integrator [0:STAGES-1];
// 梳状部分
reg signed [WIDTH+STAGES-1:0] comb [0:STAGES-1];
reg signed [WIDTH+STAGES-1:0] delay [0:STAGES-1];
// 计数器控制抽取
reg [3:0] decimation_counter;
integer i;
always @(posedge clk or posedge rst) begin
if (rst) begin
// 清零所有寄存器
for (i = 0; i < STAGES; i = i + 1) begin
integrator[i] <= 0;
comb[i] <= 0;
delay[i] <= 0;
end
decimation_counter <= 0;
dout <= 0;
end else begin
// 积分器部分 (累加器)
integrator[0] <= integrator[0] + din;
for (i = 1; i < STAGES; i = i + 1)
integrator[i] <= integrator[i-1] + integrator[i];
// 抽取操作
if (decimation_counter == DECIMATION-1) begin
decimation_counter <= 0;
// 梳状滤波器部分
comb[0] <= integrator[STAGES-1] - delay[0];
delay[0] <= integrator[STAGES-1];
for (i = 1; i < STAGES; i = i + 1) begin
comb[i] <= comb[i-1] - delay[i];
delay[i] <= comb[i-1];
end
// 输出结果
dout <= comb[STAGES-1];
end else begin
decimation_counter <= decimation_counter + 1;
end
end
end
endmodule
优化方案
1. 流水线优化
- 增加寄存器,使 累加器和梳状滤波器并行计算,提高时钟频率。
2. 移位运算替代乘法
- CIC 滤波器无乘法,但在高阶设计中可以优化 数据存储格式,减少寄存器使用。
3. 采用 FPGA DSP 资源
- 使用 FPGA 结构化 DSP 资源 进一步优化 CIC 计算效率。
4. 可变抽取因子
- 设计可变抽取因子 R,适用于 动态降采样率应用。
input [3:0] R; // 动态调整抽取因子
if (decimation_counter == R-1) begin
decimation_counter <= 0;
...
end
发表回复