promote precision to about half LSB

This commit is contained in:
dada 2025-03-13 11:16:26 +08:00
parent 69b80e4575
commit 4a451196fd
6 changed files with 211 additions and 196 deletions

View File

@ -33,11 +33,10 @@
//-FHDR-------------------------------------------------------------------------------------------------------- //-FHDR--------------------------------------------------------------------------------------------------------
module IIR_Filter_p1 #( module IIR_Filter_p1 #(
parameter data_in_width = 16 parameter data_in_width = 16
,parameter cascade_in_width = 37
,parameter coef_width = 32 ,parameter coef_width = 32
,parameter frac_data_out_width = 20//X for in,5 ,parameter temp_var_width = cascade_in_width - 1
,parameter frac_coef_width = 31//division ,parameter data_out_width = cascade_in_width - 2
,parameter mult_o_width = 36
,parameter data_out_width = 20
) )
//H(z) = a / (1 - b*z^-1) //H(z) = a / (1 - b*z^-1)
( (
@ -45,8 +44,8 @@ module IIR_Filter_p1 #(
,input clk ,input clk
,input en ,input en
,input signed [data_in_width-1 :0] din_re // Re(x(t)) ,input signed [data_in_width-1 :0] din_re // Re(x(t))
,input signed [data_out_width-1:0] dout_r1_re // Re(y(t-1)) ,input signed [cascade_in_width-1:0] dout_r1_re // Re(y(t-1))
,input signed [data_out_width-1:0] dout_r1_im // Im(y(t-1)) ,input signed [cascade_in_width-1:0] dout_r1_im // Im(y(t-1))
,input signed [coef_width-1 :0] a_re ,input signed [coef_width-1 :0] a_re
,input signed [coef_width-1 :0] a_im ,input signed [coef_width-1 :0] a_im
,input signed [coef_width-1 :0] b_re ,input signed [coef_width-1 :0] b_re
@ -57,13 +56,13 @@ module IIR_Filter_p1 #(
); );
wire signed [mult_o_width-1 :0] x1_re; wire signed [temp_var_width-1 :0] x1_re;
wire signed [mult_o_width-1 :0] x1_im; wire signed [temp_var_width-1 :0] x1_im;
wire signed [mult_o_width-1 :0] y1_re; wire signed [temp_var_width-1 :0] y1_re;
wire signed [mult_o_width-1 :0] y1_im; wire signed [temp_var_width-1 :0] y1_im;
wire signed [mult_o_width :0] y_re; wire signed [temp_var_width :0] y_re;
wire signed [mult_o_width :0] y_im; wire signed [temp_var_width :0] y_im;
wire signed [data_out_width-1:0] y_re_trunc; wire signed [data_out_width-1:0] y_re_trunc;
wire signed [data_out_width-1:0] y_im_trunc; wire signed [data_out_width-1:0] y_im_trunc;
@ -75,7 +74,7 @@ mult_x
.A_width (data_in_width ) .A_width (data_in_width )
,.C_width (coef_width ) ,.C_width (coef_width )
,.D_width (coef_width ) ,.D_width (coef_width )
,.o_width (mult_o_width ) ,.o_width (temp_var_width )
) )
inst_c1 ( inst_c1 (
.clk (clk ), .clk (clk ),
@ -93,11 +92,11 @@ inst_c1 (
// y = y1+x1 = a*x(t-8)+b*y(t-9) = y(t-8) // y = y1+x1 = a*x(t-8)+b*y(t-9) = y(t-8)
mult_C mult_C
#( #(
.A_width (data_out_width ) .A_width (cascade_in_width )
,.B_width (data_out_width ) ,.B_width (cascade_in_width )
,.C_width (coef_width ) ,.C_width (coef_width )
,.D_width (coef_width ) ,.D_width (coef_width )
,.o_width (mult_o_width ) ,.o_width (temp_var_width )
) )
inst_c3 ( inst_c3 (
.clk (clk ), .clk (clk ),
@ -117,14 +116,14 @@ assign y_im = x1_im + y1_im;
// dout = round(y) delay M = round(y(t-16)) // dout = round(y) delay M = round(y(t-16))
trunc #( trunc #(
.diw (mult_o_width+1 ) .diw (temp_var_width+1 )
,.msb (mult_o_width-1 ) ,.msb (temp_var_width-1 )
,.lsb (mult_o_width-data_out_width ) ,.lsb (temp_var_width-data_out_width )
) round_u1 (clk, rstn, en, y_re, y_re_trunc); ) round_u1 (clk, rstn, en, y_re, y_re_trunc);
trunc #( trunc #(
.diw (mult_o_width+1 ) .diw (temp_var_width+1 )
,.msb (mult_o_width-1 ) ,.msb (temp_var_width-1 )
,.lsb (mult_o_width-data_out_width ) ,.lsb (temp_var_width-data_out_width )
) round_u2 (clk, rstn, en, y_im, y_im_trunc); ) round_u2 (clk, rstn, en, y_im, y_im_trunc);
assign dout_re = y_re_trunc; assign dout_re = y_re_trunc;

