張本
中興系統(tǒng)技術(shù)有限公司,廣東深圳,518000
在當(dāng)今數(shù)字通信、雷達(dá)、圖像處理和許多其他領(lǐng)域,對(duì)高性能數(shù)字信號(hào)處理的需求不斷增加。為了滿足這種需求,研究和設(shè)計(jì)高性能數(shù)字信號(hào)處理器變得至關(guān)重要[1]?,F(xiàn)場(chǎng)可編程門陣列(FPGA)已經(jīng)成為這些領(lǐng)域中的一種強(qiáng)大工具,因?yàn)樗峁┝遂`活性、可編程性和并行性,這些特性使它成為高性能數(shù)字信號(hào)處理器的理想選擇[2]。本研究的目標(biāo)是設(shè)計(jì)和實(shí)現(xiàn)一種基于FPGA的高性能數(shù)字信號(hào)處理器,以滿足現(xiàn)代通信和信號(hào)處理應(yīng)用的需求。數(shù)字信號(hào)處理器將通過(guò)FPGA上的硬件描述語(yǔ)言(Verilog)進(jìn)行編程,以執(zhí)行信號(hào)處理任務(wù)。本文選用最常用的FFT算法進(jìn)行詳細(xì)設(shè)計(jì)和實(shí)現(xiàn),用以說(shuō)明FPGA作為數(shù)字信號(hào)處理器的卓越性能。
處理器的系統(tǒng)框圖如圖1所示。
控制單元是FFT處理器的關(guān)鍵組件[3],它負(fù)責(zé)管理和協(xié)調(diào)整個(gè)FFT計(jì)算流程,確保計(jì)算的正確性、時(shí)序性和數(shù)據(jù)訪問(wèn)的準(zhǔn)確性。控制器和地址產(chǎn)生單元的有效協(xié)同工作是FFT處理器順利運(yùn)行的關(guān)鍵。
1.1.1 控制器
控制器是FFT處理器的大腦,它執(zhí)行以下功能。
(1)啟動(dòng)和停止FFT計(jì)算:控制器允許用戶啟動(dòng)FFT計(jì)算過(guò)程,并在需要時(shí)停止計(jì)算。這確保了計(jì)算的控制權(quán)在用戶手中。
(2)時(shí)序管理:控制器負(fù)責(zé)確保蝶形運(yùn)算按正確的順序和時(shí)序執(zhí)行。它發(fā)出信號(hào),告訴蝶形運(yùn)算單元何時(shí)進(jìn)行計(jì)算,以保持整個(gè)計(jì)算的同步性。
(3)控制信號(hào)生成:控制器生成用于控制蝶形運(yùn)算和存儲(chǔ)單元的控制信號(hào)。這些信號(hào)包括讀取和寫入操作的啟動(dòng)、停止、重置等。
(4)狀態(tài)管理:控制器維護(hù)FFT計(jì)算的當(dāng)前狀態(tài),以確保正確的計(jì)算流程。它可以管理多級(jí)蝶形圖的不同階段,并確保它們按照正確的順序執(zhí)行。
控制器的關(guān)鍵任務(wù)是協(xié)調(diào)所有組件,以確保FFT計(jì)算按照正確的順序和時(shí)序執(zhí)行,以生成正確的頻譜結(jié)果。
1.1.2 地址產(chǎn)生單元
地址產(chǎn)生單元的主要作用是確保數(shù)據(jù)正確地進(jìn)出存儲(chǔ)單元,以支持FFT計(jì)算進(jìn)行。
(1)地址計(jì)算:地址產(chǎn)生單元計(jì)算出需要讀取或?qū)懭氪鎯?chǔ)單元的地址,以確保正確的數(shù)據(jù)訪問(wèn)。這通常涉及數(shù)據(jù)的分組和重新排列,以匹配FFT計(jì)算的順序。
(2)地址同步:地址產(chǎn)生單元與控制器進(jìn)行協(xié)同工作,以確保生成的地址與FFT計(jì)算的狀態(tài)同步。這防止了地址與數(shù)據(jù)的不匹配。
(3)地址傳輸:地址產(chǎn)生單元將生成的地址傳輸給存儲(chǔ)單元,以觸發(fā)正確的數(shù)據(jù)讀取或?qū)懭氩僮鳌?/p>
蝶形運(yùn)算器和旋轉(zhuǎn)因子計(jì)算單元的協(xié)同工作使FFT處理器能夠高效地進(jìn)行傅里葉變換。蝶形運(yùn)算器執(zhí)行核心運(yùn)算,而旋轉(zhuǎn)因子計(jì)算單元確保這些運(yùn)算在頻率域上正確執(zhí)行。這些部分的優(yōu)化對(duì)于FFT處理器的性能至關(guān)重要。
1.2.1 蝶形運(yùn)算器
蝶形運(yùn)算器是FFT處理器中的核心組件,它在傅里葉變換中執(zhí)行關(guān)鍵的運(yùn)算。蝶形運(yùn)算器接收一對(duì)復(fù)數(shù)輸入數(shù)據(jù)點(diǎn),執(zhí)行復(fù)數(shù)乘法和加法運(yùn)算,然后將結(jié)果存儲(chǔ)回存儲(chǔ)單元。這一過(guò)程是FFT計(jì)算的核心步驟,具有高性能和高吞吐量。在每個(gè)時(shí)鐘周期內(nèi),蝶形運(yùn)算器執(zhí)行以下操作。
(1)輸入數(shù)據(jù)接收:從存儲(chǔ)單元中獲取兩個(gè)復(fù)數(shù)輸入數(shù)據(jù)點(diǎn),通常是一個(gè)復(fù)數(shù)對(duì),這兩個(gè)數(shù)據(jù)點(diǎn)表示不同的頻域樣本。
(2)復(fù)數(shù)乘法:將這兩個(gè)輸入數(shù)據(jù)點(diǎn)相乘,通常使用乘法器進(jìn)行計(jì)算。這個(gè)操作計(jì)算出乘積的幅度和相位信息。
(3)復(fù)數(shù)加法:接下來(lái),將乘法的結(jié)果進(jìn)行復(fù)數(shù)加法運(yùn)算,以獲得蝶形運(yùn)算的輸出數(shù)據(jù)點(diǎn)。
(4)結(jié)果存儲(chǔ):最終,計(jì)算得到的輸出數(shù)據(jù)點(diǎn)被存儲(chǔ)回存儲(chǔ)單元,以供后續(xù)的計(jì)算或輸出使用。
這個(gè)過(guò)程在FFT計(jì)算中不斷重復(fù),以完成信號(hào)處理的任務(wù)。蝶形運(yùn)算器的設(shè)計(jì)需要高效的硬件實(shí)現(xiàn),以確保FFT處理器能夠快速且準(zhǔn)確地完成傅里葉變換。
1.2.2 旋轉(zhuǎn)因子計(jì)算單元
旋轉(zhuǎn)因子計(jì)算單元負(fù)責(zé)生成用于蝶形運(yùn)算的旋轉(zhuǎn)因子。這些因子用于復(fù)數(shù)乘法操作,確保正確的頻率域轉(zhuǎn)換。
旋轉(zhuǎn)因子計(jì)算單元根據(jù)FFT計(jì)算的當(dāng)前階段和頻率要求,生成旋轉(zhuǎn)因子。這通常涉及預(yù)先計(jì)算和存儲(chǔ)一組旋轉(zhuǎn)因子,以供FFT計(jì)算使用。這些因子通常在FFT處理器初始化時(shí)計(jì)算,并在需要時(shí)從存儲(chǔ)中獲取。生成旋轉(zhuǎn)因子的精確性和性能對(duì)FFT計(jì)算的準(zhǔn)確性和速度至關(guān)重要。如果旋轉(zhuǎn)因子的計(jì)算出現(xiàn)錯(cuò)誤,可能導(dǎo)致頻譜分析的結(jié)果不準(zhǔn)確。
生成的旋轉(zhuǎn)因子與蝶形運(yùn)算器的輸入數(shù)據(jù)相乘,以實(shí)現(xiàn)頻率域的旋轉(zhuǎn)。這是通過(guò)復(fù)數(shù)乘法操作來(lái)實(shí)現(xiàn)的,確保了FFT計(jì)算中正確的頻域變換。旋轉(zhuǎn)因子的應(yīng)用使蝶形運(yùn)算器能夠?qū)⑤斎霐?shù)據(jù)點(diǎn)正確旋轉(zhuǎn)到適當(dāng)?shù)念l率位置,這是傅里葉變換的核心步驟。
存儲(chǔ)單元在FFT處理器中用于暫時(shí)保存數(shù)據(jù),以便進(jìn)行傅里葉變換的各個(gè)階段。其設(shè)計(jì)和性能對(duì)FFT計(jì)算的速度和準(zhǔn)確性具有重要影響,因此,需要根據(jù)具體應(yīng)用的需求進(jìn)行合適的優(yōu)化和配置。
1.3.1 輸入數(shù)據(jù)存儲(chǔ)
存儲(chǔ)單元首先用于存儲(chǔ)從外部輸入源傳入的原始數(shù)據(jù)。這些輸入數(shù)據(jù)通常是時(shí)域的樣本,即待處理的信號(hào)。數(shù)據(jù)存儲(chǔ)的方式通常取決于FFT處理器的設(shè)計(jì),可以是一個(gè)連續(xù)的緩沖區(qū)或分塊存儲(chǔ)。
1.3.2 中間結(jié)果存儲(chǔ)
在FFT計(jì)算中,蝶形運(yùn)算需要將中間結(jié)果存儲(chǔ)在存儲(chǔ)單元中,以便進(jìn)行下一級(jí)的計(jì)算。中間結(jié)果是蝶形運(yùn)算的輸出,通常是頻域的部分計(jì)算結(jié)果。存儲(chǔ)單元允許數(shù)據(jù)在各個(gè)蝶形運(yùn)算之間流動(dòng),并保持正確的順序。
1.3.3 最終輸出存儲(chǔ)
存儲(chǔ)單元還用于存儲(chǔ)最終的FFT輸出數(shù)據(jù),即頻域中的信號(hào)分量。這些數(shù)據(jù)表示輸入信號(hào)在頻域中的頻率分量。最終輸出數(shù)據(jù)通常需要進(jìn)一步分析、處理或傳輸給其他系統(tǒng)。
1.3.4 隨機(jī)存儲(chǔ)器和緩沖區(qū)
存儲(chǔ)單元可以采用不同的物理實(shí)現(xiàn)方式,最常見(jiàn)的是使用隨機(jī)存儲(chǔ)器。隨機(jī)存儲(chǔ)器可以讀取和寫入數(shù)據(jù),具有快速的訪問(wèn)速度。此外,存儲(chǔ)單元還可以包括用于存儲(chǔ)數(shù)據(jù)的緩沖區(qū),這些緩沖區(qū)可以用于提高數(shù)據(jù)流動(dòng)的效率,確保數(shù)據(jù)可以及時(shí)傳遞給蝶形運(yùn)算單元。
1.3.5 地址管理
存儲(chǔ)單元需要能夠有效地管理數(shù)據(jù)的讀取和寫入,以確保數(shù)據(jù)能夠在正確的時(shí)間和順序下傳輸。地址產(chǎn)生單元通常與存儲(chǔ)單元協(xié)同工作,生成用于數(shù)據(jù)訪問(wèn)的地址。
1.3.6 數(shù)據(jù)流動(dòng)
數(shù)據(jù)在存儲(chǔ)單元內(nèi)部的流動(dòng)是整個(gè)FFT計(jì)算的關(guān)鍵。輸入數(shù)據(jù)被讀取,然后經(jīng)過(guò)蝶形運(yùn)算后的中間結(jié)果被存儲(chǔ),最終的FFT輸出數(shù)據(jù)也被存儲(chǔ)。這個(gè)流動(dòng)過(guò)程需要高效的數(shù)據(jù)傳輸和存儲(chǔ)管理,以確保計(jì)算的正確性和效率。
總線模塊在處理器中是至關(guān)重要的組件,它負(fù)責(zé)數(shù)據(jù)和控制信號(hào)的傳輸,以確保各個(gè)組件能夠正確地訪問(wèn)和交換數(shù)據(jù)。
1.4.1 地址總線
地址總線用于傳輸?shù)刂沸畔ⅲ灾付ㄒL問(wèn)的存儲(chǔ)單元或其他組件的位置。地址總線的位數(shù)取決于FFT處理器的設(shè)計(jì),通常與存儲(chǔ)單元的地址位數(shù)相匹配??刂茊卧褂玫刂房偩€來(lái)發(fā)出讀取或?qū)懭氩僮鞯牡刂?,以確保正確的數(shù)據(jù)訪問(wèn)。
1.4.2 數(shù)據(jù)總線
數(shù)據(jù)總線的寬度通常與處理器的數(shù)據(jù)寬度相關(guān)。數(shù)據(jù)總線的功能包括在存儲(chǔ)單元和蝶形運(yùn)算單元之間傳輸數(shù)據(jù),以及將最終的FFT輸出數(shù)據(jù)傳送給外部系統(tǒng)或存儲(chǔ)設(shè)備。輸入數(shù)據(jù)從外部傳入FFT處理器,通過(guò)數(shù)據(jù)總線傳輸?shù)酱鎯?chǔ)單元??刂茊卧ㄟ^(guò)地址總線指定要寫入的存儲(chǔ)單元的位置。中間結(jié)果由蝶形運(yùn)算單元計(jì)算并存儲(chǔ)在存儲(chǔ)單元中,然后通過(guò)數(shù)據(jù)總線傳輸?shù)较乱患?jí)的計(jì)算。最終的FFT輸出數(shù)據(jù)也通過(guò)數(shù)據(jù)總線傳送出來(lái),以供后續(xù)處理或輸出。
1.4.3 并行性和效率
總線模塊的設(shè)計(jì)允許FFT處理器同時(shí)處理多個(gè)數(shù)據(jù)點(diǎn),從而提高計(jì)算速度和效率。并行性通過(guò)同時(shí)在不同地址上訪問(wèn)存儲(chǔ)單元和傳輸數(shù)據(jù)來(lái)實(shí)現(xiàn)。數(shù)據(jù)總線的寬度和速度對(duì)于實(shí)現(xiàn)高吞吐量的FFT計(jì)算至關(guān)重要??刂茊卧?fù)責(zé)生成控制信號(hào),以協(xié)調(diào)地址總線和數(shù)據(jù)總線的使用。它確保數(shù)據(jù)在正確的時(shí)間傳輸,以支持FFT計(jì)算的正確執(zhí)行。總線模塊的設(shè)計(jì)和性能直接影響FFT處理器的整體性能。一個(gè)高效的總線系統(tǒng)可以大大提高計(jì)算速度和數(shù)據(jù)傳輸?shù)男?,從而加速頻譜分析或信號(hào)處理任務(wù)的完成。
本研究設(shè)計(jì)的FFT大小為64點(diǎn),浮點(diǎn)數(shù)精度為32位,選擇64位數(shù)據(jù)寬度。系統(tǒng)時(shí)鐘頻率為100MHz。
在FPGA設(shè)計(jì)中,控制單元核心部分是狀態(tài)機(jī)的設(shè)計(jì),狀態(tài)機(jī)是一種有限狀態(tài)自動(dòng)機(jī),用于管理FFT計(jì)算的不同階段。這些階段包括初始化、數(shù)據(jù)輸入、蝶形運(yùn)算和數(shù)據(jù)輸出等。狀態(tài)機(jī)的狀態(tài)在時(shí)鐘信號(hào)上升沿觸發(fā)時(shí)更新。根據(jù)當(dāng)前狀態(tài)和輸入信號(hào),狀態(tài)機(jī)會(huì)切換到下一個(gè)狀態(tài),在代碼中使用了always塊來(lái)描述狀態(tài)機(jī)的行為??刂茊卧€需要實(shí)現(xiàn)啟動(dòng)和停止控制。這包括設(shè)計(jì)適當(dāng)?shù)目刂菩盘?hào),以啟動(dòng)FFT計(jì)算或停止計(jì)算。通常,這些信號(hào)可以通過(guò)外部輸入或者通過(guò)FPGA編程來(lái)控制。這使得FFT處理器能夠根據(jù)外部信號(hào)或者軟件命令開(kāi)始或停止計(jì)算。
此外,控制單元還可能需要與其他模塊進(jìn)行狀態(tài)同步,以確保各個(gè)組件在正確的時(shí)間執(zhí)行。例如,與蝶形運(yùn)算單元和存儲(chǔ)單元之間的狀態(tài)同步是至關(guān)重要的,以確保數(shù)據(jù)在正確的時(shí)間傳遞和處理。
2.2.1 模塊定義
下面的代碼定義了一個(gè)名為ButterflyUnit的Verilog模塊,該模塊包括輸入和輸出端口。輸入包括兩個(gè)復(fù)數(shù)數(shù)據(jù)點(diǎn)(實(shí)部和虛部),而輸出包括一個(gè)復(fù)數(shù)數(shù)據(jù)點(diǎn)(實(shí)部和虛部)。

module…ButterflyUnit…(…………input…wire…[31:0]…input_data1_real,……//…輸入數(shù)據(jù)1 的實(shí)部…………input…wire…[31:0]…input_data1_imag,……//…輸入數(shù)據(jù)1 的虛部…………input…wire…[31:0]…input_data…………input…wire…[31:0]…input_data 2_real,……//…輸入數(shù)據(jù)2 的實(shí)部2_imag,……//…輸入數(shù)據(jù)2 的虛部…………output…wire…[31:0]…output_data_real,…//…輸出數(shù)據(jù)的實(shí)部…………output…wire…[31:0]…output_data_imag……//…輸出數(shù)據(jù)的虛部);
2.2.2 復(fù)數(shù)乘法
這部分計(jì)算了兩個(gè)輸入數(shù)據(jù)點(diǎn)的復(fù)數(shù)乘法。首先,實(shí)部相乘得到product_real,然后虛部相乘并相加得到product_imag。這兩個(gè)值構(gòu)成了復(fù)數(shù)乘法的結(jié)果。

//…復(fù)數(shù)乘法wire…[31:0]…product_real…=…input_data1_real…*…input_data2_real…-…input_data1_imag…*…input_data2 wire…[31:0]…product_imag…=…input_imag;_data1_real…*…input_data2_imag…+…input_data1_imag…*…input_data2_real;
2.2.3 復(fù)數(shù)加法
這部分計(jì)算了兩個(gè)輸入數(shù)據(jù)點(diǎn)的復(fù)數(shù)加法。它直接將實(shí)部和虛部分別相加,得到output_data_real和output_data_imag,它們構(gòu)成了復(fù)數(shù)加法的結(jié)果。

//…復(fù)數(shù)加法assign…output_data_real…=…input_data1_real…+…input_data2_real;assign…output_data_imag…=…input_data1_imag…+…input_data2_imag;
旋轉(zhuǎn)因子在FFT算法中表示為復(fù)數(shù)幅度為1的指數(shù)函數(shù),其角度由FFT計(jì)算的當(dāng)前階段和頻率決定。

module…TwiddleFactorGenerator…(…………input…wire…[7:0]…phase,…………………//…當(dāng)前階段(角度)輸入,8 位二進(jìn)制表示…………output…wire…[31:0]…twiddle_real,…//…旋轉(zhuǎn)因子實(shí)部,32 位寬…………output…wire…[31:0]…twiddle_imag……//…旋轉(zhuǎn)因子虛部,32 位寬)//…旋轉(zhuǎn)因子計(jì)算always…@(*)…begin…………//…計(jì)算角度…………reg…[7:0]…angle…=…phase;…//…在實(shí)際應(yīng)用中,可能需要更復(fù)雜的角度計(jì)算…………//…計(jì)算旋轉(zhuǎn)因子…………assign…twiddle_real…=…$signed($bitstoreal({1'b0,…1'b0,…angle}))…/…256.0;…//…實(shí)部…………assign…twiddle_imag…=…$signed($bitstoreal({1'b0,…1'b1,…angle}))…/…256.0;…//…虛部end endmodule
該模塊接受一個(gè)8位的角度輸入作為phase,并輸出32位的旋轉(zhuǎn)因子的實(shí)部和虛部。生成的旋轉(zhuǎn)因子的實(shí)部和虛部都是32位寬的有符號(hào)數(shù),它們表示了復(fù)數(shù)形式的旋轉(zhuǎn)因子。這些旋轉(zhuǎn)因子用于后續(xù)的復(fù)數(shù)乘法操作,以實(shí)現(xiàn)頻域的正確變換。
本文詳細(xì)討論了基于FPGA的高性能FFT處理器的設(shè)計(jì)和實(shí)現(xiàn)。FFT是一種在信號(hào)處理、通信和圖像處理等領(lǐng)域中廣泛使用的算法,因此,在FPGA硬件平臺(tái)上實(shí)現(xiàn)高性能的FFT處理器對(duì)于加速這些應(yīng)用非常重要。在本文中論述了處理器的各個(gè)核心組成部分,包括控制單元、蝶形運(yùn)算單元、存儲(chǔ)單元和總線模塊,并對(duì)控制單元和蝶形運(yùn)算單元如何在FPGA實(shí)現(xiàn)給予了重點(diǎn)研究。