FIR低通濾波器設(shè)計報告_第1頁
FIR低通濾波器設(shè)計報告_第2頁
FIR低通濾波器設(shè)計報告_第3頁
FIR低通濾波器設(shè)計報告_第4頁
FIR低通濾波器設(shè)計報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

FIR低通濾波器設(shè)計報告信息工程信息與通信工程2111203024xxx設(shè)計內(nèi)容本設(shè)計是基于FPGA的一個FIR低通濾波器設(shè)計,要求使用Verilog語言編寫濾波器模塊,通過編譯和綜合,并通過Matlab和modelsim聯(lián)合仿真驗證設(shè)計結(jié)果。設(shè)計原理FIR濾波器響應(yīng)(簡稱FIR)系統(tǒng)的單位脈沖響應(yīng)h(n)為有限長序列,系統(tǒng)函數(shù)H(z)在有限z平面上不存在極點,其運算結(jié)構(gòu)中不存在反饋支路,即沒有環(huán)路。如果h(n)的長度為N,則它的系統(tǒng)函數(shù)和差分方程一般具有如下形式:H(z)=N1h(n)z-nn=0y(n)=羅1h(m)x(n-m)m=0根據(jù)差分方程直接畫出FIR濾波器的結(jié)構(gòu),稱為直接型結(jié)構(gòu)。如圖所示:t?)Z-1fT=TfTCIm-3m—&**J1g1>>i叫⑴Ai,略11h(N-?}1wii1w□圖2.1FIR濾波器直接結(jié)構(gòu)FIR濾波器的特點:單位脈沖響應(yīng)序列為有限個;可快速實現(xiàn);可得到線性相位;濾波器階數(shù)較高。對線性時不變系統(tǒng)保持線性相位的條件是:單位脈沖響應(yīng)為偶對稱或奇對稱。即:土成W—1一河0<n<N-1為設(shè)計線性濾波器,應(yīng)保證h(n)為對稱的。1)若N為偶數(shù),其線性相位FIR濾波器的對稱結(jié)構(gòu)流圖:

圖2.2若N為偶數(shù)線性相位FIR濾波器的對稱結(jié)構(gòu)流圖圖中:"+1”對應(yīng)偶對稱情況,“-1”對應(yīng)奇對稱情況。當(dāng)n為奇數(shù)時,最后一個支路斷開。2)若N為奇數(shù),其線性相位FIR濾波器的對稱結(jié)構(gòu)流圖:Xfl)圖2.3N為奇數(shù)線性相位FIR濾波器的對稱結(jié)構(gòu)流圖在本設(shè)計中,我們采用線性FIR低通濾波器,所采用的階數(shù)N=8,所以是偶對稱的,估采取圖2.2的結(jié)構(gòu),其中“±1“取“+1”。設(shè)計思路要在FPGA上實現(xiàn)FIR濾波器,首先要確定濾波器的抽頭系數(shù)。其系數(shù)的確定,我們可以通過兩種辦法來實現(xiàn):第一種就是通過matlab編寫FIR濾波器程序,然后直接導(dǎo)出抽頭系數(shù)“h(n)”,另外一種辦法就是使用matlab自帶的FDATOOL簡便地設(shè)計一個FIR濾波器,然后導(dǎo)出系數(shù)。考慮到要更直觀地描述FIR濾波器的設(shè)計,我采用了第一種方法,用編寫matlab代碼的方式設(shè)計一個FIR低通濾波器。設(shè)計好濾波器后,接著要用matlab產(chǎn)生一個高頻率和低頻率的信號,通過濾波器的濾波,能把高頻的信號濾除,只剩下低頻的信號,從而驗證濾波器的性能。然后再把產(chǎn)生的輸入信號進行采樣,保存,量化,以供FPGA的FIR濾波器模塊使用。做好準(zhǔn)備工作后,就可以在QUARTUSII里面編寫Verilog代碼了。由于是硬件描述語言,所以設(shè)計的思路很簡單,就是通過把輸入序列移位,然后首位對稱相加再乘以抽頭系數(shù),然后把相乘結(jié)果再相加最后給輸出。其中涉及的難點是FPGA對有符號小數(shù)的乘法處理部分。在QUARTUSII編寫好模塊之后,就要用到modelsim來對設(shè)計進行仿真。對于仿真信號的輸入,我們可以添加一個altera的romIP核來存放之前matlab產(chǎn)生的信號采樣值,然后通過時鐘的驅(qū)動一個一個輸入到FIR濾波器模塊,最后在modelsim中顯示濾波器的輸出結(jié)果。驗證的最后一步,就是要把modelsim輸出的仿真結(jié)果用matlab進行繪圖,和之前matlab程序的輸出結(jié)果進行比較,從而驗證濾波器的設(shè)計是否成功。設(shè)計過程1)使用matlab設(shè)計FIR濾波器用matlab設(shè)計線性FIR濾波器,首先要確定其指標(biāo),在本設(shè)計里,我們規(guī)定濾波器的指標(biāo)如下:階數(shù)N=8,抽樣頻率fs=100Hz,截止頻率為12.5Hz用窗函數(shù)設(shè)計FIR濾波器,窗函數(shù)選擇漢明窗。根據(jù)此可以編得matlab代碼如下:clear;clc;t=0:0.01:5;9ifs=l00HzN=S;$N=&辨j|戲性FIR祜披卷Nv=N;w?=0.25*pi;史截止頻率為n-0:7;alp=(51-1)/2;m=n-alp+eps;hd=sin(wc*m)./(pi*m)(10用簡函數(shù)方法設(shè)計,漢明窗h=hd.fin';*求出濤波器抽義系數(shù),洽vcL-ilogffl輸出小數(shù),左移11位,對于w位有符號定點小數(shù),最高位為符號位,整段部訪為4位,小數(shù)部分為11位可以求得濾波器抽頭系數(shù)h(n)為:h=0.00280.02980.12590.23250.23250.12590.02980.0028由于FPGA不支持浮點數(shù)的運算,所以我們采用定點數(shù)的格式來量化抽頭系數(shù)。對于16位的輸入數(shù)據(jù),我們這里采用Q11的定點小數(shù)格式,即11位小數(shù)位,4位整數(shù)位,1位符號位。將抽頭系數(shù)乘以2"11可得:b=560257476476257605這樣我們就得到了8階FIR濾波器的量化系數(shù)了。確定好FIR濾波器的系數(shù)了,我們還需要用matlab產(chǎn)生仿真用的輸入信號,在這里,

我們采用了以下兩組信號:X1=0.01*sin(2*pi.*t)+0.01*sin(2*pi*40.*t),f1=0.02n,f2=0.8n(截止頻率為0.25n)X2=0.01*sin(2*pi.*t)+0.01*sin(2*pi*4.*t),f1=0.02n,f2=0.08n(截止頻率為0.25n)然后用這兩組結(jié)果分別與濾波器系數(shù)進行卷積運算,可以得到濾波器后的結(jié)果,如下圖所示:圖4.1當(dāng)輸入信號為x1時,濾波器的輸入波形以及輸出波形示意圖圖4.2當(dāng)輸入信號為x2時,濾波器的輸入波形以及輸出波形示意圖通過簡單分析上述兩圖的結(jié)果,可以看出,當(dāng)輸入信號的頻率大于0.25n時,信號得