View File

@ -36,8 +36,8 @@ module IIR_Filter_p8 #(
,parameter coef_width = 32 ,parameter coef_width = 32
,parameter frac_data_out_width = 20//X for in,5 ,parameter frac_data_out_width = 20//X for in,5
,parameter frac_coef_width = 31//division ,parameter frac_coef_width = 31//division
,parameter mult_o_width = 36 ,parameter temp_var_width = 42
,parameter data_out_width = 20 ,parameter data_out_width = 37
) )
// H(z) = a(1 + b*z^-1 + b^2*z^-2 + b^3*z^-3 + b^4*z^-4 + b^5*z^-5 + b^6*z^-6 + b^7*z^-7) / (1 - b^8*z^-8) // H(z) = a(1 + b*z^-1 + b^2*z^-2 + b^3*z^-3 + b^4*z^-4 + b^5*z^-5 + b^6*z^-6 + b^7*z^-7) / (1 - b^8*z^-8)
( (
@ -80,18 +80,18 @@ wire signed [data_in_width-1 :0] dinp [7:0] = {dinp7 , dinp6 , dinp5
wire signed [coef_width-1 :0] ab_pow_re [7:0] = {ab_pow7_re, ab_pow6_re, ab_pow5_re ,ab_pow4_re, ab_pow3_re, abb_re, ab_re, a_re }; wire signed [coef_width-1 :0] ab_pow_re [7:0] = {ab_pow7_re, ab_pow6_re, ab_pow5_re ,ab_pow4_re, ab_pow3_re, abb_re, ab_re, a_re };
wire signed [coef_width-1 :0] ab_pow_im [7:0] = {ab_pow7_im, ab_pow6_im, ab_pow5_im ,ab_pow4_im, ab_pow3_im, abb_im, ab_im, a_im }; wire signed [coef_width-1 :0] ab_pow_im [7:0] = {ab_pow7_im, ab_pow6_im, ab_pow5_im ,ab_pow4_im, ab_pow3_im, abb_im, ab_im, a_im };
wire signed [mult_o_width-1 :0] x_re [0:7]; wire signed [temp_var_width-1 :0] x_re [0:7];
wire signed [mult_o_width-1 :0] x_im [0:7]; wire signed [temp_var_width-1 :0] x_im [0:7];
wire signed [mult_o_width+3 :0] v_re; wire signed [temp_var_width+3 :0] v_re;
wire signed [mult_o_width+3 :0] v_im; wire signed [temp_var_width+3 :0] v_im;
reg signed [mult_o_width+3 :0] v1_re; reg signed [temp_var_width+3 :0] v1_re;
reg signed [mult_o_width+3 :0] v1_im; reg signed [temp_var_width+3 :0] v1_im;
wire signed [mult_o_width+3 :0] y_re; wire signed [temp_var_width+3 :0] y_re;
wire signed [mult_o_width+3 :0] y_im; wire signed [temp_var_width+3 :0] y_im;
reg signed [mult_o_width+3 :0] y1_re; reg signed [temp_var_width+3 :0] y1_re;
reg signed [mult_o_width+3 :0] y1_im; reg signed [temp_var_width+3 :0] y1_im;
wire signed [data_out_width-1:0] y_re_trunc; wire signed [data_out_width-1:0] y_re_trunc;
wire signed [data_out_width-1:0] y_im_trunc; wire signed [data_out_width-1:0] y_im_trunc;
@ -111,7 +111,7 @@ generate
.A_width (data_in_width ), .A_width (data_in_width ),
.C_width (coef_width ), .C_width (coef_width ),
.D_width (coef_width ), .D_width (coef_width ),
.o_width (mult_o_width ) .o_width (temp_var_width )
) inst_c ( ) inst_c (
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
@ -152,11 +152,11 @@ always @(posedge clk or negedge rstn)
// y = v1 + y1 = sum_{i=0,1,...,7}{a*b^i*x(8n-i)} + b^8*y(8n-8) = y(8n) // y = v1 + y1 = sum_{i=0,1,...,7}{a*b^i*x(8n-i)} + b^8*y(8n-8) = y(8n)
mult_C mult_C
#( #(
.A_width (mult_o_width+4 ) .A_width (temp_var_width+4 )
,.B_width (mult_o_width+4 ) ,.B_width (temp_var_width+4 )
,.C_width (coef_width ) ,.C_width (coef_width )
,.D_width (coef_width ) ,.D_width (coef_width )
,.o_width (mult_o_width+4 ) ,.o_width (temp_var_width+4 )
) )
inst_c9 ( inst_c9 (
.clk (clk ), .clk (clk ),
@ -175,14 +175,14 @@ assign y_im = v1_im + y1_im;
// dout = round(y) delay M = round(y(8n-8)) // dout = round(y) delay M = round(y(8n-8))
trunc #( trunc #(
.diw (mult_o_width+4 ) .diw (temp_var_width+4 )
,.msb (mult_o_width-1 ) ,.msb (temp_var_width-1 )
,.lsb (mult_o_width-data_out_width ) ,.lsb (temp_var_width-data_out_width )
) round_u1 (clk, rstn, en, y_re, y_re_trunc); ) round_u1 (clk, rstn, en, y_re, y_re_trunc);
trunc #( trunc #(
.diw (mult_o_width+4 ) .diw (temp_var_width+4 )
,.msb (mult_o_width-1 ) ,.msb (temp_var_width-1 )
,.lsb (mult_o_width-data_out_width ) ,.lsb (temp_var_width-data_out_width )
) round_u2 (clk, rstn, en, y_im, y_im_trunc); ) round_u2 (clk, rstn, en, y_im, y_im_trunc);

