1、基于 FPGA 的 IFFT 处理器设计 郑华晋 陈友武 (南京邮电大学 通信与信息工程学院 南京 210046) 摘要 :本文首先通过分析 FFT 的 Cooley-Tukey 算法,从而导出相应的 IFFT 算法。本文采用Altera 公司的 Cyclone II 系列 FPGA 芯片中的 FFT megacore IP 核来定制 IFFT 功能,最后分别使用 Quartus II 和 VHDL 开发工具验证实现。 关键词: FPGA IFFT Cooley-Tukey VHDL FPGA-Based IFFT Processor Design Zheng Huajin, Chen You
2、wu (College of Communication Information Engineering, Nanjing University of Posts 0x 0x 0x图 1 信号按奇偶分离过程 0x 1x 2x 3x 4x 5x 6x 7x 0x2x4x6x 1x3x5x7x0x4x2x6x1x3x3x7x0x4x2x6x3x5x1x7x02W 图 2 蝶形运算过程 根据上述的分析过程,可知基 2 的 FFT 运算需要复数加法器、复数乘法器以及蝶形运算器来共同实现;同时需要相应的 RAM 来存储运算结果,以及 ROM 存储旋转因子kNW 。上述硬件在 FPGA 中均可配置。 2.
3、2、IFFT 算法原理: 根据上述 DFT 及 FFT 的运算算法可知,由于 null%XAxAx= 则由矩阵元算的逆变换,可得 % null1x AX= ,其中null1A为nullA的逆矩阵 根据线性代数的定理,有 null1A=null*AN,其中null*A 为矩阵nullA的伴随矩阵 于是 FFT 运算的逆变换为 *1()xFFTXN= 对比 FFT 运算的过程,分析可知,完全可用实现 FFT 的硬件电路来实现其 IFFT 功能。两者的区别仅在于在 IFFT 中,需对输入信号先做共轭运算处理,在输出端口前,再增加进0x 4x 2x 6x 1x 5x 3x 7x 02W 02W 02W
4、 02W 0A 1A 0B 1B 0C 1C 0D1D 04W 14W 04W 14W 0G 1G 2G 3G 0G 1G 2G 3G 08W18W28W38W0X 1X 2X 3X 4X 5X 6X 7X 行一次共轭运算,然后进行一个1N(即总点数的倒数值)的因子对信号进行衰减。最后得到的输出即为初始的时域信号 x。 下面针对算法实现过程中的关键问题,进行讨论并给出解决方案。 码位倒置算法: 由对输入的离散信号分奇偶分离过程中可看到, 进入运算器时的kx 不再按输入的顺序排列。由于需寻址信号在 RAM 的存储地址,因此,对离散信号的寻址就尤为重要。可设计如下的算法来实现。以 N=8 的 FF
5、T 为例,分析kx ( k=07)的地址二进制数值,及分奇偶后的kx 的排列值,得如下关系式: 分奇偶前 分奇偶后 次序 k 二进制值 k 二进制值 1 0 000 0 000 2 1 001 4 100 3 2 010 2 010 4 3 011 6 110 5 4 100 1 001 6 5 101 5 101 7 6 110 3 011 8 7 111 7 111 由此分析出,我们只要把输入的信号kx 的 k 的二进制值,进行变换,即首位和第二位调换,而第一位保持不变,即可得到相应的分奇偶后的结果。如对于3x ,二进制值为 011。奇偶分离时第一位上的 1 不变,而首位 0 与第二位 1
6、 互换,即得输出的地址值 110,即6x 。类似的,对于任意 n 位的地址值,变换规则为第( n-1)位与第 0 位互换,第( n-2)位与第一位互换,以此类推,即可得到输出序列地址。 倒置操作示意图 同址运算: 在进行运算处理时,我们考虑采用同址运算的思想,这是 FFT 算法在运算方式上的典型特点。研究蝶形运算的特点,可以看到计算结果只与相对应的两个输入数据相关,而且每个蝶形的输入输出节点均在同一水平线上; 因此, 不妨考虑, 对于每个蝶形运算的输出数据,可将其存放在存储输入数据所对应的存储单元。 即用输出的数据覆盖原来的输入数据所占的RAM 存储区域。因此,只需要 N 个复数的存储单元。这
7、种方法,不但可存放输入的原始数据,而且可存放中间结果,并且还可存放最终的运算结果。因此,同址运算方式节省了大量的存储单元,是 FFT 算法的一大优点。 n-1 n-2 n-3. 3 2 1 0 3、硬件电路结构: 图 3 基本实现结构图 Altera 公司的 FPGA 产品内部具有高速数字信号处理 (DSP)模块,具有容量大、含高速R A M 以及内部含有丰富的乘法器等优点。因此,完全可利用 FPGA 来实现 IFFT 算法。 设计的电路结构主要包括以下模块: 作为缓冲器的双端口数据存储单元、 蝶形运算单元、存放每级运算结果的双端口存储器;进行共轭运算的共轭运算模块、存储旋转因子的 ROM、地
8、址产生单元、对整个系统进行控制的控制模块。 下面介绍各模块的功能: ( 1)共轭运算模块主要功能是对输入信号进行共轭运算,这是实现 IFFT 的前提。运算后的信号返回 RAM,进行基二运算。得到的结果再送共轭运算模块,并乘上衰减因子后,得到正确输出结果; ( 2) RAM 其功能是在运算控制模块的控制下,将输入数据的实部和虚部存放到指定的地址单元;并在控制模块的控制下,将相应地址的数据送到蝶形运算模块,作为蝶形运算模块的输入数据; ( 3)蝶形运算模块蝶形运算由乘法器和加法器构成,分别进行复乘和复加运算。由前述分析, N 点的 IFFT,其运算可以分为 B 级(2log B N= ) ,每一级
9、需做2N次蝶形运算。鉴于它们之间以及相邻级之间均为串行工作状态。因此,每次运算只需调用同一个蝶形运算模块; ( 4) ROM 该模块用于存储并往蝶形运算单元送运算所需的旋转因子。 IFFT 正是利用了系数的对称性和周期性实现把长点数变换转化为短点数变换,从而提高运算效率。旋转因子由 Matlab 软件产生,并转换为 32 位的定点数,并保存为 hex 数据格式,然后利用 Quartus 软件的 MegaWizard 工具设计 32 位的 ROM,并将 hex 文件固化在其中,这样就可以省去了计算旋转因子的时间。 将旋转因子kNW 写入到 ROM 中, 每次进行蝶形运算时,由运算控制模块选择正确
10、的旋转因子,将其送入蝶形运算模块进行计算; ( 5)运算控制模块 控制模块是算法执行的核心单元,负责产生 BAM 以及存放旋转因 子的 ROM 的读、写使能信号和读、写地址,并产生控制运算单元工作的信号。这一部分主蝶形运算模块 RAM RAM 运算控制模块 ROM 旋转因子 共轭运算模块 共轭运算模块 外部启动信号 输入数据 输出结果 要由计数器、地址线交换器、寄存器和延时器组成。为节省资源,可对存储数据 RAM 采用原址读出原址写入的方法,即在进行下一级变换的同时,首先应将结果回写到读出数据的RAM 存贮器中;而对于 ROM,则应采用与运算的数据相对应的方法来读出存储器中旋转因子的值。 4、
11、仿真 4.1、Quartus II 仿真 设计过程采用 VHDL 语言描述,首先利用 Matlab 产生旋转因子,送 ROM 中存储。然后进行编程、布线及仿真,确保硬件结构达到设计要求。 我们利用 Quartus II 首先对加法单元, 蝶算单元和地址产生单元分别综合, 然后对整个设计综合优化,产生了一系列的输出文件,其中综合报告文件和 EDIF 网表文件时最重要的。 实验结果证明系统吞吐量可以达到 2M/ s 的变换速度,已经能够满足一般系统的设计要求,图 4 是系统仿真的结果。 图4 系统仿真结果图 4.2、VHDL的编译与仿真 本设计中用MAX+PLUS II作为开发软件。MAX+PLU
12、S I1 支持原理图、VHDL等多种语言文本文件。MAX+PLUS II可以进行功能仿真和时序仿真,能够产生 精确的仿真结果。由MAX+PLUS II生成波形文件,波形 如图5。图5 蝶型运算单元波形 5、结束语 本文在分析快速傅里叶变换(FFT)算法的基础上, 提出了一种IFFT算法的FPGA设计方法,描述了设计中的蝶形运算、地址生成及旋转因子的设计过程。根据IFFT算法中数据输入、旋转因子方面的规律,利用同址运 算的思想,改进了结构设计,减 少了蝶形运算模块和RAM的数量, 提高了存储效率。 硬件试验的结果表明, 设计的IFFT处理器的运算结果基本满足要求,且具有较高的运算速度和效率。 参
13、考文献: 1 Sophocles J.Orfanidis, Introduction To Signal Processing ,北京:清华大学出版社, 2007年 7 月 2王林泉,皮亦鸣,陈晓宁,肖欣 基于 FPGA 的超高速 FFT 硬件实现 ,成都:电子科技大学学报, 2005 年 4 月 3高瞻,庄圣贤,王森林,史琴, 基 FPGA 的 FFT 处理器设计 ,设计新技术, 2005 年 10月 4 段玉波 , 刘继新 , 刘树庆 , 基于FPGA的快速傅立叶变换(FFT)处理器的设计, 自动化技术与应用,2006年 论文原创性声明 本人郑重声明:此处所呈交的论文基于 FPGA 的 IFFT 处理器设计是本人在导师指导下进行研究工作所取得的研究成果。据我所知,除了参考文献外,论文中不 包含其他人已经发表或撰写过的研究成果。本声明的法律结果将完全由本人承担。 作者签字: 郑华晋 陈友武 2008 年 5 月 25 日