1 |
4 |
vadimuzzz |
module cic_d
|
2 |
|
|
/*********************************************************************************************/
|
3 |
|
|
#(parameter idw = 8, odw = 8, r = 4, m = 4, g = 1)
|
4 |
|
|
/*********************************************************************************************/
|
5 |
|
|
//m - CIC order (comb chain length, integrator chain length)
|
6 |
|
|
//r - interpolation ratio
|
7 |
|
|
//idw - input data width
|
8 |
|
|
//odw - output data width
|
9 |
|
|
//g - differential delay in combs
|
10 |
|
|
/*********************************************************************************************/
|
11 |
|
|
(
|
12 |
|
|
input clk,
|
13 |
|
|
input reset_n,
|
14 |
|
|
input signed [idw-1:0] data_in,
|
15 |
|
|
output signed [odw-1:0] data_out,
|
16 |
|
|
output out_dv
|
17 |
|
|
);
|
18 |
|
|
/*********************************************************************************************/
|
19 |
|
|
localparam b_max = $clog2((r*g)**m)+idw;
|
20 |
|
|
/*********************************************************************************************/
|
21 |
|
|
genvar i;
|
22 |
|
|
generate
|
23 |
|
|
for (i = 0; i < m; i++) begin:int_stage
|
24 |
|
|
localparam idw_cur = b_max-cic_package::B(i+1,r,g,m,idw,odw)+1;
|
25 |
|
|
localparam odw_cur = idw_cur;
|
26 |
|
|
localparam odw_prev = (i!=0) ? b_max-cic_package::B(i,r,g,m,idw,odw)+1 : 0;
|
27 |
|
|
wire signed [idw_cur-1:0] int_in;
|
28 |
|
|
if (i!=0)
|
29 |
|
|
assign int_in = int_stage[i-1].int_out[odw_prev-1:odw_prev-idw_cur];
|
30 |
|
|
else
|
31 |
|
|
assign int_in = data_in;
|
32 |
|
|
wire signed [odw_cur-1:0] int_out;
|
33 |
|
|
integrator #(idw_cur, odw_cur) int_inst(.clk(clk) , .reset_n(reset_n) , .data_in(int_in) , .data_out(int_out));
|
34 |
|
|
end
|
35 |
|
|
endgenerate
|
36 |
|
|
/*********************************************************************************************/
|
37 |
|
|
localparam ds_dw = b_max-cic_package::B(m,r,g,m,idw,odw)+1;
|
38 |
|
|
wire signed [ds_dw-1:0] ds_out;
|
39 |
|
|
wire ds_dv;
|
40 |
|
|
/*********************************************************************************************/
|
41 |
|
|
downsampler #(ds_dw, r) u1
|
42 |
|
|
(
|
43 |
|
|
.clk(clk),
|
44 |
|
|
.reset_n(reset_n),
|
45 |
|
|
.data_in(int_stage[m-1].int_out),
|
46 |
|
|
.data_out(ds_out),
|
47 |
|
|
.dv(ds_dv)
|
48 |
|
|
);
|
49 |
|
|
/*********************************************************************************************/
|
50 |
|
|
genvar j;
|
51 |
|
|
generate
|
52 |
|
|
for (j = 0; j < m; j++) begin:comb_stage
|
53 |
|
|
localparam idw_cur = b_max-cic_package::B(m+j+1,r,g,m,idw,odw);
|
54 |
|
|
localparam odw_cur = idw_cur;
|
55 |
|
|
localparam odw_prev = (j!=0) ? b_max-cic_package::B(m+j,r,g,m,idw,odw) : 0;
|
56 |
|
|
wire signed [idw_cur-1:0] comb_in;
|
57 |
|
|
if (j!=0)
|
58 |
|
|
assign comb_in = comb_stage[j-1].comb_out[odw_prev-1:odw_prev-idw_cur];
|
59 |
|
|
else
|
60 |
|
|
assign comb_in = ds_out[ds_dw-1:ds_dw-idw_cur];
|
61 |
|
|
wire signed [odw_cur-1:0] comb_out;
|
62 |
|
|
comb #(idw_cur, odw_cur, g) comb_inst(.clk(clk) , .reset_n(reset_n) , .in_dv(ds_dv) , .data_in(comb_in) , .data_out(comb_out));
|
63 |
|
|
end
|
64 |
|
|
endgenerate
|
65 |
|
|
/*********************************************************************************************/
|
66 |
|
|
localparam dw_out = b_max-cic_package::B(2*m,r,g,m,idw,odw);
|
67 |
|
|
assign data_out = comb_stage[m-1].comb_out[dw_out-1:dw_out-odw];
|
68 |
|
|
assign out_dv = ds_dv;
|
69 |
|
|
/*********************************************************************************************/
|
70 |
|
|
endmodule
|