基于FPGA的FFT算法硬件實(shí)現
可以看出,圖3減少了一個(gè)旋轉因子復乘模塊,不但節約了一次乘法運算時(shí)間,也省略了第一級旋轉因子,更好地利用了硬件結構。
首先,在QuartusⅡ環(huán)境中對4點(diǎn)蝶形運算時(shí)序仿真,采用流水線(xiàn)設計,連續輸入連續輸出,仿真結果如圖4所示。本文引用地址:http://dyxdggzs.com/article/191332.htm
由圖4可以看出,輸出比輸入延時(shí)6個(gè)時(shí)鐘,這在系統的控制核心地址產(chǎn)生單元的設計中需要考慮到。
1.3 地址產(chǎn)生與時(shí)序控制
對于1 024.點(diǎn)基4 FFT運算,需要5級蝶形運算,每一級運算都要有寫(xiě)地址和讀地址,根據FFT同址運算的特點(diǎn)可知,當前的寫(xiě)地址即是上一級蝶形運算的讀地址。因此完成FFT運算需要設計6級RAM地址。其中第1級的寫(xiě)地址即是數據輸入的順序地址,不予討論。最后一級讀地址為數據正序輸出所需的地址。其余4級為1 024點(diǎn)數據對應的FFT蝶形運算。
第一級讀取節點(diǎn)地址的順序應該是:(0,256,512.768),(1,257,513,769),……,(255,511.767,1 023)。易觀(guān)察其讀地址的規律如下:設讀取次序的二進(jìn)制編碼為bit[9:0];則讀地址的二進(jìn)制編碼為{bit[1:O],bit[9:2]},并且依次可以推出第2、3、4級的讀地址二進(jìn)制編碼分別為{bit[9:8],bit[1:0],bit[7:2]},{bit[9:6],bit[1:0],bit[5:2]}、{bit[9:4],bit[1:0],bit[3:2]},而最后一級輸出數據的地址二進(jìn)制編碼則為:{bit[1:0],bit[3:2],bit[5:4],bit[7:6],bit[9:8]}。圖5給出了第1級讀地址和第2級讀地址的部分數據,也可以看出第2級的寫(xiě)地址即是第1級的讀地址。
圖1中的地址產(chǎn)生單元作為系統的控制核心,不僅要生成每一級的RAM讀寫(xiě)地址,還要產(chǎn)生RAM寫(xiě)使能信號、輸出有效信號以及4點(diǎn)蝶形運算單元和旋轉因子產(chǎn)生單元的啟動(dòng)信號,由于時(shí)序電路還需要考慮器件延時(shí),例如上文提到的4點(diǎn)蝶形運算輸出比輸入延時(shí)6個(gè)時(shí)鐘,以及RAM存取數據輸出比輸入延時(shí)1個(gè)時(shí)鐘,這些都需要在控制核心中考慮到。
1.4 旋轉因子產(chǎn)生
對于1 024點(diǎn)FFT蝶形運算,需要1 024個(gè)旋轉角度(即2π的1 024等份),其中第一級不需要復乘運算,第6級只是將數據進(jìn)行整序沒(méi)有運算單元,其他4級都需要旋轉因子。本設計采用將旋轉因子預置于ROM中,通過(guò)查找表方法得出每一級運算的所需的旋轉因子。根據旋轉因子的可約性,后幾級運算所需的旋轉因子都可以在第一級運算的旋轉因子中找到,因此無(wú)需另外存儲。旋轉因子在ROM中的存儲規律是:旋轉因子相位角p處存儲旋轉因子W=*****。定義一個(gè)10 bit的計數器count[9:0],則第2、3、4、5級ROM的相位角規律按照Verilog語(yǔ)法可表示為
為了節省資源,本設計只在ROM單元中存儲了前256個(gè)旋轉因子數據,即第一象限因子其余象限的因子可通過(guò)象限轉換后得到,這樣就大大節省了存儲單元的硬件資源。圖6為旋轉因子產(chǎn)生單元在QuartusⅡ環(huán)境中仿真結果的部分數據。
評論