导言
IIR数字滤波器在许多范畴中都有着宽广的运用。与FIR数字滤波器比较,IIR数字滤波器能够用较低的阶数取得较高的挑选性,并且所用存储单元少,经济效率高。一个N阶IIR数字滤波器的体系函数为:
其线性常系数差分方程为:
用FPGA完结滤波的基本思想便是依据式(2)来完结的。假如知道了体系的输入序列(滤波器的输入),那么,只需依据所给的滤波器的目标,然后经过MATLAB仿真出系数矢量b和a,再选用递推算法求解差分方程,就能求出输出序列(滤波器的输出)。
1、滤波器的MATLAB规划
由于本文选用巴特沃斯滤波器,故需求在东西箱中调用的两个函数buttord和butter的调用格局为:
其间N为滤波器阶数;wp和ws别离为通带截止频率矢量和阻带截止频率矢量,单位为π,一般需求模仿频率目标对采样频率的一半作归一化;Rp和As别离为通带最大衰减和阻带最小衰减,单位dB;wc为3 dB边际频率矢量;b和a即为方程(2)中的系数矢量。
取得系数6和a之后,调用函数freqz(b,a,k,Fs)即可依照下式核算k点的复频率呼应矢量H:
然后便可绘出K点的幅频和相频特性曲线,以用于查看核算出的系数是否满意所需求的滤波器目标。
2、编写VHDL言语代码留意事项
乘加运算进程中的数据是有符号的二进制补码,一般在Xilinx ISE集成开发环境下树立的VHDL源文件头部都会有“use IEEE.STD_LOG-IC_UNSIGNED_ALL;”,如将其改为“use IEEE.STD_LOGIC_SIGNED.ALL;”即应该包含有符号数运算程序包,这样就能确保代码中的一切std_log-ic_vector型数据依照有符号二进制补码的规矩进行运算。
由于FPGA内部不能表明浮点数,因此只能用有限精度办法来完结数据的运算,即用数据(包含方程(2)的输入输出和系数)的整数部分(截去小数部分)作近似运算,且需求std_log-ic_vector数据类型来表明数据整数部分的二进制补码办法,但这样会发生截断误差。为了减小截断误差,应该将数据扩展恰当的倍数(一般是2L倍,L为正整数),以使小数部分能够忽略不计。扩展的倍数越大,截断误差就越小,得到的数据就越准确,可是,用来表明数据整数部分的std_logic_vector型数据长度会越大,这样就会占用越多的FPGA内部资源,因此,恰当的挑选数据扩展倍数是个要害。此外,各种数据转化为std_logic_vector型数据的长度选取至少应足以表明二进制补码(包含符号位)。若FPGA内部资源足够,能够经过添加std_logic_vector型数据长度来减小截断误差,进步运算精度。
一般由MATLAB仿真得到的系数b都远小于1,因此要恰当挑选正整数L。运算时可给系数b和a(a的第一个系数在外)同乘以2L,之后取整得到B=round(b*2L)和A=round(a*2L)
当时时刻输入的x(n)有时或许太小,为减小截断误差,应该挑选恰当的整数M,以给x(n)乘以2M,即给表明当时时刻输入的std_logic_vec-tor变量后补上M个‘0’。这样,得到的当时时刻输出y (n)便是扩展了2L+M倍的数据,应该除以2L+M才是当时时刻的实在输出。而VHDL言语不支持除法运算,故应选用截去结尾(L+M)位的办法来近似除法运算,这种做法相当于原始输出y除以2L+M之后截去小数部分。
在用示波器观测时,滤波器的输出波形或许带有许多大起伏尖利毛刺,然后严重影响了滤波器的功用。毛刺是由于组合电路的竞赛而使电路输出发生瞬时过错的现象,一般消除毛刺的办法是在详细的电路中加个锁存器。本文采纳另一优化办法,即在源代码中经过符号“《=”把输出信号赋给一个中心信号,再把中心信号作为输出,这相当于将信号作一个延时再输出。这种办法不需求知道详细的电路结构,也元需编写其它代码模块,因此优化更为简洁便利,并且优化作用十分好。
3、滤波器MATLAB规划的FPGA完结
下面以一个简略的低通滤波器规划实例来阐明从MATLAB规划到FPGA完结的整个进程。该低通滤波器的体系采样频率为40 MHz,通带截止频率为1 MHz,阻带截止频率为5 MHz,通带内最大衰减为3 dB,阻带内最小衰减为40 dB,而对相位不作要求。
而其硬件渠道上的首要器材有Xilinx公司的Spartan2E系列30万门FPGA芯片XC2S300E及PROM器材XC18V04,模数转化芯片则选用AD公司的AD9218,数模转化芯片选用AD公司的AD9765,别的,还有40 MHz晶振等。其体系框图如图1所示。
3.1 MATLAB规划
MATLAB规划的详细代码如下:
这样,在运转之后,便可得到:
图2是由系数B和A绘出的幅频特性曲线。
下面是递推算法的MATLAB描绘:
若以输入别离为0.5 MHz、3 MHz、6 MHz的正弦波来测验滤波器输出,则可得出如图3所示的仿真成果。可见,该系数B和A能够满意低通滤波器的技术目标。
3.2 VHDL代码顶层模块
图4是该MATLAB规划的顶层模块“top_lev-el”的示意图。图中,Gclk为FPGA大局时钟输入(来自40MHz晶振),AD9218clk和AD9765clk是由Gclk直通送往AD9218和AD9765的驱动时钟;AD9218data_out(9:0)是来自AD9218的10位滤波器输入信号,设计时可与中心模块“lpf”的输人data_in(9:0)相连;AD9765data_in(9:0)是送往AD9765的10位滤波器输出信号,可与中心模块“lpf”的输出data_out(9:0)相连。
图5给出了顶层模块的FPGA资源占用状况,由图5可见,该体系的资源占用率十分少。
3.3 VHDL代码中心模块
图6所示为用于信号处理的中心模块“lpf”。
在中心模块VHDL代码编写时应当留意句子“use IEEE.STD_LOGIC_SIGNED.ALL;”,并运用有符号数运算程序包。别的,在将规划好的整数系数B和A转化为二进制补码时,为便利起见,可运用程序包STD_LOGlC_SIGNED.vhd中的类型转化运算符CONV_STD_LOGIC_VECTOR()来接纳整数和转化后的长度等两个参数,然后回来STD_LOGIC_VECTOR型。
本体系的代码结构体architecture选用行为描绘办法,它类似于高档言语,其长处在于只需描绘清楚输入与输出的行为,而无需花费更多的时刻和精力重视规划功用的门级完结,由于这些完全能够由EDA东西归纳生成,因此可大大缩短开发规划的时刻。
中心模块“lpf”的VHDL言语源代码如下:
librarv IEEE;
在Modelsim上对本中心模块进行仿真及代码优化时,其测验鼓励依然能够别离选用0.5 MHz、3 MHz和6 MHz的正弦波。发生的办法有两种:一是选用ISE中集成的测验鼓励生成器HDL Bencher新建Test bench waveform型文件,并从中输入一周期正弦数据;二是将正弦数据
存为文本文件,然后以TEXTIO办法读取。限于篇幅,详细操作这儿不作介绍。
这种行为仿真(Simulate Behavioral Model)的波形与图3相同,可见,本模块源代码在功用上完全正确。但时序仿真(布局布线后仿真SimulatePost-Place&Route VHDL Model)的滤波器输出波形中的大起伏尖利毛刺严重影响了滤波器的功用。消除毛刺的详细做法是将进程中的终究一条信号赋值句子改为:
经过上述赋值句子的修正,再经优化之后进行时序仿真以及后边的硬件验证,就会发现,滤波器输出中的毛刺悉数被消除,波形滑润,可见优化作用十分好。
3.4 硬件渠道的验证
将该规划计划在硬件渠道上进行验证时,先给硬件渠道加电,再将程序经过JTAG线下载到PROM中,然后给AD9218数据输入端加正弦波信号,示波器CH1和CH2探针别离搭在AD9218数据输入端和AD9765数据输出端。这样。当信号在0.7 MHz频率以下变化时,两个通道的正弦波形相同,只要相位上有一点不同;当信号从0.7~1MHz频率规模变化时。通道CH2波形起伏有弱小减小;当信号从1~5 MHz频率规模变化时,通道CH2波形敏捷衰减为一条水平线。当CH1端别离加0.5 MHz、3 MHz和6 MHz的正弦波时,两通道显现的波形相同。
4、一般IIR数字滤波器的便利完结
现在总结一下一般IIR数字滤波器的规划及完结计划。
(1) 仿真系数
依据所定技术目标经过MATLAB核算出原始系数矢量b和a,然后挑选恰当的扩展倍数,并将系数扩展后取整得到B和A,再依据B和A仿真差分方程递推算法(留意函数floor()用来仿真VHDL代码中std_logic_vector型数据截去结尾几位,以仿真除法运算)以及频域和时域波形终究确认系数B和A (当时时刻输出所对应的系数A(1)=1)。
(2) 写VHDL代码
除了当时时刻所输出的所对应系数A(1)外,还应当将一切系数都转化为std_logic_vector型常量,一起,还要使初始化程序中一切时刻的输入输出变量都为0,然后再在进程process中写递推算法代码。
(3) Modelsim仿真
用行为级仿真可查看所写代码在功用上是否正确,时序仿真则用于调查布局布线后滤波器的输出波形。
(4) 验证
将程序下载到硬件渠道上作终究验证时,滤波器的输出不一定都有毛刺,但若输出有毛刺,则应将代码中终究的数据输出信号赋值给一中心信号再输出。
5、结束语
本文以低通滤波器为例,描绘了IIR数字滤波器从MATLAB规划到FPGA完结的整个进程,评论了规划中遇到的一些要害性问题,并在MAT-LAB及modelsim上作了不同层次的仿真,一起在硬件渠道上终究验证了滤波器规划的技术目标。
依据行为描绘办法的递推算法尽管不是最节约FPGA内部资源的算法,但其长处是算法简略明晰,代码简略,可大大节约滤波器规划时刻,假如娴熟的话,一般十几分钟就能够完结一个满意功用目标的滤波器的规划;此外本规划还有一个特色,便是该算法仅在一个时钟周期内就能够做完一次对输人数据的滤波处理,并得到一个输出。所以,这种滤波算法对那些高频高采样率的输入信号十分有用。
现在,用这一办法规划的带通滤波器已经在LuolanC长途无线导航接纳机的前端数字信号处理单元中用于滤除带外噪声,其规划的低通滤波器也在其它一些导航体系中用于信号解调。
责任编辑:gt