View File

@ -32,8 +32,8 @@
//-FHDR-------------------------------------------------------------------------------------------------------- //-FHDR--------------------------------------------------------------------------------------------------------
module IIR_top #( module IIR_top #(
parameter temp_var_width = 20 parameter temp_var_width = 37
,parameter data_out_width = 18 ,parameter data_out_width = 23
) )
( (
input rstn input rstn
@ -86,21 +86,21 @@ module IIR_top #(
); );
wire signed [temp_var_width- 1:0] IIRout_p0_re; wire signed [temp_var_width- 1:0] IIRout_p0_re;
wire signed [temp_var_width-1:0] IIRout_p1_re; wire signed [temp_var_width- 3:0] IIRout_p1_re;
wire signed [temp_var_width-1:0] IIRout_p2_re; wire signed [temp_var_width- 5:0] IIRout_p2_re;
wire signed [temp_var_width-1:0] IIRout_p3_re; wire signed [temp_var_width- 7:0] IIRout_p3_re;
wire signed [temp_var_width-1:0] IIRout_p4_re; wire signed [temp_var_width- 9:0] IIRout_p4_re;
wire signed [temp_var_width-1:0] IIRout_p5_re; wire signed [temp_var_width-11:0] IIRout_p5_re;
wire signed [temp_var_width-1:0] IIRout_p6_re; wire signed [temp_var_width-13:0] IIRout_p6_re;
wire signed [temp_var_width-1:0] IIRout_p7_re; wire signed [temp_var_width-15:0] IIRout_p7_re;
wire signed [temp_var_width- 1:0] IIRout_p0_im; wire signed [temp_var_width- 1:0] IIRout_p0_im;
wire signed [temp_var_width-1:0] IIRout_p1_im; wire signed [temp_var_width- 3:0] IIRout_p1_im;
wire signed [temp_var_width-1:0] IIRout_p2_im; wire signed [temp_var_width- 5:0] IIRout_p2_im;
wire signed [temp_var_width-1:0] IIRout_p3_im; wire signed [temp_var_width- 7:0] IIRout_p3_im;
wire signed [temp_var_width-1:0] IIRout_p4_im; wire signed [temp_var_width- 9:0] IIRout_p4_im;
wire signed [temp_var_width-1:0] IIRout_p5_im; wire signed [temp_var_width-11:0] IIRout_p5_im;
wire signed [temp_var_width-1:0] IIRout_p6_im; wire signed [temp_var_width-13:0] IIRout_p6_im;
wire signed [temp_var_width-1:0] IIRout_p7_im; wire signed [temp_var_width-15:0] IIRout_p7_im;
@ -138,7 +138,9 @@ IIR_Filter_p8 inst_iir_p0 (
.dout_im (IIRout_p0_im ) // Im(y(8n-8)) .dout_im (IIRout_p0_im ) // Im(y(8n-8))
); );
IIR_Filter_p1 inst_iir_p1 ( IIR_Filter_p1 #(
.cascade_in_width (temp_var_width )
) inst_iir_p1(
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
.en (en ), .en (en ),
@ -152,7 +154,9 @@ IIR_Filter_p1 inst_iir_p1 (
.dout_re (IIRout_p1_re ), // Re(y(8n-23)) .dout_re (IIRout_p1_re ), // Re(y(8n-23))
.dout_im (IIRout_p1_im ) // Im(y(8n-23)) .dout_im (IIRout_p1_im ) // Im(y(8n-23))
); );
IIR_Filter_p1 inst_iir_p2 ( IIR_Filter_p1 #(
.cascade_in_width (temp_var_width-2 )
) inst_iir_p2 (
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
.en (en ), .en (en ),
@ -166,7 +170,9 @@ IIR_Filter_p1 inst_iir_p2 (
.dout_re (IIRout_p2_re ), // Re(y(8n-38)) .dout_re (IIRout_p2_re ), // Re(y(8n-38))
.dout_im (IIRout_p2_im ) // Im(y(8n-38)) .dout_im (IIRout_p2_im ) // Im(y(8n-38))
); );
IIR_Filter_p1 inst_iir_p3 ( IIR_Filter_p1 #(
.cascade_in_width (temp_var_width-4 )
) inst_iir_p3 (
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
.en (en ), .en (en ),
@ -180,7 +186,9 @@ IIR_Filter_p1 inst_iir_p3 (
.dout_re (IIRout_p3_re ), // Re(y(8n-53)) .dout_re (IIRout_p3_re ), // Re(y(8n-53))
.dout_im (IIRout_p3_im ) // Im(y(8n-53)) .dout_im (IIRout_p3_im ) // Im(y(8n-53))
); );
IIR_Filter_p1 inst_iir_p4 ( IIR_Filter_p1 #(
.cascade_in_width (temp_var_width-6 )
) inst_iir_p4 (
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
.en (en ), .en (en ),
@ -194,7 +202,9 @@ IIR_Filter_p1 inst_iir_p4 (
.dout_re (IIRout_p4_re ), // Re(y(8n-68)) .dout_re (IIRout_p4_re ), // Re(y(8n-68))
.dout_im (IIRout_p4_im ) // Im(y(8n-68)) .dout_im (IIRout_p4_im ) // Im(y(8n-68))
); );
IIR_Filter_p1 inst_iir_p5 ( IIR_Filter_p1 #(
.cascade_in_width (temp_var_width-8 )
) inst_iir_p5 (
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
.en (en ), .en (en ),
@ -208,7 +218,9 @@ IIR_Filter_p1 inst_iir_p5 (
.dout_re (IIRout_p5_re ), // Re(y(8n-83)) .dout_re (IIRout_p5_re ), // Re(y(8n-83))
.dout_im (IIRout_p5_im ) // Im(y(8n-83)) .dout_im (IIRout_p5_im ) // Im(y(8n-83))
); );
IIR_Filter_p1 inst_iir_p6 ( IIR_Filter_p1 #(
.cascade_in_width (temp_var_width-10 )
) inst_iir_p6 (
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
.en (en ), .en (en ),
@ -222,7 +234,9 @@ IIR_Filter_p1 inst_iir_p6 (
.dout_re (IIRout_p6_re ), // Re(y(8n-98)) .dout_re (IIRout_p6_re ), // Re(y(8n-98))
.dout_im (IIRout_p6_im ) // Im(y(8n-98)) .dout_im (IIRout_p6_im ) // Im(y(8n-98))
); );
IIR_Filter_p1 inst_iir_p7 ( IIR_Filter_p1 #(
.cascade_in_width (temp_var_width-12 )
) inst_iir_p7 (
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
.en (en ), .en (en ),
@ -237,14 +251,14 @@ IIR_Filter_p1 inst_iir_p7 (
.dout_im (IIRout_p7_im ) // Im(y(8n-113)) .dout_im (IIRout_p7_im ) // Im(y(8n-113))
); );
assign IIRout_p0 = IIRout_p0_re[temp_var_width-1 : temp_var_width-data_out_width]; // y(8n-8) assign IIRout_p0 = IIRout_p0_re[temp_var_width- 0-1 : temp_var_width- 0-data_out_width]; // y(8n-8)
assign IIRout_p1 = IIRout_p1_re[temp_var_width-1 : temp_var_width-data_out_width]; // y(8n-23) assign IIRout_p1 = IIRout_p1_re[temp_var_width- 2-1 : temp_var_width- 2-data_out_width]; // y(8n-23)
assign IIRout_p2 = IIRout_p2_re[temp_var_width-1 : temp_var_width-data_out_width]; // y(8n-38) assign IIRout_p2 = IIRout_p2_re[temp_var_width- 4-1 : temp_var_width- 4-data_out_width]; // y(8n-38)
assign IIRout_p3 = IIRout_p3_re[temp_var_width-1 : temp_var_width-data_out_width]; // y(8n-53) assign IIRout_p3 = IIRout_p3_re[temp_var_width- 6-1 : temp_var_width- 6-data_out_width]; // y(8n-53)
assign IIRout_p4 = IIRout_p4_re[temp_var_width-1 : temp_var_width-data_out_width]; // y(8n-68) assign IIRout_p4 = IIRout_p4_re[temp_var_width- 8-1 : temp_var_width- 8-data_out_width]; // y(8n-68)
assign IIRout_p5 = IIRout_p5_re[temp_var_width-1 : temp_var_width-data_out_width]; // y(8n-83) assign IIRout_p5 = IIRout_p5_re[temp_var_width-10-1 : temp_var_width-10-data_out_width]; // y(8n-83)
assign IIRout_p6 = IIRout_p6_re[temp_var_width-1 : temp_var_width-data_out_width]; // y(8n-98) assign IIRout_p6 = IIRout_p6_re[temp_var_width-12-1 : temp_var_width-12-data_out_width]; // y(8n-98)
assign IIRout_p7 = IIRout_p7_re[temp_var_width-1 : temp_var_width-data_out_width]; // y(8n-113) assign IIRout_p7 = IIRout_p7_re[temp_var_width-14-1 : temp_var_width-14-data_out_width]; // y(8n-113)
endmodule endmodule

