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

FPGA 实现 CIC 抽取滤波器

CIC 滤波器是无乘法器的线性相位 FIR 滤波器,广泛应用于数字下变频与上变频系统。文章阐述了其积分梳状结构原理、最大位宽计算公式,并提供了基于 Verilog 的 FPGA 抽取实现代码及仿真波形分析。重点讨论了级数对阻带抑制与通带衰减的影响,以及资源消耗与性能平衡策略。

DevStack发布于 2026/4/10更新于 2026/7/2840 浏览

一、什么是 CIC 滤波器

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

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

CIC 滤波器有三种工作模式:抽取滤波器(最常用)、插值滤波器和单纯滤波器。

  • 抽取滤波器:数据流由高速输入变为低速输出,主要应用于数字下变频以及降低采样率的系统中。其结构如下图所示:

CIC 抽取滤波器结构

  • 单纯滤波器:数据流速率不变,积分器和梳状器都工作在同一个采样率下,主要应用于移动平均滤波。

  • 插值滤波器:数据流由低速输入变为高速输出,主要应用于数字上变频以及提升采样率的系统中。其结构如下图所示:

CIC 插值滤波器结构

前面提到 CIC 滤波器主要由积分器和梳状器组成,积分器状态方程如下:

积分器状态方程

梳状器状态方程如下:

梳状器状态方程

其中 N 为抽取倍数(抽取因子)。例如输入信号采样率为 100MHz,如果抽取因子为 10,那么降采样之后的信号速率就是 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 滤波器中计算存在加减法操作,因此我们需要考虑到计算过程中信号位宽的问题,这是 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

仿真波形 1

级数:3,抽取因子:8

仿真波形 2

可以看到抽取因子越小或级数越小时,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

更多推荐文章

查看全部
  • 逻辑派 FPGA-G1 开发板 6 层 PCB 全流程设计总结
  • 链表分割:以给定值 x 为基准划分链表
  • macOS Sequoia 与 Tahoe 功能性能对比及升级教程
  • OpenCore Legacy Patcher 旧款 Mac 升级 macOS 完整教程
  • Android 11.0 Framework 核心原理与系统启动流程解析
  • Vivado 2019.2安装破解教程:零基础手把手指南
  • Visual C++ 运行库缺失问题排查与修复指南
  • Sudachi 模拟器架构解析与跨平台实现
  • C++ 实现 MCP 客户端架构与核心机制解析
  • OpenClaw 自托管 AI 网关安装部署全流程指南
  • 分布式光纤声波传感(DAS)无人机入侵探测技术与应用
  • 宝兰德 BES 中间件部署与启动实战:从环境搭建到应用上线
  • QUEST 一体机 SideQuest 安装 APK 与 OBB 数据包教程
  • Vivado 烧录 Flash 时出现 ILA 缺失警告 [Labtools 27-3413] 解决方法
  • N46Whisper 云端日语语音转字幕工具使用指南
  • Figma Make 实测:AI 驱动的前端代码生成能力评估
  • 申请 Hugging Face 访问令牌(以 Meta-Llama-3.1-8B-Instruct 为例)
  • CyberStrikeAI:AI 驱动的自主渗透测试平台深度解析
  • Pico 4XVR 1.10.13 安装与使用指南
  • 机器人正运动学与逆运动学基础

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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