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

Subversion Repositories cic_core

[/] [cic_core/] [trunk/] [src/] [cic_d.sv] - Blame information for rev 4

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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