數(shù)字濾波器在FPGA上的實現(xiàn)研究_第1頁
數(shù)字濾波器在FPGA上的實現(xiàn)研究_第2頁
數(shù)字濾波器在FPGA上的實現(xiàn)研究_第3頁
數(shù)字濾波器在FPGA上的實現(xiàn)研究_第4頁
數(shù)字濾波器在FPGA上的實現(xiàn)研究_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

數(shù)字濾波器在FPGA上的實現(xiàn)研究3.3.2 前期數(shù)據(jù)處理由于在Matlab軟件中得到的系數(shù)h(n)為浮點數(shù),并且是有正有負的浮點數(shù),而FPGA則是采用定點運算的方式,所以要把得到的浮點系數(shù)h(n)轉(zhuǎn)化為定點數(shù),處理的做法是把h(n)統(tǒng)一乘以倍,然后取整,最后化為11位二進制補碼來表示。最后得到的結(jié)果為h(0)=h(7)=0000_0011_011,h(1)=h(6)=1111_0000_010,h(2)=h(5)=0000_1000_010,h(3)=h(4)=0100_0001_110.最后的結(jié)果需要左移10位即可。3.3.3 程序及數(shù)據(jù)結(jié)果對比和分析在前期的準備過后,在ISE 10.1軟件中輸出程序,得到的結(jié)果為:圖3.8 FIR濾波器仿真結(jié)果圖下面對實驗結(jié)果和計算結(jié)果進行了對比,對比圖如下:表3.2 實驗結(jié)果對比圖12345678系數(shù)h0.0264-0.12340.06480.51440.51440.0648-0.12340.0264h*102427.0604-126.378766.4037526.7448526.744866.4037-126.378727.0604h取整27-1266652652666-12627輸入x500000000輸出y1.32-6.173.2425.7225.723.24-6.171.32y取整1-6325253-61輸出yh0001h7FF9h0003h0019h0019h0003h7FF9h0001結(jié)果y1-7325253-71由表3.2結(jié)果可知,程序輸出結(jié)果與正常輸出結(jié)果相差無幾,誤差是由于小數(shù)部分乘法帶來的誤差,所以我們可以認為程序是正確的。主要程序見附錄二。遇到的問題:在程序的設(shè)計過程中,我首先遇到的問題是不知道用什么來實現(xiàn)數(shù)據(jù)的存儲合適,查找資料后運用了FIFO存儲器,即就是圖3.7中的RAM用的是FIFO(先進先出)存儲器,它的作用是把所需要的數(shù)據(jù)一個一個輸進去,再按順序依次輸出,這樣數(shù)據(jù)的存儲就解決了。這也是設(shè)計中與別人不同的一點,它的優(yōu)點為可隨意調(diào)控存儲的數(shù)量,因為它有一個data_count的輸出,可以計算存儲的數(shù)量。第二個問題就是輸出之后要運用它們進行運算,且要按順序排列依次運算,因為是8階的濾波器,但是FIFO存儲器不能同時出現(xiàn)8個數(shù),所以中間用了8個shift_buf的寄存器存儲這些數(shù)據(jù),然后計算后再輸出。第三個問題是不知道這些系數(shù)h(n)從何而來,查閱資料說是在Matlab軟件中根據(jù)指標生成的,所以從上面的fdatool工具箱獲取了系數(shù)。這樣可以保證程序的可移植性,根據(jù)不同的指標及階數(shù)要求,就可以方便的變換系數(shù),程序只需稍加變動。最后問題出在如何完成乘法運算,導(dǎo)師在指導(dǎo)時說能運用IP核解決的運算就盡量用到,因為在運算中調(diào)用了乘法器IP核,就節(jié)省了運算速度也增強了準確性,但是乘法器的輸入是確定位數(shù)的2進制數(shù),不能是十進制的數(shù),所以再設(shè)計之前做了一步轉(zhuǎn)換,最后再依次把它順序輸出,再轉(zhuǎn)換回十進制數(shù)來做對比。第四章 IIR濾波器的簡單設(shè)計與實現(xiàn)4.1 IIR濾波器的基本結(jié)構(gòu) IIR濾波器的系統(tǒng)函數(shù)為 (5) 由系統(tǒng)函數(shù)可得到輸入與輸出的關(guān)系為 (6)由公式(6)可知,IIR濾波器是遞歸濾波器,即存在著輸出信號到輸入信號的反饋。對于一個給定的線性時不變系統(tǒng)的系統(tǒng)函數(shù),有著不同的網(wǎng)絡(luò)結(jié)構(gòu)。而IIR濾波器的網(wǎng)絡(luò)結(jié)構(gòu)有直接型結(jié)構(gòu)、級聯(lián)型結(jié)構(gòu)和并聯(lián)型結(jié)構(gòu)。下面給出直接型結(jié)構(gòu)的網(wǎng)絡(luò)結(jié)構(gòu)如圖4.1,其中系數(shù)組b為H(z)的分子多項式,系數(shù)組a為H(z)的分母多項式,分析幾種結(jié)構(gòu)可知,直接型的結(jié)構(gòu)比較容易實現(xiàn),但是需要較大的儲存空間。圖4.1 直接型結(jié)構(gòu)圖74.2 IIR濾波器直接型結(jié)構(gòu)實現(xiàn)得到的仿真結(jié)果如下圖4.2所示圖4.2 8階IIR濾波器仿真圖分析:根據(jù)直接型結(jié)構(gòu),可知有反饋結(jié)構(gòu),所以在程序中設(shè)置了兩個方向數(shù)即data_feedforword前饋數(shù)和data_feedback后饋數(shù),這樣兩項相加就是最后輸出。其中就每一項輸入輸出怎么儲存問題,分別定義輸入輸出寄存器(samples_in和samples_out)來依次存儲,比如8階IIR濾波器就需要8個寄存器即samples_in8,同理輸出。還有怎樣一步一步寄存和溢出,則采用移位來實現(xiàn)。x(n)序列依然用FIFO存儲器輸入。主要程序見附錄三。附 錄附錄一:均值濾波器主要代碼Module my_tbf1(din,wr_en,rd_en,clk,rst,jun_out,dout,sum,empty,full,data_count);reg 7:0 din_reg; /定義存儲輸入寄存器din_regreg 7:0 jun_out; /定義均值輸出為jun_out reg 7:0 shift_buf0; /定義5個shift_buf用來存儲連續(xù)5個數(shù)reg 7:0 shift_buf1;reg 7:0 shift_buf2;reg 7:0 shift_buf3;reg 7:0 shift_buf4;reg 7:0 x; /定義過渡寄存器x和yreg 7:0 y;wire 8:0 add_buf1,add_buf2,add_buf3,sum1; /定義中間變量 wire 9:0 sum2; wire 10:0 sum; /調(diào)用FIFO核tbf1 My_name(.clk(clk), .rst(rst), .din(din), /讀入數(shù)據(jù) .wr_en(wr_en), /寫使能 .rd_en(rd_en), /讀使能 .dout(dout), /讀出數(shù)據(jù) .full(full), /滿 .empty(empty),.data_count(data_count); /計數(shù) always(posedge clk or negedge rst) begin if(rst) din_reg=8b0000_0000; /當復(fù)位信號為1時,輸入存儲器賦0else din_reg=dout; /當復(fù)位信號為0時,就把FIFO中輸出的數(shù)賦值給輸入寄存器 endalways(posedge clk or negedge rst) begin if(rst) begin shift_buf0=8b0000_0000; /當rst=1時,5個寄存器賦初值0shift_buf1=8b0000_0000;shift_buf2=8b0000_0000;shift_buf3=8b0000_0000;shift_buf4=8b0000_0000;endelse begin shift_buf0=din_reg7,din_reg; /每當clk為上升沿且rst=0時把輸入存儲器的值賦給shift_buf0,然后把shift_buf0的值賦給shift_buf0,依次類推 shift_buf1=shift_buf0; shift_buf2=shift_buf1; shift_buf3=shift_buf2; shift_buf4=shift_buf3; end endassign add_buf1=shift_buf1,1b0; /根據(jù)1 2 2 2 1中有三個數(shù)乘以2 assign add_buf2=shift_buf2,1b0; assign add_buf3=shift_buf3,1b0; assign sum1=add_buf1+add_buf2+add_buf3; /把中間的3個乘2的數(shù)相加 assign sum2=shift_buf0+shift_buf4; /把第一個和第五個數(shù)相加 assign sum=sum1+sum2; /得到5個數(shù)的總和 always(posedge clk or negedge rst) begin if(rst) jun_out=8b0000_0000;else if(data_count=100) x=din_reg; /當計數(shù)為100時,x寄存器存儲當時的輸入else if(data_count=99) y=din_reg; /當計數(shù)為99時,y寄存器存儲當時的輸入else if(data_count=98) jun_out=8b0000_0000;else if(data_count=97&dout!=0) /第一個數(shù)和第二個數(shù)的均值輸出為原數(shù) jun_out=x;else if(data_count=96&dout!=0) jun_out=y;else if(data_count=11b11111111111) jun_out=shift_buf2;else jun_out=sum10:3; /輸出為總和除以8,即左移3位 endendmodule附錄二:FIR數(shù)字濾波器程序主要代碼module fir1(din,wr_en,rd_en,clk,rst,dout,data_count,fir_out); parameter size_in = 12; /定義輸入位數(shù)為12位parameter size_buf = 13; /定義存儲器位數(shù)為13位/parameter FIR_TAP = 8; /parameter FIR_TAPHALF = 4; parameter size_coeff = 11; /定義系數(shù)位數(shù)為11位parameter size_out = 15; /定義輸出位數(shù)為15位parameter cof1 = 11b0000_0011_011; /給8個系數(shù)賦值parameter cof2 = 11b1111_0000_010;parameter cof3 = 11b0000_1000_010;parameter cof4 = 11b0100_0001_110;/定義輸入端口input 11:0 din; /輸入的x(n)序列input wr_en; /寫使能input rd_en; /讀使能input rst;input clk;/定義輸出端口output 11:0 dout;output 9:0 data_count; /計數(shù)/output empty;/output full;output size_out-1 : 0 fir_out; /FIR濾波器輸出/定義存儲器reg size_out-1 : 0 fir_out; reg size_in-1 : 0 fir_in_reg; /輸入存儲器reg size_buf-1 : 0 shift_buf0; /定義8個過渡存儲器reg size_buf-1 : 0 shift_buf1; reg size_buf-1 : 0 shift_buf2; reg size_buf-1 : 0 shift_buf3;reg size_buf-1 : 0 shift_buf4; reg size_buf-1 : 0 shift_buf5; reg size_buf-1 : 0 shift_buf6; reg size_buf-1 : 0 shift_buf7; wire size_buf-1 : 0 add_buff_0_7; /對稱數(shù)的和wire size_buf-1 : 0 add_buff_1_6;wire size_buf-1 : 0 add_buff_2_5;wire size_buf-1 : 0 add_buff_3_4;wire size_buf+size_coeff-1 : 0 mul1; /4個積wire size_buf+size_coeff-1 : 0 mul2;wire size_buf+size_coeff-1 : 0 mul3;wire size_buf+size_coeff-1 : 0 mul4;/調(diào)用FIFO存儲器核fifo2 My_fifo2(.clk(clk), .rst(rst), .din(din), /讀入數(shù)據(jù) .wr_en(wr_en), /寫使能 .rd_en(rd_en), /讀使能 .dout(dout), /讀出數(shù)據(jù) .full(full), /滿 .empty(empty),.data_count(data_count);/給輸入存儲器賦值always (posedge clk or negedge rst) begin if(rst) fir_in_reg = 12b0000_0000_0000; else fir_in_reg = dout; end/給過渡存儲器賦值always (posedge clk or negedge rst) begin if(rst) begin shift_buf0 = 13b0000_0000_00000; /賦初值 shift_buf1 = 13b0000_0000_00000; shift_buf2 = 13b0000_0000_00000; shift_buf3 = 13b0000_0000_00000; shift_buf4 = 13b0000_0000_00000; shift_buf5 = 13b0000_0000_00000; shift_buf6 = 13b0000_0000_00000; shift_buf7 = 13b0000_0000_00000;end else begin shift_buf0 = fir_in_regsize_in-1,fir_in_reg;/輸入的數(shù)依次進入存儲器 shift_buf1 = shift_buf0; shift_buf2 = shift_buf1; shift_buf3 = shift_buf2; shift_buf4 = shift_buf3; shift_buf5 = shift_buf4; shift_buf6 = shift_buf5; shift_buf7 = shift_buf6; end end/把對稱系數(shù)的數(shù)相加assign add_buff_0_7 = shift_buf0 + shift_buf7;assign add_buff_1_6 = shift_buf1 + shift_buf6;assign add_buff_2_5 = shift_buf2 + shift_buf5;assign add_buff_3_4 = shift_buf3 + shift_buf4;/分別把系數(shù)與x(n)相乘mult1 mult11(.a(cof1),.b(add_buff_0_7),.clk(clk),.p(mul1);mult1 mult12(.a(cof2),.b(add_buff_1_6),.clk(clk),.p(mul2);mult1 mult13(.a(cof3),.b(add_buff_2_5),.clk(clk),.p(mul3);mult1 mult14(.a(cof4),.b(add_buff_3_4),.clk(clk),.p(mul4);/把乘法得到的數(shù)相加wire 24 : 0 add_mult_1_2 = mul123,mul1+mul223,mul2;wire 24 : 0 add_mult_3_4 = mul323,mul3+mul423,mul4;always (posedge clk or negedge rst)begin if(rst) fir_out = 15b0; /給fir_out賦初值 else fir_out10;/把總和向左移10位賦值給fir_outendendmodule附錄三:IIR數(shù)字濾波器直接型結(jié)構(gòu)程序主要代碼module iir_filter_8(din,wr_en,rd_en,clk,rst,data_out,dout,data_count );parameter order = 8; /定義階數(shù)為8階parameter word_size_in = 8; /輸入位數(shù)為8位parameter word_size_out = 2*word_size_in + 2; /定義輸出位數(shù)parameter b0 = 4; /前饋濾波器系數(shù) parameter b1 = 22; parameter b2 = 65; parameter b3 = 110; parameter b4 = 110; parameter b5 = 65; parameter b6 = 22; parameter b7 = 6; parameter a1 = 25; /反饋濾波器系數(shù) parameter a2 = -70; parameter a3 = 99; parameter a4 = -85; parameter a5 = 47; parameter a6 = -16; parameter a7 = 4; parameter a8 = 1;/定義輸入端口input word_size_in-1:0 din;input wr_en;input rd_en;input rst;input clk;/定義輸出端口output word_size_in-1:0 dout;output 9:0 data_count;/output empty;/output full; output word_size_out-1 : 0 data_out; reg word_size_in-1 : 0 samples_in1 : order; /定義輸入存儲器可以存數(shù)8個reg word_size_in-1 : 0 samples_out1 : order; /定義輸出存儲器可以存數(shù)8個wire word_size_out-1 : 0 data_feedforward; /定義前饋和wire word_size_out-1 : 0 data_feedback; /定義后饋和integer k; /定義移位次數(shù) /調(diào)用FIFO核my_fifo My_fifo1(.clk(clk), .rst(rst), .din(din), /讀入數(shù)據(jù) .wr

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論