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] - Diff between revs 5 and 7

Show entire file | Details | Blame | View Log

Rev 5 Rev 7
Line 4... Line 4...
 * library with functions for calculating parameters for CIC filter and Hogenauer pruning
 * library with functions for calculating parameters for CIC filter and Hogenauer pruning
 */
 */
`ifndef _CIC_FUNCTIONS_VH_
`ifndef _CIC_FUNCTIONS_VH_
`define _CIC_FUNCTIONS_VH_
`define _CIC_FUNCTIONS_VH_
`define M_PI 3.14159265359      // not all simulator defines PI 
`define M_PI 3.14159265359      // not all simulator defines PI 
/*********************************************************************************************/
 
function reg unsigned [127 : 0] nchoosek;        ///< Binomial coefficient
function reg unsigned [127 : 0] nchoosek;        ///< Binomial coefficient
        input   integer n;
        input   integer n;
        input   integer k;
        input   integer k;
        reg unsigned [127:0] tmp;
        reg unsigned [127:0] tmp;
        integer i;
        integer i;
Line 17... Line 17...
                for (i = 1; i <= (n - k); i = i + 1)
                for (i = 1; i <= (n - k); i = i + 1)
                        tmp = tmp * (k + i) / i;
                        tmp = tmp * (k + i) / i;
                nchoosek = tmp;
                nchoosek = tmp;
        end
        end
endfunction
endfunction
/*********************************************************************************************/
 
function integer clog2_l;
function integer clog2_l;
        input reg unsigned [127:0] depth;
        input reg unsigned [127:0] depth;
        reg unsigned [127:0] i;
        reg unsigned [127:0] i;
        begin
        begin
                clog2_l = 0;
                clog2_l = 0;
Line 31... Line 31...
                                i = i >> 1;
                                i = i >> 1;
                end else
                end else
                        clog2_l = -1;
                        clog2_l = -1;
        end
        end
endfunction
endfunction
/*********************************************************************************************/
 
function integer B_max_calc;
function integer B_max_calc;
        input integer N;
        input integer N;
        input integer R;
        input integer R;
        input integer M;
        input integer M;
        input integer INP_DW;
        input integer INP_DW;
        reg unsigned [127:0] RMpN;
        reg unsigned [127:0] RMpN;
        begin
        begin
                RMpN = (R * M) ** N;
                RMpN = (R * M) ** N;
                B_max_calc = clog2_l(RMpN) + INP_DW - 1;
                B_max_calc = clog2_l(RMpN) + INP_DW - 1;
 
                //$display("B_max_calc: N=%2d, R=%2d, M=%2d, ret=%2d", N, R, M, B_max_calc);
        end
        end
endfunction
endfunction
/*********************************************************************************************/
 
function integer B_out_calc;
function integer B_out_calc;
        input integer N;
        input integer N;
        input integer R;
        input integer R;
        input integer M;
        input integer M;
        input integer INP_DW;
        input integer INP_DW;
        input integer OUT_DW;
        input integer OUT_DW;
        begin
        begin
                B_out_calc = B_max_calc(N, R, M, OUT_DW) - B(2 * N, R, M, N, INP_DW, OUT_DW) + 1;
                B_out_calc = B_max_calc(N, R, M, OUT_DW) - B_calc(2 * N, N, R, M, INP_DW, OUT_DW) + 1;
        end
        end
endfunction
endfunction
/*********************************************************************************************/
 
 
 
function integer flog2_l;
function integer flog2_l;
        input reg unsigned [127:0] depth;
        input reg unsigned [127:0] depth;
        reg unsigned [127:0] i;
        reg unsigned [127:0] i;
        begin
        begin
                i = depth;
                i = depth;
                for(flog2_l = 0; i > 1; flog2_l = flog2_l + 1)
                for(flog2_l = 0; i > 1; flog2_l = flog2_l + 1)
                        i = i >> 1;
                        i = i >> 1;
        end
        end
endfunction
endfunction
/*********************************************************************************************/
 
function reg signed [127:0] h;
 
 
function reg signed [127:0] h_calc;
        input   integer j;
        input   integer j;
        input   integer k;
        input   integer k;
 
        input   integer N;
        input   integer R;
        input   integer R;
        input   integer M;
        input   integer M;
        input   integer N;
 
        integer c_stop;
        integer c_stop;
        integer i;
        integer i;
        reg signed [127:0] tmp;
        reg signed [127:0] tmp;
        reg signed [127:0] prod_1;
        reg signed [127:0] prod_1;
        reg signed [127:0] prod_2;
        reg signed [127:0] prod_2;
