1. 程式人生 > >FPGA數字訊號處理(五)Vivado FIR IP核實現

FPGA數字訊號處理(五)Vivado FIR IP核實現

該篇是FPGA數字訊號處理的第五篇,選題為DSP系統中極其常用的FIR濾波器。本文將在前三篇的基礎上,繼續介紹在Vivado開發環境下使用Xilinx提供的FIR IP核進行FIR濾波器的設計。

IP核概述

這裡寫圖片描述
Xilinx的FIR IP核屬於收費IP,但是不需要像 Quartus那樣通過修改license檔案來破解。如果是個人學習,現在網路上流傳的license破解檔案在破解Vivado的同時也破解了絕大多數可以破解的IP核。只要在IP Catalog介面中FIR Compiler的License狀態為“Included”即可正常使用。

IP核引數設定

和Quartus不一樣,Vivado的FIR Compiler沒有提供設計FIR濾波器和生成濾波器係數的功能,因此需要使用MATLAB等其它工具設計好濾波器再將係數匯入到IP核中。MATLAB的FDATOOL工具在設計好濾波器後,可以直接生成IP核需要的coe檔案,如下圖所示:
這裡寫圖片描述


在IP Catalog中開啟FIR Compiler,主介面如下:
這裡寫圖片描述
左邊的Tab可以切換看到FIR的模組圖(管腳資訊)、頻率響應等資訊。右邊的Tab是對FIR濾波器進行設計。

IP核支援兩種FIR係數輸入方式,以“Vector”的形式直接寫入;或者以“COE File”的形式匯入coe檔案。Xilinx的FIR IP核支援多種濾波器結構,可以在“Filter Type”中設定,本文選擇傳統的“Single Rate”結構。該IP核同樣也支援係數過載。

除了單速率(Single Rate,即資料輸出與輸入速率相同)外,FIR Compiler還支援抽取(Decimation)和插值(Interpolation)應用於多速率訊號處理系統。此外還支援希爾伯特變換(Hilbert)模式,可以在“Filter Type”中設定。
這裡寫圖片描述


IP核支援多通道資料輸入,可以在Channel Specification這個Tab中設定輸入資料的通道數。還可以在Hardware Oversampling Specification中設定過取樣模式,即輸入資料的頻率可以高出FIR系統時鐘的頻率。
這裡寫圖片描述
Implementation這個Tab中可以設定FIR係數的型別、量化方式、量化位寬(此值應該與MATLAB中的設定一致,否則頻率響應是錯的)和結構。本文由於是設計線性相位FIR,濾波器係數是對稱的,因此選擇為“Symmetric”,也可以選擇為“Inferred”,軟體會自動判斷係數的結構。

Detailed Implementation這個Tab中可以設定優化方式、儲存的型別、是否使用DSP單元等與綜合、實現有關的資訊。Interface這個Tab中可以設定與IP核介面相關的資訊。

IP核介面說明

Vivado的很多IP核採用的是AXI4介面,主要有資料(tdata)、準備好(tready)、有效(tvalid)幾種訊號,還有主機(m)和從機(s)之分。另外在Interface這個Tab還可以配置使用更多輔助的AXI4介面訊號。
接下來介紹幾個主要的介面:
這裡寫圖片描述
在設定為多通道、可變係數模式時,還會用到其它的介面。上表中的介面已經足夠完成一次單通道、固定係數的FIR濾波器設計。其它介面在後文的設計中使用到FIR濾波器的其它模式時,再做介紹。

FPGA設計

IP核的介面在Verilog HDL中進行設計時,一定要參考官方文件中給出的時序圖。在IP核的配置介面點選“documentation”,可以找到IP核的user guide。 也可以在Xilinx官網或DocNav工具中搜索pg149,查閱FIR Compiler的說明。

單通道、固定係數的FIR Compiler介面時序非常簡單,Verilog HDL示例程式碼如下所示:

`timescale 1ns / 1ps

module Xilinx_FIRIP_liuqi
(
    input clk,                  //FPGA系統時鐘/資料速率:2kHz
    input signed [11:0] Xin,    //資料輸入頻率為2kHZ
    output m_tvalid,            //FIR輸出資料有效訊號
    output signed [24:0] Yout   //濾波後的輸出資料
);

wire s_tready;
wire signed [31:0] m_tdata;

fir fir_lowpass_500kHz
(
        .aclk                 (clk),
        .s_axis_data_tvalid   (1'b1),
        .s_axis_data_tready   (s_tready),
        .s_axis_data_tdata    ({{4{Xin[11]}},Xin}),
        .m_axis_data_tvalid   (m_tvalid),
        .m_axis_data_tdata    (m_tdata)
);

assign Yout =  m_tdata[24:0];

endmodule

程式中認為輸入的取樣資料始終有效,因此將s_axis_data_tvalid永遠置1。由於s_axis_data_tdata為16bit位寬,但輸入訊號資料為12bit位寬,因此用拼接運算子{}在高位填充補碼的符號位;由於m_axis_data_tdata為32bit位寬,但輸出訊號資料有效位僅有25bit位寬,因此僅需取低25bit作為FIR濾波器輸出。當然不這麼操作,直接將訊號賦值到例項化介面,結果也是正確的,這樣做只是為了更嚴謹。

模擬與工程下載

使用MATLAB生成一個200khz+800kHz的混合頻率訊號,寫入txt檔案,。編寫Testbench讀取txt檔案對訊號濾波,檔案操作方法參考“Testbench編寫指南(一)檔案的讀寫操作”https://blog.csdn.net/fpgadesigner/article/details/80470972
在Vivado中進行模擬,對正弦訊號的濾波如下圖所示:
這裡寫圖片描述
新建一個虛擬匯流排,僅保留一個符號位。明顯看到經過500Hz低通濾波器濾波後,輸入的200+800Hz訊號只剩下200Hz的單頻訊號。且當FIR濾波器輸出有效時,m_tvalid訊號置高。
完整的Vivado工程(含testbench模擬)可以在這裡下載:https://download.csdn.net/download/fpgadesigner/10466659