本文所采用的是定点压缩结构。该结构相对于全精度无压缩结构,能够大大减少FPGA内部资源Xtreme DSP Slices和块RAM的使用,而相对于块浮点型,可灵活调节压缩比。定点压缩结构的压缩比例表(Scale_SCH)完全由用户自定义得到。压缩比例是按照1、2、4或者8对每一阶进行压缩,即对应于分别向右移位0、1、2或者3。如果压缩不充分,则蝶形输出结果会超出其动态范围,引起数据溢出。对于Burst I/O结构,Scale_SCH的表示方法:对于每一阶的压缩比都由指定的一个2bits的数表示,零阶的2bits数为最低位,具体形式为[⋯N4,N3,N2,N1,N0],每一个2bits数分别对应着相应阶数的压缩比。例:对于基4结构,数据转换长度N=1024,Scale_SCH=[01 10 00 1110]则表示对阶0右移位2,对阶1右移位3,对阶2右移位0,对阶3右移位2,对阶4右移位1。经验总结(可以防止产生数据溢出):对于1024点的基4,Burst I/O结构,Scale_SCH=[10 10 10 10 11];而对于1024点的基2结构,Scale_SCH=[01 01 01 01 01 01 01 01 01 10]。
对于流水线,Streaming I/O结构,把临近的一对基2阶组在一起,即阶0和阶1为组0,阶2和阶3为组1,等等。Scale_SCH的表示方法:对于每一组的压缩比都由指定的一个2bits的数表示,零组的2bits数为最低位,具体形式为[⋯N4,N3,N2,N1,N0],每一个2bits数分别对应着相应组的压缩比,表示同组内的两个基2阶有相同的压缩比。例:数据长度N=1024,Scale_SCH=[10 10 00 01 11]表示对组0(阶0和阶1)右移位3,对组1(阶2和阶3)右移位1,对组2(阶4和阶5)没有移位,对组3(阶6和阶7)右移位2,对组4(阶8和阶9)右移位2。若变换长度N不是4的幂次方的时候,最后一组只包含一个基2阶,只能用00或者01表示。经验总结(可以防止产生数据溢出):N=512时,Scale_SCH=[01 10 10 10 11];N=1024时,Scale_SCH=[10 10 10 10 11]。
压缩比例Scale_SCH的位宽,对于流水线,Streaming I/O结构和基4,Burst I/O结构,为2*ceil(0.5*log2(N));对于基2,Burst I/O结构和基2 Lite Burst I/O结构,为2* log2(N),其中N为转换数据长度。
3 FFT IP核的仿真验证
通过例化调用Xilinx IP核来实现一个512点、数据位宽和相位因子位宽都为16bit的FFT算法模块,时钟频率为50MHz(时钟频率越高,可以获得更高的复用倍数,节省更多的资源面积),采用流水线,Streaming I/O和定点压缩结构,完成在中低端FPGA上的调试,验证其可靠性和可行性。为了方便验证FFT IP核功能的正确性:以零开始计数,在每个时钟上升沿到来时,进行加一运算得到的数据,分别作为其输入信号的实部和输入信号的虚部。Scale_SCH=[01 10 10 10 11],在ISE10.1中建工程,例化调用Xilinx FFT IP核,然后利用ModelSimSE6.5进行仿真,其仿真时序如图2所示。
时序验证方面:可以看出整个时序在实现中是完全正确的。从时序图可以看出:busy信号高的的时候表明FFT IP核正在进行FFT运算,busy信号拉低后表明运算已经结束,要向外输出FFT运算结果;edone信号在done信号之前一个周期到达;此时,done信号拉高一个周期,表明FFT运算完成;而且,由于进行的是512点的FFT运算,所以,每间隔512个时钟周期,edone和done信号都会拉高一次;rfd信号一直拉高,表明输入数据一直传送到FFT IP核的输入端口,跟采用流
水线,Streaming I/O结构,可以进行连续数据处理是一致的;dv信号一直为高,表明输出的信号一直有效。
功能验证方面:根据FFT IP核在流水线,Streaming I/O结构下,间隔每一帧数据需要三帧才能输出计算结果的特点,可以推算出上面仿真图形里面输出结果时刻对应着[94:605]+ [94:605]*j的FFT输出结果。把Matlab里面通过仿真得到的结果,按照Scale_SCH的比例进行压缩,与上面得到的结果是一致的,表明了FFT IP核是正常工作的。
4 结语
本文主要通过对FFT IP核的整体测试,验证FFT算法在中低端FPGA中的可行性和可靠性。在选用流水线结构实现FFT的基础上,采用定点压缩结构,减少了数据的读取和处理时间,更好的满足了FFT处理数据的需要。
|