版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 本科畢業(yè)設計(論文) </p><p> 基于FPGA的FFT窗函數計算</p><p> 學 院 物理與光電工程學院</p><p> 專 業(yè) 光信息科學與技術</p><p> 年級班別
2、</p><p> 學 號 </p><p> 學生姓名 xxx </p><p> 指導教師 </p><p><b> 年 月</b></p><p&
3、gt;<b> 摘 要</b></p><p> 在實際工程設計中常常需要對數字信號進行傅里葉變換,而傅里葉變換的定義是對無限長的連續(xù)時域信號所進行的頻域分析。由于計算機無法對無限長的時間信號進行處理和計算,因而需要對輸入系統的信號進行截短。但是,信號的截短操作會導致頻譜能量的泄露,從而造成信號的不完整性分析。雖然理論上頻譜能量泄露是不能完全消除的,但通過本課題提出的窗函數法可以對
4、它們的影響進行抑制。本課題運用高性能FPGA硬件加速,結合MATLAB輔助分析,對海明窗、矩形窗、漢寧窗和布萊克曼窗的特性進行剖析以及研究它們對設計的影響。在用FPGA設計窗函數的過程中運用合理的方案來減少設計的資源以及提高設計的速度。測試結果表明,采用窗函數法可以很好地減少頻譜能量的泄露。最后運用AXI4協議將設計接口封裝為AXI4-Lite接口和AXI4-Stream接口,并用主控器MicroBlase進行控制。</p>
5、<p> 關鍵詞:頻譜能量泄露,窗函數,現場可編程門陣列,矩陣實驗室,AXI4協議</p><p><b> Abstract</b></p><p> In actual engineering design often need to the Fourier transform of digital signal, and the Fourie
6、r transform is defined as the infinite long continuous time domain to frequency domain signal analysis. As the computer can't infinitely long time signal processing and calculation, so it is necessary to the syste
7、m input signal was truncated. However, shortened operation will lead to frequency spectrum of signal energy leak, causing the signal integrity analysis. Although spectrum energy leakage </p><p> Key words:S
8、pectrum Energy Leakage, Window Function, FPGA, MATLAB, AXI4 Protocal</p><p><b> 目 錄</b></p><p><b> 1 緒論1</b></p><p> 1.1 課題背景及目的1</p><
9、;p> 1.2 課題研究內容1</p><p><b> 2 基礎知識2</b></p><p> 2.1 Verilog HDL2</p><p> 2.2 FPGA2</p><p> 2.3 MATLAB3</p><p> 2.4 AXI4協議3&
10、lt;/p><p><b> 3 窗函數8</b></p><p> 3.1 基本概念8</p><p> 3.2 窗函數幅頻特性分析9</p><p> 3.2.1 矩形窗函數9</p><p> 3.2.2 漢寧窗函數10</p><p>
11、3.2.3 海明窗函數11</p><p> 3.2.4 布萊克曼窗函數11</p><p> 3.3 窗函數選擇12</p><p> 4 CORDIC算法13</p><p> 4.1 圓周旋轉模式13</p><p> 5 系統設計16</p><p>
12、 5.1 系統概述16</p><p> 5.2 角度生成模塊19</p><p> 5.2.1 設計精度分析19</p><p> 5.2.2 設計實現20</p><p> 5.3 CORDIC算法模塊22</p><p> 5.3.1 設計精度分析22</p>&l
13、t;p> 5.3.2 設計實現23</p><p> 5.4 余弦值輸出模塊27</p><p> 5.5 窗函數系數生成模塊29</p><p> 5.6 窗函數結果計算模塊30</p><p> 5.7 數據與窗函數相乘模塊31</p><p> 5.8 系統的性能分析33
14、</p><p> 5.9 AXI4接口封裝34</p><p> 6 系統優(yōu)化35</p><p> 6.1 資源優(yōu)化35</p><p> 6.1.1 資源共享35</p><p> 6.1.2 位寬選擇38</p><p> 6.1.3 迭代次數選擇38
15、</p><p> 6.2 速度優(yōu)化38</p><p><b> 總結40</b></p><p><b> 參考文獻41</b></p><p><b> 致謝42</b></p><p> 附錄A CORDIC算法模塊的設計實
16、現43</p><p><b> 縮略語對照表48</b></p><p><b> 1 緒論</b></p><p> 1.1 課題背景及目的</p><p> 在現實生活中,我們經常需要用示波器、頻譜分析儀等對信號進行頻譜分析,然后根據其頻譜特性設計一個系統從信號中提取我們感興趣
17、的信號或去除沒用的信號。隨著傅里葉變換算法的提出,使得我們對信號的頻譜分析變得更加簡單。傅里葉變換的定義是對連續(xù)信號進行的,在理論上具有無限的完美性。但在實際工程中FFT(快速傅里葉變換)只能對有限個點的離散信號進行計算,就是說,我們要從連續(xù)信號中截取一段有效的信號來進行處理。信號的截短操作會導致頻譜能量的泄露,從而造成對信號的頻譜分析不正確[1-4]。</p><p> 頻譜能量泄露的表現形式就是測量頻譜在真
18、實頻譜的兩側頻帶上擴展開來的現象,即有一些幅值較小的假譜出現在真實頻譜的兩側。造成頻譜能量泄露的一個很重要原因是截取的時域周期信號不是周期的整數倍[5]。</p><p> 理論上,頻譜能量泄露是不能完全消除的,但我們通過本課題提出的窗函數法可以抑制它們對設計的影響。窗函數的類型很多,對信號加不同的窗函數處理后,信號頻譜能量的泄露可以大大減少,但減少的程度是不一樣的。因此本課題將針對頻譜能量泄露的改善進行窗函數
19、的分析、選擇和設計。</p><p> 1.2 課題研究內容</p><p> 本課題主要利用MATLAB工具研究不同窗函數的特性以及它們對頻譜能量泄露的抑制效果,然后根據輸入信號的性質和特征來選擇合適的窗函數。接著運用高性能FPGA硬件加速,采用Verilog HDL硬件描述語言在Xilinx ISE軟件平臺上對矩形窗、海明窗、漢寧窗和布萊克曼窗四個窗函數進行設計并利用models
20、im仿真工具對其進行仿真驗證。最后,使用AXI4協議將設計接口封裝為AXI4-Lite接口和AXI4-Stream接口,并由主控器MicroBlase進行控制。</p><p><b> 2 基礎知識</b></p><p> 本章將對這次課題所涉及到的一些基本概念進行介紹,其中包括Verilog HDL、FPGA、MATLAB以及AXI4協議。</p&g
21、t;<p> 2.1 Verilog HDL</p><p> Verilog HDL(簡稱Verilog)是一種以文本的方式描述數字電路結構和行為的硬件描述語言[6-7]。自從有了Verilog,對數字系統的設計就簡單容易多了,對數字電路的描述可以從算法級、寄存器傳輸級、門級和開關級四個抽象層次上進行。下面是四個抽象層次的特點:</p><p> 算法級:只需關注設
22、計實現的算法,而硬件實現方面可不必關心。</p><p> 寄存器傳輸級:只需關心數據在寄存器間的流動以及處理數據的方式。</p><p> 門級:利用邏輯門電路對功能模塊進行設計。</p><p> 開關級:利用開關、存儲節(jié)點對功能模塊進行設計。</p><p> Verilog還具有以下的優(yōu)點:</p><p&
23、gt; Verilog的語法很像C語言,只要有C語言基礎就可以容易入門。</p><p> 使用Verilog對數字電路進行設計與電路工藝無關。</p><p> 使用Verilog對設計進行功能驗證,可在設計前期發(fā)現各種漏洞并進行修復,從而縮短了設計周期。</p><p> Verilog的使用令電路的升級更加容易。</p><p>
24、; 此外,Verilog還具有一個特點就是對數字電路的設計同時支持自底向上和自頂向下兩種設計方法。</p><p><b> 2.2 FPGA</b></p><p> FPGA(即現場可編程門陣列)是在PAL、GAL、CPLD等基礎上發(fā)展起來的,作為ASIC領域中的一種半定制電路,既解決了定制電路的不足,又克服了原有可編程器件門電路數有限的缺點[8-9]。F
25、PGA內部有豐富的邏輯資源,包括CLB塊、塊RAM、DCM、乘法器硬核、可編程I/O塊等。利用FPGA進行數字電路的設計具有以下優(yōu)點:</p><p> 大多數FPGA基于SRAM工藝,理論上可以對其進行無次數擦除并重新設計。</p><p> 由于FPGA豐富的邏輯資源,因此可以設計非常復雜的組合或時序邏輯電路。</p><p> 利用FPGA進行設計可以大
26、大縮短設計周期。</p><p> 隨著技術的不斷進步,FPGA的優(yōu)勢越來越突出,也越來越多的工程師對它的青睞度不斷增加。同時,FPGA技術也正在快速發(fā)展著,總體來說具有以下幾個趨勢:</p><p> 隨著器件工藝越來越小,FPGA正向著大容量、低功耗的方向發(fā)展。</p><p> FPGA向著SoC方向發(fā)展。</p><p> F
27、PGA內部集成ASIC,從而克服體積大、功耗大、能力有限的缺點。</p><p> FPGA可動態(tài)重構。</p><p> 2.3 MATLAB</p><p> MATLAB是一款集數值計算、建模仿真、數據可視化等于一身的超強軟件[10]。由于它的強大功能,MATLAB被運用于廣泛的領域中,包括工業(yè)設計、通訊、圖像處理、工程計算等等。MATLAB具有以下幾
28、個優(yōu)點:</p><p> MATLAB友好的界面使用戶更加容易掌握軟件的使用方法。</p><p> MATLAB是一門簡單易用的語言,可以很快入門MATLAB并進行程序設計。</p><p> MATLAB擁有強大的數據處理能力以及出色的圖形處理能力。</p><p> MATLAB中集成了各種工具箱,使用戶開發(fā)更加簡單。<
29、/p><p> 善于運用MATLAB將對我們的設計和分析有非常大的幫助。</p><p> 2.4 AXI4協議</p><p> AXI4協議是Xilinx公司和ARM公司共同為下一代FPGA定制IP的一種總線協議[11]。AXI4協議中具有五個獨立的通道,并且都是單向通道結構。此外,AXI4協議還支持猝發(fā)操作,提高了數據吞吐量。圖2.1和圖2.2分別為讀通道
30、和寫通道的結構示意圖,其中包含地址、數據和寫響應五個通道。地址通道用來傳輸地址和控制信號;數據通道用來傳輸數據;寫響應通道用來指示寫數據完成。</p><p> 五個通道信號的傳輸需要依賴于握手信號VALID和READY。通過VALID信號來指示信息發(fā)送源的數據和控制信號何時有效;通過READY信號來指示信息接收源何時可以接收數據。此外,還有LAST信號用來指示最后一個數據的傳輸。</p><
31、;p> 圖2.1 讀通道結構</p><p> 圖2.2 寫通道結構</p><p> AXI4協議中有三種突發(fā)讀寫時序,下面將一一介紹。首先是突發(fā)式讀,如圖2.3所示。當地址通道上出現有效地址后,讀數據通道上將出現準備傳輸的數據。當RVALID信號和RREADY信號為高電平時,每個時鐘讀取一次數據。另外,當RLAST信號為高電平時,表示傳輸最后一個數據,即代表一次突發(fā)式讀
32、即將完成。</p><p> 圖2.3 突發(fā)式讀波形圖</p><p> 其次是重疊突發(fā)式讀,如圖2.4所示。當完成一次突發(fā)式讀時,才能接著處理再一次的突發(fā)式讀。波形圖中主機為從機傳輸了兩個地址,只有完成第一次突發(fā)式讀后才能處理第二次突發(fā)式讀。</p><p> 圖2.4 重疊突發(fā)式讀波形圖</p><p> 最后是突發(fā)式寫,如圖
33、2.5所示。如果地址通道上出現有效地址,那么當WVALID信號和WREADY信號同時為高電平時,每個時鐘寫一次數據。另外,當WLAST信號為高電平時,表示傳輸最后一個數據。當一次突發(fā)式寫完成時,寫響應信號BVALID將拉高。</p><p> 圖2.5 突發(fā)式寫波形圖</p><p> 由圖2.3~圖2.5可以看出,只有當信號VALID和READY同時為高電平時才進行數據的傳輸。但是
34、信號VALID和READY出現高電平的情況有三種。圖2.6為VALID信號先于READY信號為高電平,即主機發(fā)送有效數據并等待從機可以接收數據為止。圖2.7為READY信號先于VALID信號為高電平,即從機已經準備好接收數據但等待主機發(fā)送有效的數據為止。圖2.8為VALID信號和READY信號同時為高電平,即主機發(fā)送有效數據的同時從機可以接收數據。數據的傳輸發(fā)生在圖中的箭頭所指向的時鐘上升沿處。</p><p>
35、 圖2.6 VALID信號早于READY信號</p><p> 圖2.7 READY信號早于VALID信號</p><p> 圖2.8 VALID信號與READY信號同時</p><p> 最后介紹一下讀寫事務握手信號的依賴關系。圖2.9為讀事務握手信號依賴關系,它有以下兩點關系:</p><p> ARVALID信號可以先于
36、或后于ARREADY信號有效。</p><p> 只有當ARVALID和ARREADY信號同時有效時,RVALID信號才能開始有效,才能開始傳輸數據。</p><p> 圖2.9 讀事務握手信號依賴關系</p><p> 圖2.10為寫事務握手信號依賴關系,它有以下三點關系:</p><p> AWVALID信號或WVLAID信號有
37、效的同時或之后,AWREADY信號或WREADY信號才能有效。</p><p> 只要AWVALID和WVALID信號兩者有一個有效后,AWREADY信號才能有效。</p><p> 只要AWVALID和WVALID信號兩者有一個有效后,WREADY信號才能有效。</p><p> 圖2.10 寫事務握手信號依賴關系</p><p>
38、<b> 3 窗函數</b></p><p><b> 3.1 基本概念</b></p><p> 信號的截短操作會導致頻譜能量的泄露,為了減少頻譜能量的泄露,可以為信號加上窗函數。所謂窗函數就是一種除給定區(qū)間之外均為零的實函數,如圖3.1所示。使用窗函數使截短的信號在其邊界上收斂,或通過窗函數抑制DFT的等效濾波器振幅特性的旁瓣的方法
39、來減少信號頻譜能量的泄露。圖3.2和圖3.3分別為信號加窗之前和加窗之后的頻譜分析。通過對比它們的頻譜圖,可以發(fā)現加窗之前有嚴重的頻譜泄露,加窗之后頻譜泄露改善。這就是本課題所要達到的目的。</p><p> 圖3.1 窗函數示意圖</p><p> 圖3.2 原始信號頻譜分析</p><p> 圖3.3 加窗信號頻譜分析</p><
40、p> 3.2 窗函數幅頻特性分析</p><p> 本課題需要設計的窗函數包括海明窗、矩形窗、漢寧窗和布萊克曼窗。接下來將對這四個窗函數的DFT等效濾波器的幅頻特性進行分析,從而確定這四個窗函數改善頻譜能量泄露的性能。</p><p> 3.2.1 矩形窗函數</p><p> 矩形窗的時域表達式為:</p><p><
41、;b> ?。?1)</b></p><p><b> 其頻域特性為:</b></p><p><b> ?。?2)</b></p><p> 矩形窗的幅頻特性如圖3.4所示(矩形窗長度為40,其他窗函數長度一樣)。</p><p> 加矩形窗實際上就是不加窗。矩形窗的主瓣
42、能量相對集中,但是旁瓣幅值較高,其中最大的旁瓣幅值要比主瓣幅值低13dB。因此使用矩形窗容易帶來高頻干擾和頻譜泄露。</p><p> 圖3.4 矩形窗及其幅頻特性</p><p> 3.2.2 漢寧窗函數</p><p> 漢寧窗的時域表達式為:</p><p><b> ?。?3)</b></p&g
43、t;<p><b> 其頻域特性為:</b></p><p><b> ?。?4)</b></p><p> 漢寧窗的幅頻特性如圖3.5所示:</p><p> 圖3.5 漢寧窗及其幅頻特性</p><p> 漢寧窗的主瓣寬度比矩形窗要寬一些,旁瓣寬度比矩形窗要小很多,其中
44、最大的旁瓣幅值要比主瓣幅值低31dB。從頻譜能量泄露減少的角度出發(fā),漢寧窗要比矩形窗好。</p><p> 3.2.3 海明窗函數</p><p> 海明窗的時域表達式為:</p><p><b> ?。?5)</b></p><p><b> 其頻域特性為:</b></p>
45、<p><b> ?。?6)</b></p><p> 海明窗的頻譜特性如圖3.6所示。</p><p> 圖3.6 海明窗及其幅頻特性</p><p> 海明窗的主瓣寬度跟漢寧窗的一樣,主瓣加寬旁瓣減少,其中最大的旁瓣幅值要比主瓣幅值低42dB,比漢寧窗還要小。但海明窗旁瓣的衰減速度要比漢寧窗慢一些。</p>
46、<p> 3.2.4 布萊克曼窗函數</p><p> 布萊克曼窗的時域表達式為:</p><p><b> ?。?7)</b></p><p><b> 其頻域特性為:</b></p><p><b> (38)</b></p>&l
47、t;p> 布萊克曼窗的幅頻特性如圖3.7所示:</p><p> 圖3.7 布萊克曼窗及其幅頻特性</p><p> 與其他三個窗相比較,布萊克曼窗的主瓣寬度是最大的,但其最大的旁瓣幅值是最小的,比主瓣幅值低58dB。同時布萊克曼窗的旁瓣衰減速度也很快。</p><p> 3.3 窗函數選擇</p><p> 窗函數頻譜的
48、兩側旁瓣決定了頻譜能量泄露的程度,于是,為了減少頻譜能量的泄露,我們對窗函數的選擇應遵循兩個原則:</p><p> 選擇能量主要集中在主瓣的窗函數[10,12-13]。</p><p> 選擇旁瓣幅值小、衰減速度快的窗函數。</p><p> 但很多時候這兩個條件是不能同時滿足的,因此我們要根據信號的特性折中選擇窗函數。例如,當對讀取信號頻率精度要求高而幅值
49、精度要求不高時,可用矩形窗;當分析帶有較強干擾噪聲的窄帶信號或未知信號時,可用漢寧窗;當對讀取信號幅值精度要求高而頻率精度要求不高時,可用布萊克曼窗。窗函數的適當選擇對信號的正確分析有著非常大的幫助。</p><p> 4 CORDIC算法</p><p> CORDIC(Coordinate Rotation Digital Computer)算法是坐標旋轉數字計算機算法的簡稱[1
50、4-15]。它利用逼近實值的方法將一些復雜的算法(如開方、三角函數等)轉換成簡單的算法(移位相加減)。CORDIC算法包含圓周、線性和雙曲三種系統,每種系統包括旋轉和向量兩種模式。也就是說,CORDIC算法總共有六種算法模式。而本課題將采用CORDIC算法中的圓周旋轉模式來計算窗函數中的余弦函數。下面對該模式進行介紹。</p><p> 4.1 圓周旋轉模式</p><p> 在直角
51、坐標系中,將向量 逆時針旋轉角得到向量,如圖4.1所示:</p><p> 圖4.1 CORDIC算法圓周旋轉模式向量旋轉圖</p><p> 由圖4.1可得方程組如式(4-1)所示:</p><p><b> ?。?1)</b></p><p> 提取因數,可將式(4-1)轉化為式(4-2):</p&g
52、t;<p><b> ?。?2)</b></p><p> 去除 ,可得到偽旋轉方程式(4-3):</p><p><b> ?。?3)</b></p><p> 由于,故模值會增大倍。但是,旋轉的角度是正確的。</p><p> 假設為第次的旋轉角度,則第次偽旋轉方程組如式
53、(4-4)所示:</p><p><b> ?。?4)</b></p><p> 現在對旋轉角度 進行限制,使正切函數 可由 代替,這樣復雜的三角函數計算就變成了簡單的移位運算,如式(4-5)所示:</p><p><b> (45)</b></p><p> 表4.1顯示的是CORDIC
54、算法中每次迭代所對應的旋轉角度:</p><p> 表4.1 CORDIC算法中每次迭代所對應的旋轉角度</p><p> 旋轉角度的總和為 ,其中 。當為+1時,代表向量逆時針旋轉;當為-1時,代表向量順時針旋轉。而旋轉的方向會影響累積角度的大小。只要在 的范圍內的任意角度都可以旋轉,滿足 所有角度的總和為 。如果角度不在這個范圍內,則可以通過三角恒等式變換將角度轉換到這個范圍。&
55、lt;/p><p> 如果再增加一個追蹤角度累加結果的方程式可得式(4-6):</p><p><b> ?。?6)</b></p><p> 其中,是一個判決算子,即 ,用來確定旋轉的方向。</p><p> 令 ,其中為比例因子,表征每次旋轉時向量模長發(fā)生的變化。若總的旋轉次數為n,則總的比例因子如式(4-7)所
56、示。</p><p><b> ?。?7)</b></p><p><b> 當時, 。</b></p><p> 在圓周旋轉模式中,經過n次迭代后得到式(4-8):</p><p><b> (48)</b></p><p> 當 時, 。
57、通過設置 和 就可以計算三角函數 和 了。</p><p><b> 5 系統設計</b></p><p><b> 5.1 系統概述</b></p><p> 本課題“基于FPGA的FFT窗函數計算”,以MATLAB為輔助軟件,以FPGA為設計平臺,設計了海明窗、矩形窗、漢寧窗和布萊克曼窗四個窗函數。用FPGA
58、實現本課題的設計,主要實現基于CORDIC算法的點數為256點到16M點動態(tài)可調、窗函數類型可選的窗函數控制器。本設計頂層模塊框圖如圖5.1所示,圖5.2所示為縮略的頂層模塊內部結構,表5.1為頂層模塊的端口定義。</p><p> 圖5.1 頂層模塊框圖</p><p> 圖5.2 頂層模塊內部結構</p><p> 表5.1 頂層模塊的端口信號名列表
59、</p><p> 本課題“基于FPGA的FFT窗函數計算”需要實現的矩形窗、海明窗、漢寧窗和布萊克曼窗四個窗函數的通用公式為 ,不同的窗函數對應不同的系數A、B、C。為了計算窗函數,首先需要計算余弦函數中的相位,然后是求解相位的余弦值,再是窗函數結果的計算,最后還要計算窗函數結果與輸入的8位無符號整數的乘積。一個好的設計,需要根據設計的功能進行模塊間的劃分,這樣不僅可以做到資源利用率的提高,還可以提升設計的速
60、度。為了使本課題的設計更加合理,將本設計進行了功能上的劃分,各模塊在Xilinx ISE軟件中的組織架構如圖5.3所示,表5.2所示為各模塊的含義。</p><p> 圖5.3 本設計在ISE中的組織架構</p><p> 表5.2 系統功能模塊劃分</p><p> 另外,在實際工程中,精度對于我們的設計來說是至關重要的。一個不符合精度要求的設計是不能拿
61、出來用的。那么什么是精度?精度就是測量值與真實值的接近程度。在數字化的世界里,數值只能以有限位寬的二進制數表示,與真實值之間存在偏差。在數字信號處理電路中,經常需要進行算術運算,隨著每一次的計算,其結果的位寬會越來越大。如果不進行合理的舍位處理,最終結果的位寬可能是非常大的,自然設計會消耗更多的資源,但是舍位處理會引入誤差。為了使設計的精度滿足要求又不浪費多余的資源,我們可以為設計選擇合適的運算結構同時采用合適的位寬。當然位寬越大精度越
62、高,但是設計要占用更多的資源。為了讓設計更加地優(yōu)化,我們要對精度和資源進行一個權衡。后面會對本課題的設計精度進行分析,以了解最終結果的誤差來源。</p><p> 接下來將詳細介紹各功能模塊在設計中的地位及實現的具體功能。有一點是需要注意的,本設計所提到的相位應理解為 的系數,如 所對應的系數為 ,但為了方便理解,還是給出。</p><p> 5.2 角度生成模塊</p>
63、<p> 5.2.1 設計精度分析</p><p> 我們要提前知道的是本設計中CORDIC算法模塊的輸入相位范圍為 ,24位二進制位寬表示(詳見CORDIC算法模塊),其中最高位為符號位。窗函數表達式中的余弦 和 的最大角度分別為和,得分別用26位和27位的二進制位寬表示,其中最高位為符號位,始終為0。為了能夠進行無符號運算,只要利用三角恒等變換關系把輸入相位限制在 之間,然后輸入CORDI
64、C算法模塊,但是其輸出的結果還只是余弦函數的絕對值,還要根據其相位所在的區(qū)間給予它正值或負值。這樣,和只要分別用25位和26位的二進制位寬表示就可以了。確定了這種關系后,現在就可以開始對角度生成模塊精度進行分析。本課題“基于FPGA的FFT窗函數計算”中需要進行余弦函數 和 的計算,在進行余弦函數計算之前要對相位 和 進行計算,其中N為256點到16M點動態(tài)可調,n為0~N-1。仔細觀察角度 和 ,我們可以提取 和 兩個參數,這兩個參數
65、分別稱為相位因子和信號長度,由模塊外部的AXI4_Lite接口提供。這樣做的目的一方面可以節(jié)省大量由于除法器和其他一些邏輯電路所消耗的那一部分的邏輯資源,另一方面由MicroBlase主控器為設計提供所需的動態(tài)可調的參</p><p> 由于信號長度N為256點到16M點動態(tài)可調,為了使二進制位寬能夠表示最大點數16M,將位寬確定為24。</p><p> 當信號長度N取16M點時,可
66、獲得本設計的最小相位因子 。為了能夠將該最小相位用二進制數表示出來并盡可能減少誤差,可將相位因子左移24位即放大倍,故相位因子位寬為25位。</p><p> 由于點數n與相位因子 的乘積最大為,可以用25位二進制位寬表示。另外,兩者乘積結果位寬為49,故只需取低25位就可以了。</p><p> 由于相位因子 用25位二進制位寬無法完全表示,故引入了誤差。但此誤差小于 ,非常小,對設
67、計精度的影響不大。</p><p> 5.2.2 設計實現</p><p> 本課題“基于FPGA的FFT窗函數計算”中實現的四個窗函數設計里含有兩項余弦函數 和 ,在計算余弦函數之前需要求解余弦函數的相位,因此本課題中設計了一個相位生成器,負責產生對應時刻的相位。相位生成器的模塊框圖如圖5.4所示,表5.3所示為相位生成器的端口定義。</p><p> 圖
68、5.4 相位生成器</p><p> 表5.3 角度生成模塊的端口信號名列表</p><p> 在該模塊中,要做的事情就是根據信號長度point_num和相位因子theta_factor算出相應時刻的相位 。為了算出這個相位,調用了乘法器IP核,其例化代碼如程序清單5.1所示:</p><p> 程序清單5.1 產生余弦函數相位</p>&
69、lt;p> // 調用乘法器,產生相應的相位</p><p> wire [DATA2_WIDTH-1:0] theta;// 輸出相位,0~2*pi</p><p> wire rst;// 乘法器復位信號,高電平有效</p><p> assign r
70、st = ~rst_n;</p><p> mult_theta u_mult_theta (</p><p> .clk ( sys_clk ), // 系統時鐘</p><p> .sclr ( rst ),// 復位信號,高電平有效</p><
71、p> .a ( theta_factor ), // 相位因子,位寬25</p><p> .b ( point_cnt ), // 輸入第n點,位寬24</p><p> .p ( theta ) // 輸出相應相位,位寬25</p>
72、<p><b> );</b></p><p> 有一點是需要我們注意的,在乘法器中相位因子theta_factor和點數point_cnt的位寬分別為25和24,輸出相位theta的位寬應為49。這里只取其中的低25位,但這并沒有造成數據的損失。原因是相位因子theta_factor和點數point_cnt的乘積最大值為 ,用25位二進制位寬完全可以表示輸出相位。</
73、p><p> 為了將送入CORDIC算法模塊(詳見下一小節(jié))的相位 和 限制在 范圍之內,我們需要對乘法器輸出的相位theta進行處理。這里有兩件事要做,第一,判斷該相位屬于直角坐標系中的哪個象限,并根據三角恒等變換關系將相位轉換到第一象限;第二,根據相位原在的象限,給它一個標志位,標志其余弦值的正負極性,即當為1時代表余弦值為負數,當為0時代表余弦值為正數。</p><p> 為了更好理
74、解相位是如何轉換到第一象限的,下面結合直角坐標系來進行解釋,如圖5.5所示。以相位 為例,其范圍為 ,用25位無符號二進制數據表示。當theta[24:23]為2’b00時,表示該相位在第一象限,如(a)所示。此時的相位已在第一象限,不用轉換,相當于已限制到第一象限,即輸出相位theta_out1為theta[23:0],其余弦值為正數,即正負標志位sign1為1’b0。當theta[24:23]為2’b01時,表示該相位在第二象限,如
75、(b)所示。如果要將該相位轉換到第一象限,則轉換后的相位為 即輸出相位theta_out1為{(24){1'b1}} - theta[23:0] + 1'b1,其余弦值為負數,即正負標志位sign1為1’b1。當theta[24:23]為2’b10時,表示該相位在第三象限,如(c)所示,如果要將該相位轉換到第一象限,則轉換后的相位為 即輸出相位theta_out1為theta[23:0],其余弦值為負數,即正負標志位si
76、gn1為1’b1。當theta[24:23]為2’b11時,表示該相位在第四象限,如(d)所示,如果要將該相位轉換到第一象限,</p><p> 相位 在直角坐標中象限的轉換類似,這里就不再贅述了。</p><p> 5.3 CORDIC算法模塊</p><p> 5.3.1 設計精度分析</p><p> 本課題“基于FPGA的
77、FFT窗函數計算”中需要計算余弦函數,而余弦函數的計算是基于CORDIC迭代算法的。迭代次數越多,數據表示位寬越大,所獲得的結果精度越高,但付出的代價是消耗更多的資源。但是并不是說精度越高對設計就越好。我們既要考慮到設計的精度,也要考慮到設計消耗的資源,即設計精度與資源的均衡。為了獲得所希望的精確度,需要確定迭代的次數和數據的位寬。為了在不浪費多余的資源下確定合適的迭代次數,應該定位于CORDIC算法第n次迭代所對應的旋轉相位要小于本設
78、計的最小相位。當信號長度為16M點時,可獲得本設計的最小相位 。表5.4所示為CORDIC算法每一次迭代所對應的相位。</p><p> 表5.4 CORDIC迭代過程中的旋轉相位</p><p> 由表5.4可以看出,在23次迭代時旋轉相位 小于本系統的最小相位,因此CORDIC算法模塊的迭代次數確定為23。此外,為了能夠用二進制數比較精確地表示相位和余弦值,同時還要考慮資源的消耗
79、,需要選擇合適的二進制位寬。位寬越大,精度越高,但資源消耗越大;位寬越小,精度越小,但資源消耗越少。經過MATLAB仿真結果分析,最后決定用24位的二進制位寬表示相位和余弦值。</p><p> 5.3.2 設計實現</p><p> 本課題“基于FPGA的FFT窗函數計算”中需要計算兩項余弦函數 和 ,這里我們可以采用CORDIC迭代算法實現余弦函數的計算。于是在本設計中需要設計C
80、ORDIC算法模塊,其模塊框圖如圖5.6所示,表5.5所示為CORDIC算法模塊的端口定義。</p><p> 其中,變量theta_in是一個范圍為 的相位輸入,即最高位為符號位。變量cos_data是24位的余弦函數結果絕對值輸出,其值相對于原值的絕對值放大了倍。為了統一,將輸入相位限制在之間,其值為原值的絕對值,必須根據其正負符號標志位求出真正的余弦值(詳見相位生成模塊)。</p><
81、p> 圖5.6 CORDIC算法模塊</p><p> 表5.5 CORDIC算法模塊的端口信號名列表</p><p> 為了將本課題“基于FPGA的FFT窗函數計算”中復雜的三角函數運算轉化成簡單的移位相加減運算,需要限制旋轉相位,使得 ,即 。在用FPGA對CORDIC算法模塊進行設計之前,需要將這些旋轉相位計算出來。為了確保設計的精確度,在對CORDIC算法模塊設計時
82、進行了23次迭代?,F在利用MATLAB將這些旋轉相位計算出來,其MATLAB代碼如程序清單5.2所示:</p><p> 程序清單5.2 求解旋轉角度的MATLAB實現</p><p> fid = fopen('rot.txt','w');% 打開一個文件</p><p> for i = 0:22</p
83、><p> x = atan(2^(-i))*2^24/pi;% 計算每級迭代的旋轉角度</p><p> rot_angle = atan(2^(-i))*180/pi;% 將角度轉換成弧度</p><p> y = dec2bin(x,24);% 將十進制轉換成二進制</p><p> fprint
84、f(fid,'localparam Rot%-2d = 24''b',i+1);% 以下三行將弧度以符合Verilog HDL</p><p> fwrite(fid,y);%語法寫進文件</p><p> fprintf(fid,';\t//%9.6fdeg\r\n',rot_angle); </p>
85、<p><b> end</b></p><p> fclose(fid) </p><p> 由于每次旋轉都會使向量模長增大 ,n次旋轉后模長將增大 。為了糾正向量模長,最后得乘以因子。該因子可由程序清單5.3所示的MATLAB程序實現:</p><p> 程序清單5.3 求解向量模長糾正因子的MATLAB實現&
86、lt;/p><p> Init_1 = 1;</p><p> fid = fopen('Init.txt','w');% 打開一個文件</p><p> for i = 0:22% 計算K=1/cosθ(0)*1/cosθ(1)*...*1/cosθ(n-1)</p><p> c
87、os_data = cos(atan(2^(-i))); </p><p> Init_1 = Init_1*cos_data;</p><p><b> end</b></p><p> Init_expand = Init_1*2^23;% 將K左移23位即放大2^23倍以用整數表示</p><p>
88、 Init_data = dec2bin(Init_expand,24);% 將十進制數轉換成二進制數</p><p> fprintf(fid,'localparam Init = 24''b');% 以下三行將Init_data以符合Verilog HDL語法</p><p> fwrite(fid,Init_data);% 寫進
89、文件</p><p> fprintf(fid,'; //%9.7f*2^%d',Init_1,i);</p><p> fclose(fid)% 關閉文件</p><p> 接著,根據第四章中的式(4-5)和式(4-6)就可以開始CORDIC算法模塊的FPGA設計了,圖5.7所示為CORDIC算法模塊每次迭代所對應的硬件結構。經
90、過23迭代之后就可以將得到的余弦函數結果的絕對值輸出了。</p><p> 圖5.7 CORDIC算法每次迭代所對應的硬件結構</p><p> 到此,CORDIC算法模塊已經設計好了。接下來,驗證CORDIC算法模塊的功能是否正確,精度是否滿足設計。以驗證1M點的 為例,將modelsim仿真值和MATLAB理論值進行比較,如圖5.8所示。</p><p>
91、 圖5.8 CORDIC算法模塊實值與理論值的比較</p><p> 經過MATLAB仿真,CORDIC算法模塊實值和理論值之間最大的誤差為 。該誤差值很小,那么該誤差值對本設計最終結果的精度有沒有影響呢?首先,對本設計的數據格式要求為輸入8位的無符號整數,輸出16位無符號數據,其中8位整數、8位小數。如果用二進制數表示,則該誤差值在小數點后第17位開始。此外,該誤差來自于余弦函數。在窗函數的計算過程中,余
92、弦函數還要和一個小于1的系數相乘,也就說窗函數的結果實值與理論值的誤差小于 。窗函數的結果最后還要跟輸入的8位無符號整數相乘,說理論上本設計的誤差值將在二進制小數點后第9位開始。但本設計只保留8位小數,也就是說最終的誤差值將會被舍去。故該CORDIC算法模塊的功能是正確的,而且精度非常高,滿足設計要求。</p><p> 另外,除了滿足功能和精度上的需求,還要對CORDIC算法模塊所消耗的資源以及速度進行分析,
93、該分析是在Xilinx公司的Kintex-7 XC7K160T平臺下進行(本課題凡是涉及到資源和速度的分析都是在這個平臺下進行的)。本課題對速度的要求是使設計跑到200MHz以上。本設計也是某系統的一個小模塊,一般情況下,為了本設計所在的系統可以跑到200MHz以上,應該讓本設計至少通過250MHz的時序約束。為了分析本設計的性能,應該找一個參照的對象。于是設計了一個調用IP核的CORDIC模塊,它的參數跟純邏輯設計的CORDIC算法模
94、塊一樣,如器件型號、數據位寬、迭代次數和時序約束一樣。通過布局布線后兩個模塊的資源消耗情況如表5.6和表5.7所示,時序分析情況如表5.8和表5.9所示。</p><p> 表5.6 純邏輯CORDIC算法模塊的資源消耗</p><p> 表5.7 IP核CORDIC模塊的資源消耗</p><p> 表5.8 純邏輯CORDIC算法模塊時序分析</
95、p><p> 表5.9 IP核CORDIC IP模塊時序分析</p><p> 通過對數據的分析,純邏輯設計的CORDIC算法模塊相對于IP核CORDIC模塊不僅資源消耗小一些,速度也快了。綜上所示,本設計的CORDIC算法模塊不僅精度高、資源消耗合理、速度也通過了250MHz的時序約束,故該CORDIC算法模塊的設計是非常合理的。</p><p> 5.4
96、余弦值輸出模塊</p><p> 本課題“基于FPGA的FFT窗函數計算”中CORDIC算法模塊求出的余弦值是對應相位的余弦值的絕對值?,F在,我們要根據相位生成模塊輸出的余弦值正負符號標志位對從CORDIC算法模塊輸出的余弦值的絕對值進行還原。由數學的知識可知,正數的絕對值是其本身,負數的絕對值是其相反數。在這里,設計了一個余弦值輸出模塊,其模塊框圖如圖5.9所示,表5.10所示為余弦值輸出模塊的端口定義。&l
97、t;/p><p> 圖5.9 余弦值輸出模塊</p><p> 表5.10 余弦值輸出模塊的端口信號名列表</p><p> 在進行余弦值的還原之前,由于從相位生成模塊輸出的相位經過CORDIC算法模塊處理到余弦值的絕對值輸出需要25個時鐘周期,為了同步,需要對從相位生成模塊輸出的余弦值正負符號標志位進行25個時鐘周期的延時,最后得到經過延時后的信號為cord
98、ic_sign1_dly25和cordic_sign2_dly25。另外,由數路基礎知識可道,正數的補碼是它本身,負數的補碼是除符號位之外的數取反再加1。為了還原余弦值,得增加一位符號位,故輸出的余弦值是一個25位位寬的有符號數據。最后根據該原理,對本模塊進行Verilog HDL設計如程序清單5.4所示:</p><p> 程序清單5.4 余弦值的還原</p><p> // 根
99、據正負標志位cordic_sign1_dly26完成cos(2*pi*n/(N-1))絕對值的復原</p><p> always @(posedge sys_clk or negedge rst_n)</p><p><b> begin</b></p><p> if(rst_n==1'b0)</p><p
100、> cordic_cos1 <= #1 {(DATA2_WIDTH){1'b0}};</p><p><b> else</b></p><p><b> begin</b></p><p> if(cordic_sign1_dly26==1'b1)</p><p&g
101、t; cordic_cos1 <= #1 {1'b1,~cordic_cos_abs1+1'b1};</p><p><b> else</b></p><p> cordic_cos1 <= #1 {1'b0,cordic_cos_abs1};</p><p><b> end</b
102、></p><p><b> end</b></p><p> // 根據正負標志位cordic_sign2_dly26完成cos(4*pi*n/(N-1))絕對值的復原</p><p> always @(posedge sys_clk or negedge rst_n)</p><p><b>
103、; begin</b></p><p> if(rst_n==1'b0)</p><p> cordic_cos2 <= #1 {(DATA2_WIDTH){1'b0}};</p><p><b> else</b></p><p><b> begin</b&
104、gt;</p><p> if(cordic_sign2_dly26==1'b1)</p><p> cordic_cos2 <= #1 {1'b1,~cordic_cos_abs2+1'b1};</p><p><b> else</b></p><p> cordic_cos2
105、<= #1 {1'b0,cordic_cos_abs2};</p><p><b> end</b></p><p><b> end</b></p><p> 5.5 窗函數系數生成模塊</p><p> 本課題“基于FPGA的FFT窗函數計算”中需要設計矩形窗、海明窗、漢
106、寧窗和布萊克曼窗四個窗函數。為了實現資源共享(詳見第五章資源共享),節(jié)省大量寶貴的資源,通過窗函數的類型對窗函數的系數進行選擇,故這里設計了窗函數系數生成模塊。該模塊的模塊框圖如圖5.10所示,表5.11所示為該模塊的端口定義。</p><p> 圖5.10 窗函數系數生成模塊</p><p> 表5.11 窗函數系數生成模塊的端口信號名列表</p><p>
107、; 其中,變量window_model決定窗函數的類型,即當window_model為2’b00時,設計選擇海明窗;當window_model為2’b01時,設計選擇矩形窗;當window_model為2’b10時,設計選擇漢寧窗;當window_model為2’b11時,設計選擇布萊克曼窗。</p><p> 四個窗函數的通用表達式為 ,系數A、B、C需要根據窗函數的類型進行選擇,各窗函數對應的具體系數如表
108、5.12所示:</p><p> 表5.12 窗函數系數</p><p> 關于系數paramA、paramB、paramC的量化問題,在這里有必要說明一下。為了比較精確地表示這三個系數,系數paramB、paramC可以用16位二進制位寬(即數值放大了 倍)表示。由于從余弦值輸出模塊輸出的余弦值是已經放大了 倍的了,它們分別與系數paramB和paramC相乘后的結果(位寬為41)
109、就相當于將數值放大了倍,因此系數paramA也應放大倍,并進行符號位擴展,目前就假定用41位二進制位寬表示。又因為窗函數表達式中做加減運算的式子有三項,為了防止數據的溢出,每項式子需要進行2位的符號位擴展,所以系數paramA要用43位的二進制位寬表示。</p><p> 5.6 窗函數結果計算模塊</p><p> 到目前為止,余弦函數 和的結果 已由余弦值輸出模塊輸出,窗函數系數
110、也已由窗函數系數生成模塊輸出。對于窗函數</p><p> ,輸入條件已具備,故下一步可求出窗函數的結果。這里設計了窗函數結果計算模塊,其模塊框圖如圖5.11所示,表5.13所示為該模塊的端口定義。</p><p> 圖5.11 窗函數結果輸出模塊</p><p> 表5.13 窗函數計算模塊的端口信號名列表</p><p> 在
111、該模塊中調用兩個乘法器IP核u_mult_param_cos1和u_mult_param_cos2,分別計算余弦函數和的值。另外,在窗函數結果輸出時,注意符號位的擴展,以免數據的上溢,這里擴展2位符號位。</p><p> 5.7 數據與窗函數相乘模塊</p><p> 本課題“基于FPGA的FFT窗函數計算”中的窗函數是用來對輸入信號進行截短以減少頻譜能量的泄露,故在這里設計了輸入
112、數據與窗函數相乘模塊,完成對輸入信號的截短。數據與窗函數相乘模塊的模塊框架如圖5.12所示,表5.14所示為該模塊的端口定義。</p><p> 圖5.12 數據與窗函數相乘模塊</p><p> 表5.14 數據與窗函數相乘模塊的端口信號名列表</p><p> 由于有效輸入數據自進入設計時其相應的相位到窗函數結果輸出共經歷了36個時鐘周期的延時,為了數
113、據的同步,需要對輸入數據din進行36個時鐘周期的延時,延時后的信號為din_dly36。此外,由于本模塊調用了乘法器IP核對輸入數據與窗函數結果作乘法運算,需要對輸出結果進行一級緩存,否則仿真分析時會發(fā)現輸出結果和輸出使能不同步的現象。出現這種現象的原因是乘法器IP核含有延時信息。為了同步輸出,用寄存器對輸出結果打一拍。</p><p> 由于變量window_dout的數據格式為1位符號位、3位整數位以及3
114、9位小數位,變量din_dly36的數據格式為8位無符號整數。它們的乘積是一個51位的數據,其數據格式為1位符號位、11位整數位以及39位小數位。本系統要求輸出一個16位的數據,其數據格式為8位整數位和8位小數位。由于窗函數的數值范圍為0到1之間,故變量window_dout與變量din_dly36乘積的數值范圍在0到255之間,即最終結果為正數,符號位為0。整數部分用8位二進制數表示,不會造成數據的上溢,故可以舍去符號位、截取整數部分
115、的低八位以及小數部分的高八位,輸出符合設計要求的數據格式為8位整數位及8位小數位的無符號數。</p><p> 至此,用戶邏輯設計完成。</p><p> 5.8 系統的性能分析</p><p> 現在開始就可以對整個用戶邏輯設計進行性能上的分析和測試了。首先,查看本設計經過300MHz時序約束下的布局布線后所消耗的資源及其時序分析情況,分別如表5.14和表
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文基于fpga的fft窗函數計算
- 光信息科學與技術畢業(yè)論文基于fpga的fft窗函數計算
- 基于fft和窗函數的頻譜分析論文終稿
- 畢業(yè)論文——基于窗函數實現的fir濾波器
- 基于fpga的智能函數發(fā)生器畢業(yè)論文
- 基于fpga的函數信號發(fā)生器設計畢業(yè)論文
- 畢業(yè)設計(論文)基于fpga的fft算法設計與實現
- 窗函數特性及加窗插值FFT算法的研究.pdf
- 函數信號發(fā)生器的fpga設計畢業(yè)論文
- 振蕩函數積分的數值計算[畢業(yè)論文]
- 基于fpga上的fft實現
- 基于fpga上的fft實現
- fft畢業(yè)論文精簡版
- fft畢業(yè)論文精簡版
- 畢業(yè)論文基于fpga的uart設計
- 基于stm32的1024點fft變換【畢業(yè)論文】
- 無界函數廣義積分的數值計算[畢業(yè)論文]
- 2010畢業(yè)論文設計-函數信號發(fā)生器的fpga設計
- 基于fpga數字時鐘設計-畢業(yè)論文
- 基于fpga的fft算法的設計與實現(論文和源碼)
評論
0/150
提交評論