基于VHDL和高精度浮點運算器的基2 FFT在FPGA上的設計仿真
FFT作為數字信號處理中的重要的手段之一,主要在數字通信、語音信號處理、圖像處理、功率譜估計、仿真、系統(tǒng)分析、雷達理論、光學、醫(yī)學、地震以及數值分析等方面得到廣泛應用?;?a class="contentlabel" href="http://m.butianyuan.cn/news/listbylabel/label/FPGA">FPGA實現FFT,具有軟件編程的靈活性及電路擴展性強等優(yōu)點。隨著集成電路技術進步和制造工藝水平的提高,FPGA芯片具有的功能越來越強,成為快速實時實現FFT的重要手段。采用基2法完成基于FPGA浮點運算器的FFT。
本文引用地址:http://m.butianyuan.cn/article/201706/349067.htm1 基于FPGA浮點運算器的FFT
1.1 浮點的IEEE標準格式
設計采用單精度浮點運算,IEEE定義的二進制浮點格式為32位。結構表示如圖1所示。
將32位分為3部分:31位為符號位S,S為0時表示正數,為1時表示負數;30~23為指數E,是一個0~255之間的八位二進制數,其實際的指數是E-127,所表示的指數范圍是2-127~2128;22~0表示尾數F,小數點前還隱藏了一位‘1’,單精度尾數可表示最大數為2(23+1)=16 777 216。因為10716 777 216108,所以單精度浮點數的有效位數是7位,即浮點數的精度為10-6。為方便FFT的運算,文中采用原碼存儲。
1.2 基2的DIT-FFT算法
在蝶形運算中采用復數形式表示數據。對于一個2點的蝶形運算,輸入復數為A=x+jX,B=y+jY;經運算,輸出復數A’=(x+ycosφ+ Ysinφ)+j(X+Ycosφ-ysinφ),B’=[x-(ycosφ+Ysinφ)]+j[X-(Ycosφ-ysinφ)]。
設計主要針對8點FFT進行設計,8點FFT算法的原理圖如圖2所示。
整個FFT過程中共有三級蝶形運算,每級蝶形運算有4個蝶形運算單元。在數據輸入時按照自然順序輸入,最后倒序輸出。
1.3 FFT處理器
FFT處理器主要對數據進行蝶形運算及數據存取。設計采用基2蝶形運算器,包括存儲器ROM和RAM,控制器及地址產生單元等。其FFT的結構模型如圖3所示。
1.3.1 蝶形處理單元
蝶形處理單元是整個FFT的中心環(huán)節(jié),采用復數表示,將實部與虛部分別存儲,利用基2的DIT-FFT算法實現運算。
蝶形運算過程包括一個乘法運算和一個加/減法運算。數據的讀取由時鐘單元的信號來控制:當時鐘為c0時,讀取y;c1時,讀取Y;c2時,讀取x;c3時,讀取X。經蝶形運算后得到x’=x+(ycosφ+Ysinφ),X’=X+(Ycosφ-ysinφ),y’=x-(ycosφ+Ysinφ),Y’=X-(Ycosφ-ysinφ)然后將數據寫入同樣地址的RAM中,至此,2點的蝶形運算單元完成。在蝶形運算共需一個乘法器和兩個加法器。
(1)浮點乘法器。乘法過程對浮點數的符號位、指數以及尾數分別進行計算,符號異或,指數相加再減127,尾數加入隱含的‘1’后再進行乘法運算,如果尾數相乘的結果有溢出則指數加1尾數取前23位,若無溢出,則取最高位后的23位。但若輸入的數據有一個是0,則輸出為0。
圖5的波形為兩浮點數的乘法運算,輸入以16進制表示,分別將不同類型的數據搭配進行測試,結果表示仿真正確。
(2)浮點加法器。加法運算是將兩數指數比較,存儲較大的指數,將指數小的尾數移位,再進行加減操作,規(guī)格化后輸出。加法過程由多個模塊組合實現,包括比較模塊,右移模塊、加/減法模塊、前導零檢測模塊、左移模塊和結果整合輸出模塊。
比較模塊主要對指數操作,判斷指數的大小,較大的指數暫作結果的指數,較小指數的數做移位操作,其階差為移位量。以下程序采用for循環(huán)來實現移位,S(5 downto 0)存儲階差,最大值是32。
然后尾數經加減運算后規(guī)格化并輸出,為了以標準浮點格式輸出,規(guī)格化需要前導零檢測。
然后進行移位操作,最后將規(guī)格化后的數據整合輸出,就完成兩個浮點數的加法運算。
圖6的波形為兩個輸入浮點數的加法運算數據,以16進制表示。上述數據分別將不同類型的數據搭配運算,數據表明該仿真結果正確。
1.3.2 地址產生單元
地址產生單元主要是跟蹤FFT運算進度,進而更好地調配存儲單元,及控制各相關模塊的運行。
(1)通過計數器來跟蹤記錄FFT計算的狀況。為方便對存儲單元操作,采用計數器來記錄FFT的計算情況。8點的FFT,每個單元包括4個數據,所以用一個4位計數器Butterfly表示全部的運算狀態(tài)。一個2位級計數器Stage表示三級蝶形單元。當Butterfly計數為4時,級計數器Stage加1,當Stage計數為3時,表示FFT的計算操作完成。當Butterfly計數為15時,輸入輸出信號置‘1’,反饋回控制器輸入輸出操作完成。
(2)ROM讀取的地址。旋轉因子存儲在ROM中,由實部cos(2×k×π/8)和虛部sin(2×k×π/8)兩部分組成,讀取由時鐘單元的信號控制。由圖2可以看出每一級參加蝶形運算的旋轉因子不同。
(3)RAM數據地址。在整個地址單元中,分配RAM中數據的地址是重點,8點蝶形運算共需16個存儲單元,數據地址的產生遵循一定規(guī)則。例如,Butterfly的信號為“a3a2a1a0”,則x,y的地址產生規(guī)則如表1所示。
數據的讀取靠時鐘信號來控制。
1.4 FFT仿真結果分析
圖7中輸入8點數據為[-l,1,2,-0.5,-3,-1,2,0]。仿真結果經轉換后,用10進制表示的最后結果為[0,3.76775-1.06065i,-8-0.5i,0.23225-1.06065i,0.5,0.23225+1.06065i,-8+0.5i.3.76775+1.06065i]。Matlab仿真后結果為[-0.5000,3.7678-1.0607i,-0.8000-0.5000i,0.2322-1.0607i,0.5000,0.2322+1.0607i,-0.8000+0.5000i,3.7678+1.0607i]兩結果很接近,誤差較小,仿真結果正確。
2 結束語
文中在分析了FFT算法后,描述了運算的蝶形單元,地址生成單元及FFT的實現過程。從實際設計出發(fā),完成了基于FPGA的單精度浮點運算器的FFT設計,精度達到10-6。其輸出結果與Matlab仿真結果相近,達到了利用FPGA實現FFT的目的。
評論