该篇是FPGA数字信号处理的第17篇,题接上篇,本文详细介绍多级CIC滤波器的特性、使用Verilog HDL设计多级CIC滤波器的方法。接下来两篇会介绍使用Quartus和Vivado的IP核设计CIC的方法。


多级CIC滤波器

根据上一篇可知,单级CIC滤波器的第一旁瓣电平衰减固定为13.46dB,且与滤波器的阶数无关。这个值不满足通常的阻带衰减要求,解决方法就是通过级联CIC滤波器来达到更大的阻带衰减。事实上实际应用中采用的都是多级CIC滤波器。

●频谱特性

使用MATLAB的FDATOOL工具观察多级CIC滤波器的频谱。

点击最左边的小按钮,中间选择CIC滤波器,右边级数(Number Of Sections)设置为4,表示四级CIC滤波器。这里设置为对25MHz的Fs进行5倍抽取。可以看到第一旁瓣的衰减约为48dB,大概提升了4倍。

不过增加CIC滤波器的级数也有不利的影响:通带衰减也随着增加。换句话说,对于给定的通带衰减要求,多级CIC滤波器的通带范围会随着级数的增加而不断变窄。滤波器的设计不仅要考虑阻带误差容限,还要考虑通带误差容限,设计多级CIC滤波器时要注意考虑这个问题。

其实,CIC滤波器大多应用于抗混叠抽取/内插滤波器,也是因为上述的原因。因为在抗混叠应用中,有效信号频带往往远小于采样率,因此总可以设计出同时满足通带和阻带要求的CIC滤波器。

●实现结构

理论上多级CIC滤波器可以直接由多个单级CIC滤波器级联得到,但根据Noble恒等式(“先进行抽取或者插值,再进行线性滤波”与“先进行线性滤波,再进行抽取或者插值”这两者是可以等价的),可以将多级CIC滤波器结构变换为工程中实际应用的Hogenauer CIC滤波器结构。与直接将多个单级CIC滤波器级联相比,更加节省资源,也能提高计算速度。

抽取滤波器结构如下所示:

内插滤波器结构如下所示:


FPGA设计与仿真

本设计在Vivado环境中完成并进行仿真。设计一个5阶的3级CIC滤波器,对输入数据进行5倍抽取。根据上文抽取滤波器的结构,使用Verilog HDL分别完成积分模块、抽取模块、梳状模块的设计。

●积分模块

由于积分运算会导致数据位宽扩展,首先需要确定积分器的输出数据位宽。可以借助如下公式,当输入信号为Bin位时,积分器最大可能输出位数为:

R为抽取/插值倍数,D为滤波器级数,N为滤波器阶数。本设计输入信号设置为10bit,则根据公式计算得到积分器输出数据为30Bits。设计的Verilog HDL代码如下:

`timescale 1ns / 1ps
//-----------------------------------------------------
// 多级CIC滤波器,积分器模块
//-----------------------------------------------------
module Integrated
(input clk, rst,input signed [9:0] Xin,output signed [29:0] Xout   //位宽由公式确定
);//每级积分器需要一个寄存器和一级加法器
wire signed [29:0] I1, I2, I3;
reg signed [29:0] d1, d2, d3;//第1级积分器
always @ (posedge clk or posedge rst)if (rst) d1 <= 'd0;else d1 <= I1;            //寄存
assign I1 = d1 + {{20{Xin[9]}},Xin};  //加法//第2级积分器
always @ (posedge clk or posedge rst)if (rst) d2 <= 'd0;else d2 <= I2;            //寄存
assign I2 = I1 + d2;          //加法//第3级积分器
always @ (posedge clk or posedge rst)if (rst) d3 <= 'd0;else d3 <= I3;            //寄存
assign I3 = I2 + d3;          //加法assign Xout = I3;              //积分器输出endmodule

该模块的RTL视图如下,可以清楚的看到使用了3级寄存器和3个加法器:

●抽取模块

该模块的设计与上一篇中单级CIC的设计非常相似,只是不需要求和,每5个时钟周期抽出一个作为输出即可。同时设置一个输出有效信号,供下一级梳状 模块使用。Verilog HDL设计代码如下:

`timescale 1ns / 1ps
//-----------------------------------------------------
// 多级CIC滤波器,抽取模块
//-----------------------------------------------------
module Decimate
(input clk,    //50MHz系统时钟input rst,    //复位信号input signed [29:0] din,   //采样数据,速率为50MHzoutput tvalid,             //输出数据有效信号output signed [29:0] dout  //5倍抽取后数据,速率为10MHz
);reg tvalid_reg;
reg [2:0] cnt;      //抽取控制计数器
reg signed [29:0] dout_reg;always @ (posedge clk or posedge rst)if (rst) begincnt <= 'd0; tvalid_reg <= 1'b0;dout_reg <= 'd0;endelse beginif (cnt == 4) begin   //每隔4个数据tvalid_reg <= 1'b1;dout_reg <= din;  //得到输出结果cnt <= 'd0;endelse begintvalid_reg <= 1'b0;cnt <= cnt + 1'b1;endendassign dout = dout_reg;
assign tvalid = tvalid_reg;endmodule

