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内部资源的算法,但其优点是算法简单清晰,代码简短,可大大节省滤波器设计时间,如果熟练的话,通常十几分钟就可以完成一个满足性能指标的滤波器的设计;此外本设计还有一个特点,就是该算法仅在一个时钟周期内就可以做完一次对输人数据的滤波处理,并得到一个输出。所以,这种滤波算法对那些高频高采样率的输入信号非常有效。
|