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