国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

FPGA 的 DSP:Verilog 中的簡(jiǎn)單 FIR 濾波器

這篇具有很好參考價(jià)值的文章主要介紹了FPGA 的 DSP:Verilog 中的簡(jiǎn)單 FIR 濾波器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本項(xiàng)目介紹如何用 Verilog 實(shí)現(xiàn)一個(gè)帶有預(yù)生成系數(shù)的簡(jiǎn)單 FIR 濾波器。

fir濾波器verilog,FPGA,fpga開發(fā)

Things used in this project 、

fir濾波器verilog,FPGA,fpga開發(fā)

Story

簡(jiǎn)陋的 FIR 濾波器是 FPGA 數(shù)字信號(hào)處理中最基本的構(gòu)建模塊之一,因此了解如何利用給定的抽頭數(shù)和相應(yīng)的系數(shù)值組裝一個(gè)基本模塊非常重要。因此,在這個(gè)關(guān)于在 FPGA 上入門 DSP 基礎(chǔ)知識(shí)的實(shí)用方法迷你系列中,我將從一個(gè)簡(jiǎn)單的 15 抽頭低通濾波器 FIR 開始,先在 Matlab 中生成初始系數(shù)值,然后將這些數(shù)值轉(zhuǎn)換為 Verilog 模塊中的使用值。

有限脈沖響應(yīng)或 FIR 濾波器的定義是,濾波器的脈沖響應(yīng)在一定時(shí)間內(nèi)趨于零值,因此它是有限的。脈沖響應(yīng)歸零所需的時(shí)間與濾波器的階(抽頭數(shù))直接相關(guān),而階(抽頭數(shù))就是 FIR 底部傳遞函數(shù)多項(xiàng)式的階數(shù)。FIR 的傳遞函數(shù)不包含反饋,因此如果輸入一個(gè)值為 1 的脈沖,然后是一堆零值,那么輸出將只是濾波器的系數(shù)值。

任何濾波器的作用都是對(duì)信號(hào)進(jìn)行調(diào)節(jié),主要側(cè)重于選擇濾除或允許哪些頻率通過。最簡(jiǎn)單的例子之一就是低通濾波器,它允許低于某一閾值(截止頻率)的頻率通過,同時(shí)大大衰減高于該閾值的頻率,如下圖所示。

fir濾波器verilog,FPGA,fpga開發(fā)
本項(xiàng)目的主要重點(diǎn)是在 HDL(特別是 Verilog,但其概念可以很容易地轉(zhuǎn)換為 VHDL)中實(shí)現(xiàn) FIR,可將其分解為三個(gè)主要邏輯組件:將每個(gè)采樣時(shí)鐘送入的循環(huán)緩沖器,該緩沖器可適當(dāng)考慮串行輸入的延遲;每個(gè)抽頭系數(shù)值的乘法器;以及每個(gè)抽頭輸出相加結(jié)果的累加器寄存器。

fir濾波器verilog,FPGA,fpga開發(fā)
由于我的重點(diǎn)是 FPGA 邏輯中的 FIR 機(jī)制,因此我只是使用 Simulink 和 Matlab 中的 FDA 工具為低通濾波器插入一些簡(jiǎn)單的參數(shù),然后使用生成的系數(shù)值為 Verilog 模塊計(jì)算適當(dāng)?shù)募拇嫫髦担ㄉ院笸瓿桑?/p>

fir濾波器verilog,FPGA,fpga開發(fā)
我選擇實(shí)施一個(gè)簡(jiǎn)單的 15 抽頭低通濾波器 FIR,采樣頻率為 1Ms/s,通帶頻率為 200 kHz,截止頻率為 355kHz,從而得到以下系數(shù):

fir濾波器verilog,FPGA,fpga開發(fā)

Create Design File for FIR Module

在新的 Vivado 項(xiàng)目中從頭開始,使用流程導(dǎo)航器窗口中的添加源選項(xiàng)為 FIR 模塊創(chuàng)建新的設(shè)計(jì)源。
fir濾波器verilog,FPGA,fpga開發(fā)

在確定了 FIR 的階數(shù)(抽頭數(shù))和系數(shù)值之后,下一組必須定義的參數(shù)是輸入采樣、輸出采樣和系數(shù)本身的位寬。

