0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FIR濾波器代碼及仿真設(shè)計

CHANBAEK ? 來源:FPGA自學(xué)筆記分享 ? 作者:FPGA自學(xué)筆記分享 ? 2023-06-02 12:36 ? 次閱讀

上文 FPGA數(shù)字信號處理之濾波器2_使用dsp48e1的fir濾波器設(shè)計完成了結(jié)構(gòu)設(shè)計:

圖片

根據(jù)這一結(jié)構(gòu),假定要設(shè)計一個滿速率的fir濾波器,濾波器系數(shù)為:[3,13,27,58,62,204,47,546,233,1465,3260,3260,1465,233,546,47,204,62,58,27,13,3],濾波器總共22個系數(shù),對稱結(jié)構(gòu),所以有效系數(shù)11個。

以輸入數(shù)據(jù)為自加數(shù)為例,根據(jù)結(jié)構(gòu)可以得到數(shù)據(jù)擺放格式如下,clk0時刻的計算公式為:(500+521)*c0+(501+520)*c1+......+(510+511)*c10;clk1時刻的計算公式為:(501+522)*c0+(502+521)*c1+......+(511+512)*c10;....

圖片

據(jù)此,設(shè)計fir代碼如下:

代碼設(shè)置三個參數(shù),數(shù)據(jù)位寬、系數(shù)個數(shù)、系數(shù)增益,其中系數(shù)個數(shù)決定代碼中乘法器的個數(shù)及代碼的處理時延,系數(shù)增益是系數(shù)給數(shù)據(jù)帶來的增益,在數(shù)據(jù)輸出的時候要通過截位截掉。

// ============================================================
// File Name: cm_fir_top
// VERSION  : V1.0
// DATA     : 2023/3/4
// Author   : FPGA干貨分享
// ============================================================
// 功能:fir濾波器代碼
// coef = 
// delay : 4+C_COEF_NUM*2
// ============================================================




