天天看點

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

在 FPGA 實作 FIR 濾波器時,最常用的是直接型結構,簡單友善,在實作直接型結構時,可以選擇串行結構/并行結構/分布式結構。

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

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

7 階串行 FIR 濾波器結構框圖如下圖所示,隻使用一個乘法器,按照輸入順序依次串行使用該乘法器,

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 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 低電平進行複位;

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

(2) 定義 x0 ~ x8 并指派;

    在資料輸入時鐘 data_clk 的上升沿進行資料的移位操作,低電平複位時初始化 x0 ~ x8 均為 0,rst_n 為高電平時進行資料的移位操作(注意看前面的框圖);

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

(3) 擷取濾波器系數 h0 ~ h8;

    按照 第一講 的方式使用 matlab 的 fdatool 工具箱設計 FIR 低通濾波器,設定為系數 8-bit 量化,采樣時鐘 4 MHz(4MHz = 32MHz / 8),截止頻率設為 1 MHz(截止頻率越低,濾波效果越好,此處使用的階數隻有 7 階,是以把截止頻率再設低一些);

    在 1.8 MHz 信号衰減接近 -30 dB,幅度是原來的幾百分之一,實線和虛線幾乎完全重疊,表明 8-bit 的濾波器系數量化基本不影響濾波效果。

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

    量化後導出參數,可以直接用 .coe 檔案導出備用,導出後 matlab 也會自動打開系數檔案,用 Verilog 語言的常數定義參數 h0 ~ h7(注意指定為有符号數);

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

(4) 權重求和進行濾波

    FIR 濾波器的輸出是輸入信号不同延時階段的資料和濾波器系數的卷積(乘累加操作),也相當于每個輸入延時資料有不同的權值,進行權重和;

    使用一個計數器 count 對系統處理時鐘 clk 來計數,共計 8 個數(0 ~ 7),每個數對應處理一個乘法;

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

    定義乘數a    :reg     signed [15:0]     mult_a;

    定義乘數b    :reg     signed [7:0]      mult_b;

    定義積          :wire    signed [23:0]     mult_p;

    每個計數值對應相應的乘法器輸入,這樣共計 8 個 clk 時鐘完成 8 次乘法操作,但是隻是用了 1 個乘法器(在不同時間用的),節省了資源,但是速度較慢;

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

對乘法輸出累加,在累加了 8 個值後,輸出累加值并把原來的累加值清零;

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

2. 使用 matlab 産生仿真信号

    參數:抽樣頻率 Fs = 4 MHz,信号 f1 = 0.5 MHz,信号 f2 = 1.8 MHz,具體參見第三講matlab與FPGA數字濾波器設計(3)—— Matlab 與 Vivado 聯合仿真 FIR 濾波器;

    紅線部分前面乘0.5,讓高頻噪聲信号的幅度小一些,這樣濾波效果比較明顯,不然 7 階 FIR 濾波器的效果比較差;

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

3. 編寫仿真檔案testbench

(1)例化子產品;

(2)寫 initial 塊,初始化時鐘、複位等;

(3)寫 always 塊,給出時鐘翻轉等;

(4)讀寫 .txt 檔案,将 matlab 寫好的 .txt 的資料賦給輸入,把輸出資料寫入 .txt 檔案給 matlab 分析;

具體見第三講;

matlab與FPGA數字濾波器設計(3)—— Matlab 與 Vivado 聯合仿真 FIR 濾波器

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

4. 仿真

    階數太少,濾波效果一般;

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

    Matlab仿真,分别是 f1、f2、f1+f2、濾波後的資料;

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

    由于串行濾波器的速度限制,當處理頻率較高的資料時,要求的系統時鐘就需要更高,是以要想辦法進行優化;

(1)觀察 FIR 濾波器的系數可以發現,系數是對稱的,這也是 FIR 濾波器對稱結構的特性,對于本例來說,h0與h7一樣,h1與h6一樣…,則對于 data_in * h0 + x7*h7 可以簡化為 (data_in + x7) * h0,先計算對稱的加法,再計算乘法,A*B+A*B = (A+A)*B,這樣對于一個 7 階的 FIR濾波器(8個濾波器系數),隻需要計算 4 次乘法,在系統時鐘和階數不變的情況下,資料的輸入速率可以由原來的 4 MHz提高到 8 MHz;或者說在輸入速率和系統時鐘不變的情況下,可以把階數從 7 階(8個系數)做到 15 階(16個系數),使得濾波效果更好;

(2)上述利用對稱性能夠提高一定的速度,但是在階數較高是仍然面臨系統時鐘需求較高的問題, 此時可以利用“用資源換速度”的思想,并行處理,并加入流水線,這樣消耗了更多的資源,但是提高了運作速度;

matlab與FPGA數字濾波器設計(4)—— Vivado DDS 與 FIR IP核設計 FIR 數字濾波器系統

matlab與FPGA數字濾波器設計(3)—— Matlab 與 Vivado 聯合仿真 FIR 濾波器

matlab與FPGA數字濾波器設計(2)——Vivado調用IP核設計FIR濾波器

matlab與FPGA數字濾波器設計(1)——通過matlab的fdatool工具箱設計FIR數字濾波器

歡迎關注:FPGA探索者

matlab 圖像 幅度譜 低通濾波_matlab與FPGA數字濾波器設計(5)—— Verilog 串行 FIR 濾波器...

繼續閱讀