基于Cyclone系列FPGA的1+024点FFT算法的实现
第33卷第2期钱文明,等:基于CycIone系列FPGA的1024点FFT算法的实现 微电子与基础产品
且控制简单,不需占用片外电路板面积,可提高系统的
总体速度和可靠性。
定关系:
addr_B=addr_A+
N/2
2i
第0级:addr_A随ctI信号从0递增至N/2-1,此时本级的地址已产生完全,之后再加1溢出变成0,成为下一级的首地址。
第1~M-1级:判断addr_A的第[M-i-1:0]位,若小于N/2
-1,则来一个ctI信号,addr_A就加1,i
图2
FFT模块划分
本设计外部输入数据为12bit有符号数,由于FPGA内部含大量RAM,所以FPGA内部将其扩充为32bit有符号数,这样进行10级蝶形运算后可确保不会产生溢出,减少了溢出检查处理模块。1024点FFT共需1kX32bit实部RAM、1kX32bit虚部RAM。2.2 ROM旋转因子存储单元
参照FFT结构,旋转因子要参与蝶形运算以得到第2个运算结果。旋转因子都是小于1的小数,所以设计中需将其定点化,定点化过程是将旋转因子扩大16384(214)倍,取整数部分定点化,存入内置ROM。蝶形运算后将运算结果右移14位后作为第2个运算结果存入RAM,作为下一级的输入数据。所需ROM的容量应为1024点FFT所需的全部旋转因子数,共512个16bit实部ROM,512个16bit虚部ROM。2.3 蝶形运算单元
蝶形单元是FFT的核心部分,
主要包括乘法器和加法器。每级蝶形运算的输入数据和运算结果存储在相同地址单元中。在蝶形运算单元中,首先将两个操作数相加减,加法结果为第1个运算结果;减法结果乘以旋转因子,再右移14位,得出第2个运算结果,同时将第1个操作数存入RAM,在下1个节拍时存入第2个运算结果,可实现部分PipeIine结构。2.4 地址产生单元
地址产生单元根据控制单元输出的ctI信号产生下一级蝶形运算所需的两个操作数和旋转因子的地址。观察RAM地址生成规律:序列(xn)的长度为N,M=Iog2N,则所需的级数和地址位宽都为M(0~M-1)
。第i级蝶形运算可分为2i组,每组有(N/2)/2i个蝶形运算。每个蝶形运算的两个操作数的地址都有一
2若等于
N/22i-1,则随ctI信号addr_A加上N/2
2i
+1。本文采取的FFT实现结构为原址运算,运算结果仍然写回原地址,因此需将读数据地址延迟若干时钟
周期,作为运算结果写入地址。
ROM地址生成规律:维护一个模为N/2的计数器,第i级的地址取计数器的第[M-2:i]位即可。2.5 控制单元
控制单元是整个系统的控制核心,各个功能模块之间的地址、数据传递均通过控制单元协调工作。控制单元记录当前蝶形运算所处的级数和个数,并产生ctI信号传递给地址产生单元,以产生操作数和旋转因子的地址,地址产生单元将旋转因子的地址送入ROM模块的地址总线,直接读出旋转因子的值,送入蝶形运算单元;将操作数的地址送入控制单元,控制单元将两
个操作数的地址连续送入RAM的地址总线,连续读取两个操作数,将其寄存后送入蝶形运算单元。运算结果在中央控制单元控制下连续写入RAM。FFT完
成后,产生done信号通知外部读取处理后的数据。
3 仿真与验证
本设计采用自顶向下的设计思路,完成系统模块划分和各个功能模块的VeriIog代码编写。选用Ouar-tus!作为软件开发平台,利用该软件宏模块的调用功能产生RAM、ROM、乘法器等模块,以节省设计时间,提高系统工作效率。得出整个系统占用30%FPGA的逻辑单元和90%片上RAM,CIock最快为75MHZ。系统在工作主频率75MHZ情况下通过板级验证,完成全部1024点复数FFT运算时间大约需要250"s。功能仿真结果如图3所示。从图中可以看到,第1个节拍输出第1个操作数的地址,并寄存上一个蝶形运算得到的第2个操作数,将其送入RAM输入数据总线上;第2个节拍得到第1个操作数,并输出第2个操作数的地址;第3个节拍得到第2个操作数,并计算出第1个结果;第4个节拍寄存第1个结果,送入RAM输入数据总线上。
本系统选用GE02开发板(处理器为东南大学研
13