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