基于Stratix系列FPGA的FFT模塊設(shè)計(jì)與實(shí)現(xiàn)
1 引言
對(duì)于地面上的遠(yuǎn)距離微波通信,當(dāng)通信距離超過(guò)一定范圍時(shí),電磁波傳播會(huì)受到地面的阻擋,隨著通信距離的增加通信信號(hào)則會(huì)衰減。為了延長(zhǎng)通信距離和提高通信質(zhì)量,需要在通信二地之間設(shè)立若干微波中繼設(shè)備(例如微波接力機(jī)),進(jìn)行電磁波轉(zhuǎn)接并對(duì)信號(hào)進(jìn)行逐段接收和放大后再發(fā)送給下一段。在微波接力通信中,通常采用擴(kuò)頻方式提高系統(tǒng)的抗干擾能力。但是,擴(kuò)頻系統(tǒng)過(guò)寬的頻帶帶寬很容易在通信設(shè)備密集的地方受到其他設(shè)備的干擾(窄帶干擾)。所以在微波接力機(jī)工作過(guò)程中,需要對(duì)接收信號(hào)中的窄帶干擾信號(hào)進(jìn)行快速識(shí)別并利用相應(yīng)的自適應(yīng)陷波等技術(shù)對(duì)窄帶干擾進(jìn)行抑制。由于在頻域上窄帶干擾的功率譜呈現(xiàn)尖峰狀,而擴(kuò)頻信號(hào)大致呈現(xiàn)平坦特性且并容易識(shí)別。所以要在微波接力機(jī)中設(shè)計(jì)FFT模塊用于計(jì)算信號(hào)的功率譜。
對(duì)實(shí)現(xiàn)FFT的工程,目前通用的方法是采用DSP、FFT處理電路及FPGA。用DSP實(shí)現(xiàn)FFT的處理速度較慢,不能滿足某些高速信號(hào)實(shí)時(shí)處理的要求;專(zhuān)用的FFT處理器件雖然速度較快,但是價(jià)格相對(duì)昂貴且外圍電路相對(duì)復(fù)雜;采用新一代的FP-GA來(lái)實(shí)現(xiàn)FFT兼有二者的優(yōu)點(diǎn)。FPGA資源豐富、易于借助并行流水的特點(diǎn)來(lái)實(shí)現(xiàn)FFT,不但性能穩(wěn)定、經(jīng)濟(jì)性好,而且可以大大縮短計(jì)算的耗時(shí)。以Altera公司的Stratix系列FPGA為例,它具有多達(dá)79 040個(gè)邏輯單元、7 MB的嵌入式存儲(chǔ)器、優(yōu)化的數(shù)字信號(hào)處理器和高性能的I/O能力,非常方便以全并行流水方式進(jìn)行FFT處理。
筆者選用Stratix系列中的EPlS25型FPGA來(lái)實(shí)現(xiàn)FFT,在系統(tǒng)主頻大于52 MHz的環(huán)境下穩(wěn)定工作后,完成1次256點(diǎn)的FFT所需要的時(shí)間小于5μs,完成1次1024點(diǎn)的FFT所需時(shí)間小于20μs,完全滿足實(shí)時(shí)處理的要求。
2 模塊的設(shè)計(jì)與實(shí)現(xiàn)
2.1 FFT算法選擇
自從1965年J.W.Tuky和T.W.Coody在《計(jì)算機(jī)數(shù)學(xué)》上發(fā)表了著名的《機(jī)器計(jì)算傅立葉級(jí)數(shù)的一種算法》論文后,經(jīng)過(guò)幾十年來(lái)的不斷改進(jìn),形成了很多FFT的高效算法。這些算法基本上分為二大類(lèi):時(shí)域抽取法FFT(DIT-FFT)和頻域抽取法FFT(DIF-FFT)。時(shí)域抽取法是把變換模塊的輸入數(shù)據(jù)在時(shí)域上按一定的倒序規(guī)則打亂,經(jīng)過(guò)變換后,輸出的FFT頻域信號(hào)是順序排列的。而頻域抽取法是把變換模塊的輸入數(shù)據(jù)在時(shí)域上按順序輸入,經(jīng)過(guò)變換后,輸出的FFT頻域信號(hào)按照倒序列規(guī)則輸出。根據(jù)運(yùn)算基的不同,又可以分為基2、基4、基8及混合基算法等。
在該變換模塊的處理過(guò)程中,可以在預(yù)加窗單元方便地完成倒序操作,而且在全并行流水方式處理的過(guò)程中,采用時(shí)域抽取可以充分利用原址存儲(chǔ),節(jié)省內(nèi)存。所以,在設(shè)計(jì)中選擇簡(jiǎn)單實(shí)用的時(shí)域抽取基2FFT算法。
2.2 FFT模塊與外部電路的接口
FFT模塊與外部電路的接口如圖1所示。圖中,輸入信號(hào)Xin為復(fù)數(shù)零中頻信號(hào),數(shù)據(jù)寬度為18bit,編碼格式為二進(jìn)制補(bǔ)碼。Xout是復(fù)數(shù)變換輸出信號(hào),數(shù)據(jù)寬度為18 bit,編碼格式也是二進(jìn)制補(bǔ)碼。CLK和HCLK分別是系統(tǒng)的主時(shí)鐘和2倍時(shí)鐘。HCLK主要用于數(shù)據(jù)的輸入、輸出。當(dāng)CLK為‘1’時(shí),由Xin在HCLK的上升沿輸入實(shí)部數(shù)據(jù)并在Xout輸出變換數(shù)據(jù)的實(shí)部;當(dāng)CLK為‘O’時(shí),由Xin在HCLK的上升沿輸入虛部數(shù)據(jù)并在Xout輸出變換數(shù)據(jù)的虛部。iFSyne為變換輸入幀同步控制信號(hào),oFSync為變換輸出幀同步控制信號(hào)。2個(gè)信號(hào)為‘1’時(shí)分別表示模塊輸入/輸出變換幀的第1個(gè)數(shù)據(jù)開(kāi)始輸入/輸出。
2.3 全并行流水方式的實(shí)現(xiàn)
在FFT工作方式的設(shè)計(jì)上,充分利用FPGA內(nèi)嵌乘法器和存儲(chǔ)器資源豐富的特點(diǎn).采用全并行的流水工作方式。如圖2所示,圖中N為進(jìn)行FFT運(yùn)算的點(diǎn)數(shù),M=log2N。以N=256,M=8為例,當(dāng)系統(tǒng)穩(wěn)定工作之后,在256個(gè)時(shí)鐘之內(nèi),同時(shí)有l(wèi)O組數(shù)據(jù)在做不同的運(yùn)算。當(dāng)?shù)?組數(shù)據(jù)輸入的時(shí)候,第10組數(shù)據(jù)正在輸出,而中間的8組數(shù)據(jù)正在進(jìn)行各級(jí)蝶形運(yùn)算。因此,當(dāng)模塊進(jìn)入穩(wěn)定工作狀態(tài)后,每隔256個(gè)時(shí)鐘就有一組數(shù)據(jù)完成256點(diǎn)的FFT,從輸出RAM中輸出。
2.4 FFT變換模塊的內(nèi)部設(shè)計(jì)
FFT內(nèi)部變換模塊的設(shè)計(jì)如圖3所示。下面以N=256點(diǎn)的FFT為例分別予以說(shuō)明。
2.4.1 加窗并倒序存儲(chǔ)單元
為了減少時(shí)域截?cái)嘣斐傻念l譜泄漏誤差,在進(jìn)行FFT變換前應(yīng)對(duì)模塊輸入的數(shù)據(jù)進(jìn)行加窗處理??紤]到本模塊主要用來(lái)分析疊加有窄帶干擾的擴(kuò)頻信號(hào),它要求精確給出每個(gè)窄帶干擾的中心頻率及其干擾強(qiáng)度的相對(duì)大小,所以,這里選用帶外衰減為80 dB的Chebyshev窗以獲取良好的頻譜效果。經(jīng)過(guò)加窗之后的數(shù)據(jù)按照倒序的規(guī)則存儲(chǔ)在RAM中,等待進(jìn)入蝶形運(yùn)算單元進(jìn)行運(yùn)算。
2.4.2 控制單元
控制單元是整個(gè)FFT變換模塊的核心。它主要負(fù)責(zé)以下二方面的工作。
(1)提供各個(gè)模塊的運(yùn)算使能
當(dāng)檢測(cè)到輸入口的iFSync信號(hào)為高電平后,立即啟動(dòng)“加窗并倒序存儲(chǔ)單元”和“窗因子ROM”單元進(jìn)行數(shù)據(jù)輸入、加窗、倒序存儲(chǔ)處理。在256個(gè)時(shí)鐘之后,啟動(dòng)“各級(jí)蝶形運(yùn)算”單元,并控制地址產(chǎn)生單元產(chǎn)生當(dāng)前需要的各類(lèi)地址。中間各級(jí)蝶形運(yùn)算的使能由上l級(jí)蝶算單元產(chǎn)生。在第8級(jí)運(yùn)算結(jié)束時(shí),提供數(shù)據(jù)輸出的標(biāo)志oFSync,并控制輸出RAM同步輸出數(shù)據(jù)。
(2)產(chǎn)生各級(jí)運(yùn)算過(guò)程中所需的地址
倒序地址:用模為N的同步計(jì)數(shù)器的輸出來(lái)實(shí)現(xiàn),把當(dāng)前計(jì)數(shù)器輸出的高位與低位的對(duì)應(yīng)位進(jìn)行全部對(duì)調(diào)即可得到當(dāng)前數(shù)據(jù)的倒序地址。
各級(jí)運(yùn)算的地址:把RAM取數(shù)地址和ROM取數(shù)地址對(duì)應(yīng)起來(lái)。原則是先把1個(gè)旋轉(zhuǎn)因子所對(duì)應(yīng)的所有數(shù)據(jù)計(jì)算完畢再轉(zhuǎn)到下1個(gè)旋轉(zhuǎn)因子所對(duì)應(yīng)的數(shù)據(jù)上。這樣的話,可以在產(chǎn)生ROM地址的同時(shí)產(chǎn)生所有RAM取數(shù)的地址。把二者的地址建立關(guān)聯(lián)之后,可以使RAM數(shù)據(jù)和ROM數(shù)據(jù)嚴(yán)格對(duì)應(yīng)起來(lái)。
2.4.3 RAM模塊
在256點(diǎn)的FFT中,要進(jìn)行8級(jí)蝶算,對(duì)全并行的工作方式而言需要8個(gè)不同的RAM來(lái)存儲(chǔ)各級(jí)的中間結(jié)果。其中,第8級(jí)的RAM可以作為輸出RAM。再加上前面加窗和倒序的1個(gè)RAM,整個(gè)系統(tǒng)共需要9個(gè)RAM。對(duì)于256點(diǎn)的復(fù)數(shù),把實(shí)部和虛部分開(kāi)共需要512個(gè)存儲(chǔ)單元。在某一級(jí)的蝶算中,由于信號(hào)及運(yùn)算的延遲,不可能就在256個(gè)時(shí)鐘之內(nèi)完成本級(jí)運(yùn)算,而下一組的數(shù)據(jù)在256個(gè)時(shí)鐘之后就要進(jìn)行本級(jí)運(yùn)算并將結(jié)果存儲(chǔ)在該RAM中,這樣就有可能造成數(shù)據(jù)還沒(méi)有被完全讀取就被新數(shù)據(jù)覆蓋的沖突。為了確保在全并行工作方式中實(shí)現(xiàn)數(shù)據(jù)的準(zhǔn)確存取,可以把9個(gè)RAM都設(shè)置成1024?8 bit的存儲(chǔ)格式,即:把每個(gè)RAM分為二部分,地址為0~511的為前半部分,地址為512~l 023的為后半部分,用一個(gè)MSB的信號(hào)作為地址最高位來(lái)控制前后二部分存儲(chǔ)器。當(dāng)?shù)?組數(shù)據(jù)進(jìn)行本級(jí)運(yùn)算時(shí),其結(jié)果保存在RAM的前半部分;256個(gè)時(shí)鐘之后,對(duì)MSB求反,并以此控制把第I+1組數(shù)據(jù)進(jìn)行本級(jí)運(yùn)算的結(jié)果寫(xiě)入RAM的后半部分,此時(shí)對(duì)第1組數(shù)據(jù)的讀取在前半部分進(jìn)行,互不沖突。Altera的FPGA器件里有豐富的RAM資源,采用雙端口RAM可以很方便地實(shí)現(xiàn)上述操作。
2.4.4 ROM模塊
整個(gè)模塊共需3個(gè)ROM,一個(gè)用來(lái)存儲(chǔ)Chebyshev窗因子,另外二個(gè)分別用來(lái)存儲(chǔ)旋轉(zhuǎn)因子的實(shí)部和虛部。事先在MATLAB中計(jì)算出這些因子,并將它們按照*.mif文件格式輸出。在QuartusⅡ軟件中,例化3個(gè)ROM,并把由MATLAB產(chǎn)生的*.mif文件寫(xiě)入各自ROM的初始化文件中,完成對(duì)ROM的初始化工作。
2.4.5 蝶形運(yùn)算單元
(1)基本蝶形運(yùn)算單元。把復(fù)數(shù)運(yùn)算分解為實(shí)數(shù)運(yùn)算之后,每個(gè)基本的蝶形運(yùn)算單元都可由4個(gè)乘法器、1個(gè)加法器和1個(gè)減法器構(gòu)成。其中,乘法器是決定系統(tǒng)運(yùn)算速度的關(guān)鍵因素。對(duì)256點(diǎn)FFT在全并行的工作方式下,最多要求在同一時(shí)鐘并行完成33個(gè)18x18 bit的乘法運(yùn)算。而EPlS25系列FPGA有非常豐富的乘法器資源,僅DSP就可以并行完成40個(gè)18x18 bit的乘法運(yùn)算,完全滿足系統(tǒng)的要求。
(2)可化簡(jiǎn)的蝶形運(yùn)算單元。在對(duì)各級(jí)蝶形進(jìn)行研究的基礎(chǔ)上發(fā)現(xiàn),第1級(jí)和第2級(jí)的蝶形經(jīng)過(guò)化簡(jiǎn)完全可以不用進(jìn)行乘法操作。
第1級(jí)只有1個(gè)旋轉(zhuǎn)因子won,其實(shí)部為1、虛部為O,代入基本蝶形運(yùn)算單元化簡(jiǎn)之后可得:
mx1=xl+x2;my1=yl+y2
mx2=x1-x2;my2=y1-y2
其中:x1、x2為輸入數(shù)據(jù)實(shí)部,y1、y2為輸入數(shù)據(jù)虛部,mx1、mx2為變換之后的數(shù)據(jù)實(shí)部,my1、my2為變換之后的數(shù)據(jù)虛部。
第2級(jí)有2個(gè)旋轉(zhuǎn)因子,won和w64n,對(duì)won可以沿用第一級(jí)的簡(jiǎn)化方法。
對(duì)于w64n,其實(shí)部為0、虛部為-l,代入基本蝶算單元化簡(jiǎn)之后可得:mx1=x1+y2;my1=y1+x2;mx2=x1-xz;my2=y1+x2這樣,總共8級(jí)的蝶形運(yùn)算有2級(jí)可以不用乘法器和存儲(chǔ)旋轉(zhuǎn)因子的ROM,節(jié)省了25%的乘法器和ROM資源。
2.5 誤差的分析與控制
對(duì)FPGA而言,采用浮點(diǎn)運(yùn)算帶來(lái)的硬件開(kāi)銷(xiāo)太大。而如果采用文獻(xiàn)[3]所提出的塊浮點(diǎn)防溢出方案,在每一級(jí)蝶形運(yùn)算結(jié)束之后,都需要找出該級(jí)計(jì)算結(jié)果中的最大值來(lái)判斷溢出的狀態(tài),并以此確定進(jìn)行下一級(jí)運(yùn)算時(shí)每個(gè)數(shù)據(jù)需要移位的位數(shù)。這對(duì)全并行的工作方式而言,意味著每一級(jí)數(shù)據(jù)都會(huì)帶來(lái)更大的延遲,影響整個(gè)運(yùn)算的速度。而對(duì)定點(diǎn)運(yùn)算而言,雖然存在有限字長(zhǎng)效應(yīng)的影響,但是,只要對(duì)數(shù)據(jù)進(jìn)行適當(dāng)?shù)囊莆惶幚砭涂梢苑乐挂绯?;在?shù)據(jù)舍棄時(shí),進(jìn)行類(lèi)似4舍5入的運(yùn)算就可以有效的控制誤差。在綜合考慮之后,系統(tǒng)采用定點(diǎn)運(yùn)算方案。在定點(diǎn)運(yùn)算中,誤差主要體現(xiàn)在以下兩方面:
(1)乘法截?cái)嗾`差。2個(gè)18位的數(shù)據(jù)相乘得到36位的積,把該積舍入為18位就會(huì)產(chǎn)生誤差。由于來(lái)自零中頻的18位數(shù)據(jù)實(shí)際表征的是模值不大于‘1’的復(fù)小數(shù),所以相乘不會(huì)產(chǎn)生溢出。去掉次高位多余的符號(hào)位并截去后17位。當(dāng)被截去的各位是‘1’的時(shí)候,誤差最大;被截去的各位為‘O’時(shí),沒(méi)有誤差。對(duì)被截去的部分作類(lèi)似4舍5入的處理,第20位為‘1’則向上進(jìn)位,為‘O’則直接舍去,可以有效減小誤差。
(2)加減法溢出誤差。2個(gè)18位的數(shù)據(jù)相加減得到19位的結(jié)果,在進(jìn)行下一級(jí)運(yùn)算之前,必須舍去l位,對(duì)舍棄的這l位也進(jìn)行上述的4舍5入運(yùn)算。2個(gè)小數(shù)的加減運(yùn)算而言,把結(jié)果全部右移1位就可以防止溢出。
3 波形仿真與性能分析
波形仿真選用的輸入信號(hào)為
x(n)=Xxexp[j?03+2x127xnxπ)/256]
式中。X根據(jù)測(cè)試的需要分別取18 bit信號(hào)的最大值和達(dá)到80 dB信噪比所需的最小值13,n的取值范圍為0:255。設(shè)計(jì)工具選用VHDL93版硬件描述語(yǔ)言,在QuartusⅡ4.1平臺(tái)上進(jìn)行邏輯綜合和時(shí)序分析,把仿真結(jié)果保存為*.tbl文件格式。在MATLAB中,讀取*.tbl文件,并與MATLAB的計(jì)算結(jié)果進(jìn)行比較。由于8級(jí)運(yùn)算都作了右移1位的處理,所以實(shí)際結(jié)果比用MATLAB的計(jì)算結(jié)果縮小256倍。把MATLAB的計(jì)算結(jié)果縮小256倍與0uartusⅡ4.1的計(jì)算結(jié)果比較,如圖4所示。圖中,左上圖為原始序列,右上圖為用MATLAB計(jì)算的結(jié)果,右下圖為用FPGA計(jì)算的實(shí)際結(jié)果。在左下圖中,把二個(gè)結(jié)果進(jìn)行局部放大,MATLAB的計(jì)算結(jié)果用實(shí)線表示,Quartus4.1的仿真結(jié)果用“+”表示。可以看出二組結(jié)果的吻合性非常好,驗(yàn)證了程序的正確性。仿真采用60 MHz系統(tǒng)主頻,在系統(tǒng)進(jìn)入穩(wěn)定狀態(tài)之后(經(jīng)過(guò)38.34μs),每完成1次256點(diǎn)FFT所用時(shí)間為4.26μs。對(duì)EPlS25器件資源占用情況為:邏輯單元使用15%,內(nèi)部存儲(chǔ)器使用18%,專(zhuān)用DSP使用62.5%。雖然專(zhuān)用DSP塊使用較多,但是邏輯單元使用得很少,可以用邏輯單元來(lái)構(gòu)成18x18的乘法器和專(zhuān)用DSP一起完成更多的并行乘法運(yùn)算。這說(shuō)明系統(tǒng)還具有很好的可擴(kuò)展性,要完成更多點(diǎn)數(shù)的FFT,只需增加相應(yīng)蝶形運(yùn)算的級(jí)數(shù)即可。
從結(jié)果可以看出,由于運(yùn)算中采用有效措施防止誤差和溢出,在最大數(shù)據(jù)運(yùn)算時(shí)沒(méi)有溢出,而且最終運(yùn)算結(jié)果的誤差小于10-9。在用達(dá)到80 dB信噪比所需最小數(shù)據(jù)進(jìn)行運(yùn)算時(shí),也有很好的分辨率。
4 結(jié)束語(yǔ)
本文討論了微波接力機(jī)中FFT模塊的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程。全部電路設(shè)計(jì)已經(jīng)過(guò)功能仿真、邏輯綜合、時(shí)延分析并成功下載到FPGA中投入實(shí)踐應(yīng)用。實(shí)踐應(yīng)用表明用Stratix系列FPGA實(shí)現(xiàn)FFT的速度快、穩(wěn)定性高、易于擴(kuò)展。在微波接力通信,特別是在接力機(jī)對(duì)窄帶干擾快速識(shí)別的應(yīng)用中有很大的優(yōu)越性。
評(píng)論