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_functions.vh] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 Juzujka
/**
2
 * Library: cic_functions
3
 *
4
 * library with functions for calculating parameters for CIC filter and Hogenauer pruning
5
 */
6
`ifndef _CIC_FUNCTIONS_VH_
7
`define _CIC_FUNCTIONS_VH_
8
`define M_PI 3.14159265359      // not all simulator defines PI 
9
 
10
function reg unsigned [127 : 0] nchoosek;        ///< Binomial coefficient
11
        input   integer n;
12
        input   integer k;
13
        reg unsigned [127:0] tmp;
14
        integer i;
15
        begin
16
                tmp = 1.0;
17
                for (i = 1; i <= (n - k); i = i + 1)
18
                        tmp = tmp * (k + i) / i;
19
                nchoosek = tmp;
20
        end
21
endfunction
22
 
23
function integer clog2_l;
24
        input reg unsigned [127:0] depth;
25
        reg unsigned [127:0] i;
26
        begin
27
                clog2_l = 0;
28
                if (depth > 0) begin
29
                        i = depth - 1;  // with "- 1" clog2(2^N) will be N, not N + 1
30
                        for(clog2_l = 0; i > 0; clog2_l = clog2_l + 1)
31
                                i = i >> 1;
32
                end else
33
                        clog2_l = -1;
34
        end
35
endfunction
36
 
37
function integer B_max_calc;
38
        input integer N;
39
        input integer R;
40
        input integer M;
41
        input integer INP_DW;
42
        reg unsigned [127:0] RMpN;
43
        begin
44
                RMpN = (R * M) ** N;
45
                B_max_calc = clog2_l(RMpN) + INP_DW - 1;
46
                //$display("B_max_calc: N=%2d, R=%2d, M=%2d, ret=%2d", N, R, M, B_max_calc);
47
        end
48
endfunction
49
 
50
function integer B_out_calc;
51
        input integer N;
52
        input integer R;
53
        input integer M;
54
        input integer INP_DW;
55
        input integer OUT_DW;
56
        begin
57
                B_out_calc = B_max_calc(N, R, M, OUT_DW) - B_calc(2 * N, N, R, M, INP_DW, OUT_DW) + 1;
58
        end
59
endfunction
60
 
61
 
62
function integer flog2_l;
63
        input reg unsigned [127:0] depth;
64
        reg unsigned [127:0] i;
65
        begin
66
                i = depth;
67
                for(flog2_l = 0; i > 1; flog2_l = flog2_l + 1)
68
                        i = i >> 1;
69
        end
70
endfunction
71
 
72
 
73
function reg signed [127:0] h_calc;
74
        input   integer j;
75
        input   integer k;
76
        input   integer N;
77
        input   integer R;
78
        input   integer M;
79
        integer c_stop;
80
        integer i;
81
        reg signed [127:0] tmp;
82
        reg signed [127:0] prod_1;
83
        reg signed [127:0] prod_2;
84
        reg signed [127:0] summ;
85
        begin
86
                c_stop = k / (R * M);
87
                if ((j >= 1)&&( j<=N )) begin
88
                        tmp = 0;
89
                        for (i = 0; i <= c_stop; i = i + 1) begin
90
                                prod_1 = nchoosek(N, i);
91
                                prod_2 = nchoosek(N - j + k - R * M * i, k - R * M * i);
92
                                summ = prod_1 * prod_2;
93
                                if (i % 2) summ = -summ;
94
                                tmp = tmp + summ;
95
                        end
96
                end
97
                else begin
98
                        tmp = nchoosek(2 * N + 1 - j, k);
99
                        if (k % 2) tmp = -tmp;
100
                end
101
                h_calc = tmp;
102
        end
103
endfunction
104
 
105
function reg signed [127:0] F_sq_calc;   ///< F()**2
106
        input   integer j;
107
        input   integer N;
108
        input   integer R;
109
        input   integer M;
110
        integer c_stop;
111
        reg signed [127:0] tmp;
112
        integer i;
113
        reg signed [127:0] h_jk;
114
        begin
115
                tmp = 0;
116
                if (j <= N)
117
                        c_stop = (((R * M -1 ) * N) + j - 1);
118
                else
119
                        c_stop = 2 * N + 1 - j;
120
                for (i = 0;i <= c_stop; i = i + 1) begin
121
                        h_jk = h_calc(j, i, N, R, M);
122
                        tmp = tmp + h_jk ** 2;
123
                end
124
                F_sq_calc = tmp;
125
        end
126
endfunction
127
 
128
function integer B_calc;
129
        input   integer j;
130
        input   integer N;
131
        input   integer R;
132
        input   integer M;
133
        input   integer dw_in;
134
        input   integer dw_out;
135
        integer B_max;
136
        reg signed [127:0] sigma_T_2Np1_sq;
137
        reg signed [127:0] B_2Np1;
138
        reg signed [127:0] B_exp_real;
139
        integer B_out;
140
        reg signed [127:0] F_sq_j;
141
        reg signed [127:0] F_sq_2Np1;
142
        begin
143
                if (j <= 0) begin
144
                        B_calc = 0;
145
                end else begin
146
                        B_max = B_max_calc(N, R, M, dw_in);
147
                        if (j == 2 * N + 1) begin
148
                                B_calc = B_max - dw_out + 1;
149
                        end else begin
150
                                B_2Np1 = B_max - dw_out + 1;
151
                                F_sq_j = F_sq_calc(j, N, R, M);
152
                                F_sq_2Np1 = F_sq_calc(2 * N + 1, N, R, M);
153
                                sigma_T_2Np1_sq = (128'b1 << (2 * B_2Np1)) * F_sq_2Np1 / 12;
154
                                B_exp_real = (sigma_T_2Np1_sq / F_sq_j * 6 / N);
155
                                B_out = flog2_l(B_exp_real) / 2;
156
                                B_calc = B_out;
157
                        end
158
                end
159
        end
160
endfunction
161
 
162
`endif
163
 

powered by: WebSVN 2.1.0

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