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 5

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 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
        end
47
endfunction
48
/*********************************************************************************************/
49
function integer B_out_calc;
50
        input integer N;
51
        input integer R;
52
        input integer M;
53
        input integer INP_DW;
54
        input integer OUT_DW;
55
        begin
56
                B_out_calc = B_max_calc(N, R, M, OUT_DW) - B(2 * N, R, M, N, INP_DW, OUT_DW) + 1;
57
        end
58
endfunction
59
/*********************************************************************************************/
60
function integer flog2_l;
61
        input reg unsigned [127:0] depth;
62
        reg unsigned [127:0] i;
63
        begin
64
                i = depth;
65
                for(flog2_l = 0; i > 1; flog2_l = flog2_l + 1)
66
                        i = i >> 1;
67
        end
68
endfunction
69
/*********************************************************************************************/
70
function reg signed [127:0] h;
71
        input   integer j;
72
        input   integer k;
73
        input   integer R;
74
        input   integer M;
75
        input   integer N;
76
        integer c_stop;
77
        integer i;
78
        reg signed [127:0] tmp;
79
        reg signed [127:0] prod_1;
80
        reg signed [127:0] prod_2;
81
        reg signed [127:0] summ;
82
        begin
83
                c_stop = k / (R * M);
84
                if ((j >= 1)&&( j<=N )) begin
85
                        tmp = 0;
86
                        for (i = 0; i <= c_stop; i = i + 1) begin
87
                                prod_1 = nchoosek(N, i);
88
                                prod_2 = nchoosek(N - j + k - R * M * i, k - R * M * i);
89
                                summ = prod_1 * prod_2;
90
                                if (i % 2) summ = -summ;
91
                                tmp = tmp + summ;
92
                        end
93
                end
94
                else begin
95
                        tmp = nchoosek(2 * N + 1 - j, k);
96
                        if (k % 2) tmp = -tmp;
97
                end
98
                h = tmp;
99
        end
100
endfunction
101
/*********************************************************************************************/
102
function reg signed [127:0] F_sq;        ///< F()**2
103
        input   integer j;
104
        input   integer R;
105
        input   integer M;
106
        input   integer N;
107
        integer c_stop;
108
        reg signed [127:0] tmp;
109
        integer i;
110
        reg signed [127:0] h_jk;
111
        begin
112
                tmp = 0;
113
                if (j <= N)
114
                        c_stop = (((R * M -1 ) * N) + j - 1);
115
                else
116
                        c_stop = 2 * N + 1 - j;
117
                for (i = 0;i <= c_stop; i = i + 1) begin
118
                        h_jk = h(j, i, R, M, N);
119
                        tmp = tmp + h_jk ** 2;
120
                end
121
                F_sq = tmp;
122
        end
123
endfunction
124
/*********************************************************************************************/
125
function integer B;
126
        input   integer j;
127
        input   integer R;
128
        input   integer M;
129
        input   integer N;
130
        input   integer dw_in;
131
        input   integer dw_out;
132
        integer B_max;
133
        reg signed [127:0] sigma_T_2Np1_sq;
134
        reg signed [127:0] B_2Np1;
135
        reg signed [127:0] B_exp_real;
136
        integer B_out;
137
        reg signed [127:0] F_sq_j;
138
        reg signed [127:0] F_sq_2Np1;
139
        begin
140
                B_max = B_max_calc(N, R, M, dw_in);
141
                if (j == 2 * N + 1) begin
142
                        B = B_max - dw_out + 1;
143
                end else begin
144
                        B_2Np1 = B_max - dw_out + 1;
145
                        F_sq_j = F_sq(j, R, M, N);
146
                        F_sq_2Np1 = F_sq(2 * N + 1, R, M, N);
147
                        sigma_T_2Np1_sq = (128'b1 << (2 * B_2Np1)) * F_sq_2Np1 / 12;
148
                        B_exp_real = (sigma_T_2Np1_sq / F_sq_j * 6 / N);
149
                        B_out = flog2_l(B_exp_real) / 2;
150
                        B = B_out;
151
                end
152
        end
153
endfunction
154
/*********************************************************************************************/
155
 
156
`endif
157
 

powered by: WebSVN 2.1.0

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