1 |
4 |
vadimuzzz |
module cic_i
|
2 |
|
|
/*********************************************************************************************/
|
3 |
|
|
#(parameter dw = 8, r = 4, m = 4, g = 1)
|
4 |
|
|
/*********************************************************************************************/
|
5 |
|
|
//m - CIC order (comb chain length, integrator chain length)
|
6 |
|
|
//r - interpolation ratio
|
7 |
|
|
//dw - input data width
|
8 |
|
|
//g - differential delay in combs
|
9 |
|
|
/*********************************************************************************************/
|
10 |
|
|
(
|
11 |
|
|
input clk,
|
12 |
|
|
input reset_n,
|
13 |
|
|
input in_dv,
|
14 |
|
|
input signed [dw-1:0] data_in,
|
15 |
|
|
output signed [dw+$clog2((r**(m))/r)-1:0] data_out
|
16 |
|
|
);
|
17 |
|
|
/*********************************************************************************************/
|
18 |
|
|
wire signed [dw+m-2:0] upsample;
|
19 |
|
|
/*********************************************************************************************/
|
20 |
|
|
genvar i;
|
21 |
|
|
generate
|
22 |
|
|
for (i = 0; i < m; i++) begin:comb_stage
|
23 |
|
|
wire signed [dw+i-1:0] comb_in;
|
24 |
|
|
localparam odw = (i == m - 1) ? dw+i : dw+i+1;
|
25 |
|
|
if (i!=0)
|
26 |
|
|
assign comb_in = comb_stage[i-1].comb_out;
|
27 |
|
|
else
|
28 |
|
|
assign comb_in = data_in;
|
29 |
|
|
wire signed [odw-1:0] comb_out;
|
30 |
|
|
comb #(dw+i, odw, g) comb_inst(.clk(clk) , .reset_n(reset_n) , .in_dv(in_dv) , .data_in(comb_in) , .data_out(comb_out));
|
31 |
|
|
end
|
32 |
|
|
endgenerate
|
33 |
|
|
/*********************************************************************************************/
|
34 |
|
|
assign upsample = (in_dv) ? comb_stage[m-1].comb_out : 0;
|
35 |
|
|
/*********************************************************************************************/
|
36 |
|
|
genvar j;
|
37 |
|
|
generate
|
38 |
|
|
for (j = 0; j < m; j++) begin:int_stage
|
39 |
|
|
localparam idw = (j == 0) ? dw+m-1 : dw+$clog2(((2**(m-j))*(r**(j)))/r);
|
40 |
|
|
localparam odw = dw+$clog2(((2**(m-j-1))*(r**(j+1)))/r);
|
41 |
|
|
wire signed [idw-1:0] int_in;
|
42 |
|
|
if (j==0)
|
43 |
|
|
assign int_in = upsample;
|
44 |
|
|
else
|
45 |
|
|
assign int_in = int_stage[j-1].int_out;
|
46 |
|
|
wire signed [odw-1:0] int_out;
|
47 |
|
|
integrator #(idw, odw) int_inst(.clk(clk) , .reset_n(reset_n) , .data_in(int_in) , .data_out(int_out));
|
48 |
|
|
end
|
49 |
|
|
endgenerate
|
50 |
|
|
/*********************************************************************************************/
|
51 |
|
|
assign data_out = int_stage[m-1].int_out;
|
52 |
|
|
/*********************************************************************************************/
|
53 |
|
|
endmodule
|