1 項(xiàng)目背景 (源碼下載,至簡設(shè)計(jì)法輔導(dǎo)交流群:544453837)1.1 FIR和IIR濾波器 FIR(Finite Impulse Response)Filter:有限沖激響應(yīng)濾波器,又稱為非遞歸線性濾波器。 FIR濾波器,顧名思義,其脈沖響應(yīng)由有限個(gè)采樣值構(gòu)成。長度(抽頭數(shù))為N、階數(shù)為N−1的FIR系統(tǒng)的轉(zhuǎn)移函數(shù)、差分方程和單位沖激響應(yīng)分別如下列三式所示。 IIR(Infinite Impulse Response)Filter:無限沖激響應(yīng)濾波器,又稱為遞歸線性濾波器。 FIR相對(duì)與IIR來說,具有如下的優(yōu)點(diǎn): Ø 可以具備線性相位特性 線性相位的概念:如果濾波器的N個(gè)實(shí)值系數(shù)為對(duì)稱或者反對(duì)稱結(jié)構(gòu),該濾波器具有線性相位。 W(n)=±W(N−1−n)W(n)=±W(N−1−n) 線性相位的特性:通過線性相位濾波器的信號(hào)的所有頻率部分具有相同的延遲量。 Ø 易于設(shè)計(jì) 但FIR也有自身的缺點(diǎn):同樣指標(biāo)的濾波器,F(xiàn)IR需要更多的參數(shù),即實(shí)現(xiàn)時(shí)消耗更多的計(jì)算單元,產(chǎn)生更大的延遲。 1.2 FIR濾波器的原理 信號(hào)通過一個(gè)FIR濾波器其實(shí)就是信號(hào)與FIR濾波器的系數(shù)進(jìn)行卷積(即乘累加)的過程。我們以一個(gè)簡單信號(hào)模型為例,了解一下FIR波形器的原理。 現(xiàn)在有三組信號(hào),分別是: 信號(hào)1:低頻信號(hào),即在時(shí)域上變化慢的信號(hào),其輸入先后為1 1 1 1 2 2 2 2。 信號(hào)2:直流信號(hào),其輸入先后為1 1 1 1 1 1 1 。 信號(hào)3:高頻信號(hào),即在時(shí)域上變化快的信號(hào),其輸入先后為1 2 1 2 1 2 1 2 。 簡單的濾波器模型 低通濾波器:1 1 信號(hào)1與低通濾波器進(jìn)行卷積運(yùn)算,其結(jié)果再除以2,得到如下數(shù)據(jù):1 1 1 1.5 2 2 2?梢钥吹,低頻信號(hào)經(jīng)過低通濾波器后,各個(gè)點(diǎn)仍然保持了其形狀,而且在1變成2時(shí),還變平緩了。 信號(hào)2與低通濾波器進(jìn)行卷積運(yùn)算,其結(jié)果再除以2,得到如下數(shù)據(jù):1 1 1 1 1 1 1。可以看到,直流信號(hào)與輸入的信號(hào)完成相同。 信號(hào)3與低通濾波器進(jìn)行卷積運(yùn)算,其結(jié)果再除以2,得到如下數(shù)據(jù):1.5 1.5 1.5 1.51.5 1.5 1.5。可以看到,高頻信號(hào)經(jīng)過低通濾波器后,已經(jīng)完成消去了形狀,變成了直流信號(hào)。 再考慮另一種濾波器模型,高通濾波器:1 -1 信號(hào)1與高通濾波器進(jìn)行卷積運(yùn)算,其結(jié)果再除以2,得到如下數(shù)據(jù):0 0 0 -0.5 0 0 0?梢钥吹,低頻信號(hào)經(jīng)過高通濾波器后,信號(hào)變化基本上消失。 信號(hào)2與低通濾波器進(jìn)行卷積運(yùn)算,其結(jié)果再除以2,得到如下數(shù)據(jù):0 0 0 0 0 0 0。可以看到,直流信號(hào)仍然是沒有變化。 信號(hào)3與低通濾波器進(jìn)行卷積運(yùn)算,其結(jié)果再除以2,得到如下數(shù)據(jù):-0.5 0.5 -0.5 0.5-0.5 0.5 -0.5 0.5?梢钥吹,高頻信號(hào)已經(jīng)仍然保持了變化的形狀。 由這兩個(gè)例子可以看出,F(xiàn)IR濾波器其實(shí)就是信號(hào)與FIR濾波器的系數(shù)進(jìn)行卷積(即乘累加)的過程。通過調(diào)整濾波器系數(shù)、抽頭個(gè)數(shù),就可實(shí)現(xiàn)低通、高通、帶通等濾波器。 1.3 FIR濾波器的設(shè)計(jì)1.3.1 matlab產(chǎn)生濾波器系數(shù) 打開matlab在其命令窗口輸入fdatool 按下回車 調(diào)出FIR濾波器的設(shè)計(jì)界面。 在波形設(shè)計(jì)界面中,我們重要關(guān)注以下選項(xiàng)。 Response Type:選擇可以選擇濾波器的類型,可選擇:lowpass低通濾波器、Highpass高通濾波器、bandpass帶通濾波器、bandstop帶阻濾波器。 Fs(采樣頻率): Fstop :信號(hào)截止頻率 Fpass: Filter Order:用來設(shè)置濾波器的抽頭個(gè)數(shù)?梢栽趕pecify order中輸入個(gè)數(shù),也可以選擇Minimumorder,讓系統(tǒng)計(jì)算滿足要求的前提下的最小抽頭個(gè)數(shù)。 點(diǎn)擊Design Filter,就可以計(jì)算出抽頭系數(shù)。 產(chǎn)生系數(shù)后點(diǎn)擊file 菜單里的Export 將系數(shù)保存到工作區(qū) 點(diǎn)擊export 點(diǎn)擊之后打開工作區(qū)里的Num。 而后將下圖第一列的數(shù)據(jù)復(fù)制粘貼到txt文件中。 注意復(fù)制后需在兩個(gè)系數(shù)間插入逗號(hào)(英文輸入狀態(tài)下的的逗號(hào))。 這樣就得到濾波器的系數(shù)了。 1.3.2FPGA生成FIR IP核 打開工程后,在IP catalog這一界面中選擇DSP下一目錄中選擇Filter 在選擇選擇 FIR II 首先在Fitter這一界面做如下操作 Filter Type Interpolation Factor: Decimation Factor: Max Number of channels: Clock rate:填寫本IP核的工作時(shí)鐘頻率。 clock slack: Input sample rate (msps):采樣率 點(diǎn)擊coefficients,進(jìn)入coefficients界面。 這一界面點(diǎn)擊import from file ,彈出一下界面,找出我們之前用matlab生成的系數(shù)文件,點(diǎn)擊import,導(dǎo)入成功后可以看到下圖的 frequency response界面的波形發(fā)生變化 在coefficient界面,還可以設(shè)置系數(shù)的格式、數(shù)據(jù)位寬等。 其它選項(xiàng)不改按默認(rèn)的來點(diǎn)擊finish即可。 以上就是生成 FIR濾波器的主要步驟。 2 設(shè)計(jì)目標(biāo) 本次案例將使用到采樣率大于100M的雙通道的示波器。將示波器的兩個(gè)通道,分別與FPGA的DA通道1和DA通道2相連,觀察兩路DA的輸出。其連接示意如下圖所示。 本案例是FPGA內(nèi)部產(chǎn)生正弦信號(hào),這個(gè)正弦信號(hào)一路輸出給DA通道1,另一路經(jīng)過FIR濾波器后,輸出給DA通道2。 正弦信號(hào)的頻率受開發(fā)板上的3個(gè)撥碼開關(guān)控制,用3位信號(hào)key表示,一共可以產(chǎn)生8種頻率。 正弦信號(hào)的頻率 約等于: 100KHz * (key+1)。 例如,當(dāng)key等于0時(shí),產(chǎn)生約100KHz的正弦信號(hào); 當(dāng)key等于1時(shí),產(chǎn)生約200KHz的正弦波; 當(dāng)key等于7時(shí),產(chǎn)生約800KHz的正弦波。 FIR濾波器是低通濾波器,其截止頻率是500KHz,這樣原則上超過500KHz的信號(hào)就會(huì)被濾除。濾波器的輸出給通道2。 下面是示波器的顯示效果,其中黃色是通道1輸出的信號(hào)(上面的波形),下面藍(lán)色是通道2的輸出信號(hào)(下面的波形)。 下圖是100KHz的信號(hào)圖。 下圖是200KHz的信號(hào)圖。 下圖是300KHz的信號(hào)圖。 下圖是400KHz的信號(hào)圖,可以看到已經(jīng)衰減了。 下圖是500KHz的信號(hào)圖,可以看到已經(jīng)衰減的很小了。 下圖是600KHz的信號(hào)圖,可以看到通道2已經(jīng)沒有波形。 下圖是700KHz的信號(hào)圖,可以看到通道2已經(jīng)沒有波形。下圖是800KHz的信號(hào)圖,可以看到通道2已經(jīng)沒有波形。 下圖是800KHz的信號(hào)圖,可以看到通道2已經(jīng)沒有波形。 3 設(shè)計(jì)實(shí)現(xiàn)3.1 頂層接口 新建目錄:D:\mdy_book\fir_prj。在該目錄中,新建一個(gè)名為fir_prj.v的文件,并用GVIM打開,開始編寫代碼。 我們要實(shí)現(xiàn)的功能,概括起來就是FPGA產(chǎn)生控制AD9709,讓其中的通道A未濾波的正弦信號(hào),讓通道B輸出濾波后的正弦信號(hào)。為了控制AD9709的工作模式,就要控制AD9709的MODE、SLEEP管腳;為了控制通道A,就需要控制AD9729的CLK1、WRT1、DB7~0P1管腳;為了控制通道B,就需要控制AD9729的CLK2、WRT2、DB7~0P2管腳。根據(jù)設(shè)計(jì)目標(biāo)的要求,整個(gè)工程需要以下信號(hào): 1. 使用clk連接到晶振,表示50M時(shí)鐘的輸入。 2. 使用rst_n連接到按鍵,表示復(fù)位信號(hào)。 3. 使用3位信號(hào)key,表示三位撥碼開關(guān)。 4. 使用dac_mode信號(hào)連接到AD9709的MODE管腳,用來控制其工作模式。 5. 使用dac_sleep信號(hào)連接到AD9709的SLEEP管腳,用來控制其睡眠模式。 6. 使用dac_clka信號(hào)連接到AD9709的CLK1管腳,用來控制通道A的時(shí)鐘。 7. 使用dac_wra信號(hào)連接到AD9709的WRT1管腳,用來控制通道A的寫使能。 8. 使用8位信號(hào)dac_da連接到AD9709的DB7~0P1管腳,用來控制通道A的寫數(shù)據(jù)。 9. 使用dac_clkb號(hào)連接到AD9709的CLK2腳,用來控制通道B時(shí)鐘。 10. 使用dac_wrb號(hào)連接到AD9709的WRT2腳,用來控制通道B使能。 11. 使用8位信號(hào)dac_db接到AD9709的DB7~0P2腳,用來控制通道B寫數(shù)據(jù)。 綜上所述,我們這個(gè)工程需要11個(gè)信號(hào),時(shí)鐘clk,復(fù)位rst_n,撥碼開關(guān)的輸入key,dac_mode、dac_sleep、dac_clka、dac_wra、dac_da、dac_clkb、dac_wrb和dac_db信號(hào),其中dac_da和dac_db是8位信號(hào),其他都是1位信號(hào)。下面表格表示了硬件電路圖的連接關(guān)系。 將module的名稱定義為fir_prj,代碼如下: 其中clk、rst_n是1位的輸入信號(hào),dac_da和dac_db是8位的輸出信號(hào),key是3位輸入信號(hào),dac_mode,dac_clka,dac_wra,dac_sleep,dac_clkb,dac_wrb是一位輸出信號(hào)。 3.2 正弦信號(hào)設(shè)計(jì) 假設(shè)產(chǎn)生的正弦信號(hào)命名為sin_data信號(hào)。sin_data是從表XX中選擇出來的值,該表一共有128個(gè)點(diǎn)。該表的產(chǎn)生方法,請(qǐng)看案例“信號(hào)發(fā)生器和DA轉(zhuǎn)換”一章的內(nèi)容。 很自然地定義一個(gè)7位的選擇信號(hào)addr。我們只要控制好addr,就能方便得到sin_data。因此可以寫出下面代碼。 |