基於FPGA和MATLAB聯合模擬的數字濾波器的設計及實物測試
1)實驗目的:利用FPGA實現高精度數字濾波器的設計。
2)實驗平臺:
ALINIX黑金AX301開發板,晶片型號:ALTERA 公司的 Cyclone IV 系列 FPGA,型號為 EP4CE6F17C8, 晶片封裝為FBGA,AN108ADDA模組
3) 實驗步驟:
MATLAB fdatool(高版本改為filterdesignertool)設計濾波器直接生成Verilog程式碼---->testbench模擬----->實際模擬
3-1 MATLAB設計模組(FIR濾波器設計)
1.以設計為低通為例->選擇為海明窗函式窗函式->設計取樣頻率50MHZ->設計截止頻率為1MHZ
濾波器階數此處設為30,與效能正相關,與資源消耗反相關
2.點選左下角的Set quantization parameter,設定Filter arithmetic為Fixed-point(定點)部分FPGA只支援定點運算。
Numerator word length設定資料的長度(影響濾波器)實測16位可達到較好的濾波效果。
3.先選擇Filter precision為Specify all(這樣才能設定output wordth length)設計配置輸入輸出的為寬(因為本實驗使用的ADDA模組AN108 AD取樣與DA輸出資料都為8位),而又MATLAB生成的濾波器資料型別為signed即有符號位。因此實際的濾波器輸入即輸出資料應該為9位,最高位預設為0作為符號位。
4.生成verilog程式碼,生成路徑選擇工程資料夾下
3-2使用modisim模擬,新建工程,新增測試檔案,compile驗證成功後進行SIMULATE模擬,選中filter_tb檔案。
圖2為模擬效果,可以清楚看到高頻波形被過濾。
具體的模擬過程可有參考https://blog.csdn.net/Reborn_Lee/article/details/82974294?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242
->
3-3程式碼編寫
1.直接將生成的fir.v濾波器程式碼新增進工程,並編寫頂層檔案
`timescale 1ns/1ps module adda_test( //頂層模組 input clk,//main clock output daclk, output [7:0] dadata,//DAdata output adclk, input [7:0] addata //ADdata );
2.自設定網線型變數以及暫存器變數用於資料型別的轉換(將上述的ADDA模組的8位無符號位資料轉變為9位的有符號位資料,最高位為符號位)
reg signed [8:0] filterout; //用於濾波器的輸出 wire signed [8:0] filterin; //用於濾波器模組的輸入 assign filterin[7:0]=addata; //線網型變數的連線 assign dadata=filterout[7:0]; assign daclk=clk;//ADDA模組的時鐘連線(直接連繫統的50MHZ的時鐘即可) assign adclk=clk;
3.例化濾波器模組
filter filter_inst( .clk(clk), //濾波器取樣時鐘,由於之前MALLAB中設定為50MHZ所以直接接系統時鐘即可 .clk_enable(1'b1),//時鐘使能訊號,置為1即使能 .reset(1'b0),//reset置0為失能(最好設定單獨的復位引腳) .filter_in(filterin),//濾波器輸入資料 .filter_out(filterout)//濾波器輸出資料 );
4.關於reset的設定緣由在filter.v中的288行可以找到,可以發現reset=1'b1時為復位功能啟用,因為AX301的rst_n在按鍵未按下時高電平,所以若設定按鍵的話應當更改reser為1'b0。
1 always @( posedge clk or posedge reset) 2 begin: Delay_Pipeline_process 3 if (reset == 1'b1) begin
4)實驗效果:
以低通為例實際操作發現,在設計過程中FS取樣頻率與截止頻率的倍數相差不可過大,否則在MATLAB設計環節就無法達到所要的截止頻率的效果。而取樣頻率又不可過小,否則容易導致波形的失真。
第一次我採用了FS取樣頻率 為50MHZ,恰好為開發板晶振的時鐘頻率,設定的截止頻率為1MHZ,實驗效果較好,實際在-3.01db時為1.02MHZ,波形無失真。
第二次測試較低頻率的低通,選擇濾波器時鐘為1MHZ(將系統時鐘用PLL鎖相環50分頻),截止頻率設為30KHZ。效果圖如下,圖1為1KHZ的波形,較為清晰無失真。圖2為30KHZ,失真較嚴重,雖然截止頻率與設計預期基本相同。
之後又嘗試了帶通濾波器設計,MATLAB設計圖如下,實際測試結果也與預期相仿,但是存在的問題便是失真嚴重,因為取樣頻率才100K,而截止達到30K。嘗試提高取樣頻率,難以實際出想要的效果。
5)問題分析:個人認為主要難點還是在MATLAB的設計方面,想要設計達到預期的引數最基本需要了解各型別濾波器的引數以及設計的原理(本人準大二,模電還沒學)。或許能避免取樣頻率過高或過低帶來的效果問題。此外,還有直接呼叫IP核的設計方式,但是相比之下還是認為直接使用MATLAB生成程式碼方便,不過個人認為呼叫IP核設計的實際精度應該更高。不過貌似相同引數的濾波器呼叫IP核的話所佔用的DSP(數字處理單元會更多),實驗中就出現過DSP數目不夠的情況,解決方式就是換效能更強的FPGA板子或者降低精度。因為實驗並未取得較好的效果,所以IP核的方式在取得較好的實驗效果之後再詳細討論。
如果有大佬碰巧看到本文並且有FPGA數字濾波器的好的設計方案也請多多指教。
6)設計過程中參考一些相關部落格:
1.quartusII ip核的使用說明:https://www.cnblogs.com/cofin/p/10220648.html
2.FIR濾波器詳解:https://blog.csdn.net/Reborn_Lee/article/details/82968488
3.MALLAB生成FIR濾波器的步驟及模擬過程:https://blog.csdn.net/Reborn_Lee/article/details/82974294?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242