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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [rtl/] [fpUnit/] [fpRes.v] - Blame information for rev 51

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 51 robfinch
/* ===============================================================
2
        (C) 2006  Robert Finch
3
        All rights reserved.
4
        rob@birdcomputer.ca
5
 
6
        fpRes.v
7
                - floating point reciprocal estimate
8
                - zero clock cycle latency
9
                - IEEE 754 representation
10
 
11
        This source code is free for use and modification for
12
        non-commercial or evaluation purposes, provided this
13
        copyright statement and disclaimer remains present in
14
        the file.
15
 
16
        If the code is modified, please state the origin and
17
        note that the code has been modified.
18
 
19
        NO WARRANTY.
20
        THIS Work, IS PROVIDEDED "AS IS" WITH NO WARRANTIES OF
21
        ANY KIND, WHETHER EXPRESS OR IMPLIED. The user must assume
22
        the entire risk of using the Work.
23
 
24
        IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
25
        ANY INCIDENTAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES
26
        WHATSOEVER RELATING TO THE USE OF THIS WORK, OR YOUR
27
        RELATIONSHIP WITH THE AUTHOR.
28
 
29
        IN ADDITION, IN NO EVENT DOES THE AUTHOR AUTHORIZE YOU
30
        TO USE THE WORK IN APPLICATIONS OR SYSTEMS WHERE THE
31
        WORK'S FAILURE TO PERFORM CAN REASONABLY BE EXPECTED
32
        TO RESULT IN A SIGNIFICANT PHYSICAL INJURY, OR IN LOSS
33
        OF LIFE. ANY SUCH USE BY YOU IS ENTIRELY AT YOUR OWN RISK,
34
        AND YOU AGREE TO HOLD THE AUTHOR AND CONTRIBUTORS HARMLESS
35
        FROM ANY CLAIMS OR LOSSES RELATING TO SUCH UNAUTHORIZED
36
        USE.
37
 
38
        This multiplier/divider handles denormalized numbers.
39
        The output format is of an internal expanded representation
40
        in preparation to be fed into a normalization unit, then
41
        rounding. Basically, it's the same as the regular format
42
        except the mantissa is doubled in size, the leading two
43
        bits of which are assumed to be whole bits.
44
 
45
 
46
        Floating Point Reciprocal Estimator
47
 
48
        - to estimate the reciprocal
49
        - negate the exponent
50
        - lookup the reciprocal of the fraction
51
        - NaN's are not altered
52
 
53
        Ref: Webpack8.1i Spartan3-4 xc3s1000-4ft256
54
=============================================================== */
55
 
56
module fpRes
57
#(      parameter WID=32)
58
(
59
        input [WID:1] i,
60
        input [WID:1] o
61
);
62
//      parameter WID = 32;
63
        localparam MSB = WID-1;
64
        localparam EMSB = WID==80 ? 14 : WID==64 ? 10 : WID==48 ? 10 : WID==42 ? 10 : WID==40 ?  9 : WID==32 ?  7 : WID==24 ?  6 : 4;
65
        localparam FMSB = WID==80 ? 63 : WID==64 ? 51 : WID==48 ? 35 : WID==42 ? 29 : WID==40 ? 28 : WID==32 ? 22 : WID==24 ? 15 : 9;
66
        localparam LSB = FMSB >= 32 ? 0 : WID-FMSB;      // only the first 32 bits are in the table
67
 
68
        // Decompose the operands
69
        wire sa;                        // sign bit
70
        wire [EMSB:0] exp;       // exponent bits
71
        wire [FMSB+1:0] fract;
72
        wire inf;
73
        wire nan;
74
        reg [WID+1:1] recip;
75
        // an extra '1' is added as it is used during negation of exponent
76
        wire [2:0] expInc = recip[31] ? 1 : recip[30] ? 2 : recip[29] ? 3 : recip[28] ? 4 : 5;
77
 
78
        fpDecomp #(WID) u1 (.i(a), .sgn(sa), .exp(exp), .fract(fract), .inf(inf), .nan(nan) );
79
 
80
        assign o =      nan ? i :                                       // nan's are not converted
