📄 butterworth_iir_biquad.v
字号:
module butterworth_IIR_biquad (
reset,
clk,
clken,
x,
result,
feedback_fp,
feedback,
wn
);
//Parameter Declaration
//Coefficients - 10 bits
//[a,b] = butter(FilterOrder,300/500)
//[SOS,G] = tf2sos(b,a)
//SOS =
//1.0000 0.0105 -1.0104 1.0000 -0.0002 -0.9997
//1.0000 -0.0435 0.3372 1.0000 -0.0506 0.3245
//1.0000 1.4736 0.6153 1.0000 1.4279 0.5720
//1.0000 1.9564 0.9587 1.0000 1.9263 0.9291
//1.0000 -0.8166 0.4569 1.0000 -1.0525 0.9396
//G = 0.1067
parameter a1 = 0; //-0.0002
parameter a2 = -1024; //-0.9997
parameter b0 = 1024; //1.000
parameter b1 = 11; //0.0105
parameter b2 = -1035; //-1.0104
parameter INPUT_WIDTH = 18;
parameter COEF_WIDTH = 10;
parameter DLY_WIDTH = 18;
parameter OUTPUT_WIDTH = 21;
parameter FEEDBACK_WIDTH = 2 * DLY_WIDTH + 1;
parameter L_BIT = COEF_WIDTH; // low bit
parameter H_BIT = L_BIT + DLY_WIDTH - 1; // high bit
//Port Declaration
input clk;
input clken;
input reset;
input [INPUT_WIDTH-1:0] x;
output [OUTPUT_WIDTH-1:0] result;
output [FEEDBACK_WIDTH-1:0] feedback_fp;
output [DLY_WIDTH-1:0] wn, feedback;
//Wire Declaration
wire [DLY_WIDTH-1:0] coef_a1, coef_a2;
wire [DLY_WIDTH-1:0] wn;
wire [DLY_WIDTH-1:0] feedback;
wire [FEEDBACK_WIDTH-1:0] feedback_fp;
wire [DLY_WIDTH+1:0] wn_shift, wn1_shift, ff_adder1_res;
wire [DLY_WIDTH+2:0] tmp_wn_add, wn2_shift;
wire wn_shift_sb, wn1_shift_sb, wn2_shift_sb;
//Register Declaration
reg [DLY_WIDTH-1:0] ff_reg1, ff_reg2;
assign coef_a1 = -a1; // SBF 8.10
assign coef_a2 = -a2; // SBF 8.10
assign feedback = feedback_fp[H_BIT:L_BIT]; // SBF 14.4
assign wn_shift_sb = wn[DLY_WIDTH-1];
assign wn1_shift_sb = ff_reg1[DLY_WIDTH-1];
assign wn2_shift_sb = ff_reg2[DLY_WIDTH-1];
assign wn_shift = { wn_shift_sb,wn_shift_sb,wn[DLY_WIDTH-1:0] }; // SBF 16.4
assign wn1_shift = { wn1_shift_sb,wn1_shift_sb,wn1_shift_sb,wn1_shift_sb,
wn1_shift_sb,wn1_shift_sb,wn1_shift_sb,wn1_shift_sb,
wn1_shift_sb,ff_reg1[DLY_WIDTH-1:7] }; // SBF 16.4
assign tmp_wn_add = { ff_adder1_res[DLY_WIDTH+1], ff_adder1_res[DLY_WIDTH+1:0] }; // SBF 17.4
assign wn2_shift = { wn2_shift_sb, wn2_shift_sb, wn2_shift_sb, ff_reg2[DLY_WIDTH-1:0] } // SBF 17.4
+ {wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,
wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,
ff_reg2[DLY_WIDTH-1:7]}; // wn2_shift=ff_reg2*1.0104
always @ (posedge clk or posedge reset)
begin
if (reset)
begin
ff_reg1 <= 0;
ff_reg2 <= 0;
end
else if (clken)
begin
ff_reg1 <= wn;
ff_reg2 <= ff_reg1;
end
end
two_mult_add two_mult_add_inst (
.clock0 ( clk ),
.dataa_0 ( wn ),
.aclr3 ( reset ),
.datab_0 ( coef_a1 ),
.datab_1 ( coef_a2 ),
.ena0 ( clken ),
.result ( feedback_fp )
);
fb_adder fb_adder_inst (
.dataa ( x ),
.datab ( feedback ),
.result ( wn ),
.cout ( ),
.overflow ( )
);
ff_adder1 ff_adder1_inst (
.dataa ( wn_shift ),
.datab ( wn1_shift ),
.result ( ff_adder1_res ),
.cout ( ),
.overflow ( )
);
ff_adder2 ff_adder2_inst (
.dataa ( tmp_wn_add ),
.datab ( wn2_shift ),
.clock ( clk ),
.aclr ( reset ),
.clken ( clken ),
.result ( result ),
.cout ( ),
.overflow ( )
);
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -