数字IC设计——FIR滤波器(二)(低通FIR滤波器的Verilog实现)

数字IC设计——FIR滤波器(二)(低通FIR滤波器的Verilog实现)
用Verilog实现一个3-tap低通FIR滤波器,输入输出为8bit无符号数,滤波器系数[1/4 1/2 1/4]

module fir_lpf_3tap (
input clk,
input rst_n,
input [7:0] din,
output [7:0] dout
);

endmodule

这里3-Tap就是2阶滤波器。有三个滤波系数

Tap-抽头数即为滤波系数

y(n) = h(n) * x(n) = \sum_{k=0}^{N-1}h(k)x(n-k)

x(n)是待滤波信号,h(n)滤波系数,上式卷就相当于一个先乘再累加的过程。

本设计分为三级流水线完成

  • 第一级,将输入信号延时
  • 第二级,将输入信号与滤波系数相乘
  • 第三级,将所有信号相加。
module FIR_LPF_3Tap(
    input           clk,
    input           rst_n,
    input   [7:0]   din,
    output  [7:0]   dout
);
//coeff 1/4 1/8 1/4
parameter   COEFF1 = 2;
parameter   COEFF2 = 1;
parameter   COEFF3 = 2;

//pipeline 1
reg     [7:0]   din_r1;
reg     [7:0]   din_r2;
reg     [7:0]   din_r3;
//pipeline 2
reg     [8:0]   mul_data1;
reg     [8:0]   mul_data2;
//reg     [8:0]   mul_data3;
//pipeline 3
reg     [7:0]   dout_r;


//pipeline 1
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        din_r1 <= 0;
        din_r2 <= 0;
        din_r3 <= 0;
    end
    else begin
        din_r1 <= din;
        din_r2 <= din_r1;
        din_r3 <= din_r2;
    end
end

//pipeline2 系数对称可以直接相加
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        mul_data1 <= 0;
        mul_data2 <= 0;
        //mul_data3 <= 0;
    end
    else begin
        mul_data1 <= (din_r1 + din_r3) >> COEFF1;
        mul_data2 <= din_r2 >> COEFF2;
    end
end
//pipeline3
always @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        dout_r <= 0;
    end
    else 
        dout_r <= mul_data1 + mul_data2;
end

assign  dout = dout_r;

endmodule
发布了105 篇原创文章 · 获赞 71 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/vivid117/article/details/102822449