目录

  1. 引言
  2. CIC 滤波器基本概念
  3. CIC 滤波器的硬件实现
  4. Verilog CIC 滤波器实现
  5. 优化方案
  6. 参考资料

引言

级联积分-梳状(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)部分 组成,其数学模型如下:

  1. 积分部分(N 级积分器)y[n]=y[n−1]+x[n]
    • 累加输入数据,相当于 低通滤波器
  2. 梳状部分(N 级梳状滤波器)z[n]=y[n]−y[n−R]
    • 计算当前采样值与延迟 R 个采样点的差值,用于 补偿积分器的相位滞后
  3. 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


参考资料

  1. Richard Lyons – Understanding Digital Signal Processing
  2. Xilinx CIC Filter IP
  3. Intel FPGA Digital Signal Processing
  4. ASIC-World: Verilog Digital Filters