OpenCores
URL https://opencores.org/ocsvn/cic_core_2/cic_core_2/trunk

Subversion Repositories cic_core_2

[/] [cic_core_2/] [trunk/] [rtl/] [verilog/] [cic_i.sv] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 Juzujka
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.