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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [rtl/] [lib/] [cntlz.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 robfinch
/* ===============================================================
2
        (C) 2006  Robert Finch
3
        All rights reserved.
4
        rob@birdcomputer.ca
5
 
6
        cntlz.v
7
                - count number of leading zeros in a byte
8
                - count number of leading ones in a byte
9
                - simple fast approach - lookup table
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
        Ref: Webpack 8.1i Spartan3-4 xc3s1000-4ft256
39
        11 LUTs / 6 slices / 12.2 ns
40
 
41
=============================================================== */
42
 
43
module cntlz8(
44
        input [7:0] i,
45
        output reg [3:0] o
46
);
47
 
48
        always @(i)
49
                case (i)
50
                8'b00000000:    o = 8;
51
                8'b00000001:    o = 7;
52
                8'b00000010:    o = 6;
53
                8'b00000011:    o = 6;
54
                8'b00000100:    o = 5;
55
                8'b00000101:    o = 5;
56
                8'b00000110:    o = 5;
57
                8'b00000111:    o = 5;
58
                8'b00001000:    o = 4;
59
                8'b00001001:    o = 4;
60
                8'b00001010:    o = 4;
61
                8'b00001011:    o = 4;
62
                8'b00001100:    o = 4;
63
                8'b00001101:    o = 4;
64
                8'b00001110:    o = 4;
65
                8'b00001111:    o = 4;
66
 
67
                8'b00010000:    o = 3;
68
                8'b00010001:    o = 3;
69
                8'b00010010:    o = 3;
70
                8'b00010011:    o = 3;
71
                8'b00010100:    o = 3;
72
                8'b00010101:    o = 3;
73
                8'b00010110:    o = 3;
74
                8'b00010111:    o = 3;
75
                8'b00011000:    o = 3;
76
                8'b00011001:    o = 3;
77
                8'b00011010:    o = 3;
78
                8'b00011011:    o = 3;
79
                8'b00011100:    o = 3;
80
                8'b00011101:    o = 3;
81
                8'b00011110:    o = 3;
82
                8'b00011111:    o = 3;
83
 
84
                8'b00100000:    o = 2;
85
                8'b00100001:    o = 2;
86
                8'b00100010:    o = 2;
87
                8'b00100011:    o = 2;
88
                8'b00100100:    o = 2;
89
                8'b00100101:    o = 2;
90
                8'b00100110:    o = 2;
91
                8'b00100111:    o = 2;
92
                8'b00101000:    o = 2;
93
                8'b00101001:    o = 2;
94
                8'b00101010:    o = 2;
95
                8'b00101011:    o = 2;
96
                8'b00101100:    o = 2;
97
                8'b00101101:    o = 2;
98
                8'b00101110:    o = 2;
99
                8'b00101111:    o = 2;
100
 
101
                8'b00110000:    o = 2;
102
                8'b00110001:    o = 2;
103
                8'b00110010:    o = 2;
104
                8'b00110011:    o = 2;
105
                8'b00110100:    o = 2;
106
                8'b00110101:    o = 2;
107
                8'b00110110:    o = 2;
108
                8'b00110111:    o = 2;
109
                8'b00111000:    o = 2;
110
                8'b00111001:    o = 2;
111
                8'b00111010:    o = 2;
112
                8'b00111011:    o = 2;
113
                8'b00111100:    o = 2;
114
                8'b00111101:    o = 2;
115
                8'b00111110:    o = 2;
116
                8'b00111111:    o = 2;
117
 
118
                // 44 - 1       
119
                8'b01000000:    o = 1;
120
                8'b01000001:    o = 1;
121
                8'b01000010:    o = 1;
122
                8'b01000011:    o = 1;
123
                8'b01000100:    o = 1;
124
                8'b01000101:    o = 1;
125
                8'b01000110:    o = 1;
126
                8'b01000111:    o = 1;
127
                8'b01001000:    o = 1;
128
                8'b01001001:    o = 1;
129
                8'b01001010:    o = 1;
130
                8'b01001011:    o = 1;
131
                8'b01001100:    o = 1;
132
                8'b01001101:    o = 1;
133
                8'b01001110:    o = 1;
134
                8'b01001111:    o = 1;
135
 
136
                8'b01010000:    o = 1;
137
                8'b01010001:    o = 1;
138
                8'b01010010:    o = 1;
139
                8'b01010011:    o = 1;
140
                8'b01010100:    o = 1;
141
                8'b01010101:    o = 1;
142
                8'b01010110:    o = 1;
143
                8'b01010111:    o = 1;
144
                8'b01011000:    o = 1;
145
                8'b01011001:    o = 1;
146
                8'b01011010:    o = 1;
147
                8'b01011011:    o = 1;
148
                8'b01011100:    o = 1;
149
                8'b01011101:    o = 1;
150
                8'b01011110:    o = 1;
151
                8'b01011111:    o = 1;
152
 
153
                8'b01100000:    o = 1;
154
                8'b01100001:    o = 1;
155
                8'b01100010:    o = 1;
156
                8'b01100011:    o = 1;
157
                8'b01100100:    o = 1;
158
                8'b01100101:    o = 1;
159
                8'b01100110:    o = 1;
160
                8'b01100111:    o = 1;
161
                8'b01101000:    o = 1;
162
                8'b01101001:    o = 1;
163
                8'b01101010:    o = 1;
164
                8'b01101011:    o = 1;
165
                8'b01101100:    o = 1;
166
                8'b01101101:    o = 1;
167
                8'b01101110:    o = 1;
168
                8'b01101111:    o = 1;
169
 
170
                8'b01110000:    o = 1;
171
                8'b01110001:    o = 1;
172
                8'b01110010:    o = 1;
173
                8'b01110011:    o = 1;
174
                8'b01110100:    o = 1;
175
                8'b01110101:    o = 1;
176
                8'b01110110:    o = 1;
177
                8'b01110111:    o = 1;
178
                8'b01111000:    o = 1;
179
                8'b01111001:    o = 1;
180
                8'b01111010:    o = 1;
181
                8'b01111011:    o = 1;
182
                8'b01111100:    o = 1;
183
                8'b01111101:    o = 1;
184
                8'b01111110:    o = 1;
185
                8'b01111111:    o = 1;
186
 
187
                //  - 2 
188
                8'b10000000:    o = 0;
189
                8'b10000001:    o = 0;
190
                8'b10000010:    o = 0;
191
                8'b10000011:    o = 0;
192
                8'b10000100:    o = 0;
193
                8'b10000101:    o = 0;
194
                8'b10000110:    o = 0;
195
                8'b10000111:    o = 0;
196
                8'b10001000:    o = 0;
197
                8'b10001001:    o = 0;
198
                8'b10001010:    o = 0;
199
                8'b10001011:    o = 0;
200
                8'b10001100:    o = 0;
201
                8'b10001101:    o = 0;
202
                8'b10001110:    o = 0;
203
                8'b10001111:    o = 0;
204
 
205
                8'b10010000:    o = 0;
206
                8'b10010001:    o = 0;
207
                8'b10010010:    o = 0;
208
                8'b10010011:    o = 0;
209
                8'b10010100:    o = 0;
210
                8'b10010101:    o = 0;
211
                8'b10010110:    o = 0;
212
                8'b10010111:    o = 0;
213
                8'b10011000:    o = 0;
214
                8'b10011001:    o = 0;
215
                8'b10011010:    o = 0;
216
                8'b10011011:    o = 0;
217
                8'b10011100:    o = 0;
218
                8'b10011101:    o = 0;
219
                8'b10011110:    o = 0;
220
                8'b10011111:    o = 0;
221
 
222
                8'b10100000:    o = 0;
223
                8'b10100001:    o = 0;
224
                8'b10100010:    o = 0;
225
                8'b10100011:    o = 0;
226
                8'b10100100:    o = 0;
227
                8'b10100101:    o = 0;
228
                8'b10100110:    o = 0;
229
                8'b10100111:    o = 0;
230
                8'b10101000:    o = 0;
231
                8'b10101001:    o = 0;
232
                8'b10101010:    o = 0;
233
                8'b10101011:    o = 0;
234
                8'b10101100:    o = 0;
235
                8'b10101101:    o = 0;
236
                8'b10101110:    o = 0;
237
                8'b10101111:    o = 0;
238
 
239
                8'b10110000:    o = 0;
240
                8'b10110001:    o = 0;
241
                8'b10110010:    o = 0;
242
                8'b10110011:    o = 0;
243
                8'b10110100:    o = 0;
244
                8'b10110101:    o = 0;
245
                8'b10110110:    o = 0;
246
                8'b10110111:    o = 0;
247
                8'b10111000:    o = 0;
248
                8'b10111001:    o = 0;
249
                8'b10111010:    o = 0;
250
                8'b10111011:    o = 0;
251
                8'b10111100:    o = 0;
252
                8'b10111101:    o = 0;
253
                8'b10111110:    o = 0;
254
                8'b10111111:    o = 0;
255
 
256
                // 44 - 3       
257
                8'b11000000:    o = 0;
258
                8'b11000001:    o = 0;
259
                8'b11000010:    o = 0;
260
                8'b11000011:    o = 0;
261
                8'b11000100:    o = 0;
262
                8'b11000101:    o = 0;
263
                8'b11000110:    o = 0;
264
                8'b11000111:    o = 0;
265
                8'b11001000:    o = 0;
266
                8'b11001001:    o = 0;
267
                8'b11001010:    o = 0;
268
                8'b11001011:    o = 0;
269
                8'b11001100:    o = 0;
270
                8'b11001101:    o = 0;
271
                8'b11001110:    o = 0;
272
                8'b11001111:    o = 0;
273
 
274
                8'b11010000:    o = 0;
275
                8'b11010001:    o = 0;
276
                8'b11010010:    o = 0;
277
                8'b11010011:    o = 0;
278
                8'b11010100:    o = 0;
279
                8'b11010101:    o = 0;
280
                8'b11010110:    o = 0;
281
                8'b11010111:    o = 0;
282
                8'b11011000:    o = 0;
283
                8'b11011001:    o = 0;
284
                8'b11011010:    o = 0;
285
                8'b11011011:    o = 0;
286
                8'b11011100:    o = 0;
287
                8'b11011101:    o = 0;
288
                8'b11011110:    o = 0;
289
                8'b11011111:    o = 0;
290
 
291
                8'b11100000:    o = 0;
292
                8'b11100001:    o = 0;
293
                8'b11100010:    o = 0;
294
                8'b11100011:    o = 0;
295
                8'b11100100:    o = 0;
296
                8'b11100101:    o = 0;
297
                8'b11100110:    o = 0;
298
                8'b11100111:    o = 0;
299
                8'b11101000:    o = 0;
300
                8'b11101001:    o = 0;
301
                8'b11101010:    o = 0;
302
                8'b11101011:    o = 0;
303
                8'b11101100:    o = 0;
304
                8'b11101101:    o = 0;
305
                8'b11101110:    o = 0;
306
                8'b11101111:    o = 0;
307
 
308
                8'b11110000:    o = 0;
309
                8'b11110001:    o = 0;
310
                8'b11110010:    o = 0;
311
                8'b11110011:    o = 0;
312
                8'b11110100:    o = 0;
313
                8'b11110101:    o = 0;
314
                8'b11110110:    o = 0;
315
                8'b11110111:    o = 0;
316
                8'b11111000:    o = 0;
317
                8'b11111001:    o = 0;
318
                8'b11111010:    o = 0;
319
                8'b11111011:    o = 0;
320
                8'b11111100:    o = 0;
321
                8'b11111101:    o = 0;
322
                8'b11111110:    o = 0;
323
                8'b11111111:    o = 0;
324
 
325
                endcase
326
 
327
 
328
endmodule
329
 
330
 
331
module cntlz16(
332
        input [15:0] i,
333
        output [4:0] o
334
);
335
 
336
        wire [3:0] cnt1, cnt2;
337
 
338
        cntlz8 u1 (i[ 7:0],cnt1);
339
        cntlz8 u2 (i[15:8],cnt2);
340
 
341
        assign o = cnt2[3] ? cnt1 + 4'h8 : cnt2;
342
 
343
endmodule
344
 
345
 
346
// 39 slices / 67 LUTs / 19.3ns
347
module cntlz24(
348
        input [23:0] i,
349
        output [4:0] o
350
);
351
 
352
        wire [3:0] cnt1, cnt2, cnt3;
353
 
354
        // cntlz8 results in faster result than cntlz16
355
        cntlz8 u1 (i[ 7: 0],cnt1);
356
        cntlz8 u2 (i[15: 8],cnt2);
357
        cntlz8 u3 (i[23:16],cnt3);
358
 
359
        assign o =
360
                !cnt3[3] ? cnt3 :
361
                !cnt2[3] ? cnt2 + 5'd8 :
362
                 cnt1 + 5'd16;
363
 
364
endmodule
365
 
366
// 39 slices / 67 LUTs / 19.3ns
367
module cntlz32(
368
        input [31:0] i,
369
        output [5:0] o
370
);
371
 
372
        wire [3:0] cnt1, cnt2, cnt3, cnt4;
373
 
374
        // cntlz8 results in faster result than cntlz16
375
        cntlz8 u1 (i[ 7: 0],cnt1);
376
        cntlz8 u2 (i[15: 8],cnt2);
377
        cntlz8 u3 (i[23:16],cnt3);
378
        cntlz8 u4 (i[31:24],cnt4);
379
 
380
        assign o =
381
                !cnt4[3] ? cnt4 :
382
                !cnt3[3] ? cnt3 + 6'd8 :
383
                !cnt2[3] ? cnt2 + 6'd16 :
384
                 cnt1 + 6'd24;
385
 
386
endmodule
387
 
388
 
389
// 88 slices / 154 LUTs / 22.5 ns
390
module cntlz48(
391
        input [47:0] i,
392
        output [5:0] o
393
);
394
 
395
        wire [4:0] cnt1, cnt2, cnt3;
396
 
397
        cntlz16 u1 (i[15: 0],cnt1);
398
        cntlz16 u2 (i[31:16],cnt2);
399
        cntlz16 u3 (i[47:32],cnt3);
400
 
401
        assign o =
402
                !cnt3[4] ? cnt3 :
403
                !cnt2[4] ? cnt2 + 7'd16 :
404
                 cnt1 + 7'd32;
405
 
406
endmodule
407
 
408
 
409
// 88 slices / 154 LUTs / 22.5 ns
410
module cntlz64(
411
        input [63:0] i,
412
        output [6:0] o
413
);
414
 
415
        wire [4:0] cnt1, cnt2, cnt3, cnt4;
416
 
417
        cntlz16 u1 (i[15: 0],cnt1);
418
        cntlz16 u2 (i[31:16],cnt2);
419
        cntlz16 u3 (i[47:32],cnt3);
420
        cntlz16 u4 (i[63:48],cnt4);
421
 
422
        assign o =
423
                !cnt4[4] ? cnt4 :
424
                !cnt3[4] ? cnt3 + 7'd16 :
425
                !cnt2[4] ? cnt2 + 7'd32 :
426
                 cnt1 + 7'd48;
427
 
428
endmodule
429
 
430
 
431
module cntlz80(
432
        input [79:0] i,
433
        output [6:0] o
434
);
435
 
436
    wire [4:0] cnt3;
437
        wire [5:0] cnt1, cnt2;
438
 
439
        cntlz32 u1 (i[31: 0],cnt1);
440
        cntlz32 u2 (i[63:32],cnt2);
441
        cntlz16 u3 (i[79:64],cnt3);
442
 
443
        assign o =
444
                !cnt3[4] ? {2'b0,cnt3} :
445
                !cnt2[5] ? {1'b0,cnt2} + 8'd16 :
446
                 {1'b0,cnt1} + 7'd48;
447
 
448
endmodule
449
 
450
 
451
module cntlz96(
452
        input [95:0] i,
453
        output [7:0] o
454
);
455
 
456
        wire [5:0] cnt1, cnt2, cnt3;
457
 
458
        cntlz32 u1 (i[31: 0],cnt1);
459
        cntlz32 u2 (i[63:32],cnt2);
460
        cntlz32 u3 (i[95:64],cnt3);
461
 
462
        assign o =
463
                !cnt3[5] ? cnt3 :
464
                !cnt2[5] ? cnt2 + 8'd32 :
465
                 cnt1 + 8'd64;
466
 
467
endmodule
468
 
469
 
470
module cntlz128(
471
        input [127:0] i,
472
        output [7:0] o
473
);
474
 
475
        wire [5:0] cnt1, cnt2, cnt3, cnt4;
476
 
477
        cntlz32 u1 (i[31: 0],cnt1);
478
        cntlz32 u2 (i[63:32],cnt2);
479
        cntlz32 u3 (i[95:64],cnt3);
480
        cntlz32 u4 (i[127:96],cnt4);
481
 
482
        assign o =
483
                !cnt4[5] ? cnt4 :
484
                !cnt3[5] ? cnt3 + 8'd32 :
485
                !cnt2[5] ? cnt2 + 8'd64 :
486
                 cnt1 + 8'd96;
487
 
488
endmodule
489
 
490
 
491
module cntlz32Reg(
492
        input clk,
493
        input ce,
494
        input [31:0] i,
495
        output reg [5:0] o
496
);
497
 
498
        wire [5:0] o1;
499
        cntlz32 u1 (i,o1);
500
        always @(posedge clk)
501
                if (ce) o <= o1;
502
 
503
endmodule
504
 
505
 
506
module cntlz64Reg(
507
        input clk,
508
        input ce,
509
        input [63:0] i,
510
        output reg [6:0] o
511
);
512
 
513
        wire [6:0] o1;
514
        cntlz64 u1 (i,o1);
515
        always @(posedge clk)
516
                if (ce) o <= o1;
517
 
518
endmodule
519
 
520
module cntlz80Reg(
521
        input clk,
522
        input ce,
523
        input [79:0] i,
524
        output reg [6:0] o
525
);
526
 
527
        wire [6:0] o1;
528
        cntlz80 u1 (i,o1);
529
        always @(posedge clk)
530
                if (ce) o <= o1;
531
 
532
endmodule
533
 
534
module cntlz96Reg(
535
        input clk,
536
        input ce,
537
        input [95:0] i,
538
        output reg [7:0] o
539
);
540
 
541
        wire [7:0] o1;
542
        cntlz96 u1 (i,o1);
543
        always @(posedge clk)
544
                if (ce) o <= o1;
545
 
546
endmodule
547
 
548
module cntlz128Reg(
549
        input clk,
550
        input ce,
551
        input [127:0] i,
552
        output reg [7:0] o
553
);
554
 
555
        wire [7:0] o1;
556
        cntlz128 u1 (i,o1);
557
        always @(posedge clk)
558
                if (ce) o <= o1;
559
 
560
endmodule
561
 
562
// 5 slices / 10 LUTs / 7.702 ns
563
module cntlo8(
564
        input [7:0] i,
565
        output [3:0] o
566
);
567
 
568
        cntlz8 u1 (~i,o);
569
 
570
endmodule
571
 
572
 
573
module cntlo16(
574
        input [15:0] i,
575
        output [4:0] o
576
);
577
 
578
        cntlz16 u1 (~i,o);
579
 
580
endmodule
581
 
582
 
583
module cntlo32(
584
        input [31:0] i,
585
        output [5:0] o
586
);
587
 
588
        cntlz32 u1 (~i,o);
589
 
590
endmodule
591
 
592
 
593
module cntlo48(
594
        input [47:0] i,
595
        output [5:0] o
596
);
597
 
598
        cntlz48 u1 (~i,o);
599
 
600
endmodule
601
 
602
 
603
// 59 slices / 99 LUTs / 14.065 ns
604
module cntlo64(
605
        input [63:0] i,
606
        output [6:0] o
607
);
608
 
609
        cntlz64 u1 (~i,o);
610
 
611
endmodule
612
 
613
 

powered by: WebSVN 2.1.0

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