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