Line 25... |
Line 25... |
/*********************************************************************************************/
|
/*********************************************************************************************/
|
|
|
genvar i;
|
genvar i;
|
generate
|
generate
|
for (i = 0; i < CIC_N; i = i + 1) begin : int_stage
|
for (i = 0; i < CIC_N; i = i + 1) begin : int_stage
|
localparam B_j = B(i + 1, CIC_R, CIC_M, CIC_N, INP_DW, OUT_DW);
|
localparam B_jm1 = B_calc(i , CIC_N, CIC_R, CIC_M, INP_DW, OUT_DW);
|
localparam B_jm1 = B(i , CIC_R, CIC_M, CIC_N, INP_DW, OUT_DW);
|
localparam B_j = B_calc(i + 1, CIC_N, CIC_R, CIC_M, INP_DW, OUT_DW);
|
localparam logic [127:0 ] F_sq_j = F_sq(i , CIC_R, CIC_M, CIC_N);
|
localparam F_sq_j = 0;
|
localparam dw_cur = B_max - B_j + 1;
|
localparam idw_cur = B_max - B_jm1 + 1;
|
localparam odw_cur = dw_cur;
|
localparam odw_cur = B_max - B_j + 1;
|
localparam B_dw_prev = (i != 0) ? B_max - B_jm1 + 1 : 0;
|
localparam B_dw_prev = (i != 0) ? B_max - B_jm1 + 1 : 0;
|
localparam odw_prev = (B_dw_prev > 1) ? B_dw_prev : 2; /// icarus stops with error if in [a -: b] a is <= 0
|
|
localparam idw_cur = dw_cur > 0 ? dw_cur : 1;
|
|
wire signed [idw_cur - 1 : 0] int_in;
|
wire signed [idw_cur - 1 : 0] int_in;
|
if ( i == 0 ) assign int_in = inp_samp_data;
|
if ( i == 0 ) assign int_in = inp_samp_data;
|
else assign int_in = int_stage[i - 1].int_out[odw_prev - 1 -: idw_cur];
|
else assign int_in = int_stage[i - 1].int_out;
|
|
wire signed [idw_cur - 1 : 0] int_inst_out;
|
wire signed [odw_cur - 1 : 0] int_out;
|
wire signed [odw_cur - 1 : 0] int_out;
|
|
assign int_out = int_inst_out[idw_cur - 1 -: odw_cur];
|
integrator #(
|
integrator #(
|
idw_cur,
|
idw_cur,
|
odw_cur
|
idw_cur
|
)
|
)
|
int_inst(
|
int_inst(
|
.clk (clk),
|
.clk (clk),
|
.reset_n (reset_n),
|
.reset_n (reset_n),
|
.clear (clear) ,
|
.clear (clear) ,
|
.inp_samp_data (int_in),
|
.inp_samp_data (int_in),
|
.inp_samp_str (inp_samp_str),
|
.inp_samp_str (inp_samp_str),
|
.out_samp_data (int_out)
|
.out_samp_data (int_inst_out)
|
);
|
);
|
initial begin
|
initial begin
|
//$display("i:%d integ dw %d B(%d, %d, %d, %d, %d, %d)=%d, F_sq=%d", i, odw_cur, i + 1, CIC_R, CIC_M, CIC_N, INP_DW, OUT_DW, B_j, F_sq_j);
|
//$display("i:%d integ idw=%2d odw=%2d B(%2d, %3d, %2d, %2d, %2d, %2d)=%2d, Bj-1=%2d, F_sq=%8d", i, idw_cur, odw_cur, i + 1, CIC_R, CIC_M, CIC_N, INP_DW, OUT_DW, B_j, B_jm1, F_sq_j);
|
$display("i:%d integ dw %d ", i, odw_cur);
|
$display("i:%d integ idw=%d ", i, idw_cur);
|
end
|
end
|
end
|
end
|
endgenerate
|
endgenerate
|
/*********************************************************************************************/
|
/*********************************************************************************************/
|
localparam B_m = B(CIC_N, CIC_R, CIC_M, CIC_N, INP_DW, OUT_DW);
|
localparam B_m = B_calc(CIC_N, CIC_N, CIC_R, CIC_M, INP_DW, OUT_DW);
|
localparam ds_dw = B_max - B_m + 1;
|
localparam ds_dw = B_max - B_m + 1;
|
wire signed [ds_dw - 1 : 0] ds_out_samp_data;
|
wire signed [ds_dw - 1 : 0] ds_out_samp_data;
|
wire ds_out_samp_str;
|
wire ds_out_samp_str;
|
/*********************************************************************************************/
|
/*********************************************************************************************/
|
initial begin
|
initial begin
|
Line 97... |
Line 97... |
if (SMALL_FOOTPRINT == 0) assign summ_rdy_str = '0;
|
if (SMALL_FOOTPRINT == 0) assign summ_rdy_str = '0;
|
else assign summ_rdy_str = comb_inp_str_d[CIC_N];
|
else assign summ_rdy_str = comb_inp_str_d[CIC_N];
|
|
|
|
|
for (j = 0; j < CIC_N; j = j + 1) begin : comb_stage
|
for (j = 0; j < CIC_N; j = j + 1) begin : comb_stage
|
localparam j_cic = CIC_N + j + 1;
|
localparam B_m_j_m1 = B_calc(CIC_N + j , CIC_N, CIC_R, CIC_M, INP_DW, OUT_DW);
|
localparam B_m_j = B( j_cic, CIC_R, CIC_M, CIC_N, INP_DW, OUT_DW);
|
localparam B_m_j = B_calc(CIC_N + j + 1, CIC_N, CIC_R, CIC_M, INP_DW, OUT_DW);
|
localparam F_sq_j = F_sq( j_cic, CIC_R, CIC_M, CIC_N);
|
localparam F_sq_j = 1;
|
localparam B_m_j_m1 = B( CIC_N + j, CIC_R, CIC_M, CIC_N, INP_DW, OUT_DW);
|
localparam idw_cur = B_max - B_m_j_m1 + 1;
|
localparam F_sq_2Np1 = F_sq(2 * CIC_N + 1, CIC_R, CIC_M, CIC_N);
|
localparam odw_cur = B_max - B_m_j + 1;
|
localparam idw_cur = B_max - B_m_j + 1;
|
|
localparam odw_cur = idw_cur;
|
|
localparam odw_prev = (j != 0) ? B_max - B_m_j_m1 + 1 : 0;
|
|
wire signed [idw_cur - 1 : 0] comb_in;
|
wire signed [idw_cur - 1 : 0] comb_in;
|
|
wire signed [idw_cur - 1 : 0] comb_inst_out;
|
wire signed [odw_cur - 1 : 0] comb_out;
|
wire signed [odw_cur - 1 : 0] comb_out;
|
wire comb_dv;
|
wire comb_dv;
|
if (j == 0) assign comb_in = ds_out_samp_data[ds_dw - 1 -: idw_cur];
|
if (j == 0) assign comb_in = ds_out_samp_data;
|
else assign comb_in = comb_stage[j - 1].comb_out[odw_prev - 1 -: idw_cur];
|
else assign comb_in = comb_stage[j - 1].comb_out;
|
|
assign comb_out = comb_inst_out[idw_cur - 1 -: odw_cur];
|
comb #(
|
comb #(
|
.SAMP_WIDTH (idw_cur),
|
.SAMP_WIDTH (idw_cur),
|
.CIC_M (CIC_M),
|
.CIC_M (CIC_M),
|
.SMALL_FOOTPRINT(SMALL_FOOTPRINT)
|
.SMALL_FOOTPRINT(SMALL_FOOTPRINT)
|
)
|
)
|
Line 123... |
Line 122... |
.clear (clear),
|
.clear (clear),
|
.samp_inp_str (ds_out_samp_str),
|
.samp_inp_str (ds_out_samp_str),
|
.samp_inp_data (comb_in),
|
.samp_inp_data (comb_in),
|
.summ_rdy_str (summ_rdy_str),
|
.summ_rdy_str (summ_rdy_str),
|
.samp_out_str (comb_dv),
|
.samp_out_str (comb_dv),
|
.samp_out_data (comb_out)
|
.samp_out_data (comb_inst_out)
|
);
|
);
|
if (SMALL_FOOTPRINT == 0) assign comb_chain_out_str = comb_stage[CIC_N - 1].comb_dv;
|
if (SMALL_FOOTPRINT == 0) assign comb_chain_out_str = comb_stage[CIC_N - 1].comb_dv;
|
else assign comb_chain_out_str = comb_inp_str_d[CIC_N - 1];
|
else assign comb_chain_out_str = comb_inp_str_d[CIC_N - 1];
|
initial begin
|
initial begin
|
//$display("i:%d comb dw %d inp comb_out[%2d -: %2d]; B(%2d, %1d, %1d, %1d, %1d, %1d)=%2d, ln(F_sq)=%4d, F_sq=%8d", j, odw_cur, odw_prev - 1, idw_cur, CIC_N + j + 1, CIC_R, CIC_M, CIC_N, INP_DW, OUT_DW, B_m_j, $ln(F_sq_j), F_sq_j);
|
//$display("i:%d comb idw=%2d odw=%2d B(%2d, %3d, %2d, %2d, %2d, %2d)=%2d, ln(F_sq)=%4d, F_sq=%8d", j, idw_cur, odw_cur, CIC_N + j + 1, CIC_R, CIC_M, CIC_N, INP_DW, OUT_DW, B_m_j, $ln(F_sq_j), F_sq_j);
|
$display("i:%d comb dw %d", j, odw_cur);
|
//if (j != 0) $display("odw_prev=%2d, comb_stage[j - 1].odw_cur=%2d", odw_prev, comb_stage[j - 1].odw_cur);
|
|
$display("i:%d comb idw=%d", j, idw_cur);
|
end
|
end
|
end
|
end
|
endgenerate
|
endgenerate
|
/*********************************************************************************************/
|
/*********************************************************************************************/
|
localparam dw_out = B_max - B(2 * CIC_N, CIC_R, CIC_M, CIC_N, INP_DW, OUT_DW) + 1;
|
localparam dw_out = B_max - B_calc(2 * CIC_N, CIC_N, CIC_R, CIC_M, INP_DW, OUT_DW) + 1;
|
reg signed [OUT_DW-1:0] comb_out_samp_data_reg;
|
reg signed [OUT_DW-1:0] comb_out_samp_data_reg;
|
reg comb_out_samp_str_reg;
|
reg comb_out_samp_str_reg;
|
|
|
always @(negedge reset_n or posedge clk)
|
always @(negedge reset_n or posedge clk)
|
begin
|
begin
|
Line 187... |
Line 187... |
h_f0_x_mul = x_multiplier * h_f0_pre / 2**(B_2Np1 + 1);
|
h_f0_x_mul = x_multiplier * h_f0_pre / 2**(B_2Np1 + 1);
|
end
|
end
|
$display("CIC inp_dw %d", INP_DW);
|
$display("CIC inp_dw %d", INP_DW);
|
$display("CIC out_dw %d", OUT_DW);
|
$display("CIC out_dw %d", OUT_DW);
|
$display("CIC B_max %d", B_max);
|
$display("CIC B_max %d", B_max);
|
|
$display("CIC B_out %d", dw_out);
|
$display("CIC B_2Np1 %d", B_2Np1);
|
$display("CIC B_2Np1 %d", B_2Np1);
|
$display("CIC h(f=0) %1d.%1d", h_f0_x_mul / x_multiplier, h_f0_x_mul % x_multiplier);
|
$display("CIC h(f=0) %1d.%1d", h_f0_x_mul / x_multiplier, h_f0_x_mul % x_multiplier);
|
$display(" clog2_l((r*m)**n) %d", clog2_l((CIC_R*CIC_M)**CIC_N));
|
$display(" clog2_l((r*m)**n) %d", clog2_l((CIC_R*CIC_M)**CIC_N));
|
tot_registers = 0;
|
tot_registers = 0;
|
for (j = 1; j < 2 * CIC_N + 2; j = j + 1) begin : check_Bj
|
for (j = 1; j < 2 * CIC_N + 2; j = j + 1) begin : check_Bj
|
F_sq_curr = F_sq(j, CIC_R, CIC_M, CIC_N);
|
F_sq_curr = F_sq_calc(j, CIC_N, CIC_R, CIC_M);
|
B_j = B(j, CIC_R, CIC_M, CIC_N, INP_DW, OUT_DW);
|
B_j = B_calc(j, CIC_N, CIC_R, CIC_M, INP_DW, OUT_DW);
|
dw_j = B_max - B_j + 1;
|
dw_j = B_max - B_j + 1;
|
tot_registers = tot_registers + dw_j;
|
tot_registers = tot_registers + dw_j;
|
end
|
end
|
$display("CIC total registers %2d", tot_registers);
|
$display("CIC total registers %2d", tot_registers);
|
endtask
|
endtask
|
|
|
|
|
generate
|
generate
|
initial begin : initial_print_parameters
|
initial begin : initial_print_parameters
|
if (0) begin
|
if (1) begin
|
print_parameters_nice;
|
print_parameters_nice;
|
end
|
end
|
|
|
end
|
end
|
if (0) begin
|
if (0) begin
|