图4 蝶形运算单元
数据格式选择定点16位二进制补码。设计时必须考虑乘法器速度,将会直接影响整个FFT处理单元的运算速度,该设计的乘法器利用QuartusⅡ开发软件中所提供的宏单元生成。乘法器的两输入均为16位,输出32位。因为乘法器中带有旋转因子项.所以乘法运算后不应改变输入的幅值即乘法器的输出仍为16位,因此要对输出数据进行截取,截取其中16位作为加(减)法器的输入。
在FFT处理单元中存储器是必不可少的单元,蝶形运算数据的输入输出和中间结果的存储都要经过存储器,因此它们的频繁读写操作对整个FFT处理速度影响较大。图2中存储器A和存储器B由RAM和状态机组成,各自分别具有数据总线、地址总线和触发时钟。存储器A接收外部输入数据,存储器B是中间结果单元,除第一级蝶形运算外每级数据的输入输出均经过该存储器。在两块存储器和蝶形运算模块之间加入两个数据控制器配合工作,可以在写入上一组中间结果的同时读取下一组蝶形运算数据,从而提高FFT的处理速度。
旋转因子单元是用于存储FFT运算所需的旋转因子WrN=exp(-j2πr/N)。在Matlab中旋转因子分为实部和虚部产生,由于它们是小于1的小数,故在设计中需将其定点化。其过程是将旋转因子扩大214倍。取整数部分转化为16位定点数,以.hex文件格式保存,利用QuartusⅡ软件的Megawizard工具设计。ROM,并将.hex文件同化在其中。根据旋转因子的对称性和周期性,在利用ROM存储旋转因子时,可以只存储旋转因子表的一部分,通过
地址的改变查询出每级蝶形运算所需的旋转因子。
控制单元用于协调驱动各模块,在FFT运算中具有关键作用。存储器A、旋转因子单元及数据控制器的读信号,存储器B的读写信号都是由控制单元产生。控制单元通过一个有限状态机(FSM)实现,使用两个内部计数器控制状态机的翻转。控制单元具有单独的输入时钟,可产生相应的控制信号。
5 仿真结果
选用Altera公司的QuartusⅡ软件作为开发平台,以Stratix系列中的EP1S25型FPGA为核心器件,采用白顶向下的设计思路和VHDL语言,实现对各个模块单元的设计、综合和仿真。为了简化设计,只在数据输入时钟下输入了一组64个复数,其余输入设为0,并且实部和虚部都限定在±l,±2,±3,±4,e5之内。为防止溢出先将输入数据乘以一定比例因子2-9,再乘以2 15转化为十六进制数。输出的结果如图5所示。需要注意的是:仿真结果乘以2 -6后才是实际结果。将仿真结果与Matlab计算的结果相比较,数据基本一致,说明了设计正确,其误差主要来源于数据的截取和旋转因子的近似。
图5 FFT运算仿真图
6 结束语
FFT 是数字信号处理中是一种重要的运算, 在通信、语音处理、图像处理等领域有着广泛地应用。FPGA具有成千上万的查找表和触发器,因此,FPGA平台可以利用更低的成本达到此通用DSP更快的速度。本文提出了用移位寄存器存
储旋转因子的方法,设计了一种基于FPGA的FFT处理器的方案,输入数据以二进制数表示,采用基2 FFT算法,以QuartusⅡ软件为开发平台对处理器各个的模块进行设计和仿真,得到理想运算结果。采用FPGA实现FFT算法在体积、速度、灵活性等方面都具有优越性。采用FPGA技术,还可以获得高性能,满足成本要求,并享有快速有效地对新设计进行优化的灵活性。
参考文献:
[1] 吴大正.信号与线性系统,高等教育出版社 2009,第4版 : 115—187.
[2] 高西全,丁玉美.数字信号处理.西安电子科技大学出版社, 2008,第3版 : 110- 123. [3] 韩颖,王旭,吴嗣亮.FPGA 实现高速FFT 处理器的设计[J].电讯技术, 2003(2):60—78. [4] 罗雪荀, 詹阳.用FPGA 实现FFT 算法[J].今日电子, 2002,第2版 : 11- 18.