81
                                inf ? {sa,{WID-1{1'b0}}} :      // reciprocal of infinity is zero
82
                                {sa,~(exp+expInc),recip[31:LSB]<<expInc};
83
 
84
        // estimate 1/d 8-bit accuracy
85
        always @(fract)
86
                case(fract[FMSB+1:FMSB+1-7])
87
                8'd001: recip=32'h10000000;
88
                8'd002: recip=32'h80000000;
89
                8'd003: recip=32'h55555555;
90
                8'd004: recip=32'h40000000;
91
                8'd005: recip=32'h33333333;
92
                8'd006: recip=32'h2AAAAAAA;
93
                8'd007: recip=32'h24924924;
94
                8'd008: recip=32'h20000000;
95
                8'd009: recip=32'h1C71C71C;
96
                8'd010: recip=32'h19999999;
97
                8'd011: recip=32'h1745D174;
98
                8'd012: recip=32'h15555555;
99
                8'd013: recip=32'h13B13B13;
100
                8'd014: recip=32'h12492492;
101
                8'd015: recip=32'h11111111;
102
                8'd016: recip=32'h10000000;
103
                8'd017: recip=32'hF0F0F0F;
104
                8'd018: recip=32'hE38E38E;
105
                8'd019: recip=32'hD79435E;
106
                8'd020: recip=32'hCCCCCCC;
107
                8'd021: recip=32'hC30C30C;
108
                8'd022: recip=32'hBA2E8BA;
109
                8'd023: recip=32'hB21642C;
110
                8'd024: recip=32'hAAAAAAA;
111
                8'd025: recip=32'hA3D70A3;
112
                8'd026: recip=32'h9D89D89;
113
                8'd027: recip=32'h97B425E;
114
                8'd028: recip=32'h9249249;
115
                8'd029: recip=32'h8D3DCB0;
116
                8'd030: recip=32'h8888888;
117
                8'd031: recip=32'h8421084;
118
                8'd032: recip=32'h8000000;
119
                8'd033: recip=32'h7C1F07C;
120
                8'd034: recip=32'h7878787;
121
                8'd035: recip=32'h7507507;
122
                8'd036: recip=32'h71C71C7;
123
                8'd037: recip=32'h6EB3E45;
124
                8'd038: recip=32'h6BCA1AF;
125
                8'd039: recip=32'h6906906;
126
                8'd040: recip=32'h6666666;
127
                8'd041: recip=32'h63E7063;
128
                8'd042: recip=32'h6186186;
129
                8'd043: recip=32'h5F417D0;
130
                8'd044: recip=32'h5D1745D;
131
                8'd045: recip=32'h5B05B05;
132
                8'd046: recip=32'h590B216;
133
                8'd047: recip=32'h572620A;
134
                8'd048: recip=32'h5555555;
135
                8'd049: recip=32'h5397829;
136
                8'd050: recip=32'h51EB851;
137
                8'd051: recip=32'h5050505;
138
                8'd052: recip=32'h4EC4EC4;
139
                8'd053: recip=32'h4D4873E;
140
                8'd054: recip=32'h4BDA12F;
141
                8'd055: recip=32'h4A7904A;
142
                8'd056: recip=32'h4924924;
143
                8'd057: recip=32'h47DC11F;
144
                8'd058: recip=32'h469EE58;
145
                8'd059: recip=32'h456C797;
146
                8'd060: recip=32'h4444444;
147
                8'd061: recip=32'h4325C53;
148
                8'd062: recip=32'h4210842;
149
                8'd063: recip=32'h4104104;
150
                8'd064: recip=32'h4000000;
151
                8'd065: recip=32'h3F03F03;
152
                8'd066: recip=32'h3E0F83E;
153
                8'd067: recip=32'h3D22635;
154
                8'd068: recip=32'h3C3C3C3;
155
                8'd069: recip=32'h3B5CC0E;
156
                8'd070: recip=32'h3A83A83;
157
                8'd071: recip=32'h39B0AD1;
158
                8'd072: recip=32'h38E38E3;
159
                8'd073: recip=32'h381C0E0;
160
                8'd074: recip=32'h3759F22;
161
                8'd075: recip=32'h369D036;
162
                8'd076: recip=32'h35E50D7;
163
                8'd077: recip=32'h3531DEC;
164
                8'd078: recip=32'h3483483;
165
                8'd079: recip=32'h33D91D2;
166
                8'd080: recip=32'h3333333;
167
                8'd081: recip=32'h329161F;
168
                8'd082: recip=32'h31F3831;
169
                8'd083: recip=32'h3159721;
170
                8'd084: recip=32'h30C30C3;
171
                8'd085: recip=32'h3030303;
172
                8'd086: recip=32'h2FA0BE8;
173
                8'd087: recip=32'h2F14990;
174
                8'd088: recip=32'h2E8BA2E;
175
                8'd089: recip=32'h2E05C0B;
176
                8'd090: recip=32'h2D82D82;
177
                8'd091: recip=32'h2D02D02;
178
                8'd092: recip=32'h2C8590B;
179
                8'd093: recip=32'h2C0B02C;
180
                8'd094: recip=32'h2B93105;
181
                8'd095: recip=32'h2B1DA46;
182
                8'd096: recip=32'h2AAAAAA;
183
                8'd097: recip=32'h2A3A0FD;
184
                8'd098: recip=32'h29CBC14;
185
                8'd099: recip=32'h295FAD4;
186
                8'd100: recip=32'h28F5C28;
187
                8'd101: recip=32'h288DF0C;
188
                8'd102: recip=32'h2828282;
189
                8'd103: recip=32'h27C4597;
190
                8'd104: recip=32'h2762762;
191
                8'd105: recip=32'h2702702;
192
                8'd106: recip=32'h26A439F;
193
                8'd107: recip=32'h2647C69;
194
                8'd108: recip=32'h25ED097;
195
                8'd109: recip=32'h2593F69;
196
                8'd110: recip=32'h253C825;
197
                8'd111: recip=32'h24E6A17;
198
                8'd112: recip=32'h2492492;
199
                8'd113: recip=32'h243F6F0;
200
                8'd114: recip=32'h23EE08F;
201
                8'd115: recip=32'h239E0D5;
202
                8'd116: recip=32'h234F72C;
203
                8'd117: recip=32'h2302302;
204
                8'd118: recip=32'h22B63CB;
205
                8'd119: recip=32'h226B902;
206
                8'd120: recip=32'h2222222;
207
                8'd121: recip=32'h21D9EAD;
208
                8'd122: recip=32'h2192E29;
209
                8'd123: recip=32'h214D021;
210
                8'd124: recip=32'h2108421;
211
                8'd125: recip=32'h20C49BA;
212
                8'd126: recip=32'h2082082;
213
                8'd127: recip=32'h2040810;
214
                8'd128: recip=32'h2000000;
215
                8'd129: recip=32'h1FC07F0;
216
                8'd130: recip=32'h1F81F81;
217
                8'd131: recip=32'h1F44659;
218
                8'd132: recip=32'h1F07C1F;
219
                8'd133: recip=32'h1ECC07B;
220
                8'd134: recip=32'h1E9131A;
221
                8'd135: recip=32'h1E573AC;
222
                8'd136: recip=32'h1E1E1E1;
223
                8'd137: recip=32'h1DE5D6E;
224
                8'd138: recip=32'h1DAE607;
225
                8'd139: recip=32'h1D77B65;
226
                8'd140: recip=32'h1D41D41;
227
                8'd141: recip=32'h1D0CB58;
228
                8'd142: recip=32'h1CD8568;
229
                8'd143: recip=32'h1CA4B30;
230
                8'd144: recip=32'h1C71C71;
231
                8'd145: recip=32'h1C3F8F0;
232
                8'd146: recip=32'h1C0E070;
233
                8'd147: recip=32'h1BDD2B8;
234
                8'd148: recip=32'h1BACF91;
235
                8'd149: recip=32'h1B7D6C3;
236
                8'd150: recip=32'h1B4E81B;
237
                8'd151: recip=32'h1B20364;
238
                8'd152: recip=32'h1AF286B;
239
                8'd153: recip=32'h1AC5701;
240
                8'd154: recip=32'h1A98EF6;
241
                8'd155: recip=32'h1A6D01A;
242
                8'd156: recip=32'h1A41A41;
243
                8'd157: recip=32'h1A16D3F;
244
                8'd158: recip=32'h19EC8E9;
245
                8'd159: recip=32'h19C2D14;
246
                8'd160: recip=32'h1999999;
247
                8'd161: recip=32'h1970E4F;
248
                8'd162: recip=32'h1948B0F;
249
                8'd163: recip=32'h1920FB4;
250
                8'd164: recip=32'h18F9C18;
251
                8'd165: recip=32'h18D3018;
252
                8'd166: recip=32'h18ACB90;
253
                8'd167: recip=32'h1886E5F;
254
                8'd168: recip=32'h1861861;
255
                8'd169: recip=32'h183C977;
256
                8'd170: recip=32'h1818181;
257
                8'd171: recip=32'h17F405F;
258
                8'd172: recip=32'h17D05F4;
259
                8'd173: recip=32'h17AD220;
260
                8'd174: recip=32'h178A4C8;
261
                8'd175: recip=32'h1767DCE;
262
                8'd176: recip=32'h1745D17;
263
                8'd177: recip=32'h1724287;
264
                8'd178: recip=32'h1702E05;
265
                8'd179: recip=32'h16E1F76;
266
                8'd180: recip=32'h16C16C1;
267
                8'd181: recip=32'h16A13CD;
268
                8'd182: recip=32'h1681681;
269
                8'd183: recip=32'h1661EC6;
270
                8'd184: recip=32'h1642C85;
271
                8'd185: recip=32'h1623FA7;
272
                8'd186: recip=32'h1605816;
273
                8'd187: recip=32'h15E75BB;
274
                8'd188: recip=32'h15C9882;
275
                8'd189: recip=32'h15AC056;
276
                8'd190: recip=32'h158ED23;
277
                8'd191: recip=32'h1571ED3;
278
                8'd192: recip=32'h1555555;
279
                8'd193: recip=32'h1539094;
280
                8'd194: recip=32'h151D07E;
281
                8'd195: recip=32'h1501501;
282
                8'd196: recip=32'h14E5E0A;
283
                8'd197: recip=32'h14CAB88;
284
                8'd198: recip=32'h14AFD6A;
285
                8'd199: recip=32'h149539E;
286
                8'd200: recip=32'h147AE14;
287
                8'd201: recip=32'h1460CBC;
288
                8'd202: recip=32'h1446F86;
289
                8'd203: recip=32'h142D662;
290
                8'd204: recip=32'h1414141;
291
                8'd205: recip=32'h13FB013;
292
                8'd206: recip=32'h13E22CB;
293
                8'd207: recip=32'h13C995A;
294
                8'd208: recip=32'h13B13B1;
295
                8'd209: recip=32'h13991C2;
296
                8'd210: recip=32'h1381381;
297
                8'd211: recip=32'h13698DF;
298
                8'd212: recip=32'h13521CF;
299
                8'd213: recip=32'h133AE45;
300
                8'd214: recip=32'h1323E34;
301
                8'd215: recip=32'h130D190;
302
                8'd216: recip=32'h12F684B;
303
                8'd217: recip=32'h12E025C;
304
                8'd218: recip=32'h12C9FB4;
305
                8'd219: recip=32'h12B404A;
306
                8'd220: recip=32'h129E412;
307
                8'd221: recip=32'h1288B01;
308
                8'd222: recip=32'h127350B;
309
                8'd223: recip=32'h125E227;
310
                8'd224: recip=32'h1249249;
311
                8'd225: recip=32'h1234567;
312
                8'd226: recip=32'h121FB78;
313
                8'd227: recip=32'h120B470;
314
                8'd228: recip=32'h11F7047;
315
                8'd229: recip=32'h11E2EF3;
316
                8'd230: recip=32'h11CF06A;
317
                8'd231: recip=32'h11BB4A4;
318
                8'd232: recip=32'h11A7B96;
319
                8'd233: recip=32'h1194538;
320
                8'd234: recip=32'h1181181;
321
                8'd235: recip=32'h116E068;
322
                8'd236: recip=32'h115B1E5;
323
                8'd237: recip=32'h11485F0;
324
                8'd238: recip=32'h1135C81;
325
                8'd239: recip=32'h112358E;
326
                8'd240: recip=32'h1111111;
327
                8'd241: recip=32'h10FEF01;
328
                8'd242: recip=32'h10ECF56;
329
                8'd243: recip=32'h10DB20A;
330
                8'd244: recip=32'h10C9714;
331
                8'd245: recip=32'h10B7E6E;
332
                8'd246: recip=32'h10A6810;
333
                8'd247: recip=32'h10953F3;
334
                8'd248: recip=32'h1084210;
335
                8'd249: recip=32'h1073260;
336
                8'd250: recip=32'h10624DD;
337
                8'd251: recip=32'h105197F;
338
                8'd252: recip=32'h1041041;
339
                8'd253: recip=32'h103091B;
340
                8'd254: recip=32'h1020408;
341
                8'd255: recip=32'h1010101;
342
                endcase
343
 
344
endmodule
345
 
346
 

powered by: WebSVN 2.1.0

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