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