数字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