View File

@ -31,8 +31,9 @@
// Other: // Other:
//-FHDR-------------------------------------------------------------------------------------------------------- //-FHDR--------------------------------------------------------------------------------------------------------
module TailCorr_top module TailCorr_top #(
parameter temp_var_width = 23
)
( (
input rstn input rstn
,input clk ,input clk
@ -190,22 +191,22 @@ wire signed [15:0] IIRin_p4; // iirin_x(8n+13)
wire signed [15:0] IIRin_p5; // iirin_x(8n+14) wire signed [15:0] IIRin_p5; // iirin_x(8n+14)
wire signed [15:0] IIRin_p6; // iirin_x(8n+15) wire signed [15:0] IIRin_p6; // iirin_x(8n+15)
wire signed [15:0] IIRin_p7; // iirin_x(8n+16) wire signed [15:0] IIRin_p7; // iirin_x(8n+16)
wire signed [17:0] IIRout_p0 [5:0]; // iirout_y(8n-8) wire signed [temp_var_width-1:0] IIRout_p0 [5:0]; // iirout_y(8n-8)
wire signed [17:0] IIRout_p1 [5:0]; // iirout_y(8n-23) wire signed [temp_var_width-1:0] IIRout_p1 [5:0]; // iirout_y(8n-23)
wire signed [17:0] IIRout_p2 [5:0]; // iirout_y(8n-38) wire signed [temp_var_width-1:0] IIRout_p2 [5:0]; // iirout_y(8n-38)
wire signed [17:0] IIRout_p3 [5:0]; // iirout_y(8n-53) wire signed [temp_var_width-1:0] IIRout_p3 [5:0]; // iirout_y(8n-53)
wire signed [17:0] IIRout_p4 [5:0]; // iirout_y(8n-68) wire signed [temp_var_width-1:0] IIRout_p4 [5:0]; // iirout_y(8n-68)
wire signed [17:0] IIRout_p5 [5:0]; // iirout_y(8n-83) wire signed [temp_var_width-1:0] IIRout_p5 [5:0]; // iirout_y(8n-83)
wire signed [17:0] IIRout_p6 [5:0]; // iirout_y(8n-98) wire signed [temp_var_width-1:0] IIRout_p6 [5:0]; // iirout_y(8n-98)
wire signed [17:0] IIRout_p7 [5:0]; // iirout_y(8n-113) wire signed [temp_var_width-1:0] IIRout_p7 [5:0]; // iirout_y(8n-113)
wire signed [20:0] sum_IIRout_p0; wire signed [temp_var_width+2:0] sum_IIRout_p0;
wire signed [20:0] sum_IIRout_p1; wire signed [temp_var_width+2:0] sum_IIRout_p1;
wire signed [20:0] sum_IIRout_p2; wire signed [temp_var_width+2:0] sum_IIRout_p2;
wire signed [20:0] sum_IIRout_p3; wire signed [temp_var_width+2:0] sum_IIRout_p3;
wire signed [20:0] sum_IIRout_p4; wire signed [temp_var_width+2:0] sum_IIRout_p4;
wire signed [20:0] sum_IIRout_p5; wire signed [temp_var_width+2:0] sum_IIRout_p5;
wire signed [20:0] sum_IIRout_p6; wire signed [temp_var_width+2:0] sum_IIRout_p6;
wire signed [20:0] sum_IIRout_p7; wire signed [temp_var_width+2:0] sum_IIRout_p7;
reg signed [15:0] din_p0_r [15:0]; reg signed [15:0] din_p0_r [15:0];
reg signed [15:0] din_p1_r [15:0]; reg signed [15:0] din_p1_r [15:0];
reg signed [15:0] din_p2_r [15:0]; reg signed [15:0] din_p2_r [15:0];
@ -221,21 +222,21 @@ reg signed [15:0] IIRin_p3_r [7 :0]; // iirin_x(8n-53)
reg signed [15:0] IIRin_p4_r [9 :0]; // iirin_x(8n-67) reg signed [15:0] IIRin_p4_r [9 :0]; // iirin_x(8n-67)
reg signed [15:0] IIRin_p5_r [11:0]; // iirin_x(8n-82) reg signed [15:0] IIRin_p5_r [11:0]; // iirin_x(8n-82)
reg signed [15:0] IIRin_p6_r [13:0]; // iirin_x(8n-97) reg signed [15:0] IIRin_p6_r [13:0]; // iirin_x(8n-97)
reg signed [20:0] sum_IIRout_p0_r [12:0]; reg signed [temp_var_width+2:0] sum_IIRout_p0_r [12:0];
reg signed [20:0] sum_IIRout_p1_r [11:0]; reg signed [temp_var_width+2:0] sum_IIRout_p1_r [11:0];
reg signed [20:0] sum_IIRout_p2_r [9 :0]; reg signed [temp_var_width+2:0] sum_IIRout_p2_r [9 :0];
reg signed [20:0] sum_IIRout_p3_r [7 :0]; reg signed [temp_var_width+2:0] sum_IIRout_p3_r [7 :0];
reg signed [20:0] sum_IIRout_p4_r [5 :0]; reg signed [temp_var_width+2:0] sum_IIRout_p4_r [5 :0];
reg signed [20:0] sum_IIRout_p5_r [3 :0]; reg signed [temp_var_width+2:0] sum_IIRout_p5_r [3 :0];
reg signed [20:0] sum_IIRout_p6_r [1 :0]; reg signed [temp_var_width+2:0] sum_IIRout_p6_r [1 :0];
wire signed [20:0] dout_p0_r0; wire signed [temp_var_width+2:0] dout_p0_r0;
wire signed [20:0] dout_p1_r0; wire signed [temp_var_width+2:0] dout_p1_r0;
wire signed [20:0] dout_p2_r0; wire signed [temp_var_width+2:0] dout_p2_r0;
wire signed [20:0] dout_p3_r0; wire signed [temp_var_width+2:0] dout_p3_r0;
wire signed [20:0] dout_p4_r0; wire signed [temp_var_width+2:0] dout_p4_r0;
wire signed [20:0] dout_p5_r0; wire signed [temp_var_width+2:0] dout_p5_r0;
wire signed [20:0] dout_p6_r0; wire signed [temp_var_width+2:0] dout_p6_r0;
wire signed [20:0] dout_p7_r0; wire signed [temp_var_width+2:0] dout_p7_r0;
wire vldo_diff; wire vldo_diff;
diff_p inst_diff_p ( diff_p inst_diff_p (
@ -732,23 +733,23 @@ always @(posedge clk or negedge rstn) begin
end end
end end
assign dout_p0_r0 = {{3{din_p0_r[15][15]}},din_p0_r[15],2'b0} + sum_IIRout_p1_r[11]; // y(8n-119) assign dout_p0_r0 = {{3{din_p0_r[15][15]}},din_p0_r[15],{(temp_var_width-16){1'b0}}} + sum_IIRout_p1_r[11]; // y(8n-119)
assign dout_p1_r0 = {{3{din_p1_r[15][15]}},din_p1_r[15],2'b0} + sum_IIRout_p2_r[9]; // y(8n-118) assign dout_p1_r0 = {{3{din_p1_r[15][15]}},din_p1_r[15],{(temp_var_width-16){1'b0}}} + sum_IIRout_p2_r[9]; // y(8n-118)
assign dout_p2_r0 = {{3{din_p2_r[15][15]}},din_p2_r[15],2'b0} + sum_IIRout_p3_r[7]; // y(8n-117) assign dout_p2_r0 = {{3{din_p2_r[15][15]}},din_p2_r[15],{(temp_var_width-16){1'b0}}} + sum_IIRout_p3_r[7]; // y(8n-117)
assign dout_p3_r0 = {{3{din_p3_r[15][15]}},din_p3_r[15],2'b0} + sum_IIRout_p4_r[5]; // y(8n-116) assign dout_p3_r0 = {{3{din_p3_r[15][15]}},din_p3_r[15],{(temp_var_width-16){1'b0}}} + sum_IIRout_p4_r[5]; // y(8n-116)
assign dout_p4_r0 = {{3{din_p4_r[15][15]}},din_p4_r[15],2'b0} + sum_IIRout_p5_r[3]; // y(8n-115) assign dout_p4_r0 = {{3{din_p4_r[15][15]}},din_p4_r[15],{(temp_var_width-16){1'b0}}} + sum_IIRout_p5_r[3]; // y(8n-115)
assign dout_p5_r0 = {{3{din_p5_r[15][15]}},din_p5_r[15],2'b0} + sum_IIRout_p6_r[1]; // y(8n-114) assign dout_p5_r0 = {{3{din_p5_r[15][15]}},din_p5_r[15],{(temp_var_width-16){1'b0}}} + sum_IIRout_p6_r[1]; // y(8n-114)
assign dout_p6_r0 = {{3{din_p6_r[15][15]}},din_p6_r[15],2'b0} + sum_IIRout_p7; // y(8n-113) assign dout_p6_r0 = {{3{din_p6_r[15][15]}},din_p6_r[15],{(temp_var_width-16){1'b0}}} + sum_IIRout_p7; // y(8n-113)
assign dout_p7_r0 = {{3{din_p7_r[15][15]}},din_p7_r[15],2'b0} + sum_IIRout_p0_r[12]; // y(8n-112) assign dout_p7_r0 = {{3{din_p7_r[15][15]}},din_p7_r[15],{(temp_var_width-16){1'b0}}} + sum_IIRout_p0_r[12]; // y(8n-112)
trunc #(21,17,2) round_u0 (clk, rstn, en, dout_p0_r0, dout_p0); trunc #(temp_var_width+3,temp_var_width-1,temp_var_width-16,1) round_u0 (clk, rstn, en, dout_p0_r0, dout_p0);
trunc #(21,17,2) round_u1 (clk, rstn, en, dout_p1_r0, dout_p1); trunc #(temp_var_width+3,temp_var_width-1,temp_var_width-16,1) round_u1 (clk, rstn, en, dout_p1_r0, dout_p1);
trunc #(21,17,2) round_u2 (clk, rstn, en, dout_p2_r0, dout_p2); trunc #(temp_var_width+3,temp_var_width-1,temp_var_width-16,1) round_u2 (clk, rstn, en, dout_p2_r0, dout_p2);
trunc #(21,17,2) round_u3 (clk, rstn, en, dout_p3_r0, dout_p3); trunc #(temp_var_width+3,temp_var_width-1,temp_var_width-16,1) round_u3 (clk, rstn, en, dout_p3_r0, dout_p3);
trunc #(21,17,2) round_u4 (clk, rstn, en, dout_p4_r0, dout_p4); trunc #(temp_var_width+3,temp_var_width-1,temp_var_width-16,1) round_u4 (clk, rstn, en, dout_p4_r0, dout_p4);
trunc #(21,17,2) round_u5 (clk, rstn, en, dout_p5_r0, dout_p5); trunc #(temp_var_width+3,temp_var_width-1,temp_var_width-16,1) round_u5 (clk, rstn, en, dout_p5_r0, dout_p5);
trunc #(21,17,2) round_u6 (clk, rstn, en, dout_p6_r0, dout_p6); trunc #(temp_var_width+3,temp_var_width-1,temp_var_width-16,1) round_u6 (clk, rstn, en, dout_p6_r0, dout_p6);
trunc #(21,17,2) round_u7 (clk, rstn, en, dout_p7_r0, dout_p7); trunc #(temp_var_width+3,temp_var_width-1,temp_var_width-16,1) round_u7 (clk, rstn, en, dout_p7_r0, dout_p7);