Line 93... Line 96...
                end
                end
                else begin
                else begin
                        tmp = nchoosek(2 * N + 1 - j, k);
                        tmp = nchoosek(2 * N + 1 - j, k);
                        if (k % 2) tmp = -tmp;
                        if (k % 2) tmp = -tmp;
                end
                end
                h = tmp;
                h_calc = tmp;
        end
        end
endfunction
endfunction
/*********************************************************************************************/
 
function reg signed [127:0] F_sq;        ///< F()**2
function reg signed [127:0] F_sq_calc;   ///< F()**2
        input   integer j;
        input   integer j;
 
        input   integer N;
        input   integer R;
        input   integer R;
        input   integer M;
        input   integer M;
        input   integer N;
 
        integer c_stop;
        integer c_stop;
        reg signed [127:0] tmp;
        reg signed [127:0] tmp;
        integer i;
        integer i;
        reg signed [127:0] h_jk;
        reg signed [127:0] h_jk;
        begin
        begin
Line 113... Line 116...
                if (j <= N)
                if (j <= N)
                        c_stop = (((R * M -1 ) * N) + j - 1);
                        c_stop = (((R * M -1 ) * N) + j - 1);
                else
                else
                        c_stop = 2 * N + 1 - j;
                        c_stop = 2 * N + 1 - j;
                for (i = 0;i <= c_stop; i = i + 1) begin
                for (i = 0;i <= c_stop; i = i + 1) begin
                        h_jk = h(j, i, R, M, N);
                        h_jk = h_calc(j, i, N, R, M);
                        tmp = tmp + h_jk ** 2;
                        tmp = tmp + h_jk ** 2;
                end
                end
                F_sq = tmp;
                F_sq_calc = tmp;
        end
        end
endfunction
endfunction
/*********************************************************************************************/
 
function integer B;
function integer B_calc;
        input   integer j;
        input   integer j;
 
        input   integer N;
        input   integer R;
        input   integer R;
        input   integer M;
        input   integer M;
        input   integer N;
 
        input   integer dw_in;
        input   integer dw_in;
        input   integer dw_out;
        input   integer dw_out;
        integer B_max;
        integer B_max;
        reg signed [127:0] sigma_T_2Np1_sq;
        reg signed [127:0] sigma_T_2Np1_sq;
        reg signed [127:0] B_2Np1;
        reg signed [127:0] B_2Np1;
        reg signed [127:0] B_exp_real;
        reg signed [127:0] B_exp_real;
        integer B_out;
        integer B_out;
        reg signed [127:0] F_sq_j;
        reg signed [127:0] F_sq_j;
        reg signed [127:0] F_sq_2Np1;
        reg signed [127:0] F_sq_2Np1;
        begin
        begin
 
                if (j <= 0) begin
 
                        B_calc = 0;
 
                end else begin
                B_max = B_max_calc(N, R, M, dw_in);
                B_max = B_max_calc(N, R, M, dw_in);
                if (j == 2 * N + 1) begin
                if (j == 2 * N + 1) begin
                        B = B_max - dw_out + 1;
                                B_calc = B_max - dw_out + 1;
                end else begin
                end else begin
                        B_2Np1 = B_max - dw_out + 1;
                        B_2Np1 = B_max - dw_out + 1;
                        F_sq_j = F_sq(j, R, M, N);
                                F_sq_j = F_sq_calc(j, N, R, M);
                        F_sq_2Np1 = F_sq(2 * N + 1, R, M, N);
                                F_sq_2Np1 = F_sq_calc(2 * N + 1, N, R, M);
                        sigma_T_2Np1_sq = (128'b1 << (2 * B_2Np1)) * F_sq_2Np1 / 12;
                        sigma_T_2Np1_sq = (128'b1 << (2 * B_2Np1)) * F_sq_2Np1 / 12;
                        B_exp_real = (sigma_T_2Np1_sq / F_sq_j * 6 / N);
                        B_exp_real = (sigma_T_2Np1_sq / F_sq_j * 6 / N);
                        B_out = flog2_l(B_exp_real) / 2;
                        B_out = flog2_l(B_exp_real) / 2;
                        B = B_out;
                                B_calc = B_out;
 
                        end
                end
                end
        end
        end
endfunction
endfunction
/*********************************************************************************************/
 
 
 
`endif
`endif
 
 
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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