
對于FFT處理器的實現(xiàn), 目前通用的方法是采用DSP、專用FFT處理芯片和FPGA。用DSP實現(xiàn)FFT的處理速度較慢,不能滿足某些高速信號實時處理的要求;專用的FFT處理芯片雖然速度較快,但外圍電路相對復雜,不易擴展,且價格昂貴。新一代FPGA資源豐富,易于組織流水和并行的結(jié)構(gòu),用其實現(xiàn)FFT,不僅可以提高處理速度,而且具有靈活性高,開發(fā)費用低的特點。
1 設(shè)計與實現(xiàn)
本設(shè)計為128點FFT,采用簡單實用的基2時間抽取(DIT)算法。該模塊的FFT處理共需3個過程,即外部數(shù)據(jù)倒序輸入過程,F(xiàn)FT中間運算過程(128點的FFT運算可分解成7級運算,每級64個基2蝶形運算)和運算結(jié)果正序輸出過程。整個FFT模塊內(nèi)部結(jié)構(gòu)簡圖如圖2所示。該FFT模塊主要包括蝶形運算單元、控制單元和存儲單元(ROM和雙口RAM)。

1.1 蝶形運算單元
基2時間抽取蝶形運算信號流圖如圖3所示。

由上述公式可以看出,一個基2蝶形運算要進行1次復乘、2次復加。若在一個時鐘周期內(nèi)完成復乘,則需要4個實數(shù)乘法器和2個實數(shù)加法器。因為一個蝶形運算需要取兩個輸入數(shù)據(jù),而只存在1次復乘,所以可以用2個時鐘周期來完成1次復乘,即可以對實數(shù)乘法器進行復用,從而減少乘法器的數(shù)目同時不降低處理速度。
改進后的基2蝶形運算單元充分利用了FPGA片內(nèi)的寄存器,采用流水和并行的結(jié)構(gòu)將復乘所需的4個實數(shù)乘法器減少到2個,其邏輯結(jié)構(gòu)如圖4。從中可以看出,蝶形運算單元主要由寄存器、選擇器、乘法器和加法器構(gòu)成。左邊3個選擇器用來選擇做乘法的數(shù)據(jù),右邊2個選擇器用來選擇加法器的加減功能。