●梳状模块

该模块设计与积分模块很相似,只不过是由寄存器和减法器组成的。该模块的输出即为整个CIC抽取滤波器的输出数据,位宽可由如下公式确定:

符号意义与上文的公式相同,本例中经计算CIC滤波器的输出位宽最大为17Bits。Verilog HDL设计代码如下:

`timescale 1ns / 1ps
//-----------------------------------------------------
// 多级CIC滤波器,梳状模块
//-----------------------------------------------------
module Comb
(input clk,    //50MHz系统时钟input rst,    //复位信号input signed [29:0] din,   //采样数据,速率为50MHzinput tvalid,              //输入数据有效信号output signed [16:0] dout  //5倍抽取后数据,速率为10MHz
);reg signed [29:0] d1,d2,d3,d4;
wire signed [29:0] C1, C2, dout_reg;always @ (posedge clk or posedge rst)if (rst) begind1 <= 'd0; d2 <= 'd0; d3 <= 'd0; d4 <= 'd0;endelse beginif (tvalid) begin  //输入信号有效d1 <= din;     //数据寄存d2 <= d1;d3 <= C1;d4 <= C2;endendassign C1 = d1 - d2;       //减法器
assign C2 = C1 - d3;
assign dout_reg = C2 - d4;
assign dout = dout_reg[16:0];   //截取有效位输出endmodule

该模块的RTL视图如下,可以清楚的看到使用了3级寄存器和3个减法器(d1_reg仅作为对输入数据的缓存):

●综合与仿真

在顶层模块中分别实例化三个子模块,并连接起来。顶层模块的RTL视图如下所示,可以清楚地看到信号的处理流程:

为了更直观地观察效果,使用MATLAB生成一个0.25MHz+7.5Mhz的正弦混合信号,写入txt文件。编写testbench读取txt文件对信号抽取滤波,文件操作方法参考“Testbench编写指南(一)文件的读写操作https://blog.csdn.net/fpgadesigner/article/details/80470972 ”。

Vivado中仿真结果如下图所示:

可以看到输出数据速率为输入数据速率的1/5,每当有新数据输出时,tvalid信号会置高1个时钟周期。将信号设置为Analog显示方式:

可以看到经过抽取滤波后,0.25MHz的信号分量数据速率降低,但信号频率没有改变。而7.5MHz的信号分量被抗混叠滤波器滤除,仿真结果符合预期。

FPGA数字信号处理(十七)多级CIC滤波器Verilog设计相关推荐

  1. FPGA数字信号处理(十六)单级CIC滤波器Verilog设计

    该篇是FPGA数字信号处理的第16篇,选题为多速率信号处理系统中常用的CIC滤波器.本文将详细介绍使用Verilog HDL设计单级CIC滤波器的方法.接下来几篇会介绍多级CIC滤波器的Verilog ...

  2. m基于FPGA的积分梳状CIC滤波器verilog设计

    目录 1.算法描述 2.仿真效果预览 3.verilog核心程序 4.完整FPGA 1.算法描述 积分梳状滤波器,是指该滤波器的冲激响应具有如下形式: 其物理框图如图所示: 可见,CIC滤波器是由两部 ...

  3. FPGADesigner《FPGA数字信号处理系列》目录与传送门

    FPGA数字信号处理(1)数字混频(NCO与DDS的使用): https://blog.csdn.net/fpgadesigner/article/details/80512067 FPGA数字信号处 ...

  4. FPGA数字信号处理(21)多级半带(HB)滤波器设计

    本篇是FPGA数字信号处理的第21篇,上一篇介绍了半带滤波器的相关知识以及单级半带滤波器的设计方法.单级半带滤波器只能实现2倍抽取,本文将介绍可实现2^N倍抽取的多级半带滤波器的设计方法. 多级半带滤 ...

  5. FPGA数字信号处理(二)并行FIR滤波器Verilog设计

    该篇是FPGA数字信号处理的第二篇,选题为DSP系统中极其常用的FIR滤波器.本文将简单介绍FIR滤波器的原理,详细介绍使用Verilog HDL设计并行FIR滤波器的流程和方法.接下来几篇会介绍串行 ...

  6. FPGA数字信号处理(六)直接型IIR滤波器Verilog设计

    该篇是FPGA数字信号处理的第六篇,2-5篇介绍了DSP系统中极其常用的FIR滤波器.本文将简单介绍另一种数字滤波器--IIR滤波器的原理,详细介绍使用Verilog HDL设计直接型IIR滤波器的方 ...

  7. FPGA数字信号处理(三)串行FIR滤波器Verilog设计

    该篇是FPGA数字信号处理的第三篇,选题为DSP系统中极其常用的FIR滤波器.本文将在上一篇"FPGA数字信号处理(二)并行FIR滤波器Verilog设计" https://blo ...

  8. FPGA数字信号处理(七)级联型IIR滤波器Verilog设计

    该篇是FPGA数字信号处理的第七篇,上一篇介绍了直接型IIR滤波器的原理,详细介绍使用Verilog HDL设计直接型IIR滤波器的方法.本文会介绍如何用Verilog HDL设计级联型IIR滤波器. ...

  9. FPGA数字信号处理(20)单级半带(HB)滤波器设计

    本篇是FPGA数字信号处理的第20篇,前面介绍了多速率信号处理系统中用到的多速率FIR滤波器.CIC滤波器,本文将介绍另一种常用的半带滤波器(Half-Band Filter)的相关知识及设计方法.本 ...

  10. FPGA数字信号处理(十九)Vivado CIC IP核实现

    该篇是FPGA数字信号处理的第19篇,题接上篇,本文详细介绍使用Vivado自带的CIC IP核进行设计的方法.关于单级CIC滤波器.多级CIC滤波器的Verilog HDL设计以及Quartus中C ...

最新文章

  1. @所有人,20 万大奖待领取!【全民找“BUG”】活动,等你!
  2. Be the Winner(结论:反nim博弈)
  3. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
  4. 【Java学习笔记一】类和对象
  5. python数据分析环境搭建_教你零搭建Python数据分析环境
  6. 没有记录让grivdview显示
  7. Noip2011提高组 聪明的质监员
  8. 扇贝有道180918每日一句
  9. 项目-字典-更新字典分组
  10. 软件开发过程的一个实例
  11. Android屏幕、坐标系、Padding、Margin
  12. 《神经科学:探索脑》学习笔记(合集)
  13. LeetCode 101Pro
  14. sms 短信服务说明
  15. 服务器项目描述,项目服务器 2010 SP2 的描述
  16. c语言题目翻译,c语言专业词汇表达带翻译
  17. Java语言基础大合集
  18. 怎么把打开方式还原计算机程序,怎么把一个DAT用打开方式变成其他格式再还原成DAT文件...
  19. px4在ubuntu中make px4fmu-v2_default upload上传失败
  20. Ubuntu系统---安装搜狗输入法

热门文章

  1. 皮尔逊相关系数和斯皮尔曼相关系数(等级系数)与典型相关分析
  2. 用BT搜宝快速找种子
  3. java强势来袭 百战程序员Java基础入门教程,学编程就像玩游戏一样简单 ~
  4. Echarts地图的基本使用方法
  5. Java 定时任务表达式
  6. AutoJs学习-几个QQ群脚本(群引流\提取成员\加群友\加群)
  7. VaR、CoVaR、delta CoVaR计算方法综述 案例与代码
  8. 知识图谱——关系抽取
  9. java获取微信用户信息(UnionID)
  10. .gpx文件转geojson