View File

@ -3,6 +3,7 @@ module trunc #(
//,parameter integer dow = msb - (lsb -1) //,parameter integer dow = msb - (lsb -1)
,parameter integer msb = 7 ,parameter integer msb = 7
,parameter integer lsb = 1 ,parameter integer lsb = 1
,parameter integer half_precision = 0
) )
( (
input clk input clk
@ -16,23 +17,7 @@ module trunc #(
reg signed [msb - lsb : 0] d_tmp; reg signed [msb - lsb : 0] d_tmp;
generate generate
if(lsb==0) begin if(lsb!=0 && half_precision != 0) begin
always @(posedge clk or negedge rstn) begin
if (!rstn) begin
d_tmp <= 'h0;
end
else if(en) begin
if(din[diw-1 : msb] != {(diw-msb){din[diw-1]}})
d_tmp <= {{din[diw-1]}, {(msb-lsb){!din[diw-1]}}};
else
d_tmp <= din[msb:lsb];
end
else begin
d_tmp <= d_tmp;
end
end
end
else begin
always @(posedge clk or negedge rstn) begin always @(posedge clk or negedge rstn) begin
if (!rstn) begin if (!rstn) begin
d_tmp <= 'h0; d_tmp <= 'h0;
@ -48,6 +33,22 @@ generate
end end
end end
end end
else begin
always @(posedge clk or negedge rstn) begin
if (!rstn) begin
d_tmp <= 'h0;
end
else if(en) begin
if(din[diw-1 : msb] != {(diw-msb){din[diw-1]}})
d_tmp <= {{din[diw-1]}, {(msb-lsb){!din[diw-1]}}};
else
d_tmp <= din[msb:lsb];
end
else begin
d_tmp <= d_tmp;
end
end
end
endgenerate endgenerate
assign dout = d_tmp; assign dout = d_tmp;

View File

@ -103,12 +103,12 @@ trunc #(
.diw (A_width+C_width+1 ) .diw (A_width+C_width+1 )
,.msb (A_width+C_width-2 ) ,.msb (A_width+C_width-2 )
,.lsb (A_width+C_width-o_width-1 ) ,.lsb (A_width+C_width-o_width-1 )
) u_round1 (clk, rstn, en, Im_tmp, Re_trunc); ) u_round1 (clk, rstn, en, Re_tmp, Re_trunc);
trunc #( trunc #(
.diw (A_width+D_width+1 ) .diw (A_width+D_width+1 )
,.msb (A_width+D_width-2 ) ,.msb (A_width+D_width-2 )
,.lsb (A_width+C_width-o_width-1 ) ,.lsb (A_width+C_width-o_width-1 )
) u_round2 (clk, rstn, en, Re_tmp, Im_trunc); ) u_round2 (clk, rstn, en, Im_tmp, Im_trunc);
// Since this is complex multiplication, the output bit width needs to be increased by one compared to the input. // Since this is complex multiplication, the output bit width needs to be increased by one compared to the input.
assign Re = Re_trunc; assign Re = Re_trunc;