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

Subversion Repositories pipelined_fixed_point_elementary_functions

[/] [pipelined_fixed_point_elementary_functions/] [trunk/] [math_pipelined/] [exp_pipelined.sv] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 leshabiruk
 
2
module exp_pipelined(
3
        input clk,
4
        input signed [ARG_HIGH+ ARG_LOW-1:0] ix,
5
        output [RES_HIGH+ RES_LOW-1:0] oexp
6
        );
7
 
8
parameter ARG_HIGH= 4;
9
parameter ARG_LOW= 16;
10
parameter ARG_GUARD= 0;
11
 
12
parameter RES_HIGH= 16;
13
parameter RES_LOW= 16;
14
parameter RES_GUARD= 0;
15
 
16
//      Внутренние константы, не переопределять.
17
parameter A_BITS= ARG_HIGH+ ARG_LOW+ ARG_GUARD;
18
parameter A_UP= A_BITS-1;
19
 
20
parameter R_BITS= RES_HIGH+ RES_LOW+ RES_GUARD;
21
parameter STEPS= RES_HIGH+ RES_LOW;
22
parameter R_UP= R_BITS-1;
23
 
24
bit [A_UP:0] x [STEPS:0];
25
bit [R_UP:0] bexp [STEPS:0];
26
 
27
assign oexp= bexp[STEPS]>>RES_GUARD;
28
 
29
`define LN2x64 (64'hB17217F7D1CF79AB)
30
wire signed [63:0] C_LN_10001 [63:0];   //      Ln(1+1/2^x)
31
 
32
always @( posedge clk )
33
begin
34
        integer ind;
35
 
36
        x[0]<= ix<<
37
        bexp[0]<= 64'h1<<(RES_LOW+RES_GUARD);
38
        for (ind=0; ind
39
        begin
40
                if ( x[ind]>(`LN2x64>>( 64-A_BITS+ind )) )
41
                begin
42
                        x [ind+1]<= x[ind] - (`LN2x64>>( 64-A_BITS+ind ));
43
                        bexp[ind+1]<= bexp[ind]<<(64'h1<<(ARG_HIGH-ind-1));
44
                end
45
                else
46
                begin
47
                        x [ind+1]<= x [ind];
48
                        bexp[ind+1]<= bexp[ind];
49
                end
50
        end
51
        for (ind=ARG_HIGH; ind
52
        begin
53
                if ( x[ind]>(C_LN_10001[ind-ARG_HIGH]>>( 67-A_BITS )) )
54
                begin
55
                        x [ind+1]<= x[ind] - (C_LN_10001[ind-ARG_HIGH]>>( 67-A_BITS ));
56
                        bexp[ind+1]<= bexp[ind] + (bexp[ind]>>(ind-ARG_HIGH+1));
57
                end
58
                else
59
                begin
60
                        x [ind+1]<= x [ind];
61
                        bexp[ind+1]<= bexp[ind];
62
                end
63
        end
64
end
65
 
66
//      for ( i=0; i<64; i++){
67
//              double dval= log(1+1./pow(2.,1+i)) * pow(2.,64.); //((long long)1 << i);
68
//              unsigned long long val= i>30 ? 1ull<<(63-i) :dval;
69
//              cout << "assign C_LN_10001[" << dec << i << "]= 64'h" << hex << val << ";" << endl;
70
//      }
71
 
72
assign C_LN_10001[0]= 64'h67cc8fb2fe613000;//   Точность первых понижена!
73
assign C_LN_10001[1]= 64'h391fef8f35344400;
74
assign C_LN_10001[2]= 64'h1e27076e2af2e600;
75
assign C_LN_10001[3]= 64'hf85186008b15300;
76
assign C_LN_10001[4]= 64'h7e0a6c39e0cc000;
77
assign C_LN_10001[5]= 64'h3f815161f807c80;
78
assign C_LN_10001[6]= 64'h1fe02a6b1067890;
79
assign C_LN_10001[7]= 64'hff805515885e00;
80
assign C_LN_10001[8]= 64'h7fe00aa6ac4398;
81
assign C_LN_10001[9]= 64'h3ff80155156220;
82
assign C_LN_10001[10]= 64'h1ffe002aa6ab11;
83
assign C_LN_10001[11]= 64'hfff8005551558;
84
assign C_LN_10001[12]= 64'h7ffe000aaa6aa;
85
assign C_LN_10001[13]= 64'h3fff800155515;
86
assign C_LN_10001[14]= 64'h1fffe0002aaa6;
87
assign C_LN_10001[15]= 64'hffff80005555;
88
assign C_LN_10001[16]= 64'h7fffe0000aaa;
89
assign C_LN_10001[17]= 64'h3ffff8000155;
90
assign C_LN_10001[18]= 64'h1ffffe00002a;
91
assign C_LN_10001[19]= 64'hfffff800005;
92
assign C_LN_10001[20]= 64'h7ffffe00000;
93
assign C_LN_10001[21]= 64'h3fffff80000;
94
assign C_LN_10001[22]= 64'h1fffffe0000;
95
assign C_LN_10001[23]= 64'hffffff8000;
96
assign C_LN_10001[24]= 64'h7fffffe000;
97
assign C_LN_10001[25]= 64'h3ffffff800;
98
assign C_LN_10001[26]= 64'h1ffffffe00;
99
assign C_LN_10001[27]= 64'hfffffff80;
100
assign C_LN_10001[28]= 64'h7ffffffe0;
101
assign C_LN_10001[29]= 64'h3fffffff8;
102
assign C_LN_10001[30]= 64'h1fffffffe;
103
assign C_LN_10001[31]= 64'h100000000;
104
assign C_LN_10001[32]= 64'h80000000;
105
assign C_LN_10001[33]= 64'h40000000;
106
assign C_LN_10001[34]= 64'h20000000;
107
assign C_LN_10001[35]= 64'h10000000;
108
assign C_LN_10001[36]= 64'h8000000;
109
assign C_LN_10001[37]= 64'h4000000;
110
assign C_LN_10001[38]= 64'h2000000;
111
assign C_LN_10001[39]= 64'h1000000;
112
assign C_LN_10001[40]= 64'h800000;
113
assign C_LN_10001[41]= 64'h400000;
114
assign C_LN_10001[42]= 64'h200000;
115
assign C_LN_10001[43]= 64'h100000;
116
assign C_LN_10001[44]= 64'h80000;
117
assign C_LN_10001[45]= 64'h40000;
118
assign C_LN_10001[46]= 64'h20000;
119
assign C_LN_10001[47]= 64'h10000;
120
assign C_LN_10001[48]= 64'h8000;
121
assign C_LN_10001[49]= 64'h4000;
122
assign C_LN_10001[50]= 64'h2000;
123
assign C_LN_10001[51]= 64'h1000;
124
assign C_LN_10001[52]= 64'h800;
125
assign C_LN_10001[53]= 64'h400;
126
assign C_LN_10001[54]= 64'h200;
127
assign C_LN_10001[55]= 64'h100;
128
assign C_LN_10001[56]= 64'h80;
129
assign C_LN_10001[57]= 64'h40;
130
assign C_LN_10001[58]= 64'h20;
131
assign C_LN_10001[59]= 64'h10;
132
assign C_LN_10001[60]= 64'h8;
133
assign C_LN_10001[61]= 64'h4;
134
assign C_LN_10001[62]= 64'h2;
135
assign C_LN_10001[63]= 64'h1;
136
 
137
endmodule
138
 
139
 

powered by: WebSVN 2.1.0

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