matlab與FPGA無線通信、FPGA數字信號處理系列(5)—— 在 Vivado 中 使用 Verilog 實現串行 FIR 濾波器

     在 FPGA 實現 FIR 濾波器時,最常用的是直接型結構,簡單方便,在實現直接型結構時,可以選擇串行結構/並行結構(第六講)/分佈式結構。

     串行結構即串行實現 FIR 濾波器的乘累加操作,數據的處理速度較慢。N 階串行 FIR 濾波器,數據的輸入速率 = 系統處理時鐘速率 / 濾波器長度(N+1),本例使用 7 階串行,系統時鐘 32 MHz,這樣數據的輸入速率(也是採樣速率)爲4 MHz;

相關博客:
(3)Matlab 與 Vivado 聯合仿真 FIR 濾波器
MATLAB 與 FPGA無線通信、圖像處理、數字信號處理系列 彙總
在這裏插入圖片描述
     7 階串行 FIR 濾波器結構框圖如圖所示,只使用一個乘法器,按照輸入順序依次串行使用該乘法器,
     輸入信號爲 0.5 MHz 疊加 1.8 MHz 信號,採樣時鐘爲 4 MHz(系統處理時鐘頻率 / 濾波器階數)16-bit量化;
     濾波器係數 8-bit量化,4 MHz抽樣,低通濾波器(Low Pass Filter,LPF),截止頻率 1 MHz,窗函數設計,Blackman窗;
輸入信號爲 0.5 MHz信號,16-bit截位;
在這裏插入圖片描述

1. 新建工程和文件

(1)新建 Verilog 文件,輸入信號 16-bit,輸出信號 16-bit,復位 rst_n 低電平進行復位;
在這裏插入圖片描述
(2)定義 x0 ~ x8 並賦值;
     在數據輸入時鐘 data_clk 的上升沿進行數據的移位操作,低電平復位時初始化 x0 ~ x8 均爲 0,rst_n 爲高電平時進行數據的移位操作(注意看最開始的框圖);
在這裏插入圖片描述
(3)獲取濾波器係數 h0 ~ h8;
     按照 第一講 的方式使用 matlab 的 fdatool 工具箱設計 FIR 低通濾波器,設置爲係數 8-bit 量化,採樣時鐘 4 MHz(4MHz = 32MHz / 8),截止頻率設爲 1 MHz(截止頻率越低,濾波效果越好,此處使用的階數只有 7 階,所以把截止頻率再設低一些);
在 1.8 MHz 信號衰減接近 -30 dB,幅度是原來的幾百分之一,實線和虛線幾乎完全重疊,表明 8-bit 的濾波器係數量化基本不影響濾波效果。
在這裏插入圖片描述
     量化後導出參數,可以直接用 .coe 文件導出備用,導出後 matlab 也會自動打開係數文件,用 Verilog 語言定義參數 h0 ~ h7(注意指定爲有符號數);
在這裏插入圖片描述
(4)加權求和進行濾波
     FIR 濾波器的輸出是輸入信號不同延時階段的數據和濾波器係數的卷積(乘累加操作),也相當於每個輸入延時數據有不同的權值,進行加權和;
     使用一個計數器 count 對系統處理時鐘 clk 來計數,共計 8 個數(0 ~ 7),每個數對應處理一個乘法;
在這裏插入圖片描述
定義乘數 a / b / 積 :

reg signed [15:0] mult_a;
reg signed [7:0]  mult_b;
wire signed [23:0] mult_p;

     每個計數值對應相應的乘法器輸入,這樣共計 8 個 clk 時鐘完成 8 次乘法操作,但是隻是用了 1 個乘法器(在不同時間用的),節省了資源,但是速度較慢;
在這裏插入圖片描述
對乘法輸出累加,在累加了 8 個值後,輸出累加值並把原來的累加值清零;
在這裏插入圖片描述

2.使用 matlab 產生仿真信號

參數:
     抽樣頻率 Fs = 4 MHz,信號 f1 = 0.5 MHz,信號 f2 = 1.8 MHz,具體參見 第三講 Matlab 與 Vivado 聯合仿真 FIR 濾波器
     紅線部分前面乘0.5,讓高頻噪聲信號的幅度小一些,這樣濾波效果比較明顯,不然 7 階 FIR 濾波器的效果比較差;
在這裏插入圖片描述

3.編寫仿真文件testbench

(1)例化模塊;
(2)寫 initial 塊,初始化時鐘、復位等;
(3)寫 always 塊,給出時鐘翻轉等;
(4)讀寫 .txt 文件,將 matlab 寫好的 .txt 的數據賦給輸入,把輸出數據寫入 .txt 文件給 matlab 分析;
     具體見 第三講 Matlab 與 Vivado 聯合仿真 FIR 濾波器
在這裏插入圖片描述
4.仿真
(1)Testbench仿真
     階數太少,濾波效果一般;
在這裏插入圖片描述
(2)Matlab仿真
     分別是 f1、f2、f1+f2、濾波後的數據;
在這裏插入圖片描述
     由於串行濾波器的速度限制,當處理頻率較高的數據時,要求的系統時鐘就需要更高,所以要想辦法進行優化;
(1)觀察 FIR 濾波器的係數可以發現,係數是對稱的,這也是 FIR 濾波器對稱結構的特性,對於本例來說,h0與h7一樣,h1與h6一樣…,則對於 data_in * h0 + x7 * h7 可以簡化爲 (data_in + x7) * h0,先計算對稱的加法,再計算乘法,這樣對於一個 7 階的 FIR濾波器(8個濾波器係數),只需要計算 4 次乘法,在系統時鐘和階數不變的情況下,數據的輸入速率可以由原來的 4 MHz提高到 8 MHz;或者說在輸入速率和系統時鐘不變的情況下,可以把階數從 7 階(8個係數)做到 15 階(16個係數),使得濾波效果更好;
(2)上述利用對稱性能夠提高一定的速度,但是在階數較高是仍然面臨系統時鐘需求較高的問題, 此時可以利用 “ 用資源換速度 ” 的思想,並行處理,並加入流水線,這樣消耗了更多的資源,但是提高了運行速度;

第三講 Matlab 與 Vivado 聯合仿真 FIR 濾波器

下一講(6)—— 在 Vivado 中 使用 Verilog 實現並行 FIR 濾波器-1

MATLAB 與 FPGA無線通信、圖像處理、數字信號處理系列 彙總

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章