在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Verilog并行FIR濾波器設計

冬至子 ? 來源:數字IC與好好生活的兩居室 ? 作者:除夕之夜啊 ? 2023-06-01 11:11 ? 次閱讀

FIR(Finite Impulse Response)濾波器是一種有限長單位沖激響應濾波器,又稱為非遞歸型濾波器。FIR 濾波器具有嚴格的線性相頻特性,同時其單位響應是有限長的,因而是穩定的系統,在數字通信、圖像處理等領域都有著廣泛的應用。

FIR 濾波器原理

FIR 濾波器是有限長單位沖擊響應濾波器。直接型結構如下:

圖片

FIR 濾波器本質上就是輸入信號與單位沖擊響應函數的卷積,表達式如下:

圖片

FIR 濾波器有如下幾個特性:

(1) 響應是有限長序列。

(2) 系統函數在 |z| > 0 處收斂,極點全部在 z=0 處,屬于因果系統。

(3) 結構上是非遞歸的,沒有輸出到輸入的反饋。

(4) 輸入信號相位響應是線性的,因為響應函數 h(n) 系數是對稱的。

(5) 輸入信號的各頻率之間,相對相位差也是固定不變的。

(6) 時域卷積等于頻域相乘,因此該卷積相當于篩選頻譜中各頻率分量的增益倍數。某些頻率分量保留,某些頻率分量衰減,從而實現濾波的效果。

并行 FIR 濾波器設計

◆設計說明

輸入頻率為 7.5 MHz 和 250 KHz 的正弦波混合信號,經過 FIR 濾波器后,高頻信號 7.5MHz 被濾除,只保留 250KHz 的信號。設計參數如下:

輸入頻率: 7.5MHz 和 250KHz

采樣頻率: 50MHz

阻帶: 1MHz ~ 6MHz

階數: 15(N-1=15)

由 FIR 濾波器結構可知,階數為 15 時,FIR 的實現需要 16 個乘法器,15 個加法器和 15 組延時寄存器。為了穩定第一拍的數據,可以再多用一組延時寄存器,即共用 16 組延時寄存器。由于 FIR 濾波器系數的對稱性,乘法器可以少用一半,即共使用 8 個乘法器。

并行設計,就是在一個時鐘周期內對 16 個延時數據同時進行乘法、加法運算,然后在時鐘驅動下輸出濾波值。這種方法的優點是濾波延時短,但是對時序要求比較高。

◆并行設計

設計中使用到的乘法器模塊代碼,可參考之前流水線式設計的乘法器。

為方便快速仿真,也可以直接使用乘號 “*” 完成乘法運算,設計中加入宏定義 SAFE_DESIGN 來選擇使用哪種乘法器。

FIR 濾波器系數可由 matlab 生成,具體見附錄。

/***********************************************************
> > V201001 : Fs50Mhz, fstop:1Mhz-6Mhz, order: 15
************************************************************/
`define SAFE_DESIGN

module fir_guide    (
    input                rstn,  //復位,低有效
    input                clk,   //工作頻率,即采樣頻率
    input                en,    //輸入數據有效信號
    input        [11:0]  xin,   //輸入混合頻率的信號數據
    output               valid, //輸出數據有效信號
    output       [28:0]  yout   //輸出數據,低頻信號,即250KHz
    );

    //data en delay 
    reg [3:0]            en_r ;
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            en_r[3:0]      <= 'b0 ;
        end
        else begin
            en_r[3:0]      <= {en_r[2:0], en} ;
        end
    end

   //(1) 16 組移位寄存器
    reg        [11:0]    xin_reg[15:0];
    reg [3:0]            i, j ;
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            for (i=0; i< 15; i=i+1) begin
                xin_reg[i]  <= 12'b0;
            end
        end
        else if (en) begin
            xin_reg[0] <= xin ;
            for (j=0; j< 15; j=j+1) begin
                xin_reg[j+1] <= xin_reg[j] ; //周期性移位操作
            end
        end
    end

   //Only 8 multipliers needed because of the symmetry of FIR filter coefficient
   //(2) 系數對稱,16個移位寄存器數據進行首位相加
    reg        [12:0]    add_reg[7:0];
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            for (i=0; i< 8; i=i+1) begin
                add_reg[i] <= 13'd0 ;
            end
        end
        else if (en_r[0]) begin
            for (i=0; i< 8; i=i+1) begin
                add_reg[i] <= xin_reg[i] + xin_reg[15-i] ;
            end
        end
    end

    //(3) 8個乘法器
    // 濾波器系數,已經過一定倍數的放大
    wire        [11:0]   coe[7:0] ;
    assign coe[0]        = 12'd11 ;
    assign coe[1]        = 12'd31 ;
    assign coe[2]        = 12'd63 ;
    assign coe[3]        = 12'd104 ;
    assign coe[4]        = 12'd152 ;
    assign coe[5]        = 12'd198 ;
    assign coe[6]        = 12'd235 ;
    assign coe[7]        = 12'd255 ;
    wire        [24:0]   mout[7:0]; 

`ifdef SAFE_DESIGN
    //流水線式乘法器
    wire [7:0]          valid_mult ;
    genvar              k ;
    generate
        for (k=0; k< 8; k=k+1) begin
            mult_man #(13, 12)
            u_mult_paral          (
              .clk        (clk),
              .rstn       (rstn),
              .data_rdy   (en_r[1]),
              .mult1      (add_reg[k]),
              .mult2      (coe[k]),
              .res_rdy    (valid_mult[k]), //所有輸出使能完全一致  
              .res        (mout[k])
            );
        end
    endgenerate
    wire valid_mult7     = valid_mult[7] ;

