always@ (posedgeclk ) begin
if(!rst_n )//复位时,全部寄存器变量清零 begin x1<=16'b0; x2<=16'b0; x3<=16'b0; x4<=16'b0; x5<=1'b0; x6<=30'b0; x7<=32'b0; y_out<=32'b0; end else/ begin
x1<=in_a[31:16];//截取16位被乘数, x2<=in_b[31:16];//截取16位乘数
x3<=(x1[15]==0)?x1:{x1[15],~x1[14:0]+1'b1}; //据最高位判断是否为负数, //若负数则把补码转成原码
x4<=(x2[15]==0)?x2:{x2[15],~x2[14:0]+1'b1};
x5<=x3[15]^x4[15];//两数符号位相异或,得到乘积的符号位 x6<=x3[14:0]*x4[14:0];//两数的数据位相乘
x7<={x5,x6,1'b0}; //乘积由1位符号位和30位数据位及1位无关组成; //因为是小数,往低位生长,所以无关位放置最低位 y_out<=(x7[31]==0)?x7:{x7[31],~x7[30:0]+1'b1}; end end endmodule
25
小数乘法器的仿真结果如下图2-14所示:
图2-14小数乘法器仿真结果
全过程可以看成:把32位的小数截取高16位左移16位,变为16位整数相乘得到32位整数乘积后,右移32位调整无关位的位置得到32位小数,这样就可以完成早期程序中的小数乘法功能,然后来进行设计中的FPGA数字滤波器设计的优化。
在先前的设计中我们使用Matlab进行综合仿真设计,并且借助FDAtool设计出滤波器。在Quartus 2的仿真中我们发现程序无法正常的完成运行,究其原因在于小数乘法器的问题。在原来的滤波器中需要对每一个参数进行单独设置,这样会使得程序占有巨量的篇幅大大的增加了工作量和容错度。于是,我们需求另外一种方法来解决这个问题,后来我们研究了移位算法。利用移位来把小数运算转换成整数运算,这样我们的11阶滤波器程序大大减少篇幅同时也增加了程序的可读程度和稳定程度。
3 滤波器仿真滤波 3.1设置混合信号
在Matlab中进行我们设计过的FIR数字滤波器的仿真,首先我们启动Matlab中的Simulink,启动方式是直接在文本窗口中输入命令Simulink,或者点击Matlab中的快速启动按钮。
26
图2-15 Simulink工具窗口图
本论文模拟一个混合信号正弦波信号他包涵了10,30,60(Hz)的信号,在Matlab模拟出来是这样一个信号: Fs=200; t=(1:200)/Fs; x1=sin(2*pi*t*10); x2=sin(2*pi*t*30); x3=sin(2*pi*t*60); X= x1+ x2+ x3; plot(t,X);
title('杨成杰本科毕业设计混合正弦波信号X(t)-滤波前'); grid; Module end
//整个模拟滤波信号结束 //使用软件仿真出待滤波信号
混合信号设定之后利用Matlab工具进行模型仿真。
27
图2-16 Matlab中模拟的混合信号
然后在程序中设置好仿真模型如下图(2-17)
图2-17 Simulink模型仿真
28
3.2设置仿真参数
设置好仿真参数,对各个信号进行单独修改和设置如下图(2-18):
图2-18 sin(2*pi*30*t)参数模块
在主设置中,振幅(Amplitude)设置为1, 频率(Frequency)设置为30Hz, 输出混合为实常量,样本时间为1/1000,
采样帧数设置为1帧,以下不同频率信号同理设置:
图2-19 sin(2*pi*10*t)参数模块
29