基于FPGA的FIR濾波器IP仿真實(shí)例

發(fā)布時(shí)間:2019-7-16 17:33    發(fā)布者:rousong1989
基于FPGAFIR濾波器IP仿真實(shí)例
AT7_Xilinx開(kāi)發(fā)板(USB3.0+LVDS)資料共享
       騰訊鏈接:https://share.weiyun.com/5GQyKKc
       百度網(wǎng)盤(pán)鏈接:https://pan.baidu.com/s/1M7PLzRs-yMJv7NFJE8GVAw
       提取碼:qr0t
1 FIR濾波器簡(jiǎn)介
FIRFinite Impulse Response)濾波器,即有限脈沖響應濾波器,又稱(chēng)為非遞歸型濾波器,是數字信號處理系統中最基本的元件,它可以在保證任意幅頻特性的同時(shí)具有嚴格的線(xiàn)性相頻特性,同時(shí)其單位抽樣響應是有限長(cháng)的,因而濾波器是穩定的系統。因此,FIR濾波器在通信、圖像處理、模式識別等領(lǐng)域都有著(zhù)廣泛的應用。
         Vivado集成的FIR IP核可以實(shí)現如下公式所示的N級卷積運算。
         FIR IP核可以根據配置實(shí)現復用的乘累加單元,以實(shí)現面積最優(yōu)化的設計;當然了,在速度性能要求極高的應用中,也可以配置并行的乘累加單元,以達到最大的FIR數據吞吐量。
2 FIR IP核配置
         FIRIP配置主頁(yè)面如圖所示。此頁(yè)面可以配置基本的濾波參數。
         通道配置頁(yè)面如下。
         輸入輸出的數據位寬可在Implementation頁(yè)面配置。
         實(shí)現的資源利用情況,如優(yōu)化選項、存儲器選項和DSP Slice選項等,可以在Detailed Implementation頁(yè)面配置。
         額外的控制接口,可以在Interface頁(yè)面配置。
         左側的Freq.Response頁(yè)面可以參考所使用的FIR濾波參數最終實(shí)現的濾波特性(低通、高通、低阻、高阻或帶通、帶阻等),這里我們使用的是一組IP默認的參數,低通濾波器。
         而左側的Implementation Details頁(yè)面,則可以自由利用以及接口等信息。如圖所示的ufix16_0表示輸入數據為16位的無(wú)符號整數,而fix25_0則表示輸出結果是25位的有符號整數。
         詳細配置可參看pg149-fir-compiler.pdfat7_img_ex07/matlab文件夾下)。
3 FIR IP核接口時(shí)序
         我們例化的FIR IP核,有如下的接口,其功能和端口方向定義如下。
inputaclk;         //時(shí)鐘信號
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濾波結果輸出有效,高電平有效
         接口時(shí)序控制如圖所示。圖中很多信號本實(shí)例不涉及,可以忽略。s_axis_data_tvalids_axis_data_tready信號同時(shí)拉高時(shí),s_axis_data_tdataFIR IP核接收,進(jìn)行處理。當m_axis_data_tvalid拉高時(shí),表示輸出FIR濾波結果m_axis_data_tdata有效。
4 FIR IP仿真
         使用at7_img_ex07/matlab文件夾下的test_data_generate_for_fir.m腳本,可以產(chǎn)生一組1000個(gè)點(diǎn)的余弦數據,存放在time_domain_cos.txt文件中,這組數據將作為FPGA的仿真輸入激勵,經(jīng)過(guò)FIR濾波器進(jìn)行濾波處理。
clc;clear `all;close all;
format long g
Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sampling period
L = 1000;                     % Length of signal
t = (0-1)*T;                % Time vector
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的頂層是一個(gè)測試腳本,at7_fir_sim.v文件。該測試腳本將time_domain_cos.txt文件的1000個(gè)數據讀入,然后依次送入FIR濾波器IP核進(jìn)行處理,輸出結果寫(xiě)入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中打開(kāi)at7_img_ex07工程,在Project Manager à Simulation Sources à sim_1下,看到top module為高亮的at7_fir_sim.v模塊,點(diǎn)擊Flow Navigator à Simulation à Run Simulation可以啟動(dòng)仿真。
         運行仿真如圖。
仿真的結果將寫(xiě)入生成的fir_result.txt文本(位于at7_img_ex07\at7.sim文件夾的子文件夾中),將該文本放置到matlab文件夾中,運行matlab腳本draw_wave_from_txt.m,可以查看正弦數據FIR濾波前后的波形比對。在時(shí)域看來(lái),峰或谷的位置是高頻,因此都被FIR濾波處理了。
AT7_Xilinx開(kāi)發(fā)板(USB3.0+LVDS)資料共享
       騰訊鏈接:https://share.weiyun.com/5GQyKKc
       百度網(wǎng)盤(pán)鏈接:https://pan.baidu.com/s/1M7PLzRs-yMJv7NFJE8GVAw
       提取碼:qr0t
本文地址:http://selenalain.com/thread-565970-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页