跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言算法

FPGA 实现 CIC 抽取滤波器

CIC 滤波器作为无乘法器的线性相位 FIR 滤波器,广泛应用于数字下变频与上变频场景。文章阐述了其基本原理与三种工作模式,详细推导了最大位宽计算公式,分析了级数对阻带抑制与通带衰减的影响。同时提供了基于 Verilog 的 FPGA 抽取滤波器实现代码,包含积分器、降采样逻辑及梳状器设计,并结合仿真波形验证了不同抽取因子下的输出效果,为硬件资源优化提供参考。

晚风告白发布于 2026/3/27更新于 2026/7/2936 浏览

一、什么是 CIC 滤波器

(一)CIC 滤波器原理和结构

CIC(级联积分梳状)滤波器是一种高效的多速率信号处理滤波器,属于无乘法器的线性相位 FIR 滤波器。常用于数字下变频(DDC)和数字上变频(DUC)中。其主要优点是不需要乘法器,结构简单,仅由加法器、减法器和寄存器组成。

CIC 滤波器有三种工作模式:

  • 抽取滤波器:数据流由高速输入变为低速输出,主要应用于数字下变频及降低采样率的系统。 CIC 抽取滤波器结构图
  • 单纯滤波器:数据流速率不变,积分器和梳状器都工作在同一个采样率下,主要应用于移动平均滤波。
  • 插值滤波器:数据流由低速输入变为高速输出,主要应用于数字上变频及提升采样率的系统。 CIC 插值滤波器结构图

CIC 滤波器主要由积分器和梳状器组成。 积分器状态方程如下: CIC 积分器状态方程

梳状器状态方程如下: CIC 梳状器状态方程

其中 N 为抽取倍数(抽取因子)。例如输入信号采样率为 100MHz,如果抽取因子为 10,那么降采样之后的信号速率就是 10MHz,即 F_out = F_in / 抽取因子。

由于单级 CIC 的第一旁瓣阻带衰减是固定的 13.46dB,无法很好地抑制旁瓣,因此可以通过级联的方式来提升抑制效果。根据实际旁瓣抑制需求可以实现多级 CIC。

可以把 CIC 滤波器想象成一个多层过滤系统:

  • 一级(N=1):像一层纱网,能过滤掉一些大颗粒杂质。
  • 二级(N=2):在纱网后面再加一层更密的滤布,过滤效果更好。
  • ...
  • 五级(N=5):相当于经过了五层不同精度的过滤,最后得到的液体非常纯净。

级数 N 越高,滤波效果越好,但系统的资源消耗和位宽增长也会相应增加。在数字下变频等应用中,N=5 或 N=6 是非常常见的选择。

假设数据以 Fs(假设 100MHz)的频率输入滤波器,数据先通过 3 级的积分滤波器一直进行累加。假如希望得到 Fs 的 10 分频的采样数据,就将积分滤波器的最后一级输出以 Fs/N(10MHz)的频率进入梳状滤波器。梳状滤波器其实是微分运算,即当前值减去上一次的值。经过 3 次的梳状滤波器,最后 1 级的结果即为抽取的数值。 CIC 三级积分梳状结构

(二)最大位宽计算

CIC 滤波器中存在加减法操作,需关注计算过程中信号位宽的问题。由于积分器的累加效应,内部数据位宽会随着级数 N 线性增长。

最大位宽计算公式如下: B_max = B_in + N * ceil(log2(R * M))

ceil()–向上取整函数

  • B_in:输入位宽
  • R:抽取/插值因子
  • M:差分延迟(通常为 1)

举个例子:假设 B_in=16 位,R=64,M=1,ceil(log2(64)) = 6。

  • 当 N=3 时,最大位宽 = 16 + 3*6 = 34 位
  • 当 N=5 时,最大位宽 = 16 + 5*6 = 46 位
  • 当 N=6 时,最大位宽 = 16 + 6*6 = 52 位

可以看到,级数每增加一级,位宽就会显著增加,消耗更多的寄存器、逻辑和布线资源。

级数 N 对滤波器性能的影响:

  1. 阻带抑制:这是增加级数最主要的目的。N 越高,阻带衰减越大,滤波器对带外信号的抑制能力就越强。这对于抽取器来说,意味着能更好地防止混叠;对于插值器来说,意味着能更好地抑制镜像。
  2. 通带衰减:这是增加级数带来的主要代价。N 越高,通带内的衰减也越严重。为了补偿这种通带衰减,通常需要在 CIC 滤波器后面级联一个补偿 FIR 滤波器。

二、CIC 抽取滤波器 FPGA 实现

(一)Verilog 代码

以下 CIC 滤波器代码参数:级数 3,抽取因子 16。