對(duì)于這個(gè) FIR,我選擇將輸入采樣和系數(shù)寄存器設(shè)置為 16 位寬,輸出采樣寄存器設(shè)置為 32 位寬,因?yàn)閮蓚€(gè) 16 位值的乘積是一個(gè) 32 位值(兩個(gè)值相乘的寬度相加得出乘積的寬度,因此如果我選擇 16 位輸入采樣和 8 位抽頭,那么輸出采樣的寬度將是 24 位)。

這些值也都是帶符號(hào)的,因此 MSB 被用作符號(hào)位,其余較低的位數(shù)則是值必須包含的位數(shù)(在選擇輸入采樣寄存器的初始寬度時(shí)務(wù)必牢記這一點(diǎn))。要在 Verilog 中將這些值設(shè)置為有符號(hào)數(shù)據(jù)類型,需要使用關(guān)鍵字 signed:

reg signed [15:0] register_name;

接下來要解決的問題是如何在 Verilog 中處理系數(shù)值,需要將十進(jìn)制點(diǎn)值轉(zhuǎn)換為定點(diǎn)值。由于所有的系數(shù)值都小于 1,因此寄存器的全部 15 位(總共 16 位中的 MSB 為帶符號(hào)位)都可以用于小數(shù)位。通常,你必須決定寄存器中的整數(shù)部分和小數(shù)部分各占多少位。因此,轉(zhuǎn)換小數(shù)抽頭的數(shù)學(xué)方法是:(小數(shù)系數(shù)值)*(2^(15)),如果系數(shù)值為負(fù)數(shù),該乘積的任何十進(jìn)制值都將被四舍五入,并計(jì)算該值的兩位數(shù):