`timescale 1ns/100ps
module cm_fir_top #(
    parameter                           C_DATA_WIDTH     = 16    ,
    parameter                           C_COEF_NUM       = 11    , ///有效系數(shù)個數(shù)
    parameter                           C_COEF_CUT_NUM   = 12    ) ///四舍五入使用的0.5大小
(
    input  wire                         I_sys_clk                , /// 工作時鐘 
    input  wire                         I_rst_in                 , /// 復(fù)位 
    input  wire [C_DATA_WIDTH-1:0]      I_data_in                , /// 數(shù)據(jù)輸入
    output reg  [C_DATA_WIDTH-1:0]      O_data_out                 /// 數(shù)據(jù)輸出
);


// ============================================================
// 內(nèi)部參數(shù)
// ============================================================
localparam  C_COEF_05 = 2**C_COEF_CUT_NUM ;


// ============================================================
// 變量
// ============================================================
reg     [C_DATA_WIDTH-1:0]      S_data_in[C_COEF_NUM*2-1:0] ;
wire    [17:0]                  S_coef[C_COEF_NUM-1:0]      ;
wire    [47:0]                  S_pcout[C_COEF_NUM-1:0]     ;
wire    [47:0]                  S_dsp_out[C_COEF_NUM-1:0]   ;

然后就是主代碼,使用assign給系數(shù)賦值,然后根據(jù)系數(shù)個數(shù)緩存輸入數(shù)據(jù),用于fir濾波器的卷積操作。隨后例化第一個dsp,U0_cm_dsp48e1,該濾波器作為級聯(lián)濾波器組的開頭乘法器,沒有級聯(lián)輸入,但是使用C端口作為假四舍五入預(yù)加的輸入,隨后使用generate根據(jù)濾波器系數(shù)個數(shù)生成級聯(lián)dsp組,最后將最后一級濾波器的輸出進(jìn)行截位,得到最終結(jié)果。

// ============================================================
// main code
// ============================================================
assign S_coef[0 ] =  18'd3     ;
assign S_coef[1 ] =  18'd13    ;
assign S_coef[2 ] = -18'd27   ;
assign S_coef[3 ] = -18'd58   ;
assign S_coef[4 ] =  18'd62    ;
assign S_coef[5 ] =  18'd204   ;
assign S_coef[6 ] = -18'd47   ;
assign S_coef[7 ] = -18'd546  ;
assign S_coef[8 ] = -18'd233  ;
assign S_coef[9 ] =  18'd1465  ;
assign S_coef[10] =  18'd3260  ;


always@(posedge I_sys_clk)
    S_data_in[0] <= I_data_in ;




genvar i;
generate for(i=1;i< C_COEF_NUM*2;i=i+1)
    begin
        always@(posedge I_sys_clk)
            S_data_in[i] <= S_data_in[i-1];
    end
endgenerate




cm_dsp48e1 #(
    .C_DATA_WITH_A      (C_DATA_WIDTH                   ),
    .C_DATA_WITH_B      (18                             ),
    .C_DATA_WITH_C      (32                             ),
    .C_DATA_WITH_D      (C_DATA_WIDTH                   )
)
U0_cm_dsp48e1(
    .I_CLK              (I_sys_clk                      ) , // clk
    .I_RST              (I_rst_in                       ) , // RST
    .I_A                (S_data_in[0]                   ) , // [29:0] 
    .I_B                (S_coef[0 ]                     ) , // [17:0] 
    .I_C                (C_COEF_05                      ) , // [47:0] 
    .I_D                (S_data_in[C_COEF_NUM*2-1]      ) , // [24:0] 
    .I_PCIN             (48'd0                          ) , // [47:0] 只能直連PCOUT
    .I_ALUMODE          (4'd0                           ) , // [3:0] 
    .I_INMODE           (5'b00101                       ) , // [4:0] 
    .I_OPMODE           (7'b0110101                     ) , // [6:0]  C + (A+D)*B
    .O_P                (                               ) , // [47:0]
    .O_PCOUT            (S_pcout[0]                     )   // [47:0] 只能直連PCIN
    );




genvar j;
generate for(j=1;j< C_COEF_NUM;j=j+1)
    begin


        cm_dsp48e1 #(
            .C_DATA_WITH_A      (C_DATA_WIDTH                   ),
            .C_DATA_WITH_B      (18                             ),
            .C_DATA_WITH_C      (32                             ),
            .C_DATA_WITH_D      (C_DATA_WIDTH                   )
        )
        U1_cm_dsp48e1(
            .I_CLK              (I_sys_clk                      ) , // clk
            .I_RST              (I_rst_in                       ) , // RST
            .I_A                (S_data_in[2*j]                 ) , // [29:0] 
            .I_B                (S_coef[j ]                     ) , // [17:0] 
            .I_C                (32'd0                          ) , // [47:0] 
            .I_D                (S_data_in[C_COEF_NUM*2-1]      ) , // [24:0] 
            .I_PCIN             (S_pcout[j-1]                   ) , // [47:0] 只能直連PCOUT
            .I_ALUMODE          (4'd0                           ) , // [3:0] 
            .I_INMODE           (5'b00101                       ) , // [4:0] 
            .I_OPMODE           (7'b0010101                     ) , // [6:0] PCin + (A+D)*B
            .O_P                (S_dsp_out[j]                   ) , // [47:0]
            .O_PCOUT            (S_pcout[j]                     )   // [47:0] 只能直連PCIN
            );


    end
endgenerate


always@(posedge I_sys_clk)
    O_data_out <= S_dsp_out[C_COEF_NUM-1][C_COEF_CUT_NUM+1+:C_DATA_WIDTH] ;




endmodule

仿真tb如下,可使用自加數(shù)或者單音作為輸入:

// ============================================================
// File Name: cm_fir_top
// VERSION  : V1.0
// DATA     : 2023/3/4
// Author   : FPGA干貨分享
// ============================================================
// 功能:fir濾波器代碼
// delay : 20clk
// ============================================================




`timescale 1ns/100ps
module tb_cm_fir_top ;
    parameter                           C_DATA_WIDTH     = 16    ;
    parameter                           C_COEF_NUM       = 11    ; ///有效系數(shù)個數(shù)
    parameter                           C_COEF_CUT_NUM   = 12    ; ///四舍五入使用的0.5大小


    reg                                 I_sys_clk                ; /// 工作時鐘 
    reg                                 I_rst_in                 ; /// 復(fù)位 
    reg         [C_DATA_WIDTH-1:0]      I_data_in                ; /// 數(shù)據(jù)輸入
    wire        [C_DATA_WIDTH-1:0]      O_data_out               ; /// 數(shù)據(jù)輸出,從start開始連續(xù)輸出,位寬按照最大能力輸出


    reg [31:0]      S_clk_cnt ;

