畢業(yè)論文——基于FPGA的FFT窗函數(shù)計算
《畢業(yè)論文——基于FPGA的FFT窗函數(shù)計算》由會員分享,可在線閱讀,更多相關《畢業(yè)論文——基于FPGA的FFT窗函數(shù)計算(60頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、本科畢業(yè)設計(論文) 基于FPGA的FFT窗函數(shù)計算學 院 物理與光電工程學院專 業(yè) 光信息科學與技術年級班別 學 號 學生姓名 xxx 指導教師 年 月基于FPGA的FFT窗函數(shù)計算xxx物理與光電工程學院54摘 要在實際工程設計中常常需要對數(shù)字信號進行傅里葉變換,而傅里葉變換的定義是對無限長的連續(xù)時域信號所進行的頻域分析。由于計算機無法對無限長的時間信號進行處理和計算,因而需要對輸入系統(tǒng)的信號進行截短。但是,信號的截短操作會導致頻譜能量的泄露,從而造成信號的不完整性分析。雖然理論上頻譜能量泄露是不能完全消除的,但通過本課題提出的窗函數(shù)法可以對它們的影響進行抑制。本課題運用高性能FPGA硬件
2、加速,結合MATLAB輔助分析,對海明窗、矩形窗、漢寧窗和布萊克曼窗的特性進行剖析以及研究它們對設計的影響。在用FPGA設計窗函數(shù)的過程中運用合理的方案來減少設計的資源以及提高設計的速度。測試結果表明,采用窗函數(shù)法可以很好地減少頻譜能量的泄露。最后運用AXI4協(xié)議將設計接口封裝為AXI4-Lite接口和AXI4-Stream接口,并用主控器MicroBlase進行控制。關鍵詞:頻譜能量泄露,窗函數(shù),現(xiàn)場可編程門陣列,矩陣實驗室,AXI4協(xié)議AbstractIn actual engineering design often need to the Fourier transform of di
3、gital signal, and the Fourier transform is defined as the infinite long continuous time domain to frequency domain signal analysis. As the computer cant infinitely long time signal processing and calculation, so it is necessary to the system input signal was truncated. However, shortened operation w
4、ill lead to frequency spectrum of signal energy leak, causing the signal integrity analysis. Although spectrum energy leakage cannot be totally eliminated, but through this topic proposed window function method can affects their suppression. This topic using high-performance FPGA hardware accelerati
5、on, auxiliary analysis combined with MATLAB, the hamming window, rectangular window and hanning window and analyzes the characteristics of blackman window and study their impact on design. In the process of using FPGA to design a window function using rational scheme to reduce the design resources,
6、and improve the speed of the design. Test results show that the window function method is a good way to reduce the frequency spectrum energy leakage. Finally using the AXI4 protocol will design interface encapsulation for AXI4 - Lite interface and AXI4 - Stream interface, and the host controller Mic
7、roBlase control.Key words:Spectrum Energy Leakage, Window Function, FPGA, MATLAB, AXI4 Protocal目 錄1 緒論11.1 課題背景及目的11.2 課題研究內(nèi)容12 基礎知識22.1 Verilog HDL22.2 FPGA22.3 MATLAB32.4 AXI4協(xié)議33 窗函數(shù)83.1 基本概念83.2 窗函數(shù)幅頻特性分析93.2.1 矩形窗函數(shù)93.2.2 漢寧窗函數(shù)103.2.3 海明窗函數(shù)113.2.4 布萊克曼窗函數(shù)113.3 窗函數(shù)選擇124 CORDIC算法134.1 圓周旋轉模式135 系
8、統(tǒng)設計165.1 系統(tǒng)概述165.2 角度生成模塊195.2.1 設計精度分析195.2.2 設計實現(xiàn)205.3 CORDIC算法模塊225.3.1 設計精度分析225.3.2 設計實現(xiàn)235.4 余弦值輸出模塊275.5 窗函數(shù)系數(shù)生成模塊295.6 窗函數(shù)結果計算模塊305.7 數(shù)據(jù)與窗函數(shù)相乘模塊315.8 系統(tǒng)的性能分析335.9 AXI4接口封裝346 系統(tǒng)優(yōu)化356.1 資源優(yōu)化356.1.1 資源共享356.1.2 位寬選擇386.1.3 迭代次數(shù)選擇386.2 速度優(yōu)化38總結40參考文獻41致謝42附錄A CORDIC算法模塊的設計實現(xiàn)43縮略語對照表481 緒論1.1 課題
9、背景及目的在現(xiàn)實生活中,我們經(jīng)常需要用示波器、頻譜分析儀等對信號進行頻譜分析,然后根據(jù)其頻譜特性設計一個系統(tǒng)從信號中提取我們感興趣的信號或去除沒用的信號。隨著傅里葉變換算法的提出,使得我們對信號的頻譜分析變得更加簡單。傅里葉變換的定義是對連續(xù)信號進行的,在理論上具有無限的完美性。但在實際工程中FFT(快速傅里葉變換)只能對有限個點的離散信號進行計算,就是說,我們要從連續(xù)信號中截取一段有效的信號來進行處理。信號的截短操作會導致頻譜能量的泄露,從而造成對信號的頻譜分析不正確1-4。頻譜能量泄露的表現(xiàn)形式就是測量頻譜在真實頻譜的兩側頻帶上擴展開來的現(xiàn)象,即有一些幅值較小的假譜出現(xiàn)在真實頻譜的兩側。造
10、成頻譜能量泄露的一個很重要原因是截取的時域周期信號不是周期的整數(shù)倍5。理論上,頻譜能量泄露是不能完全消除的,但我們通過本課題提出的窗函數(shù)法可以抑制它們對設計的影響。窗函數(shù)的類型很多,對信號加不同的窗函數(shù)處理后,信號頻譜能量的泄露可以大大減少,但減少的程度是不一樣的。因此本課題將針對頻譜能量泄露的改善進行窗函數(shù)的分析、選擇和設計。1.2 課題研究內(nèi)容本課題主要利用MATLAB工具研究不同窗函數(shù)的特性以及它們對頻譜能量泄露的抑制效果,然后根據(jù)輸入信號的性質(zhì)和特征來選擇合適的窗函數(shù)。接著運用高性能FPGA硬件加速,采用Verilog HDL硬件描述語言在Xilinx ISE軟件平臺上對矩形窗、海明窗
11、、漢寧窗和布萊克曼窗四個窗函數(shù)進行設計并利用modelsim仿真工具對其進行仿真驗證。最后,使用AXI4協(xié)議將設計接口封裝為AXI4-Lite接口和AXI4-Stream接口,并由主控器MicroBlase進行控制。2 基礎知識本章將對這次課題所涉及到的一些基本概念進行介紹,其中包括Verilog HDL、FPGA、MATLAB以及AXI4協(xié)議。2.1 Verilog HDLVerilog HDL(簡稱Verilog)是一種以文本的方式描述數(shù)字電路結構和行為的硬件描述語言6-7。自從有了Verilog,對數(shù)字系統(tǒng)的設計就簡單容易多了,對數(shù)字電路的描述可以從算法級、寄存器傳輸級、門級和開關級四個
12、抽象層次上進行。下面是四個抽象層次的特點:(1) 算法級:只需關注設計實現(xiàn)的算法,而硬件實現(xiàn)方面可不必關心。(2) 寄存器傳輸級:只需關心數(shù)據(jù)在寄存器間的流動以及處理數(shù)據(jù)的方式。(3) 門級:利用邏輯門電路對功能模塊進行設計。(4) 開關級:利用開關、存儲節(jié)點對功能模塊進行設計。Verilog還具有以下的優(yōu)點:(1) Verilog的語法很像C語言,只要有C語言基礎就可以容易入門。(2) 使用Verilog對數(shù)字電路進行設計與電路工藝無關。(3) 使用Verilog對設計進行功能驗證,可在設計前期發(fā)現(xiàn)各種漏洞并進行修復,從而縮短了設計周期。(4) Verilog的使用令電路的升級更加容易。此外
13、,Verilog還具有一個特點就是對數(shù)字電路的設計同時支持自底向上和自頂向下兩種設計方法。2.2 FPGAFPGA(即現(xiàn)場可編程門陣列)是在PAL、GAL、CPLD等基礎上發(fā)展起來的,作為ASIC領域中的一種半定制電路,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點8-9。FPGA內(nèi)部有豐富的邏輯資源,包括CLB塊、塊RAM、DCM、乘法器硬核、可編程I/O塊等。利用FPGA進行數(shù)字電路的設計具有以下優(yōu)點:(1) 大多數(shù)FPGA基于SRAM工藝,理論上可以對其進行無次數(shù)擦除并重新設計。(2) 由于FPGA豐富的邏輯資源,因此可以設計非常復雜的組合或時序邏輯電路。(3) 利用F
14、PGA進行設計可以大大縮短設計周期。隨著技術的不斷進步,F(xiàn)PGA的優(yōu)勢越來越突出,也越來越多的工程師對它的青睞度不斷增加。同時,F(xiàn)PGA技術也正在快速發(fā)展著,總體來說具有以下幾個趨勢:(1) 隨著器件工藝越來越小,F(xiàn)PGA正向著大容量、低功耗的方向發(fā)展。(2) FPGA向著SoC方向發(fā)展。(3) FPGA內(nèi)部集成ASIC,從而克服體積大、功耗大、能力有限的缺點。(4) FPGA可動態(tài)重構。2.3 MATLABMATLAB是一款集數(shù)值計算、建模仿真、數(shù)據(jù)可視化等于一身的超強軟件10。由于它的強大功能,MATLAB被運用于廣泛的領域中,包括工業(yè)設計、通訊、圖像處理、工程計算等等。MATLAB具有以
15、下幾個優(yōu)點:(1) MATLAB友好的界面使用戶更加容易掌握軟件的使用方法。(2) MATLAB是一門簡單易用的語言,可以很快入門MATLAB并進行程序設計。(3) MATLAB擁有強大的數(shù)據(jù)處理能力以及出色的圖形處理能力。(4) MATLAB中集成了各種工具箱,使用戶開發(fā)更加簡單。善于運用MATLAB將對我們的設計和分析有非常大的幫助。2.4 AXI4協(xié)議AXI4協(xié)議是Xilinx公司和ARM公司共同為下一代FPGA定制IP的一種總線協(xié)議11。AXI4協(xié)議中具有五個獨立的通道,并且都是單向通道結構。此外,AXI4協(xié)議還支持猝發(fā)操作,提高了數(shù)據(jù)吞吐量。圖2.1和圖2.2分別為讀通道和寫通道的結
16、構示意圖,其中包含地址、數(shù)據(jù)和寫響應五個通道。地址通道用來傳輸?shù)刂泛涂刂菩盘枺粩?shù)據(jù)通道用來傳輸數(shù)據(jù);寫響應通道用來指示寫數(shù)據(jù)完成。五個通道信號的傳輸需要依賴于握手信號VALID和READY。通過VALID信號來指示信息發(fā)送源的數(shù)據(jù)和控制信號何時有效;通過READY信號來指示信息接收源何時可以接收數(shù)據(jù)。此外,還有LAST信號用來指示最后一個數(shù)據(jù)的傳輸。圖2.1 讀通道結構圖2.2 寫通道結構AXI4協(xié)議中有三種突發(fā)讀寫時序,下面將一一介紹。首先是突發(fā)式讀,如圖2.3所示。當?shù)刂吠ǖ郎铣霈F(xiàn)有效地址后,讀數(shù)據(jù)通道上將出現(xiàn)準備傳輸?shù)臄?shù)據(jù)。當RVALID信號和RREADY信號為高電平時,每個時鐘讀取一次
17、數(shù)據(jù)。另外,當RLAST信號為高電平時,表示傳輸最后一個數(shù)據(jù),即代表一次突發(fā)式讀即將完成。圖2.3 突發(fā)式讀波形圖其次是重疊突發(fā)式讀,如圖2.4所示。當完成一次突發(fā)式讀時,才能接著處理再一次的突發(fā)式讀。波形圖中主機為從機傳輸了兩個地址,只有完成第一次突發(fā)式讀后才能處理第二次突發(fā)式讀。圖2.4 重疊突發(fā)式讀波形圖最后是突發(fā)式寫,如圖2.5所示。如果地址通道上出現(xiàn)有效地址,那么當WVALID信號和WREADY信號同時為高電平時,每個時鐘寫一次數(shù)據(jù)。另外,當WLAST信號為高電平時,表示傳輸最后一個數(shù)據(jù)。當一次突發(fā)式寫完成時,寫響應信號BVALID將拉高。圖2.5 突發(fā)式寫波形圖由圖2.3圖2.5可
18、以看出,只有當信號VALID和READY同時為高電平時才進行數(shù)據(jù)的傳輸。但是信號VALID和READY出現(xiàn)高電平的情況有三種。圖2.6為VALID信號先于READY信號為高電平,即主機發(fā)送有效數(shù)據(jù)并等待從機可以接收數(shù)據(jù)為止。圖2.7為READY信號先于VALID信號為高電平,即從機已經(jīng)準備好接收數(shù)據(jù)但等待主機發(fā)送有效的數(shù)據(jù)為止。圖2.8為VALID信號和READY信號同時為高電平,即主機發(fā)送有效數(shù)據(jù)的同時從機可以接收數(shù)據(jù)。數(shù)據(jù)的傳輸發(fā)生在圖中的箭頭所指向的時鐘上升沿處。圖2.6 VALID信號早于READY信號圖2.7 READY信號早于VALID信號圖2.8 VALID信號與READY信號同
19、時最后介紹一下讀寫事務握手信號的依賴關系。圖2.9為讀事務握手信號依賴關系,它有以下兩點關系:(1) ARVALID信號可以先于或后于ARREADY信號有效。(2) 只有當ARVALID和ARREADY信號同時有效時,RVALID信號才能開始有效,才能開始傳輸數(shù)據(jù)。圖2.9 讀事務握手信號依賴關系圖2.10為寫事務握手信號依賴關系,它有以下三點關系:(1) AWVALID信號或WVLAID信號有效的同時或之后,AWREADY信號或WREADY信號才能有效。(2) 只要AWVALID和WVALID信號兩者有一個有效后,AWREADY信號才能有效。(3) 只要AWVALID和WVALID信號兩者有
20、一個有效后,WREADY信號才能有效。圖2.10 寫事務握手信號依賴關系3 窗函數(shù)3.1 基本概念信號的截短操作會導致頻譜能量的泄露,為了減少頻譜能量的泄露,可以為信號加上窗函數(shù)。所謂窗函數(shù)就是一種除給定區(qū)間之外均為零的實函數(shù),如圖3.1所示。使用窗函數(shù)使截短的信號在其邊界上收斂,或通過窗函數(shù)抑制DFT的等效濾波器振幅特性的旁瓣的方法來減少信號頻譜能量的泄露。圖3.2和圖3.3分別為信號加窗之前和加窗之后的頻譜分析。通過對比它們的頻譜圖,可以發(fā)現(xiàn)加窗之前有嚴重的頻譜泄露,加窗之后頻譜泄露改善。這就是本課題所要達到的目的。圖3.1 窗函數(shù)示意圖圖3.2 原始信號頻譜分析圖3.3 加窗信號頻譜分析
21、3.2 窗函數(shù)幅頻特性分析本課題需要設計的窗函數(shù)包括海明窗、矩形窗、漢寧窗和布萊克曼窗。接下來將對這四個窗函數(shù)的DFT等效濾波器的幅頻特性進行分析,從而確定這四個窗函數(shù)改善頻譜能量泄露的性能。3.2.1 矩形窗函數(shù)矩形窗的時域表達式為: (31)其頻域特性為: (32)矩形窗的幅頻特性如圖3.4所示(矩形窗長度為40,其他窗函數(shù)長度一樣)。加矩形窗實際上就是不加窗。矩形窗的主瓣能量相對集中,但是旁瓣幅值較高,其中最大的旁瓣幅值要比主瓣幅值低13dB。因此使用矩形窗容易帶來高頻干擾和頻譜泄露。圖3.4 矩形窗及其幅頻特性3.2.2 漢寧窗函數(shù)漢寧窗的時域表達式為: (33)其頻域特性為: (34
22、)漢寧窗的幅頻特性如圖3.5所示:圖3.5 漢寧窗及其幅頻特性漢寧窗的主瓣寬度比矩形窗要寬一些,旁瓣寬度比矩形窗要小很多,其中最大的旁瓣幅值要比主瓣幅值低31dB。從頻譜能量泄露減少的角度出發(fā),漢寧窗要比矩形窗好。3.2.3 海明窗函數(shù)海明窗的時域表達式為: (35)其頻域特性為: (36)海明窗的頻譜特性如圖3.6所示。圖3.6 海明窗及其幅頻特性海明窗的主瓣寬度跟漢寧窗的一樣,主瓣加寬旁瓣減少,其中最大的旁瓣幅值要比主瓣幅值低42dB,比漢寧窗還要小。但海明窗旁瓣的衰減速度要比漢寧窗慢一些。3.2.4 布萊克曼窗函數(shù)布萊克曼窗的時域表達式為: (37)其頻域特性為: (38)布萊克曼窗的幅
23、頻特性如圖3.7所示:圖3.7 布萊克曼窗及其幅頻特性與其他三個窗相比較,布萊克曼窗的主瓣寬度是最大的,但其最大的旁瓣幅值是最小的,比主瓣幅值低58dB。同時布萊克曼窗的旁瓣衰減速度也很快。3.3 窗函數(shù)選擇窗函數(shù)頻譜的兩側旁瓣決定了頻譜能量泄露的程度,于是,為了減少頻譜能量的泄露,我們對窗函數(shù)的選擇應遵循兩個原則:(1) 選擇能量主要集中在主瓣的窗函數(shù)10,12-13。(2) 選擇旁瓣幅值小、衰減速度快的窗函數(shù)。但很多時候這兩個條件是不能同時滿足的,因此我們要根據(jù)信號的特性折中選擇窗函數(shù)。例如,當對讀取信號頻率精度要求高而幅值精度要求不高時,可用矩形窗;當分析帶有較強干擾噪聲的窄帶信號或未知
24、信號時,可用漢寧窗;當對讀取信號幅值精度要求高而頻率精度要求不高時,可用布萊克曼窗。窗函數(shù)的適當選擇對信號的正確分析有著非常大的幫助。4 CORDIC算法CORDIC(Coordinate Rotation Digital Computer)算法是坐標旋轉數(shù)字計算機算法的簡稱14-15。它利用逼近實值的方法將一些復雜的算法(如開方、三角函數(shù)等)轉換成簡單的算法(移位相加減)。CORDIC算法包含圓周、線性和雙曲三種系統(tǒng),每種系統(tǒng)包括旋轉和向量兩種模式。也就是說,CORDIC算法總共有六種算法模式。而本課題將采用CORDIC算法中的圓周旋轉模式來計算窗函數(shù)中的余弦函數(shù)。下面對該模式進行介紹。4.
25、1 圓周旋轉模式在直角坐標系中,將向量逆時針旋轉角得到向量,如圖4.1所示:圖4.1 CORDIC算法圓周旋轉模式向量旋轉圖由圖4.1可得方程組如式(4-1)所示: (41)提取因數(shù),可將式(4-1)轉化為式(4-2): (42)去除,可得到偽旋轉方程式(4-3): (43)由于,故模值會增大倍。但是,旋轉的角度是正確的。假設為第次的旋轉角度,則第次偽旋轉方程組如式(4-4)所示: (44)現(xiàn)在對旋轉角度進行限制,使正切函數(shù)可由代替,這樣復雜的三角函數(shù)計算就變成了簡單的移位運算,如式(4-5)所示: (45)表4.1顯示的是CORDIC算法中每次迭代所對應的旋轉角度:表4.1 CORDIC算法
26、中每次迭代所對應的旋轉角度i0110.520.2530.12540.0625旋轉角度的總和為,其中。當為+1時,代表向量逆時針旋轉;當為-1時,代表向量順時針旋轉。而旋轉的方向會影響累積角度的大小。只要在的范圍內(nèi)的任意角度都可以旋轉,滿足所有角度的總和為。如果角度不在這個范圍內(nèi),則可以通過三角恒等式變換將角度轉換到這個范圍。如果再增加一個追蹤角度累加結果的方程式可得式(4-6): (46)其中,是一個判決算子,即,用來確定旋轉的方向。令,其中為比例因子,表征每次旋轉時向量模長發(fā)生的變化。若總的旋轉次數(shù)為n,則總的比例因子如式(4-7)所示。 (47)當時,。在圓周旋轉模式中,經(jīng)過n次迭代后得到
27、式(4-8): (48)當時,。通過設置和就可以計算三角函數(shù)和了。5 系統(tǒng)設計5.1 系統(tǒng)概述本課題“基于FPGA的FFT窗函數(shù)計算”,以MATLAB為輔助軟件,以FPGA為設計平臺,設計了海明窗、矩形窗、漢寧窗和布萊克曼窗四個窗函數(shù)。用FPGA實現(xiàn)本課題的設計,主要實現(xiàn)基于CORDIC算法的點數(shù)為256點到16M點動態(tài)可調(diào)、窗函數(shù)類型可選的窗函數(shù)控制器。本設計頂層模塊框圖如圖5.1所示,圖5.2所示為縮略的頂層模塊內(nèi)部結構,表5.1為頂層模塊的端口定義。圖5.1 頂層模塊框圖圖5.2 頂層模塊內(nèi)部結構表5.1 頂層模塊的端口信號名列表信號名信號方向位寬含義sys_clkinput1系統(tǒng)時鐘r
28、st_ninput1全局復位信號,低電平有效point_numinput24信號長度輸入,point_num范圍為28-1224-1theta_factorinput25角度因子輸入,由225/point_num決定window_modelinput2窗函數(shù)類型選擇變量dininput8無符號整數(shù)輸入din_eninput1輸入數(shù)據(jù)使能信號,高電平有效ndinput1從設備是否準備好接收數(shù)據(jù)標志位,高電平有效dout_by_windowoutput16無符號數(shù)輸出,數(shù)據(jù)格式為8位整數(shù),8位小數(shù)dout_by_window_enoutput1輸出數(shù)據(jù)使能信號,高電平有效rdyoutput1主設備
29、是否準備好接收數(shù)據(jù)標志位,高電平有效本課題“基于FPGA的FFT窗函數(shù)計算”需要實現(xiàn)的矩形窗、海明窗、漢寧窗和布萊克曼窗四個窗函數(shù)的通用公式為,不同的窗函數(shù)對應不同的系數(shù)A、B、C。為了計算窗函數(shù),首先需要計算余弦函數(shù)中的相位,然后是求解相位的余弦值,再是窗函數(shù)結果的計算,最后還要計算窗函數(shù)結果與輸入的8位無符號整數(shù)的乘積。一個好的設計,需要根據(jù)設計的功能進行模塊間的劃分,這樣不僅可以做到資源利用率的提高,還可以提升設計的速度。為了使本課題的設計更加合理,將本設計進行了功能上的劃分,各模塊在Xilinx ISE軟件中的組織架構如圖5.3所示,表5.2所示為各模塊的含義。圖5.3 本設計在ISE
30、中的組織架構表5.2 系統(tǒng)功能模塊劃分序號模塊名含義1windows_func頂層模塊,用來例化各功能模塊2u_theta_generator相位生成模塊,產(chǎn)生角度和3u_delay_tap延時模塊,對相關信號進行延時4u_cordic_topCORDIC算法頂層模塊,完成余弦值的計算5u_window_param窗函數(shù)系數(shù)生成模塊6u_window_calc窗函數(shù)結果計算模塊7u_window_mult_din數(shù)據(jù)與窗函數(shù)相乘模塊8u_mult_theta乘法器模塊,計算角度和9u_cordic_1計算的余弦絕對值10u_cordic_2計算的余弦絕對值11u_cos_result計算和的余
31、弦值12u_mult_param_cos1窗函數(shù)系數(shù)與的余弦值相乘13u_mult_param_cos2窗函數(shù)系數(shù)與的余弦值相乘14u_mult_window_filter數(shù)據(jù)與窗函數(shù)相乘模塊另外,在實際工程中,精度對于我們的設計來說是至關重要的。一個不符合精度要求的設計是不能拿出來用的。那么什么是精度?精度就是測量值與真實值的接近程度。在數(shù)字化的世界里,數(shù)值只能以有限位寬的二進制數(shù)表示,與真實值之間存在偏差。在數(shù)字信號處理電路中,經(jīng)常需要進行算術運算,隨著每一次的計算,其結果的位寬會越來越大。如果不進行合理的舍位處理,最終結果的位寬可能是非常大的,自然設計會消耗更多的資源,但是舍位處理會引入
32、誤差。為了使設計的精度滿足要求又不浪費多余的資源,我們可以為設計選擇合適的運算結構同時采用合適的位寬。當然位寬越大精度越高,但是設計要占用更多的資源。為了讓設計更加地優(yōu)化,我們要對精度和資源進行一個權衡。后面會對本課題的設計精度進行分析,以了解最終結果的誤差來源。接下來將詳細介紹各功能模塊在設計中的地位及實現(xiàn)的具體功能。有一點是需要注意的,本設計所提到的相位應理解為的系數(shù),如所對應的系數(shù)為,但為了方便理解,還是給出。5.2 角度生成模塊5.2.1 設計精度分析我們要提前知道的是本設計中CORDIC算法模塊的輸入相位范圍為,24位二進制位寬表示(詳見CORDIC算法模塊),其中最高位為符號位。窗
33、函數(shù)表達式中的余弦和的最大角度分別為和,得分別用26位和27位的二進制位寬表示,其中最高位為符號位,始終為0。為了能夠進行無符號運算,只要利用三角恒等變換關系把輸入相位限制在之間,然后輸入CORDIC算法模塊,但是其輸出的結果還只是余弦函數(shù)的絕對值,還要根據(jù)其相位所在的區(qū)間給予它正值或負值。這樣,和只要分別用25位和26位的二進制位寬表示就可以了。確定了這種關系后,現(xiàn)在就可以開始對角度生成模塊精度進行分析。本課題“基于FPGA的FFT窗函數(shù)計算”中需要進行余弦函數(shù)和的計算,在進行余弦函數(shù)計算之前要對相位和進行計算,其中N為256點到16M點動態(tài)可調(diào),n為0N-1。仔細觀察角度和,我們可以提取和
34、兩個參數(shù),這兩個參數(shù)分別稱為相位因子和信號長度,由模塊外部的AXI4_Lite接口提供。這樣做的目的一方面可以節(jié)省大量由于除法器和其他一些邏輯電路所消耗的那一部分的邏輯資源,另一方面由MicroBlase主控器為設計提供所需的動態(tài)可調(diào)的參數(shù)很方便。對于角度生成器,其位寬選取理由為:(1) 由于信號長度N為256點到16M點動態(tài)可調(diào),為了使二進制位寬能夠表示最大點數(shù)16M,將位寬確定為24。(2) 當信號長度N取16M點時,可獲得本設計的最小相位因子。為了能夠將該最小相位用二進制數(shù)表示出來并盡可能減少誤差,可將相位因子左移24位即放大倍,故相位因子位寬為25位。(3) 由于點數(shù)n與相位因子的乘積
35、最大為,可以用25位二進制位寬表示。另外,兩者乘積結果位寬為49,故只需取低25位就可以了。由于相位因子用25位二進制位寬無法完全表示,故引入了誤差。但此誤差小于,非常小,對設計精度的影響不大。5.2.2 設計實現(xiàn)本課題“基于FPGA的FFT窗函數(shù)計算”中實現(xiàn)的四個窗函數(shù)設計里含有兩項余弦函數(shù)和,在計算余弦函數(shù)之前需要求解余弦函數(shù)的相位,因此本課題中設計了一個相位生成器,負責產(chǎn)生對應時刻的相位。相位生成器的模塊框圖如圖5.4所示,表5.3所示為相位生成器的端口定義。圖5.4 相位生成器表5.3 角度生成模塊的端口信號名列表信號名信號方向位寬含義sys_clkinput1系統(tǒng)時鐘rst_ninp
36、ut1全局復位信號,低電平有效point_numinput24信號長度輸入,point_num范圍為28-1224-1theta_factorinput25相位因子輸入,由225/point_num決定din_eninput1輸入數(shù)據(jù)使能信號,高電平有效ndinput1從設備是否準備好接收數(shù)據(jù)標志位,高電平有效theta_out1output24角度輸出,0pi/2sign1output1符號標志位1,1表示負數(shù),0表示整數(shù)theta_out2output24角度輸出,0pi/2sign2output1符號標志位2,1表示負數(shù),0表示整數(shù)rdyoutput1主設備是否準備好接收數(shù)據(jù)標志位,高有
37、電平效在該模塊中,要做的事情就是根據(jù)信號長度point_num和相位因子theta_factor算出相應時刻的相位。為了算出這個相位,調(diào)用了乘法器IP核,其例化代碼如程序清單5.1所示:程序清單5.1 產(chǎn)生余弦函數(shù)相位/ 調(diào)用乘法器,產(chǎn)生相應的相位wire DATA2_WIDTH-1:0 theta;/ 輸出相位,02*piwire rst;/ 乘法器復位信號,高電平有效assign rst = rst_n;mult_theta u_mult_theta ( .clk ( sys_clk ), / 系統(tǒng)時鐘 .sclr ( rst ),/ 復位信號,高電平有效 .a ( theta_facto
38、r ), / 相位因子,位寬25 .b ( point_cnt ), / 輸入第n點,位寬24 .p ( theta ) / 輸出相應相位,位寬25);有一點是需要我們注意的,在乘法器中相位因子theta_factor和點數(shù)point_cnt的位寬分別為25和24,輸出相位theta的位寬應為49。這里只取其中的低25位,但這并沒有造成數(shù)據(jù)的損失。原因是相位因子theta_factor和點數(shù)point_cnt的乘積最大值為,用25位二進制位寬完全可以表示輸出相位。為了將送入CORDIC算法模塊(詳見下一小節(jié))的相位和限制在范圍之內(nèi),我們需要對乘法器輸出的相位theta進行處理。這里有兩件事要做
39、,第一,判斷該相位屬于直角坐標系中的哪個象限,并根據(jù)三角恒等變換關系將相位轉換到第一象限;第二,根據(jù)相位原在的象限,給它一個標志位,標志其余弦值的正負極性,即當為1時代表余弦值為負數(shù),當為0時代表余弦值為正數(shù)。為了更好理解相位是如何轉換到第一象限的,下面結合直角坐標系來進行解釋,如圖5.5所示。以相位為例,其范圍為,用25位無符號二進制數(shù)據(jù)表示。當theta24:23為2b00時,表示該相位在第一象限,如(a)所示。此時的相位已在第一象限,不用轉換,相當于已限制到第一象限,即輸出相位theta_out1為theta23:0,其余弦值為正數(shù),即正負標志位sign1為1b0。當theta24:23
40、為2b01時,表示該相位在第二象限,如(b)所示。如果要將該相位轉換到第一象限,則轉換后的相位為即輸出相位theta_out1為(24)1b1 - theta23:0 + 1b1,其余弦值為負數(shù),即正負標志位sign1為1b1。當theta24:23為2b10時,表示該相位在第三象限,如(c)所示,如果要將該相位轉換到第一象限,則轉換后的相位為即輸出相位theta_out1為theta23:0,其余弦值為負數(shù),即正負標志位sign1為1b1。當theta24:23為2b11時,表示該相位在第四象限,如(d)所示,如果要將該相位轉換到第一象限,則轉換后的相位為即輸出相位theta_out1為(2
41、4)1b1 - theta23:0 + 1b1,其余弦值為正數(shù),即正負標志位sign1為1b0。相位在直角坐標中象限的轉換類似,這里就不再贅述了。(a)相位在第一象限(b)相位在第二象限(c)相位在第三象限(d)相位在第四象限圖5.5 直角坐標系相位旋轉示意圖5.3 CORDIC算法模塊5.3.1 設計精度分析本課題“基于FPGA的FFT窗函數(shù)計算”中需要計算余弦函數(shù),而余弦函數(shù)的計算是基于CORDIC迭代算法的。迭代次數(shù)越多,數(shù)據(jù)表示位寬越大,所獲得的結果精度越高,但付出的代價是消耗更多的資源。但是并不是說精度越高對設計就越好。我們既要考慮到設計的精度,也要考慮到設計消耗的資源,即設計精度與
42、資源的均衡。為了獲得所希望的精確度,需要確定迭代的次數(shù)和數(shù)據(jù)的位寬。為了在不浪費多余的資源下確定合適的迭代次數(shù),應該定位于CORDIC算法第n次迭代所對應的旋轉相位要小于本設計的最小相位。當信號長度為16M點時,可獲得本設計的最小相位。表5.4所示為CORDIC算法每一次迭代所對應的相位。表5.4 CORDIC迭代過程中的旋轉相位i012122由表5.4可以看出,在23次迭代時旋轉相位小于本系統(tǒng)的最小相位,因此CORDIC算法模塊的迭代次數(shù)確定為23。此外,為了能夠用二進制數(shù)比較精確地表示相位和余弦值,同時還要考慮資源的消耗,需要選擇合適的二進制位寬。位寬越大,精度越高,但資源消耗越大;位寬越
43、小,精度越小,但資源消耗越少。經(jīng)過MATLAB仿真結果分析,最后決定用24位的二進制位寬表示相位和余弦值。5.3.2 設計實現(xiàn)本課題“基于FPGA的FFT窗函數(shù)計算”中需要計算兩項余弦函數(shù)和,這里我們可以采用CORDIC迭代算法實現(xiàn)余弦函數(shù)的計算。于是在本設計中需要設計CORDIC算法模塊,其模塊框圖如圖5.6所示,表5.5所示為CORDIC算法模塊的端口定義。其中,變量theta_in是一個范圍為的相位輸入,即最高位為符號位。變量cos_data是24位的余弦函數(shù)結果絕對值輸出,其值相對于原值的絕對值放大了倍。為了統(tǒng)一,將輸入相位限制在之間,其值為原值的絕對值,必須根據(jù)其正負符號標志位求出真
44、正的余弦值(詳見相位生成模塊)。圖5.6 CORDIC算法模塊表5.5 CORDIC算法模塊的端口信號名列表信號名信號方向位寬含義sys_clkinput1系統(tǒng)時鐘rst_ninput1全局復位信號,低電平有效theta_ininput24角度輸入, cos_dataoutput24余弦值絕對值輸出為了將本課題“基于FPGA的FFT窗函數(shù)計算”中復雜的三角函數(shù)運算轉化成簡單的移位相加減運算,需要限制旋轉相位,使得,即。在用FPGA對CORDIC算法模塊進行設計之前,需要將這些旋轉相位計算出來。為了確保設計的精確度,在對CORDIC算法模塊設計時進行了23次迭代。現(xiàn)在利用MATLAB將這些旋轉相
45、位計算出來,其MATLAB代碼如程序清單5.2所示:程序清單5.2 求解旋轉角度的MATLAB實現(xiàn)fid = fopen(rot.txt,w);% 打開一個文件for i = 0:22 x = atan(2(-i)*224/pi;% 計算每級迭代的旋轉角度 rot_angle = atan(2(-i)*180/pi;% 將角度轉換成弧度 y = dec2bin(x,24);% 將十進制轉換成二進制fprintf(fid,localparam Rot%-2d = 24b,i+1);% 以下三行將弧度以符合Verilog HDLfwrite(fid,y);%語法寫進文件 fprintf(fid,;
46、t/%9.6fdegrn,rot_angle); endfclose(fid) 由于每次旋轉都會使向量模長增大,n次旋轉后模長將增大 。為了糾正向量模長,最后得乘以因子。該因子可由程序清單5.3所示的MATLAB程序實現(xiàn):程序清單5.3 求解向量模長糾正因子的MATLAB實現(xiàn)Init_1 = 1;fid = fopen(Init.txt,w);% 打開一個文件for i = 0:22% 計算K=1/cos(0)*1/cos(1)*.*1/cos(n-1) cos_data = cos(atan(2(-i); Init_1 = Init_1*cos_data;endInit_expand = I
47、nit_1*223;% 將K左移23位即放大223倍以用整數(shù)表示Init_data = dec2bin(Init_expand,24);% 將十進制數(shù)轉換成二進制數(shù)fprintf(fid,localparam Init = 24b);% 以下三行將Init_data以符合Verilog HDL語法fwrite(fid,Init_data);% 寫進文件fprintf(fid,; /%9.7f*2%d,Init_1,i);fclose(fid)% 關閉文件接著,根據(jù)第四章中的式(4-5)和式(4-6)就可以開始CORDIC算法模塊的FPGA設計了,圖5.7所示為CORDIC算法模塊每次迭代所對應
48、的硬件結構。經(jīng)過23迭代之后就可以將得到的余弦函數(shù)結果的絕對值輸出了。圖5.7 CORDIC算法每次迭代所對應的硬件結構到此,CORDIC算法模塊已經(jīng)設計好了。接下來,驗證CORDIC算法模塊的功能是否正確,精度是否滿足設計。以驗證1M點的為例,將modelsim仿真值和MATLAB理論值進行比較,如圖5.8所示。(a)理論值(b)實值(c)誤差值圖5.8 CORDIC算法模塊實值與理論值的比較經(jīng)過MATLAB仿真,CORDIC算法模塊實值和理論值之間最大的誤差為。該誤差值很小,那么該誤差值對本設計最終結果的精度有沒有影響呢?首先,對本設計的數(shù)據(jù)格式要求為輸入8位的無符號整數(shù),輸出16位無符號
49、數(shù)據(jù),其中8位整數(shù)、8位小數(shù)。如果用二進制數(shù)表示,則該誤差值在小數(shù)點后第17位開始。此外,該誤差來自于余弦函數(shù)。在窗函數(shù)的計算過程中,余弦函數(shù)還要和一個小于1的系數(shù)相乘,也就說窗函數(shù)的結果實值與理論值的誤差小于。窗函數(shù)的結果最后還要跟輸入的8位無符號整數(shù)相乘,說理論上本設計的誤差值將在二進制小數(shù)點后第9位開始。但本設計只保留8位小數(shù),也就是說最終的誤差值將會被舍去。故該CORDIC算法模塊的功能是正確的,而且精度非常高,滿足設計要求。另外,除了滿足功能和精度上的需求,還要對CORDIC算法模塊所消耗的資源以及速度進行分析,該分析是在Xilinx公司的Kintex-7 XC7K160T平臺下進行
50、(本課題凡是涉及到資源和速度的分析都是在這個平臺下進行的)。本課題對速度的要求是使設計跑到200MHz以上。本設計也是某系統(tǒng)的一個小模塊,一般情況下,為了本設計所在的系統(tǒng)可以跑到200MHz以上,應該讓本設計至少通過250MHz的時序約束。為了分析本設計的性能,應該找一個參照的對象。于是設計了一個調(diào)用IP核的CORDIC模塊,它的參數(shù)跟純邏輯設計的CORDIC算法模塊一樣,如器件型號、數(shù)據(jù)位寬、迭代次數(shù)和時序約束一樣。通過布局布線后兩個模塊的資源消耗情況如表5.6和表5.7所示,時序分析情況如表5.8和表5.9所示。表5.6 純邏輯CORDIC算法模塊的資源消耗邏輯資源使用已使用寄存器1567
51、查找表1657表5.7 IP核CORDIC模塊的資源消耗邏輯資源使用已使用寄存器1957查找表2069表5.8 純邏輯CORDIC算法模塊時序分析周期占空比周期裕量時鐘約束4ns50%布局布線后2.158ns1.842ns表5.9 IP核CORDIC IP模塊時序分析周期占空比周期裕量時鐘約束4ns50%布局布線后2.278ns1.722ns通過對數(shù)據(jù)的分析,純邏輯設計的CORDIC算法模塊相對于IP核CORDIC模塊不僅資源消耗小一些,速度也快了。綜上所示,本設計的CORDIC算法模塊不僅精度高、資源消耗合理、速度也通過了250MHz的時序約束,故該CORDIC算法模塊的設計是非常合理的。5
52、.4 余弦值輸出模塊本課題“基于FPGA的FFT窗函數(shù)計算”中CORDIC算法模塊求出的余弦值是對應相位的余弦值的絕對值?,F(xiàn)在,我們要根據(jù)相位生成模塊輸出的余弦值正負符號標志位對從CORDIC算法模塊輸出的余弦值的絕對值進行還原。由數(shù)學的知識可知,正數(shù)的絕對值是其本身,負數(shù)的絕對值是其相反數(shù)。在這里,設計了一個余弦值輸出模塊,其模塊框圖如圖5.9所示,表5.10所示為余弦值輸出模塊的端口定義。圖5.9 余弦值輸出模塊表5.10 余弦值輸出模塊的端口信號名列表信號名信號方向位寬含義sys_clkinput1系統(tǒng)時鐘rst_ninput1全局復位信號,低電平有效cordic_cos_abs1inp
53、ut24余弦函數(shù)的絕對值cordic_sign1_dly25input1余弦函數(shù)正負標志位cordic_cos_abs2input24余弦函數(shù)的絕對值cordic_sign2_dly25input1余弦函數(shù)正負標志位cordic_cos1output25余弦函數(shù)的余弦值cordic_cos2output25余弦函數(shù)的余弦值在進行余弦值的還原之前,由于從相位生成模塊輸出的相位經(jīng)過CORDIC算法模塊處理到余弦值的絕對值輸出需要25個時鐘周期,為了同步,需要對從相位生成模塊輸出的余弦值正負符號標志位進行25個時鐘周期的延時,最后得到經(jīng)過延時后的信號為cordic_sign1_dly25和cordi
54、c_sign2_dly25。另外,由數(shù)路基礎知識可道,正數(shù)的補碼是它本身,負數(shù)的補碼是除符號位之外的數(shù)取反再加1。為了還原余弦值,得增加一位符號位,故輸出的余弦值是一個25位位寬的有符號數(shù)據(jù)。最后根據(jù)該原理,對本模塊進行Verilog HDL設計如程序清單5.4所示:程序清單5.4 余弦值的還原/ 根據(jù)正負標志位cordic_sign1_dly26完成cos(2*pi*n/(N-1)絕對值的復原always (posedge sys_clk or negedge rst_n)begin if(rst_n=1b0) cordic_cos1 = #1 (DATA2_WIDTH)1b0; else
55、begin if(cordic_sign1_dly26=1b1) cordic_cos1 = #1 1b1,cordic_cos_abs1+1b1; else cordic_cos1 = #1 1b0,cordic_cos_abs1; endend/ 根據(jù)正負標志位cordic_sign2_dly26完成cos(4*pi*n/(N-1)絕對值的復原always (posedge sys_clk or negedge rst_n)begin if(rst_n=1b0) cordic_cos2 = #1 (DATA2_WIDTH)1b0; else begin if(cordic_sign2_dl
56、y26=1b1) cordic_cos2 = #1 1b1,cordic_cos_abs2+1b1; else cordic_cos2 = #1 1b0,cordic_cos_abs2;endend5.5 窗函數(shù)系數(shù)生成模塊本課題“基于FPGA的FFT窗函數(shù)計算”中需要設計矩形窗、海明窗、漢寧窗和布萊克曼窗四個窗函數(shù)。為了實現(xiàn)資源共享(詳見第五章資源共享),節(jié)省大量寶貴的資源,通過窗函數(shù)的類型對窗函數(shù)的系數(shù)進行選擇,故這里設計了窗函數(shù)系數(shù)生成模塊。該模塊的模塊框圖如圖5.10所示,表5.11所示為該模塊的端口定義。圖5.10 窗函數(shù)系數(shù)生成模塊表5.11 窗函數(shù)系數(shù)生成模塊的端口信號名列表信號名信號方向位寬含義window_modelinput2窗函數(shù)類型選擇變量paramAoutput43窗函數(shù)第一系數(shù)paramBoutput16窗函數(shù)第二系數(shù)paramCoutput16窗函數(shù)第三系數(shù)其中,變量window_model決定窗函數(shù)的類型,即當window_model為2b00時,設計選擇海明窗;
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。