該蝶形運算單元中的復乘運算是2個8比特的復數(shù)相乘得到15比特的復數(shù)。因為輸入數(shù)據(jù)和旋轉(zhuǎn)因子的8比特數(shù)據(jù)實際上表征的是模值不大于“1”的復小數(shù),所以復乘運算的輸出結(jié)果用15比特表示并不會產(chǎn)生溢出。2個15比特的數(shù)據(jù)進行復加運算得到16比特的結(jié)果。為便于下一級運算,將復加運算輸出的16比特數(shù)據(jù)截掉低8位(采用定點四舍五人的方法以減小誤差)。128點FFT的7級運算中每一級的數(shù)據(jù)都相當于先左移了7位(旋轉(zhuǎn)因子的模值為128),而后又截掉了低8位,所以每一級都相當于做了除2運算,故此128點FFT輸出結(jié)果是理論值的(1/2)7。
1.2 控制單元
控制單元是整個FFT模塊的核心。主要有以下兩個功能:
1)提供各個模塊的運算使能。
當檢測到輸入口的FFT_start信號后,立即開始接收數(shù)據(jù),并反序存儲到RAM中。在128個時鐘周期之后,啟動各級的蝶形運算,并同時產(chǎn)生RAM的讀寫使能信號。在第7級運算結(jié)束時,提供數(shù)據(jù)輸出的標志FFT_done,并控制RAM 同步正序輸出數(shù)據(jù)。
2)產(chǎn)生各級運算所需的地址
產(chǎn)生FFT輸入的倒序地址和輸出的正序地址(正序和倒序均用同步計數(shù)器實現(xiàn),正序為當前計數(shù)器的輸出,倒序為當前計數(shù)器的高位與低位的對應位全部對調(diào)后的輸出);各級運算的地址(按照計數(shù)器的輸出,根據(jù)各級蝶形運算的規(guī)律產(chǎn)生。先產(chǎn)生蝶形運算個數(shù)據(jù)的RAM地址,再產(chǎn)生第二個數(shù)據(jù)的RAM地址;在產(chǎn)生以上兩個取數(shù)地址的同時,產(chǎn)生所對應的旋轉(zhuǎn)因子的ROM取數(shù)地址)。
1.3 存儲單元
該FFT模塊中的存儲單元(ROM和雙口RAM)由Xilinx ISE 6.2i的CORE Generator工具根據(jù)FPGA的型號生成。
本FFT設(shè)計中有2個ROM分別用來存儲旋轉(zhuǎn)因子,并以補碼的形式將它們按照*.mif格式文件輸出。用工具例化ROM,將*.mif文件寫入各自的ROM初始化文件中,完成對ROM的初始化。
通常的FFT設(shè)計采用的是有2塊(按實、虛部分開算是4塊)RAM的“乒乓”式結(jié)構(gòu),而在處理速度要求不太高的情況下,可以采用1塊(按實、虛部分開算是2塊)RAM來完成,進而節(jié)省RAM資源,便于以后的ASIC開發(fā)。在此FFT模塊的設(shè)計中,有2個分別用來存儲數(shù)據(jù)實部和虛部的雙口RAM(端口a只寫,端口b只讀)。RAM的兩端口可以在讀寫地址不同的情況下同時工作,即在通過端口b從RAM中讀取蝶形運算數(shù)據(jù)的同時,也在通過端口a往RAM 中寫入上幾次蝶形運算的結(jié)果。
2 仿真與分析
采用Verilog HDL對所設(shè)計的FFT模塊進行RTL描述。FFT處理點數(shù)為128,輸入輸出用8比特補碼表示。采用MoldSim SE 5.8a對整個設(shè)計進行功能仿真,采用Synplify Pro 7.3.3進行綜合;使用Xilinx的ISE 6.2i工具配置比特流下載;FPGA選用Xilinx Spartan II系列中的xc2s200pq208-5。用MoldSim進行仿真的局部時序如圖5所示。

將MATLAB的計算結(jié)果與FPGA的仿真結(jié)果進行對比,如圖6所示。可見兩組結(jié)果能較好地吻合,從而驗證了所設(shè)計的FFT模塊的正確性。

整個FFT模塊在Spartan II的xc2s200pq208-5上共用去邏輯單元(LUTs)393,占總資源的8%,這樣就為OFDM系統(tǒng)其他模塊的設(shè)計節(jié)省了大量資源。
128點FFT需要完成蝶形運算 (128/2)×log2128=448次,每個蝶形運算需要2個時鐘周期,蝶形運算需要7個時鐘周期的延時,收發(fā)外部數(shù)據(jù)需要128×2=256個時鐘周期,所以整個FFT運算共需要時鐘周期448×2+7+256=1159個,在處理速度上達到了預期的目標。
3 結(jié)論
本文中設(shè)計的FFT模塊采用基2時間抽取算法,用verilog HDL對其進行了RTL描述,用MoldSim和Synplify工具進行了仿真和綜合,并在Xilinx Spartan II FPGA中進行了驗證。
此外,F(xiàn)FT運算結(jié)果的精度與輸入數(shù)據(jù)的位數(shù)及運算過程中的位數(shù)有關(guān)。在定點計算中,存儲器數(shù)據(jù)的位數(shù)越大,運算精度越高,使用的存儲單元和邏輯單元也越多。在OFDM系統(tǒng)的實際應用中,可以根據(jù)實際情況折衷選擇FFT模塊的精度和資源。
本文所設(shè)計的FFT模塊的輸入、輸出和旋轉(zhuǎn)因子為8比特數(shù)據(jù),采用了1塊(按實、虛部分開算是2塊)雙口RAM和基2單蝶形流水運算的結(jié)構(gòu),達到了某些OFDM系統(tǒng)對FFT模塊的精度和資源的要求,為OFDM系統(tǒng)的ASIC的開發(fā)提供了很好的依據(jù)。