`timescale 1ns /1ps
module cic_down_sample#(
    parameter DATA_IN_WIDTH = 8,
    parameter DATA_OUT_WIDTH = 8,
    parameter CIC_FACTORS = 16, // 抽取因子
    parameter MAX_WIDTH = 20 // 最大位宽
)(
    input clk,
    input rstn,
    input signed[DATA_IN_WIDTH-1:0] data_in,
    input data_in_valid,
    output signed[DATA_OUT_WIDTH-1:0] data_out
);

wire signed[MAX_WIDTH-1:0] add_data_0;
wire signed[MAX_WIDTH-1:0] add_data_1;
wire signed[MAX_WIDTH-1:0] add_data_2;
reg signed[MAX_WIDTH-1:0] data_0;
reg signed[MAX_WIDTH-1:0] data_1;
reg signed[MAX_WIDTH-1:0] data_2;
reg [4:0] cnt_div;
reg sample_flag; // 采样标志

reg signed[MAX_WIDTH-1:0] comb_in;
wire signed[MAX_WIDTH-1:0] add_comb_0;
wire signed[MAX_WIDTH-1:0] add_comb_1;
wire signed[MAX_WIDTH-1:0] add_comb_2;
reg signed[MAX_WIDTH-1:0] comb_0;
reg signed[MAX_WIDTH-1:0] comb_1;
reg signed[MAX_WIDTH-1:0] comb_2;

// 积分器
always @(posedge clk or negedge rstn) begin
    if(!rstn) begin
        data_0 <= 'd0;
        data_1 <= 'd0;
        data_2 <= 'd0;
    end else begin
        data_0 <= add_data_0;
        data_1 <= add_data_1;
        data_2 <= add_data_2;
    end
end
assign add_data_0 = {{12{data_in[7]}},data_in} + data_0;
assign add_data_1 = add_data_0 + data_1;
assign add_data_2 = add_data_1 + data_2;

// 降采样处理
always @(posedge clk or negedge rstn) begin
    if(!rstn) begin
        cnt_div <= 'd0;
    end elseif(cnt_div == CIC_FACTORS -1) begin
        cnt_div <= 'd0;
    end else begin
        cnt_div <= cnt_div + 1;
    end
end

always @(posedge clk or negedge rstn) begin
    if(!rstn) begin
        sample_flag <= 1'b0;
    end elseif(cnt_div == CIC_FACTORS -1) begin
        sample_flag <= 1'b1;
    end else begin
        sample_flag <= 1'b0;
    end
end

// 梳状器
always @(posedge clk or negedge rstn) begin
    if(!rstn) begin
        comb_in <= 'd0;
    end elseif(sample_flag) begin
        comb_in <= add_data_2;
    end
end

always @(posedge clk or negedge rstn) begin
    if(!rstn) begin
        comb_0 <= 'd0;
        comb_1 <= 'd0;
        comb_2 <= 'd0;
    end elseif(sample_flag) begin
        comb_0 <= comb_in;
        comb_1 <= add_comb_0;
        comb_2 <= add_comb_1;
    end
end

assign add_comb_0 = comb_in - comb_0;
assign add_comb_1 = add_comb_0 - comb_1;
assign add_comb_2 = add_comb_1 - comb_2;
assign data_out = add_comb_2[19:12];

endmodule

顶层文件:

`timescale 1ns /1ps
module cic_top(
    input sysclk,
    input sysrstn
);

wire m_axis_data_tvalid;
wire signed[7:0] m_axis_data_tdata;
wire signed[7:0] data_out;

dds_compiler_0 dds(.aclk(sysclk),
                   .m_axis_data_tvalid(m_axis_data_tvalid),
                   .m_axis_data_tdata(m_axis_data_tdata));

cic_down_sample#(.DATA_IN_WIDTH(8),.DATA_OUT_WIDTH(8),.CIC_FACTORS(16),.MAX_WIDTH(20))u_cic_down_sample(
    .clk(sysclk),
    .rstn(sysrstn),
    .data_in(m_axis_data_tdata),
    .data_in_valid(m_axis_data_tvalid),
    .data_out(data_out)
);

endmodule

(二)仿真分析

级数:3,抽取因子:16 仿真波形图

级数:3,抽取因子:8 仿真波形图

可以看到抽取因子越小或级数越小时,CIC 抽取滤波器输出波形约平滑,因此必要时需级联一个补偿 FIR 滤波器。

目录

  1. 一、什么是 CIC 滤波器
  2. (一)CIC 滤波器原理和结构
  3. (二)最大位宽计算
  4. 二、CIC 抽取滤波器 FPGA 实现
  5. (一)Verilog 代码
  6. (二)仿真分析
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 低空经济一网统飞无人机巡检系统落地方案
  • Whisper 模型国内镜像源汇总与快速下载方案
  • Ubuntu 24.04 LTS ufw 防火墙完整配置指南
  • Docker 部署 AI 量化分析平台与波浪理论实战指南
  • Flutter 三方库 wasm_interop 的鸿蒙化适配指南
  • FastGPT 集成 MCP 协议实现工具增强型智能体构建
  • MCP AI Copilot 考试核心题型与备考策略解析
  • Xilinx PCIe IP 核详解、FPGA 实现及仿真全流程(Virtex-7 Gen3)
  • JVS-APS 开源智能排产系统:算法驱动与低代码融合
  • OpenClaw 开源 AI 智能体框架:技术架构、部署与安全分析
  • 机器人避障系统核心技术解析:从传感器到算法实现
  • 字节跳动 AI 原生 IDE Trae 安装与使用指南
  • 黑客、骇客、白客与红客的定义及工作区别解析
  • 传统线程同步通讯技术实现
  • AirSim 无人机仿真入门:实现起飞与降落
  • 统信 UOS V2500 服务器 OpenClaw AI Agent 安装部署指南
  • FPGA 入门实战:利用 LED 实现 2 选 1 多路选择器
  • 云电脑与传统 PC:3A 游戏与 AI 训练成本及性能对比
  • Llama-3.2-3B 部署案例:Ollama 镜像免配置与 Mac M1/M2 原生运行实测
  • 使用 Frontend-Design Skill 增强大模型前端设计能力

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online