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

Subversion Repositories fast_log

[/] [fast_log/] [trunk/] [Log2flowthru.v] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 MichaelDun
module Log2flowthru
2
 
3
/*
4
A fast base-2 logarithm function, 24 bits (21 used) in, 8 bits out.
5
Designed and coded by: Michael Dunn, http://www.cantares.on.ca/
6
(more info at the web site - see "Extras")
7
Executes every cycle, with a latency of 1 - slower throughput than pipelined
8
version, but faster result.
9
 
10
This version has a smallish lookup table, hence, a slightly uneven output.
11
Valid input range = 000100 - FFFFFF. In effect, there is a binary point:
12
xxxx.yy. Logs of inputs below 1.00 are negative, and not handled by this design.
13
 
14
License: Free to use & modify, but please keep this header intact.
15
July 27, 2010, Kitchener, Ontario, Canada
16
*/
17
 
18
(
19
        input [23:0]     DIN,
20
        output  [7:0]    DOUT
21
);
22
 
23
 
24
// Comprises 3 main blocks: priority encoder, barrel shifter, and LUT
25
 
26
wire    [3:0]    priencout1;
27
wire    [3:0]    LUTout;
28
 
29
assign  DOUT    =       {priencout1, LUTout};   // Basic top-level connectivity
30
 
31
 
32
// Barrel shifter - OMG, it's a primitive in Verilog!
33
 
34
wire    [19:0]   barrelin        =       DIN[22:3];
35
wire    [19:0]   tmp1 =  (barrelin << ~priencout1);
36
wire    [4:0]    barrelout       =       tmp1[19:15];
37
 
38
 
39
// Priority encoder
40
 
41
wire    [15:0]   priencin = DIN[23:8];
42
always @*
43
casex (priencin)
44
 
45
        16'b1xxxxxxxxxxxxxxx:   priencout1      =       15;
46
        16'b01xxxxxxxxxxxxxx:   priencout1      =       14;
47
        16'b001xxxxxxxxxxxxx:   priencout1      =       13;
48
        16'b0001xxxxxxxxxxxx:   priencout1      =       12;
49
        16'b00001xxxxxxxxxxx:   priencout1      =       11;
50
        16'b000001xxxxxxxxxx:   priencout1      =       10;
51
        16'b0000001xxxxxxxxx:   priencout1      =       9;
52
        16'b00000001xxxxxxxx:   priencout1      =       8;
53
        16'b000000001xxxxxxx:   priencout1      =       7;
54
        16'b0000000001xxxxxx:   priencout1      =       6;
55
        16'b00000000001xxxxx:   priencout1      =       5;
56
        16'b000000000001xxxx:   priencout1      =       4;
57
        16'b0000000000001xxx:   priencout1      =       3;
58
        16'b00000000000001xx:   priencout1      =       2;
59
        16'b000000000000001x:   priencout1      =       1;
60
        16'b000000000000000x:   priencout1      =       0;
61
 
62
endcase
63
 
64
 
65
 
66
/*
67
LUT for log fraction lookup
68
 - can be done with array or case:
69
 
70
case (addr)
71
0:out=0;
72
.
73
31:out=15;
74
endcase
75
 
76
        OR
77
 
78
wire [3:0] lut [0:31];
79
assign lut[0] = 0;
80
.
81
assign lut[31] = 15;
82
 
83
Are there any better ways?
84
*/
85
 
86
// Let's try "case".
87
// The equation is: output = log2(1+input/32)*16
88
// For larger tables, better to generate a separate data file using a program!
89
 
90
always @*
91
case (barrelout)
92
 
93
        0:       LUTout  =       0;
94
        1:      LUTout  =       1;
95
        2:      LUTout  =       1;
96
        3:      LUTout  =       2;
97
        4:      LUTout  =       3;
98
        5:      LUTout  =       3;
99
        6:      LUTout  =       4;
100
        7:      LUTout  =       5;
101
        8:      LUTout  =       5;
102
        9:      LUTout  =       6;
103
        10:     LUTout  =       6;
104
        11:     LUTout  =       7;
105
        12:     LUTout  =       7;
106
        13:     LUTout  =       8;
107
        14:     LUTout  =       8;
108
        15:     LUTout  =       9;
109
        16:     LUTout  =       9;
110
        17:     LUTout  =       10;
111
        18:     LUTout  =       10;
112
        19:     LUTout  =       11;
113
        20:     LUTout  =       11;
114
        21:     LUTout  =       12;
115
        22:     LUTout  =       12;
116
        23:     LUTout  =       13;
117
        24:     LUTout  =       13;
118
        25:     LUTout  =       13;
119
        26:     LUTout  =       14;
120
        27:     LUTout  =       14;
121
        28:     LUTout  =       14;     // calculated value is *slightly* closer to 15, but 14 makes for a smoother curve!
122
        29:     LUTout  =       15;
123
        30:     LUTout  =       15;
124
        31:     LUTout  =       15;
125
 
126
endcase
127
 
128
endmodule

powered by: WebSVN 2.1.0

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