基于FPGA的FIR濾波器IP仿真實例 騰訊鏈接:https://share.weiyun.com/5GQyKKc 百度網盤鏈接:https://pan.baidu.com/s/1M7PLzRs-yMJv7NFJE8GVAw 提取碼:qr0t ![]() FIR(Finite Impulse Response)濾波器,即有限脈沖響應濾波器,又稱為非遞歸型濾波器,是數字信號處理系統中最基本的元件,它可以在保證任意幅頻特性的同時具有嚴格的線性相頻特性,同時其單位抽樣響應是有限長的,因而濾波器是穩定的系統。因此,FIR濾波器在通信、圖像處理、模式識別等領域都有著廣泛的應用。 Vivado集成的FIR IP核可以實現如下公式所示的N級卷積運算。
![]() FIR IP核可以根據配置實現復用的乘累加單元,以實現面積最優化的設計;當然了,在速度性能要求極高的應用中,也可以配置并行的乘累加單元,以達到最大的FIR數據吞吐量。
![]() FIRIP配置主頁面如圖所示。此頁面可以配置基本的濾波參數。
![]() 通道配置頁面如下。
![]() 輸入輸出的數據位寬可在Implementation頁面配置。
![]() 實現的資源利用情況,如優化選項、存儲器選項和DSP Slice選項等,可以在Detailed Implementation頁面配置。
![]() 額外的控制接口,可以在Interface頁面配置。
![]() 左側的Freq.Response頁面可以參考所使用的FIR濾波參數最終實現的濾波特性(低通、高通、低阻、高阻或帶通、帶阻等),這里我們使用的是一組IP默認的參數,低通濾波器。
![]() 而左側的Implementation Details頁面,則可以自由利用以及接口等信息。如圖所示的ufix16_0表示輸入數據為16位的無符號整數,而fix25_0則表示輸出結果是25位的有符號整數。
![]() 詳細配置可參看pg149-fir-compiler.pdf(at7_img_ex07/matlab文件夾下)。 我們例化的FIR IP核,有如下的接口,其功能和端口方向定義如下。 inputaclk; //時鐘信號 input [15 : 0] s_axis_data_tdata; //unsigned(16.0),輸入數據 inputs_axis_data_tvalid; //輸入數據有效信號,高電平有效 outputs_axis_data_tready; //準備好接收輸入數據,高電平有效 output [24 : 0] m_axis_data_tdata; //signed(25.0),FIR濾波結果輸出 outputm_axis_data_tvalid; //FIR濾波結果輸出有效,高電平有效 接口時序控制如圖所示。圖中很多信號本實例不涉及,可以忽略。s_axis_data_tvalid和s_axis_data_tready信號同時拉高時,s_axis_data_tdata被FIR IP核接收,進行處理。當m_axis_data_tvalid拉高時,表示輸出FIR濾波結果m_axis_data_tdata有效。
![]() 使用at7_img_ex07/matlab文件夾下的test_data_generate_for_fir.m腳本,可以產生一組1000個點的余弦數據,存放在time_domain_cos.txt文件中,這組數據將作為FPGA的仿真輸入激勵,經過FIR濾波器進行濾波處理。 clc;clear `all;close all; format long g Fs = 1000; % Sampling frequency T = 1/Fs; % Sampling period L = 1000; % Length of signal t = (0 ![]() x1 = cos(2*pi*50*t)*(2^13); % First row wave %output time domain data x1_fix = round(x1,0); %convert to fixed signed(3.13) x1_fix(find(x1_fix<0)) = x1_fix(find(x1_fix<0))+(2^16); fid0 = fopen('time_domain_cos.txt', 'wt'); fprintf(fid0, '%16x\n', x1_fix); fid0 = fclose(fid0); FPGA工程at7_img_ex07的頂層是一個測試腳本,at7_fir_sim.v文件。該測試腳本將time_domain_cos.txt文件的1000個數據讀入,然后依次送入FIR濾波器IP核進行處理,輸出結果寫入fir_result.txt文本中。 `timescale 1ns/1ps module zstar_fir_sim( ); reg clk; reg [15 : 0] s_axis_data_tdata; //unsigned(16.0) reg s_axis_data_tvalid; wire s_axis_data_tready; wire [31 : 25] null; wire [24 : 0] m_axis_data_tdata; //signed(25.0) wire m_axis_data_tvalid; parameter DATA_NUM = 1000; //////////////////////////////////////////////////// //FIR IP Core fir_compiler_0 uut_fir_compiler_0 ( .aclk(clk), // input wire aclk .s_axis_data_tvalid(s_axis_data_tvalid), // input wire s_axis_data_tvalid .s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready .s_axis_data_tdata(s_axis_data_tdata), // input wire [15 : 0] s_axis_data_tdata .m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid .m_axis_data_tdata({null,m_axis_data_tdata}) // output wire [31 : 0] m_axis_data_tdata ); //////////////////////////////////////////////////// integer i; reg[15:0] data_mem [DATA_NUM-1:0]; initial #500 $readmemh("../../time_domain_cos.txt", data_mem); initial begin clk = 0; s_axis_data_tdata<= 16'd0; s_axis_data_tvalid<= 1'b0; #1000; @(posedgeclk); i<= 1; #10000; @(posedgeclk); #100_000; $fclose(w1_file); #1000; $stop; end always @(*) begin if((i>0) && (i else s_axis_data_tdata<= 16'd0; end always @(posedgeclk) begin if(i == 0) i<= 0; else if(i<= DATA_NUM) begin if(s_axis_data_tready&&s_axis_data_tvalid) i<= i+1; else ; end else if(i< DATA_NUM+26) i<= i+1; else ; end always @(posedgeclk) begin if((i>=1) && (i<=DATA_NUM-1)) s_axis_data_tvalid<= 1'b1; else s_axis_data_tvalid<= 1'b0; end always #10 clk = ~clk; integer w1_file; initial w1_file = $fopen("./fir_result.txt","w"); always @(posedgeclk) begin if(m_axis_data_tvalid) begin $fwrite(w1_file, "%x\n", m_axis_data_tdata); end end endmodule 如圖所示,Vivado中打開at7_img_ex07工程,在Project Manager à Simulation Sources à sim_1下,看到top module為高亮的at7_fir_sim.v模塊,點擊Flow Navigator à Simulation à Run Simulation可以啟動仿真。 運行仿真如圖。
![]() 仿真的結果將寫入生成的fir_result.txt文本(位于at7_img_ex07\at7.sim文件夾的子文件夾中),將該文本放置到matlab文件夾中,運行matlab腳本draw_wave_from_txt.m,可以查看正弦數據FIR濾波前后的波形比對。在時域看來,峰或谷的位置是高頻,因此都被FIR濾波處理了。
![]() AT7_Xilinx開發板(USB3.0+LVDS)資料共享 騰訊鏈接:https://share.weiyun.com/5GQyKKc 百度網盤鏈接:https://pan.baidu.com/s/1M7PLzRs-yMJv7NFJE8GVAw 提取碼:qr0t |