到很好的濾除,而當(dāng)輸入信號少于0.25兀時,其信號會無失真地通過濾波器。接下來,我們就先把這兩種信號的采樣值進行移位量化處理,然后保存到txt文件,供后續(xù)仿真使用,具體matlab代碼如下:廠①);%把箭入波弗的個個取樣點蘭琢11性,取整,保存至「'dM5LirL.txt''中,為后面驗證FPGA設(shè)計F亦濾波器作為數(shù)據(jù)蜿入fitfopenC"ditmB+st?「vrt'J;Wfid=fopen(?daia_in2.tat?j?vrt';:拷對應(yīng)第二種波開:的輸出文件i供gdelsim仿真用fprintf(fidj?%d\n?jXl),fclose(fid);圖4.3matlba程序?qū)1波形進行采樣,量化,然后保存到txt文件2)用Verilog編寫濾波器模塊由于Verilog是一種行為描述語言,所以用來描述FIR的結(jié)構(gòu)是很方便的,其關(guān)鍵程序就是有符號小數(shù)的乘法處理模塊。為了方便后續(xù)的仿真,整一個FIR濾波器程序可以分為三個部分:用來存放輸入數(shù)據(jù)的rom模塊,F(xiàn)IR濾波器主程序以及有符號小數(shù)的乘法模塊。(1)Rom模塊:Rom模塊使用QUARTUSII的IP核直接調(diào)用,然后把matlab采樣的數(shù)據(jù),直接保存到mif或hex文件,供rom調(diào)用。在本設(shè)計,一開始我們也是保存在mif文件中,但發(fā)現(xiàn)modelsim不支持mif文件的仿真,所以我們改為保存在hex文件中。圖4.3hex文件存放的數(shù)據(jù),節(jié)選

(2)FIR濾波器主程序:其主程序的變量定義如下:tinescalelms/lu.2ITCCU.1CX,cll'jTCSt)□u.t];u.-tL3-:0]outIl.i-u.1rest,input[15:0]k;Il.hj.1elk,l,匚襯L■匚MiiillC'l/jlitbinneditytRiiclitytRiicl/7輸八16位T等號數(shù),1位符弋芝,「位有鼓射主al,x2jr.3,k4,k匚./(,/7輸八16位T等號數(shù),1位符弋芝,「位有鼓射主al,x2jr.3,k4,k匚./(,aT,x8;si.s2.s3.s4.yl.y2.?3.y4.i/E.v(.yT.y8;QU1,out1.out2;雁w7J?I乘出果入人小中乘輸有r器柞,目位有姓場據(jù)1315313433pai^Eiriei:tr1S:(IcoefflpararnEtcr15:0cocff2paramettr15:0coeffSpai^amei:tr15:0coefflparameter15;0coeff5pai^ameltr15:0coeff6pai^amei:tr15:0coeff?parametercoeffS1樣,正;16'dCO,16'dkbf16J.R75|1GJ.1^73lM5f13。;1&虬〃其中h(1)4⑷和h⑴飛愆對林相等其中輸入數(shù)據(jù)和濾波器的抽頭系數(shù),都是16位,由于輸入序列最大值不超過40,所以相加結(jié)果仍然是16位。相乘的結(jié)果用32位表示。為了防止相乘再相加后數(shù)據(jù)的溢出,我們在這里把存放相乘再相加的結(jié)果擴大了2位,用到34位,然后最后的輸出,在原來的基礎(chǔ)上再擴大1位,35位的輸出。在最后的輸出中,可以把低位去掉,只保留若干高位,但這里只需要仿真出結(jié)果便可,所以沒有進行截斷處理,然而在實際工程中,由于數(shù)位的限制,還是要注意這點。FIR主程序就是描述圖2.2的FIR濾波器結(jié)構(gòu),其行為描述,具體可以用以下代碼實現(xiàn):xl<=x;x2<二xl;x3<=x2;M<=x3;x5<=x6<=k5;<=k6;x8<=si<=xL+k8;s2<=x2+k7;s3<=x3+k6;s4<=x4+x5;outl〈二yl+y2;out2〈二y3+y4:out<=out1+out2;其中x1~x8通過前一個值對后一個值的賦值,可以實現(xiàn)移位操作;而s1~s4是用來存放首位對稱相加的結(jié)果;然后y1~y4是乘法輸出的結(jié)果,通過out1與out2的相加,最后輸出到結(jié)果out。其中乘法的運算,我們調(diào)用4次乘法模塊(因為線性FIR濾波器是對稱結(jié)構(gòu),所以可以只進行8/2=4次的乘法運算。fix_multmulti(.elk(elk),.rst_n(rest)3.in_a(co已ffl),.in_b(si).y_oi.it(yl))fix_multmult2(.elk(elk),.rst_n(rest)j.in__a(coeff2),.in_上(sN),.y_out(y2))fix_multmult3(.elk(elk),.rst_n(rest)j.in_典(c:口已ff3),.in_上(m3),.y_out(y3))fix_inultmult4(.elk(elk),.rst_n(rest)j.in_a(coeff4)J.in_b(s4)3.y_out(y4))(3)乘法模塊對于有符號的小數(shù)運算,在FPGA里面,其實是和有符號整數(shù)的運算是一樣的。只是定點數(shù)的小數(shù)點的位置,我們需要牢記,在最后輸出結(jié)果的時候,要適當(dāng)?shù)倪M行移位。由于負數(shù)在Verilog中是以補碼形式保存的,所以在輸入16位有符號數(shù)的時候,在進行相乘之前,要把負數(shù)變?yōu)樵a再相乘,而正數(shù)的補碼就是其本身,所以不用轉(zhuǎn)換。然后把符號位提出來,進行異或運算,得到輸出的符號位,再把有效數(shù)位的原碼進行相乘,最后得到1位符號位和30位相乘結(jié)果。為了補全32位,可以在最低位加上一個無關(guān)位0。最終輸出如果是負數(shù),還需要把它變成補碼的形式輸出。至此,一個有符號的小數(shù)乘法運算就完成了。根據(jù)以上思路,我們可以寫出出乘法模塊的代碼:timescale1ms/'Iusmo<lvlefiiLr=±_ri2y_oi.itJ;K位中苻號數(shù)乘注模塊,櫥止'巾inputelk,rsi_n;input[lb:J]in_b□LtDH任1:)1V_OUt:resL<:inputelk,rsi_n;input[lb:J]in_b□LtDH任1:)1V_OUt:resL<:L]y_out;resElS;Clxl.x2.iz.x4:rega5;reSL29:fJ16;teH匯;〔[同;z/Wi出結(jié)呆,,/Til.〃用£〃如位寄.〃用未在r:輸口輸[出結(jié)呆的補碼瞥沼露況京虹用來存放輸*吁星的刷??邕旨效數(shù)位相乘紀星的原瑪always?tnejedfe,11:)beSLllif(.T?t_n'、>besinKl<=16JbO:K2<=16JbO;K3<=16JbO;bO:s6<=30JbO;:*3Z'bU:7_out<=32JbO;已Isel>cfiii工1〈二in_a;/7■復(fù)位使匏,寄存器清等/隔入寄存器賦值x2<=inb:k3<=(N[IS]==0)?xl:bdllSk4<=Ck2[15]==0)?x2:{i2[15k5<=x3[15]"x4[15LaG<=x3'14:0]+x4[14:0];xlE14:O]4-lJbl);^2L14:0]4-lJbl];k"二"*,1JbO};vcut<='x7r3_'==u)?x7:(k7':11."xT[30:u'+i'i斷-X入到斷//////即

不―I

最異相而

筮數(shù)原手

L贏翁據(jù)

符一襄數(shù)

澈Mtt止

所卬?刑成乘由滋cnc.endendnod-ile3)綜合設(shè)計模塊為了把rom模塊和FIR主程序連接起來,我們需要編寫一個頂層文件。tim已me己1已lms/lus、、mo-dulcfir_tDp(clkjrestjaddressjout);『/FIR教字濾披器頁后模塊IinpuLelk;inputrest;input[K:J]address;output[34:0]oui;wi珪[15:3]/彼置線型變量親連接8E的輸出與firm器主程序的輸八inE'Ut_roinrom2(.adcresE(address^.<lock(elk)..qlxl));firfir2(.out(ou.t)j.x(工1),.elk(elk)..restLi'已Et));endmocule.分析驗證設(shè)計好以上模塊后,可以進行編譯綜合了。最后的編譯綜合結(jié)果如下圖所示:

QuartusII岡Task三?:Coni|:deDesiqnsJE?,unalj/sls&S^ntheslc£1FullConnpilationwassuccessful(12warnhgsj/E?Rtter(Flazebd-AAs$er「b卮r(GenerateprcqMrrrrirqFies)yl±}?ClassicliminqAndysisOKl±J?E3AN=tli;t^itcrProgramDevice(CprnProgrflmrnrr)圖5.1編譯結(jié)果從上圖可以看出,最后編譯成功,程序設(shè)計沒有語法錯誤。但具體要測試其工作是否正常,我們接下來,就需要用到modelsim對其進行仿真。首先我們看看其RTL視圖:從上圖的結(jié)構(gòu)可以看出,我們要寫testbench文件,就需要三個輸入,一個輸出。其中一個輸入是時鐘,一個復(fù)位信號,還有隨時鐘變化的地址輸入和最后的輸出。根據(jù)此可以寫出測試文件:\tim已scalelms/lusmodulefir_top_tb;/頂層模塊測試文件r已gelk;regrest;reg[8:0]address;wireL34:OJout;regsigned[34:\tim已scalelms/lusmodulefir_top_tb;/頂層模塊測試文件r已gelk;regrest;reg[8:0]address;wireL34:OJout;regsigned[34:0]outl;initialbeginclk=lJbO;address=yJbU;rest=rbO;#50res:=lJbl;end//初始化模塊A?初值,安全起見器清零工作〃復(fù)位信#10,器清零工作always#10clk="clk;〃產(chǎn)生日、J鐘信號always?(negedgeelk)〃由于8in是從clcick的上升沿開始讀取數(shù)形,所以在clcick的下降beginif(address1=9"dFOl)^〃由于matlab程序里只有SOI個采樣點,所以設(shè)置地t止循環(huán)系數(shù)為addi'已mm二己ddr已es+8'dl;elaeaddi'已mm二8’dO;endalways?(posedgeelk)〃用來記錄濾波器輸出的值,在modelsim中顯不,然后復(fù)制到mbegin□utl=out;$display(/y%d\outl);endfir_topfir3(.elk(elk),.rest(rest)^.address(address),.out(out));77例化頂層模塊endmodule由于最后輸出的數(shù)是補碼,為了能在modelsim的下方報告欄能顯示出正常的十進制負數(shù),我們定義了一個有符號寄存器out1,然后通過$display命令把結(jié)果按照時鐘一個個輸出到報告欄里。仿真得到的波形和結(jié)果如下圖所示:圖5.3modelsim仿真波形Transcript-26068善-18S88-14784-11042TOC\o"1-5"\h\z尊-6906-18601S60于690611042147S4善18S8821646圖5.4modelsim輸出結(jié)果顯示

最后把報告欄里顯示的結(jié)果,復(fù)制一部分到txt文件里,然后供matlab繪圖用。Bbin.txt-記事本文件⑤編輯⑧格式(①查看頃幫助四-29G90-26068-21646-18888-14784-11042—6906-18601860690611042147841888821646圖5.5把modelsim輸出結(jié)果保存到txt中最后執(zhí)行以下代碼,畫出FIR濾波器輸出的仿真波形:a=teKtread(?bin.?%d?V讀取出的數(shù)據(jù)記錄“bin.txt”,畫出jnodelsimt^直的輸出波形%a=textread(nbin2.txt,j??;%對應(yīng)第二種波形輸入,modelsim的輸出波形文件為:tin2.txtout=a./(2"23);驗由于輸出結(jié)果是34位,在verilog運算過程中,涉及16X16乘法,整數(shù)部分4位,小數(shù)部分11位相乘figured;監(jiān)得到g位整數(shù)部妤和叫位小數(shù)部并,但由于加了1位無關(guān)位,所以結(jié)果要處以廠23plot(out);title(nmodelsim^真FIR數(shù)字濾波器輸出波形’);由于我們沒有對輸出的35位數(shù)據(jù)進行截斷處理,所以在最后的輸出結(jié)果,我們要處以2"23。這是因為兩個Q11的小數(shù)相乘,其小數(shù)位擴大了11位,變成了22位;然后加上1位的無關(guān)位,所以最后輸出要處以2的23次方。

最后得出濾波器仿真的波形和matlab產(chǎn)生的結(jié)果進行比較:圖5.6當(dāng)輸入信號為x1時,modelsim輸出的波形和matlab仿真的波形比較-0.D1IDO2003DD4DD-0.D2-0-O.D11OO200300400-0.D2-0EllsEditYieiyInseri£oolsReektopWindowHelp-0.D1IDO2003DD4DD-0.D2-0-O.D11OO200300400-0.D2-0EllsEditYieiyInseri£oolsReektopWindowHelp&毀0方⑥定□國□-002111111110501D0150200290300350400450圖5.7當(dāng)輸入信號為x2時,modelsim輸出的波形和matlab仿真的波形比較□120.D2□.□2濾波前的浪形濾波后的波形modelsim^真FIR數(shù)字濾波器輸出波形-0.01?JFigure2由于輸出結(jié)果是隨機選取,所以相位上會有偏差。但可以看得出,modelsim的輸出波形是和matlab的輸出波形一致的,可以確定濾波器正常工作,達到了預(yù)期的效果。6.設(shè)計總結(jié)通過本次FI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論