initial
    begin
        I_sys_clk    = 'd1;
        I_rst_in     = 'd1;
        I_data_in    = 'd0;
        S_clk_cnt    = 'd0;

        #1000;
        I_rst_in     = 'd0;


    end

always #1 I_sys_clk = ~I_sys_clk;





always @(posedge I_sys_clk) 
    S_clk_cnt <= S_clk_cnt + 'd1;


/// 自加數(shù)
always @(posedge I_sys_clk)
    I_data_in <= I_data_in + 'd1;

///單音
// always @(posedge I_sys_clk)
    // I_data_in <= $sin(2*3.14*S_clk_cnt/512)*8192;


cm_fir_top #(
    .C_DATA_WIDTH               ( C_DATA_WIDTH          )  ,
    .C_COEF_NUM                 ( C_COEF_NUM            )  , ///有效系數(shù)個數(shù)
    .C_COEF_CUT_NUM             ( C_COEF_CUT_NUM        )  ) ///四舍五入使用的0.5大小
cm_fir_top(
    .I_sys_clk                  ( I_sys_clk             )  , /// 工作時鐘 
    .I_rst_in                   ( I_rst_in              )  , /// 復(fù)位 
    .I_data_in                  ( I_data_in             )  , /// 數(shù)據(jù)輸入
    .O_data_out                 ( O_data_out            )    /// 數(shù)據(jù)輸出,從start開始連續(xù)輸出,位寬按照最大能力輸出
);






endmodule

使用自加數(shù)仿真對數(shù)如下:

輸入輸出:

圖片

dsp輸入數(shù)據(jù)擺放:

圖片

python或者Excel計算的結(jié)果:

圖片