`else
    //如果對時序要求不高,可以直接用乘號
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            for (i=0 ; i< 8; i=i+1) begin
                mout[i]     <= 25'b0 ;
            end
        end
        else if (en_r[1]) begin
            for (i=0 ; i< 8; i=i+1) begin
                mout[i]     <= coe[i] * add_reg[i] ;
            end
        end
    end
    wire valid_mult7 = en_r[2];
`endif

    //(4) 積分累加,825bit數據 - > 129bit 數據
    //數據有效延時
    reg [3:0]            valid_mult_r ;
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            valid_mult_r[3:0]  <= 'b0 ;
        end
        else begin
            valid_mult_r[3:0]  <= {valid_mult_r[2:0], valid_mult7} ;
        end
    end


`ifdef SAFE_DESIGN
    //加法運算時,分多個周期進行流水,優化時序
    reg        [28:0]    sum1 ;
    reg        [28:0]    sum2 ;
    reg        [28:0]    yout_t ;
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            sum1   <= 29'd0 ;
            sum2   <= 29'd0 ;
            yout_t <= 29'd0 ;
        end
        else if(valid_mult7) begin
            sum1   <= mout[0] + mout[1] + mout[2] + mout[3] ;
            sum2   <= mout[4] + mout[5] + mout[6] + mout[7] ;
            yout_t <= sum1 + sum2 ;
        end
    end

`else 
    //一步計算累加結果,但是實際中時序非常危險
    reg signed [28:0]    sum ;
    reg signed [28:0]    yout_t ;
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            sum    <= 29'd0 ;
            yout_t <= 29'd0 ;
        end
        else if (valid_mult7) begin
            sum    <= mout[0] + mout[1] + mout[2] + mout[3] + mout[4] + mout[5] + mout[6] + mout[7];
            yout_t <= sum ;
        end
    end 
`endif
    assign yout  = yout_t ;
    assign valid = valid_mult_r[0];


endmodule

◆testbench

testbench 編寫如下,主要功能就是不間斷連續的輸入 250KHz 與 7.5MHz 的正弦波混合信號數據。輸入的混合信號數據也可由 matlab 生成,具體見附錄。

`timescale 1ps/1ps

module test ;
   //input
    reg          clk ;
    reg          rst_n ;
    reg          en ;
    reg [11:0]   xin ;
    //output
    wire         valid ;
    wire [28:0]  yout ;

    parameter    SIMU_CYCLE   = 64'd2000 ;  //50MHz 采樣頻率
    parameter    SIN_DATA_NUM = 200 ;      //仿真周期


//=====================================
// 50MHz clk generating
    localparam   TCLK_HALF     = 10_000;
    initial begin
        clk = 1'b0 ;
        forever begin
            # TCLK_HALF ;
            clk = ~clk ;
        end
    end

//============================
//  reset and finish
    initial begin
        rst_n = 1'b0 ;
        # 30   rst_n = 1'b1 ;
        # (TCLK_HALF * 2 * SIMU_CYCLE) ;
        $finish ;
    end

//=======================================
// read signal data into register
    reg          [11:0] stimulus [0: SIN_DATA_NUM-1] ;
    integer      i ;
    initial begin
        $readmemh("../tb/cosx0p25m7p5m12bit.txt", stimulus) ;
        i = 0 ;
        en = 0 ;
        xin = 0 ;
        # 200 ;
        forever begin
            @(negedge clk) begin
                en          = 1'b1 ;
                xin         = stimulus[i] ;
                if (i == SIN_DATA_NUM-1) begin  //周期送入數據控制
                    i = 0 ;
                end
                else begin
                    i = i + 1 ;
                end
            end
        end 
    end 

    fir_guide u_fir_paral (
      .xin         (xin),
      .clk         (clk),
      .en          (en),
      .rstn        (rst_n),
      .valid       (valid),
      .yout        (yout));


endmodule

◆仿真結果