fir濾波器verilog,FPGA,fpga開發(fā)
現(xiàn)在,我們終于可以專注于 FIR 模塊的邏輯了,首先是循環(huán)緩沖器,它引入串行輸入采樣流,并為濾波器的 15 個(gè)抽頭創(chuàng)建一個(gè)包含 15 個(gè)輸入采樣的數(shù)組。

    always @ (posedge clk)
        begin
            if(enable_buff == 1'b1)
                begin
                    buff0 <= in_sample;
                    buff1 <= buff0;        
                    buff2 <= buff1;         
                    buff3 <= buff2;      
                    buff4 <= buff3;      
                    buff5 <= buff4;       
                    buff6 <= buff5;    
                    buff7 <= buff6;       
                    buff8 <= buff7;       
                    buff9 <= buff8;       
                    buff10 <= buff9;        
                    buff11 <= buff10;       
                    buff12 <= buff11;       
                    buff13 <= buff12;       
                    buff14 <= buff13;    
                end
        end

接下來,乘法階段將每個(gè)樣本乘以每個(gè)系數(shù)值:

always @ (posedge clk)
        begin
            if (enable_fir == 1'b1)
                begin
                    acc0 <= tap0 * buff0;
                    acc1 <= tap1 * buff1;
                    acc2 <= tap2 * buff2;
                    acc3 <= tap3 * buff3;
                    acc4 <= tap4 * buff4;
                    acc5 <= tap5 * buff5;
                    acc6 <= tap6 * buff6;
                    acc7 <= tap7 * buff7;
                    acc8 <= tap8 * buff8;
                    acc9 <= tap9 * buff9;
                    acc10 <= tap10 * buff10;
                    acc11 <= tap11 * buff11;
                    acc12 <= tap12 * buff12;
                    acc13 <= tap13 * buff13;
                    acc14 <= tap14 * buff14;
                end
        end 

乘法階段的結(jié)果值通過加法累積到寄存器中,最終成為濾波器的輸出數(shù)據(jù)流。

 /* Accumulate stage of FIR */   
    always @ (posedge clk) 
        begin
            if (enable_fir == 1'b1)
                begin
                    m_axis_fir_tdata <= acc0 + acc1 + acc2 + acc3 + acc4 + acc5 + acc6 + acc7 + acc8 + acc9 + acc10 + acc11 + acc12 + acc13 + acc14;
                end
        end 

最后,邏輯的最后一部分是 FIR 模塊的數(shù)據(jù)流接口。AXI 流接口是最常見的接口之一,因此我選擇了它來實(shí)現(xiàn)。其關(guān)鍵在于有效信號(hào)和就緒信號(hào),這兩個(gè)信號(hào)可以控制上下游設(shè)備之間的數(shù)據(jù)流。這意味著 FIR 模塊需要向其下游設(shè)備提供一個(gè)有效信號(hào),以表明其輸出為有效數(shù)據(jù),同時(shí)在下游設(shè)備取消就緒信號(hào)時(shí),能夠暫停(但仍保留)其輸出。FIR 模塊還必須能夠在其主站接口上以同樣的方式與上游設(shè)備進(jìn)行通信。

fir濾波器verilog,FPGA,fpga開發(fā)

以下是 FIR 模塊的邏輯設(shè)計(jì)概覽:
fir濾波器verilog,FPGA,fpga開發(fā)
請(qǐng)注意有效信號(hào)和就緒信號(hào)是如何設(shè)置 FIR 輸入循環(huán)緩沖器和乘法級(jí)的使能值的,以及數(shù)據(jù)或系數(shù)通過的每個(gè)寄存器是如何聲明為帶符號(hào)的。

FIR 模塊 Verilog 代碼:

`timescale 1ns / 1ps

module FIR(
    input clk,
    input reset,
    input signed [15:0] s_axis_fir_tdata, 
    input [3:0] s_axis_fir_tkeep,
    input s_axis_fir_tlast,
    input s_axis_fir_tvalid,
    input m_axis_fir_tready,
    output reg m_axis_fir_tvalid,
    output reg s_axis_fir_tready,
    output reg m_axis_fir_tlast,
    output reg [3:0] m_axis_fir_tkeep,
    output reg signed [31:0] m_axis_fir_tdata
    );


    always @ (posedge clk)
        begin
            m_axis_fir_tkeep <= 4'hf;
        end
        
    always @ (posedge clk)
        begin
            if (s_axis_fir_tlast == 1'b1)
                begin
                    m_axis_fir_tlast <= 1'b1;
                end
            else
                begin
                    m_axis_fir_tlast <= 1'b0;
                end
        end
    
    // 15-tap FIR 
    reg enable_fir, enable_buff;
    reg [3:0] buff_cnt;
    reg signed [15:0] in_sample; 
    reg signed [15:0] buff0, buff1, buff2, buff3, buff4, buff5, buff6, buff7, buff8, buff9, buff10, buff11, buff12, buff13, buff14; 
    wire signed [15:0] tap0, tap1, tap2, tap3, tap4, tap5, tap6, tap7, tap8, tap9, tap10, tap11, tap12, tap13, tap14; 
    reg signed [31:0] acc0, acc1, acc2, acc3, acc4, acc5, acc6, acc7, acc8, acc9, acc10, acc11, acc12, acc13, acc14; 

    
    /* Taps for LPF running @ 1MSps with a cutoff freq of 400kHz*/
    assign tap0 = 16'hFC9C;  // twos(-0.0265 * 32768) = 0xFC9C
    assign tap1 = 16'h0000;  // 0
    assign tap2 = 16'h05A5;  // 0.0441 * 32768 = 1445.0688 = 1445 = 0x05A5
    assign tap3 = 16'h0000;  // 0
    assign tap4 = 16'hF40C;  // twos(-0.0934 * 32768) = 0xF40C
    assign tap5 = 16'h0000;  // 0
    assign tap6 = 16'h282D;  // 0.3139 * 32768 = 10285.8752 = 10285 = 0x282D
    assign tap7 = 16'h4000;  // 0.5000 * 32768 = 16384 = 0x4000
    assign tap8 = 16'h282D;  // 0.3139 * 32768 = 10285.8752 = 10285 = 0x282D
    assign tap9 = 16'h0000;  // 0
    assign tap10 = 16'hF40C; // twos(-0.0934 * 32768) = 0xF40C
    assign tap11 = 16'h0000; // 0
    assign tap12 = 16'h05A5; // 0.0441 * 32768 = 1445.0688 = 1445 = 0x05A5
    assign tap13 = 16'h0000; // 0
    assign tap14 = 16'hFC9C; // twos(-0.0265 * 32768) = 0xFC9C
    
    /* This loop sets the tvalid flag on the output of the FIR high once 
     * the circular buffer has been filled with input samples for the 
     * first time after a reset condition. */
    always @ (posedge clk or negedge reset)
        begin
            if (reset == 1'b0) //if (reset == 1'b0 || tvalid_in == 1'b0)
                begin
                    buff_cnt <= 4'd0;
                    enable_fir <= 1'b0;
                    in_sample <= 8'd0;
                end
            else if (m_axis_fir_tready == 1'b0 || s_axis_fir_tvalid == 1'b0)
                begin
                    enable_fir <= 1'b0;
                    buff_cnt <= 4'd15;
                    in_sample <= in_sample;
                end
            else if (buff_cnt == 4'd15)
                begin
                    buff_cnt <= 4'd0;
                    enable_fir <= 1'b1;
                    in_sample <= s_axis_fir_tdata;
                end
            else
                begin
                    buff_cnt <= buff_cnt + 1;
                    in_sample <= s_axis_fir_tdata;
                end
        end   

    always @ (posedge clk)
        begin
            if(reset == 1'b0 || m_axis_fir_tready == 1'b0 || s_axis_fir_tvalid == 1'b0)
                begin
                    s_axis_fir_tready <= 1'b0;
                    m_axis_fir_tvalid <= 1'b0;
                    enable_buff <= 1'b0;
                end
            else
                begin
                    s_axis_fir_tready <= 1'b1;
                    m_axis_fir_tvalid <= 1'b1;
                    enable_buff <= 1'b1;
                end
        end
    
    /* Circular buffer bring in a serial input sample stream that 
     * creates an array of 15 input samples for the 15 taps of the filter. */
    always @ (posedge clk)
        begin
            if(enable_buff == 1'b1)
                begin
                    buff0 <= in_sample;
                    buff1 <= buff0;        
                    buff2 <= buff1;         
                    buff3 <= buff2;      
                    buff4 <= buff3;      
                    buff5 <= buff4;       
                    buff6 <= buff5;    
                    buff7 <= buff6;       
                    buff8 <= buff7;       
                    buff9 <= buff8;       
                    buff10 <= buff9;        
                    buff11 <= buff10;       
                    buff12 <= buff11;       
                    buff13 <= buff12;       
                    buff14 <= buff13;    
                end
            else
                begin
                    buff0 <= buff0;
                    buff1 <= buff1;        
                    buff2 <= buff2;         
                    buff3 <= buff3;      
                    buff4 <= buff4;      
                    buff5 <= buff5;       
                    buff6 <= buff6;    
                    buff7 <= buff7;       
                    buff8 <= buff8;       
                    buff9 <= buff9;       
                    buff10 <= buff10;        
                    buff11 <= buff11;       
                    buff12 <= buff12;       
                    buff13 <= buff13;       
                    buff14 <= buff14;
                end
        end
        
    /* Multiply stage of FIR */
    always @ (posedge clk)
        begin
            if (enable_fir == 1'b1)
                begin
                    acc0 <= tap0 * buff0;
                    acc1 <= tap1 * buff1;
                    acc2 <= tap2 * buff2;
                    acc3 <= tap3 * buff3;
                    acc4 <= tap4 * buff4;
                    acc5 <= tap5 * buff5;
                    acc6 <= tap6 * buff6;
                    acc7 <= tap7 * buff7;
                    acc8 <= tap8 * buff8;
                    acc9 <= tap9 * buff9;
                    acc10 <= tap10 * buff10;
                    acc11 <= tap11 * buff11;
                    acc12 <= tap12 * buff12;
                    acc13 <= tap13 * buff13;
                    acc14 <= tap14 * buff14;
                end
        end    
        
     /* Accumulate stage of FIR */   
    always @ (posedge clk) 
        begin
            if (enable_fir == 1'b1)
                begin
                    m_axis_fir_tdata <= acc0 + acc1 + acc2 + acc3 + acc4 + acc5 + acc6 + acc7 + acc8 + acc9 + acc10 + acc11 + acc12 + acc13 + acc14;
                end
        end     

    
    
endmodule

Create a Simulation Source for its Testbench

要測(cè)試 FIR 模塊,需要?jiǎng)?chuàng)建一個(gè)測(cè)試平臺(tái)作為新的模擬源:
fir濾波器verilog,FPGA,fpga開發(fā)
在 FIR 模塊中需要測(cè)試兩個(gè)主要部分:濾波器數(shù)學(xué)和 AXI 流接口。為此,我在測(cè)試臺(tái)中創(chuàng)建了一個(gè)狀態(tài)機(jī),用于生成一個(gè)簡(jiǎn)單的 200kHz 正弦波,同時(shí)切換 FIR 接口從屬側(cè)的有效信號(hào)和主控側(cè)的就緒信號(hào)。

Testbench for FIR module:

`timescale 1ns / 1ps

module tb_FIR;

    reg clk, reset, s_axis_fir_tvalid, m_axis_fir_tready;
    reg signed [15:0] s_axis_fir_tdata;
    wire m_axis_fir_tvalid;
    wire [3:0] m_axis_fir_tkeep;
    wire [31:0] m_axis_fir_tdata;
    
    /*
     * 100Mhz (10ns) clock 
     */
    always begin
        clk = 1; #5;
        clk = 0; #5;
    end
    
    always begin
        reset = 1; #20;
        reset = 0; #50;
        reset = 1; #1000000;
    end
    
    always begin
        s_axis_fir_tvalid = 0; #100;
        s_axis_fir_tvalid = 1; #1000;
        s_axis_fir_tvalid = 0; #50;
        s_axis_fir_tvalid = 1; #998920;
    end
    
    always begin
        m_axis_fir_tready = 1; #1500;
        m_axis_fir_tready = 0; #100;
        m_axis_fir_tready = 1; #998400;
    end
    
    /* Instantiate FIR module to test. */
    FIR FIR_i(
        .clk(clk),
        .reset(reset),
        .s_axis_fir_tdata(s_axis_fir_tdata),   
        .s_axis_fir_tkeep(s_axis_fir_tkeep),   
        .s_axis_fir_tlast(s_axis_fir_tlast),   
        .s_axis_fir_tvalid(s_axis_fir_tvalid), 
        .m_axis_fir_tready(m_axis_fir_tready),
        .m_axis_fir_tvalid(m_axis_fir_tvalid), 
        .s_axis_fir_tready(s_axis_fir_tready), 
        .m_axis_fir_tlast(m_axis_fir_tlast),   
        .m_axis_fir_tkeep(m_axis_fir_tkeep),   
        .m_axis_fir_tdata(m_axis_fir_tdata));  
        
    reg [4:0] state_reg;
    reg [3:0] cntr;
    
    parameter wvfm_period = 4'd4;
    
    parameter init               = 5'd0;
    parameter sendSample0        = 5'd1;
    parameter sendSample1        = 5'd2;
    parameter sendSample2        = 5'd3;
    parameter sendSample3        = 5'd4;
    parameter sendSample4        = 5'd5;
    parameter sendSample5        = 5'd6;
    parameter sendSample6        = 5'd7;
    parameter sendSample7        = 5'd8;
    
    /* This state machine generates a 200kHz sinusoid. */
    always @ (posedge clk or posedge reset)
        begin
            if (reset == 1'b0)
                begin
                    cntr <= 4'd0;
                    s_axis_fir_tdata <= 16'd0;
                    state_reg <= init;
                end
            else
                begin
                    case (state_reg)
                        init : //0
                            begin
                                cntr <= 4'd0;
                                s_axis_fir_tdata <= 16'h0000;
                                state_reg <= sendSample0;
                            end
                            
                        sendSample0 : //1
                            begin
                                s_axis_fir_tdata <= 16'h0000;
                                
                                if (cntr == wvfm_period)
                                    begin
                                        cntr <= 4'd0;
                                        state_reg <= sendSample1;
                                    end
                                else
                                    begin 
                                        cntr <= cntr + 1;
                                        state_reg <= sendSample0;
                                    end
                            end 
                        
                        sendSample1 : //2
                            begin
                                s_axis_fir_tdata <= 16'h5A7E; 
                                
                                if (cntr == wvfm_period)
                                    begin
                                        cntr <= 4'd0;
                                        state_reg <= sendSample2;
                                    end
                                else
                                    begin 
                                        cntr <= cntr + 1;
                                        state_reg <= sendSample1;
                                    end
                            end 
                        
                        sendSample2 : //3
                            begin
                                s_axis_fir_tdata <= 16'h7FFF;
                                
                                if (cntr == wvfm_period)
                                    begin
                                        cntr <= 4'd0;
                                        state_reg <= sendSample3;
                                    end
                                else
                                    begin 
                                        cntr <= cntr + 1;
                                        state_reg <= sendSample2;
                                    end
                            end 
                        
                        sendSample3 : //4
                            begin
                                s_axis_fir_tdata <= 16'h5A7E;
                                
                                if (cntr == wvfm_period)
                                    begin
                                        cntr <= 4'd0;
                                        state_reg <= sendSample4;
                                    end
                                else
                                    begin 
                                        cntr <= cntr + 1;
                                        state_reg <= sendSample3;
                                    end
                            end 
                        
                        sendSample4 : //5
                            begin
                                s_axis_fir_tdata <= 16'h0000;
                                
                                if (cntr == wvfm_period)
                                    begin
                                        cntr <= 4'd0;
                                        state_reg <= sendSample5;
                                    end
                                else
                                    begin 
                                        cntr <= cntr + 1;
                                        state_reg <= sendSample4;
                                    end
                            end 
                        
                        sendSample5 : //6
                            begin
                                s_axis_fir_tdata <= 16'hA582; 
                                
                                if (cntr == wvfm_period)
                                    begin
                                        cntr <= 4'd0;
                                        state_reg <= sendSample6;
                                    end
                                else
                                    begin 
                                        cntr <= cntr + 1;
                                        state_reg <= sendSample5;
                                    end
                            end 
                        
                        sendSample6 : //6
                            begin
                                s_axis_fir_tdata <= 16'h8000; 
                                
                                if (cntr == wvfm_period)
                                    begin
                                        cntr <= 4'd0;
                                        state_reg <= sendSample7;
                                    end
                                else
                                    begin 
                                        cntr <= cntr + 1;
                                        state_reg <= sendSample6;
                                    end
                            end 
                        
                        sendSample7 : //6
                            begin
                                s_axis_fir_tdata <= 16'hA582; 
                                
                                if (cntr == wvfm_period)
                                    begin
                                        cntr <= 4'd0;
                                        state_reg <= sendSample0;
                                    end
                                else
                                    begin 
                                        cntr <= cntr + 1;
                                        state_reg <= sendSample7;
                                    end
                            end                     
                    
                    endcase
                end
        end
    
endmodule

在 "source "窗口的模擬來源下,右擊測(cè)試平臺(tái)模塊并選擇 “Set as Top”,將其設(shè)置為頂層文件。
fir濾波器verilog,FPGA,fpga開發(fā)

Run a Behavioral Simulation

安裝好 FIR 模塊及其測(cè)試平臺(tái)后,從 Flow Navigator 窗口啟動(dòng) Vivado 中的仿真器,選擇 Run Behavioral Simulation(運(yùn)行行為仿真)選項(xiàng)(如果沒有綜合或?qū)崿F(xiàn)結(jié)果,這是唯一可用的選項(xiàng))。fir濾波器verilog,FPGA,fpga開發(fā)
正如行為仿真所顯示的那樣,F(xiàn)IR 正在對(duì)信號(hào)進(jìn)行正確的濾波,并對(duì) AXI 流信號(hào)做出正確的響應(yīng)。
fir濾波器verilog,FPGA,fpga開發(fā)
許多人可能會(huì)注意到,在使用這種特定 FIR 模塊的設(shè)計(jì)上運(yùn)行綜合和實(shí)現(xiàn),會(huì)導(dǎo)致設(shè)計(jì)無法滿足時(shí)序要求(我相信閱讀此文的經(jīng)驗(yàn)豐富的 FPGA 工程師只需查看一下 FIR 模塊的 Verilog 就能知道這一點(diǎn))。這將在 FPGA DSP 系列的下一篇文章中討論,因?yàn)樗鼮槲覀兲峁┝撕芎玫囊娊猓屛覀兞私庠跓o法滿足設(shè)置時(shí)序要求時(shí)如何重新思考設(shè)計(jì)。文章來源地址http://www.zghlxwxcb.cn/news/detail-840952.html

到了這里,關(guān)于FPGA 的 DSP:Verilog 中的簡(jiǎn)單 FIR 濾波器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Verilog 教程】7.3 Verilog 串行 FIR 濾波器設(shè)計(jì)

    【Verilog 教程】7.3 Verilog 串行 FIR 濾波器設(shè)計(jì)

    串行 FIR 濾波器設(shè)計(jì) 設(shè)計(jì)說明 設(shè)計(jì)參數(shù)不變,與并行 FIR 濾波器參數(shù)一致。即,輸入頻率為 7.5 MHz 和 250 KHz 的正弦波混合信號(hào),經(jīng)過 FIR 濾波器后,高頻信號(hào) 7.5MHz 被濾除,只保留 250KMHz 的信號(hào)。 串行設(shè)計(jì),就是在 16 個(gè)時(shí)鐘周期內(nèi)對(duì) 16 個(gè)延時(shí)數(shù)據(jù)分時(shí)依次進(jìn)行乘法、加法運(yùn)算

    2024年02月06日
    瀏覽(26)
  • FPGA設(shè)計(jì)FIR濾波器低通濾波器,代碼及視頻

    FPGA設(shè)計(jì)FIR濾波器低通濾波器,代碼及視頻

    名稱:FIR濾波器低通濾波器 軟件:Quartus 語言:Verilog/VHDL 本資源含有verilog及VHDL兩種語言設(shè)計(jì)的工程,每個(gè)工程均可實(shí)現(xiàn)以下FIR濾波器的功能。 代碼功能: 設(shè)計(jì)一個(gè)8階FIR濾波器(低通濾波器),要求截止頻率為20KHz,使用線性相位結(jié)構(gòu)。 參數(shù)設(shè)計(jì)方法: 使用matlab軟件設(shè)計(jì)濾

    2024年02月08日
    瀏覽(27)
  • FIR濾波器簡(jiǎn)述及FPGA仿真驗(yàn)證

    FIR濾波器簡(jiǎn)述及FPGA仿真驗(yàn)證

    數(shù)字濾波器的設(shè)計(jì),本項(xiàng)目做的數(shù)字濾波器準(zhǔn)確來說是FIR濾波器。 FIR濾波器(有限沖激響應(yīng)濾波器),與另一種基本類型的數(shù)字濾波器——IIR濾波器(無限沖擊響應(yīng)濾波器)相對(duì)應(yīng),其實(shí)就是將所輸入的信號(hào)都看成是離散的,用離散的沖擊信號(hào)代替實(shí)際的信號(hào)。對(duì)于FIR濾波器

    2024年02月09日
    瀏覽(21)
  • 利用FPGA實(shí)現(xiàn)全串行低通FIR濾波器

    利用FPGA實(shí)現(xiàn)全串行低通FIR濾波器

    設(shè)計(jì)一個(gè)15階(長(zhǎng)度為16)的具有線性相位低通FIR濾波器,采用布拉克曼窗函數(shù)設(shè)計(jì),截止頻率為500HZ,抽樣頻率為2000HZ;采用FPGA實(shí)現(xiàn)全串行FIR濾波器,系數(shù)的量化位數(shù)為12比特,輸入數(shù)據(jù)位數(shù)為12比特,輸出數(shù)據(jù)位數(shù)為29比特,系統(tǒng)時(shí)鐘為16KHZ 設(shè)計(jì)思路 :首先采用MATLAB根據(jù)要

    2024年02月07日
    瀏覽(25)
  • 通用FIR濾波器的verilog實(shí)現(xiàn)(內(nèi)有Lowpass、Hilbert參數(shù)生成示例)

    通用FIR濾波器的verilog實(shí)現(xiàn)(內(nèi)有Lowpass、Hilbert參數(shù)生成示例)

    ??眾所周知,Matlab 中的 Filter Designer 可以直接生成 FIR 濾波器的 verilog 代碼,可以方便地生成指定階數(shù)、指定濾波器參數(shù)的高通、低通、帶通濾波器,生成的 verilog 代碼也可以指定輸入輸出信號(hào)的類型和位寬。然而其生成的代碼實(shí)在算不上美觀,復(fù)用性也很差,要實(shí)現(xiàn)不同

    2024年02月13日
    瀏覽(24)
  • FIR內(nèi)插濾波器的FPGA實(shí)現(xiàn)(一)-matlab實(shí)現(xiàn)

    FIR內(nèi)插濾波器的FPGA實(shí)現(xiàn)(一)-matlab實(shí)現(xiàn)

    FIR內(nèi)插濾波器是一種基本的插值方法,主要有兩個(gè)步驟: 1)在輸入的每一個(gè)初始采樣中間插入L個(gè)零點(diǎn); 2)插零后的數(shù)據(jù)經(jīng)過低通濾波器。 運(yùn)行結(jié)果如圖(時(shí)域、頻域): 我們的目標(biāo)是把采樣頻率提升五十倍。 得到的頻域圖: 可以看出內(nèi)插零點(diǎn)在頻域會(huì)實(shí)現(xiàn)頻譜擴(kuò)展,因此

    2024年02月03日
    瀏覽(23)
  • FIR濾波器的FPGA實(shí)現(xiàn)【IP核實(shí)現(xiàn)版】

    FIR濾波器的FPGA實(shí)現(xiàn)【IP核實(shí)現(xiàn)版】

    本文使用FPGA來實(shí)現(xiàn)FIR濾波器設(shè)計(jì),設(shè)計(jì)中使用的DDS、乘法器與FIR濾波器均采用IP core進(jìn)行實(shí)現(xiàn),實(shí)現(xiàn)效果是將3MHz和4MHz的正弦信號(hào)混頻后使用FIR低通濾波器濾除7MHz信號(hào)得到1MHz的信號(hào)。 首先用兩個(gè)DDS核生成3MHz以及4MHz的正弦波信號(hào)。 注意:此處的dds的命名要和代碼中對(duì)應(yīng),系統(tǒng)

    2024年02月04日
    瀏覽(23)
  • 解析使用FPGA邏輯實(shí)現(xiàn)FIR濾波器的幾種架構(gòu)

    解析使用FPGA邏輯實(shí)現(xiàn)FIR濾波器的幾種架構(gòu)

    有限脈沖響應(yīng)(finite impulse response,F(xiàn)IR)數(shù)字濾波器 ????????FIR濾波器的實(shí)質(zhì)就是輸入序列與系統(tǒng)脈沖響應(yīng)的卷積,即: ????????其中,N為濾波器的階數(shù),也即抽頭數(shù);x(n)為第n個(gè)輸入序列;h(n)為FIR濾波器的第n級(jí)抽頭系數(shù)。 ????????FIR濾波器基本結(jié)構(gòu)如下: ?????

    2024年02月08日
    瀏覽(18)
  • 數(shù)字信號(hào)處理-10-并行FIR濾波器MATLAB與FPGA實(shí)現(xiàn)

    數(shù)字信號(hào)處理-10-并行FIR濾波器MATLAB與FPGA實(shí)現(xiàn)

    本文介紹了設(shè)計(jì)濾波器的FPGA實(shí)現(xiàn)步驟,并結(jié)合杜勇老師的書籍中的并行FIR濾波器部分進(jìn)行一步步實(shí)現(xiàn)硬件設(shè)計(jì),對(duì)書中的架構(gòu)做了復(fù)現(xiàn)以及解讀,并進(jìn)行了仿真驗(yàn)證。 FIR濾波器的結(jié)構(gòu)形式時(shí),介紹了直接型、級(jí)聯(lián)型、頻率取樣型和快速卷積型4種。在FPGA實(shí)現(xiàn)時(shí),最常用的是最

    2023年04月09日
    瀏覽(37)
  • 基于FPGA的FIR數(shù)字濾波器設(shè)計(jì)(quartus和vivado程序都有)。

    基于FPGA的FIR數(shù)字濾波器設(shè)計(jì)(quartus和vivado程序都有)。

    基于FPGA的FIR數(shù)字濾波器設(shè)計(jì)(quartus和vivado程序都有)。 附: 1.配套quartus從MATLAB系數(shù)生成直到仿真成功說明文檔。 2.配套仿真出波形(圖1)的視頻。 ? ? ?

    2024年02月10日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包