使用單音仿真結(jié)果如下:

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1625

    文章

    21623

    瀏覽量

    601242
  • 濾波器
    +關(guān)注

    關(guān)注

    160

    文章

    7703

    瀏覽量

    177486
  • FIR
    FIR
    +關(guān)注

    關(guān)注

    4

    文章

    146

    瀏覽量

    33071
  • 仿真設(shè)計
    +關(guān)注

    關(guān)注

    3

    文章

    95

    瀏覽量

    16787
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68236
收藏 人收藏

    評論

    相關(guān)推薦

    基于FPGA的FIR濾波器設(shè)計與實現(xiàn)

    DSPBuilder設(shè)計了一個4階FIR濾波器,并用QuartusII進(jìn)行硬件仿真,仿真結(jié)果表明設(shè)計FIR
    發(fā)表于 08-11 15:32

    fir濾波器的設(shè)計和實現(xiàn)

    使用iir濾波器相對fir濾波器可以在使用更小的階數(shù)的情況下實現(xiàn)更好的效果。實驗證明,可能20階的iir效果堪比500階左右的fir濾波器
    發(fā)表于 12-22 08:29

    FIR濾波器的軟件仿真與硬件實現(xiàn)

    FIR 數(shù)字濾波器由于具有諸多優(yōu)點,因而在數(shù)字信號處理中得到了十分廣泛的應(yīng)用。介紹了MATLAB 環(huán)境下FIR 數(shù)字濾波器的設(shè)計、仿真和基
    發(fā)表于 12-16 13:31 ?58次下載

    基于DSP的FIR數(shù)字濾波器設(shè)計與實現(xiàn)

    分析了FIR數(shù)字濾波器的基本原理,在MATLAB環(huán)境下利用窗函數(shù)設(shè)計FIR低通濾波器,實現(xiàn)了FIR低通
    發(fā)表于 12-18 15:53 ?101次下載

    什么是fir數(shù)字濾波器 什么叫FIR濾波器

    什么是fir數(shù)字濾波器 Part 1: Basics1.1 什么是FIR濾波器?FIR 濾波器
    發(fā)表于 01-16 09:42 ?1.7w次閱讀

    高效FIR濾波器的設(shè)計與仿真-基于FPGA

    高效FIR濾波器的設(shè)計與仿真-基于FPGA 摘要:該文在介紹有限沖激響應(yīng)(FIR)數(shù)字濾波器理論及常見實現(xiàn)方法的基礎(chǔ)上,提出了一種基于FP
    發(fā)表于 01-16 09:56 ?1613次閱讀
    高效<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>的設(shè)計與<b class='flag-5'>仿真</b>-基于FPGA

    基于MATLAB與FPGA的FIR濾波器設(shè)計與仿真

    數(shù)字濾波器是數(shù)字信號處理領(lǐng)域內(nèi)的重要組成部分。FIR濾波器又以其嚴(yán)格的線性相位及穩(wěn)定性高等特性被廣泛應(yīng)用。本文結(jié)合MATLAB工具軟件介紹了FIR數(shù)字
    發(fā)表于 09-25 11:34 ?120次下載
    基于MATLAB與FPGA的<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>設(shè)計與<b class='flag-5'>仿真</b>

    fir_濾波器sourc

    fir濾波器的有關(guān)資料 fir_濾波器sourc.rar
    發(fā)表于 12-14 14:12 ?24次下載

    基于MATLAB的FIR濾波器設(shè)計與濾波

    基于MATLAB的FIR濾波器設(shè)計與濾波。
    發(fā)表于 12-14 22:08 ?64次下載

    詳解FIR濾波器和IIR濾波器的區(qū)別

    數(shù)字濾波器廣泛應(yīng)用于硬件電路設(shè)計,一般分為FIR濾波器和IIR濾波器。那么FIR濾波器和IIR
    發(fā)表于 05-03 11:36 ?20次下載

    FIR濾波器的FPGA設(shè)計與實現(xiàn)

    ,結(jié)合MATLAB軟件提供的專用數(shù)字濾波器設(shè)計工具包FDATOOL,以及QuartusⅡ軟件提供的FIR核實現(xiàn)快速、便捷的設(shè)計FIR濾波器的幾個具體實驗,得出結(jié)論證實了熟練使用FDAT
    發(fā)表于 12-21 14:53 ?14次下載
    <b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>的FPGA設(shè)計與實現(xiàn)

    FPGA的FIR抽取濾波器設(shè)計詳細(xì)教程

    文介紹了FIR抽取濾波器的工作原理,重點闡述了用XC2V1000實現(xiàn)FIR抽取濾波器的方法,并給出了仿真波形和設(shè)計特點。
    發(fā)表于 04-19 11:34 ?2224次閱讀
    FPGA的<b class='flag-5'>FIR</b>抽取<b class='flag-5'>濾波器</b>設(shè)計詳細(xì)教程

    使用DSP設(shè)計和仿真FIR濾波器

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用DSP設(shè)計和仿真FIR濾波器包括了:dsp builder profile和基本設(shè)計流程和fir的設(shè)計過程及注意事項
    發(fā)表于 09-01 16:02 ?13次下載
    使用DSP設(shè)計和<b class='flag-5'>仿真</b><b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>

    FIR濾波器和IIR濾波器的區(qū)別與聯(lián)系

    1.根據(jù)沖激響應(yīng)的不同,將數(shù)字濾波器分為有限沖激響應(yīng)(FIR濾波器和無限沖激響應(yīng)(IIR)濾波器。對于FIR
    的頭像 發(fā)表于 12-30 23:45 ?3538次閱讀

    IIR濾波器FIR濾波器的區(qū)別

    數(shù)字濾波器是數(shù)字信號處理中最常用的一種技術(shù),可以對數(shù)字信號進(jìn)行濾波、降噪、增強(qiáng)等處理,其中最常見的兩種數(shù)字濾波器是IIR濾波器FIR
    的頭像 發(fā)表于 06-03 10:21 ?1.9w次閱讀