由下圖仿真結果可知,經過 FIR 濾波器后的信號只有一種低頻率信號(250KHz),高頻信號(7.5MHz)被濾除了。而且輸出波形是連續的,能夠持續輸出。

但是,如紅圈所示,波形起始部分呈不規則狀態,對此進行放大。

圖片

波形起始端放大后如下圖所示,可見不規則波形的時間段,即兩根豎線之間的時間間隔是16 個時鐘周期。

因為數據是串行輸入,設計中使用了 16 組延時寄存器,所以濾波后的第一個正常點應該較第一個濾波數據輸出時刻延遲 16 個時鐘周期。即數據輸出有效信號 valid 應該再延遲 16 個時鐘周期,則會使輸出波形更加完美。

圖片

附錄:matlab 使用

◆生成 FIR 濾波器系數

打開 matlab,在命令窗口輸入命令: fdatool。

然后會打開如下窗口,按照 FIR 濾波器參數進行設置。

這里選擇的 FIR 實現方法是最小二乘法(Least-squares),不同的實現方式濾波效果也不同。

圖片

點擊 File -> Export

將濾波器參數輸出,存到變量 coef 中,如下圖所示。

圖片

此時 coef 變量應該是浮點型數據。對其進行一定倍數的相乘擴大,然后取其近似的定點型數據作為設計中的 FIR 濾波器參數。這里取擴大倍數為 2048,結果如下所示。

圖片

◆生成輸入的混合信號

利用 matlab 生成混合的輸入信號參考代碼如下。

信號為無符號定點型數據,位寬寬度為 12bit,存于文件 'cosx0p25m7p5m12bit.txt' 。

clear all;close all;clc;
%=======================================================
% generating a cos wave data with txt hex format
%=======================================================


fc          = 0.25e6 ;      % 中心頻率
fn          = 7.5e6 ;       % 雜波頻率
Fs          = 50e6 ;        % 采樣頻率
T           = 1/fc ;        % 信號周期
Num         = Fs * T ;      % 周期內信號采樣點數
t           = (0:Num-1)/Fs ;      % 離散時間
cosx        = cos(2*pi*fc*t) ;    % 中心頻率正弦信號
cosn        = cos(2*pi*fn*t) ;    % 雜波信號
cosy        = mapminmax(cosx + cosn) ;     %幅值擴展到(-1,1) 之間
cosy_dig    = floor((2^11-1) * cosy + 2^11) ;     %幅值擴展到 0~4095
fid         = fopen('cosx0p25m7p5m12bit.txt', 'wt') ;  %寫數據文件
fprintf(fid, '%x\\n', cosy_dig) ;
fclose(fid) ;

%時域波形
figure(1);
subplot(121);plot(t,cosx);hold on ;
plot(t,cosn) ;
subplot(122);plot(t,cosy_dig) ;

