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

FPGA数字信号处理(⼗六)单级CIC滤波器Verilog设计
该篇是FPGA数字信号处理的第16篇,选题为多速率信号处理系统中常⽤的CIC滤波器。本⽂将详细介绍使⽤Verilog HDL设计单级CIC滤波器的⽅法。接下来⼏篇会介绍多级CIC滤波器的Verilog设计、使⽤Quartus和Vivado的IP核设计CIC的⽅法。
CIC滤波器
根据上⼀篇可知,多速率信号处理系统中最主要的还是滤波器的设计:抽取和内插后不能产⽣频谱混叠、占⽤资源少、运算速度快。上⼀篇介绍了多速率FIR滤波器,与其相⽐,CIC(Cascaded Integrator Comb,积分梳状)滤波器运算速度快、占⽤资源少、⼯作频率⾼(因为CIC只使⽤加法器、减法器和寄存器),在多速率信号处理系统中应⽤更⼴泛。
●频谱特性
CIC本质上其实就是⼀种特殊的FIR滤波器(系数都为1)。本⽂不⽤理论推导的⽅式,从频谱图出发更直观地观察体会CIC滤波器的特点。我们使⽤MATLAB的FDATOOL⼯具观察CIC滤波器的频谱。
点击最左边的⼩按钮,中间选择CIC滤波器,右边级数(Number Of Sections)设置为1,表⽰单级CIC滤波器。这⾥设置为对25MHz的Fs进⾏25倍抽取。可以看到第⼀旁瓣的衰减为13.46dB(事实上这是⼀个固定的值,与CIC滤波器阶数⽆关),这个阻带衰减远远不能满⾜通常的设计要求,通过级联的⽅式可以提⾼阻带衰减,在下⼀篇介绍多级CIC滤波器时再详细说明。
●阶数与倍数的关系
CIC滤波器通常⽤于抗混叠抽取/内插滤波器(抽取与内插结构见本⽂开头的链接)。考虑抽取/内插的过程、CIC滤波器的特性(系数为1的特殊FIR滤波器)以及FIR滤波器的实现结构,就会发现,当CIC滤波器的阶数与内插/抽取的倍数相同时,其结构更利于FPGA实现。⽐如抽取时,只需要将D个数据组成⼀组,相加作为⼀个输出即可(即同时完成了滤波与抽取)。
结合下⾯的实例理解(设CIC滤波器阶数与抽取倍数都为5):
完整的抽取过程为:CIC作为抗混叠滤波,由于系数为1,y1=x1+x2+…+x5,y2=x2+x3+…+x6,等等;得到滤波输出后,再每隔4个点(即D-1个)取⼀个值输出,完成5倍抽取。⽽这个过程恰好等效于将原始数据每5个分为⼀组,每组的数据分别相加作为⼀个输出。由此可见:当CIC滤波器与抽取倍数相同时,可以⼤⼤节省资源、减⼩运算量。
同理,当使⽤CIC完成内插滤波时,设CIC滤波器阶数与内插倍数都为5:
完整的内插过程为:每两个数据之间插⼊4个零值(I-1个),完成5倍内插,之后使⽤CIC做低通滤波,由于CIC滤波器的系数为1,滤波后的插值0变为前⼀个原始数据值。这个过程恰好等效于直接在
两个数据之间插⼊前⼀个数据值。由此可见:当CIC滤波器与内插倍数相同时,也可以节省资源和运算。
韩城市象山中学CIC抽取滤波器的FPGA设计与仿真
使⽤50MHz采样率对0.25MHz的信号进⾏采样,由五阶CIC滤波器进⾏5倍抽取,将采样率降⾄10MHz。根据上⽂的介绍,设计的Verilog HDL代码如下:
`timescale 1ns / 1ps
//-------------------------------------------------------------
//  单级CIC抽取滤波器,滤波器阶数与抽取倍数相同
//-------------------------------------------------------------
明基笔记本电脑module SingleCIC_Decimation
(
input clk,    //50MHz系统时钟
input rst,    //复位信号
input signed [9:0] din,    //采样数据,速率为50MHz
output tvalid,            //输出数据有效信号
output signed [12:0] dout  //5倍抽取后数据,速率为10MHz );
reg tvalid_reg;
reg [2:0] cnt;      //抽取控制计数器
reg signed [12:0] sum, dout_reg;
always @ (posedge clk or posedge rst)
if (rst) begin
cnt <= 'd0; tvalid_reg <= 1'b0;
sum <= 'd0; dout_reg <= 'd0;
end
else begin
if (cnt == 4) begin  //每隔4个数据
tvalid_reg <= 1'b1;
dout_reg <= sum + din;  //得到输出结果
cnt <= 'd0;
sum <= 'd0;
end
else begin
tvalid_reg <= 1'b0;
sum <= sum + din;    //累加
cnt <= cnt + 1'b1;
end
end
assign dout = dout_reg;路网
assign tvalid = tvalid_reg;
endmodule
Vivado中仿真结果如下图所⽰:
中国节拍 震动世界可以看到输出数据速率为输⼊数据速率的1/5,每当有新数据输出时,tvalid信号会置⾼1个时钟周期。将信号设置为Analog显⽰⽅式:
可以看到经过抽取滤波后,数据速率降低,但信号频率没有改变。
c86CIC 内插滤波器的FPGA 设计与仿真
使⽤10MHz采样率对0.25MHz的信号进⾏采样,由五阶CIC滤波器进⾏5倍内插,将采样率提⾼⾄50MHz。根据上⽂的介绍,内插⽐抽取甚⾄更容易理解,设计起来也⾮常简单,设计的Verilog HDL代码如下:
Vivado中仿真结果如下图所⽰:
从结果看输⼊与输出是完全⼀样的,但实际意义不同,输⼊数据的速率为10MHz(每5个时钟周期输⼊⼀个数据),输出数据的速率为50MHz(每个时钟周期都输出⼀个数据)。`timescale 1ns / 1ps
//-------------------------------------------------------------
//  单级CIC 内插滤波器,滤波器阶数与抽取倍数相同
//-------------------------------------------------------------
module  SingleCIC_Interpolation
(
input clk,    //50MHz 系统时钟
input rst,    //复位信号
input signed [9:0] din,    //采样数据,速率为10MHz
output signed [9:0] dout  //5倍内插后数据,速率为50MHz
);
reg signed [9:0] dout_reg;
always @ (posedge clk or  posedge rst)
if  (rst)  dout_reg <= 'd0;
else  dout_reg <= din;
睿达资优教育assign dout = dout_reg;
endmodule

本文发布于:2024-09-22 08:32:30,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/8424.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:抽取   数据   速率   输出   信号   滤波   设计
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议