%頻域波形
fft_cosy    = fftshift(fft(cosy, Num)) ;
f_axis      = (-Num/2 : Num/2 - 1) * (Fs/Num) ;
figure(5) ;
plot(f_axis, abs(fft_cosy)) ;
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 濾波器
    +關注

    關注

    162

    文章

    8076

    瀏覽量

    181051
  • 寄存器
    +關注

    關注

    31

    文章

    5421

    瀏覽量

    123370
  • FIR
    FIR
    +關注

    關注

    4

    文章

    151

    瀏覽量

    34044
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    DSP in FPGA:FIR濾波器(一)

    FIR 濾波器廣泛應用于數字信號處理中,主要功能就是將不感興趣的信號濾除,留下有用信號。##全并行FIR濾波器結構
    發表于 06-27 10:02 ?1w次閱讀

    matlab與FPGA數字信號處理系列 Verilog 實現并行 FIR 濾波器

    在 FPGA 實現 FIR 濾波器時,最常用的是直接型結構,簡單方便,在實現直接型結構時,可以選擇串行結構/并行結構/分布式結構。 并行結構即并行
    發表于 05-24 07:48

    并行FIR濾波器Verilog設計

    本文將簡單介紹FIR濾波器的原理,詳細介紹使用Verilog HDL設計并行FIR濾波器的流程和
    發表于 09-25 17:44

    FIR并行濾波器設計

    FIR并行濾波器設計 數字濾波器可以濾除多余的噪聲,擴展信號頻帶,完成信號預調,改變信號的特定頻譜分量,從而得到預期的結果。數字濾波器在D
    發表于 01-16 09:47 ?1543次閱讀
    <b class='flag-5'>FIR</b><b class='flag-5'>并行</b><b class='flag-5'>濾波器</b>設計

    基于流水線技術的并行高效FIR濾波器設計

    基于流水線技術的并行高效FIR濾波器設計 基于流水線技術,利用FPGA進行并行可重復配置高精度的FIR
    發表于 03-28 15:12 ?891次閱讀
    基于流水線技術的<b class='flag-5'>并行</b>高效<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>設計

    基于流水線的并行FIR濾波器設計

    基于流水線技術,利用FPGA進行并行可重復配置高精度的 FIR濾波器 設計。使用VHDL可以很方便地改變濾波器的系數和階數。在DSP中采用這種FIR
    發表于 07-18 17:09 ?63次下載
    基于流水線的<b class='flag-5'>并行</b><b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>設計

    基于位并行DA結構的高速FIR濾波器

    基于位并行DA結構的高速FIR濾波器_周云
    發表于 01-07 21:39 ?4次下載

    基于FPGA的橫向FIR濾波器設計詳解

    在理論的基礎上詳細闡述了如何基于Verilog HDL搭建的數字電路,來完成來完成FIR橫向濾波器的設計。
    的頭像 發表于 07-08 08:33 ?6190次閱讀

    如何使用FPGA實現實現高速并行FIR濾波器

    提出了一種基于多相濾波器并行有限脈沖響應(finite impulse response,FIR濾波器結構,可以有效提高濾波器運算的吞吐
    發表于 01-28 17:22 ?15次下載
    如何使用FPGA實現實現高速<b class='flag-5'>并行</b><b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>

    如何使用FPGA實現實現高速并行FIR濾波器

    提出了一種基于多相濾波器并行有限脈沖響應(finite impulse response,FIR濾波器結構,可以有效提高濾波器運算的吞吐
    發表于 01-28 17:22 ?7次下載
    如何使用FPGA實現實現高速<b class='flag-5'>并行</b><b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>

    Verilog并行FIR濾波器設計

    FIR(Finite Impulse Response)濾波器是一種有限長單位沖激響應濾波器,又稱為非遞歸型濾波器。FIR
    的頭像 發表于 03-27 11:33 ?1171次閱讀
    <b class='flag-5'>Verilog</b><b class='flag-5'>并行</b><b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>設計

    Verilog串行FIR濾波器設計

    設計參數不變,與并行 FIR 濾波器參數一致。即,輸入頻率為 7.5 MHz 和 250 KHz 的正弦波混合信號,經過 FIR 濾波器后,
    的頭像 發表于 03-27 11:36 ?1110次閱讀
    <b class='flag-5'>Verilog</b>串行<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>設計

    并行FIR濾波器MATLAB與FPGA實現

    本文介紹了設計濾波器的FPGA實現步驟,并結合杜勇老師的書籍中的并行FIR濾波器部分進行一步步實現硬件設計,對書中的架構做了復現以及解讀,并進行了仿真驗證。
    的頭像 發表于 05-24 10:57 ?1410次閱讀
    <b class='flag-5'>并行</b><b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>MATLAB與FPGA實現

    Verilog串行FIR濾波器設計

    設計參數不變,與并行 FIR 濾波器參數一致。即,輸入頻率為 7.5 MHz 和 250 KHz 的正弦波混合信號,經過 FIR 濾波器后,
    的頭像 發表于 06-01 11:08 ?1130次閱讀
    <b class='flag-5'>Verilog</b>串行<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>設計

    FPGA的數字信號處理:Verilog實現簡單的FIR濾波器

    該項目介紹了如何使用 Verilog 實現具有預生成系數的簡單 FIR 濾波器
    的頭像 發表于 06-07 14:51 ?4063次閱讀
    FPGA的數字信號處理:<b class='flag-5'>Verilog</b>實現簡單的<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>
    主站蜘蛛池模板: 女人张开腿给人桶免费视频 | 久久婷婷色 | 色爱综合区五月小说 | 艹逼视频免费看 | 网站国产 | 狼色视频在线观免费观看 | 欧美成人性色xxxxx视频大 | 五月天丁香花婷婷 | 午夜a级毛片| 亚洲视频一二三 | 特级毛片免费视频播放 | 色视频在线观看完整免费版 | 五月天天爱 | 狠狠色噜狠狠狠狠色综合久 | 日本三级欧美三级香港黄 | 欧美大全 | 在线小毛片 | 国产亚洲3p无码一区二区 | 大象焦伊人久久综合网色视 | 三级精品 | 天天操天天操天天射 | 高h上错人1v1 | 经典三级一区二区三区视频 | 4455四色永久免费 | 国内色综合精品视频在线 | 午夜在线观看免费高清在线播放 | 亚洲aaa视频 | 成在线人永久免费播放视频 | 四虎影院在线看 | 国产超爽人人爽人人做 | 在线天堂网 | 天天爱天天做色综合 | 亚洲激情四射 | 国产精品免费拍拍拍 | 黄色18网站 | 综合五月| 亚欧成人中文字幕一区 | 成人免费淫片95视频观看网站 | 中文一级黄色片 | 日本高免费观看在线播放 | 一二三区电影 |