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

Subversion Repositories fast_log

[/] [fast_log/] [trunk/] [Log2pipelined.v] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 MichaelDun
module Log2pipelined
2
 
3
/*
4
A fast base-2 logarithm function, 24 bits 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 3.
8
License: Free to use & modify, but please keep this header intact.
9
July 18, 2010, Kitchener, Ontario, Canada
10
This version not yet tested...
11
*/
12
 
13
(
14
        input [23:0]     DIN,
15
        input                   clk,
16
 
17
        output  [7:0]    DOUT
18
);
19
 
20
 
21
// Comprises 3 main blocks: priority encoder, barrel shifter, and LUT
22
 
23
reg     [3:0]    priencout1;
24
reg     [3:0]    priencout2;
25
reg     [3:0]    priencout3;
26
reg     [4:0]    barrelout;
27
reg     [20:0]   barrelin;
28
reg     [3:0]    LUTout;
29
 
30
 
31
 
32
always @(posedge clk)                                           // Basic top-level connectivity
33
begin
34
        priencout2      <=      priencout1;
35
        priencout3      <=      priencout2;
36
        barrelin        <=      DIN[23:3];
37
end
38
 
39
assign  DOUT    =       {priencout3, LUTout};
40
 
41
 
42
 
43
wire [20:0] tmp1 =       (barrelin << ~priencout1);
44
always @(posedge clk)                                           // Barrel shifter - OMG, it's a primitive in Verilog!
45
begin
46
        barrelout       <=      tmp1[19:15];
47
end
48
 
49
 
50
 
51
wire    [15:0]   priencin = DIN[23:8];
52
 
53
always @(posedge clk)                                           // Priority encoder
54
 
55
casex (priencin)
56
 
57
        16'b1xxxxxxxxxxxxxxx:   priencout1      <=      15;
58
        16'b01xxxxxxxxxxxxxx:   priencout1      <=      14;
59
        16'b001xxxxxxxxxxxxx:   priencout1      <=      13;
60
        16'b0001xxxxxxxxxxxx:   priencout1      <=      12;
61
        16'b00001xxxxxxxxxxx:   priencout1      <=      11;
62
        16'b000001xxxxxxxxxx:   priencout1      <=      10;
63
        16'b0000001xxxxxxxxx:   priencout1      <=      9;
64
        16'b00000001xxxxxxxx:   priencout1      <=      8;
65
        16'b000000001xxxxxxx:   priencout1      <=      7;
66
        16'b0000000001xxxxxx:   priencout1      <=      6;
67
        16'b00000000001xxxxx:   priencout1      <=      5;
68
        16'b000000000001xxxx:   priencout1      <=      4;
69
        16'b0000000000001xxx:   priencout1      <=      3;
70
        16'b00000000000001xx:   priencout1      <=      2;
71
        16'b000000000000001x:   priencout1      <=      1;
72
        16'b000000000000000x:   priencout1      <=      0;
73
 
74
endcase
75
 
76
 
77
 
78
/*
79
LUT for log fraction lookup
80
 - can be done with array or case:
81
 
82
case (addr)
83
0:out=0;
84
.
85
31:out=15;
86
endcase
87
 
88
        OR
89
 
90
wire [3:0] lut [0:31];
91
assign lut[0] = 0;
92
.
93
assign lut[31] = 15;
94
 
95
Are there any better ways?
96
*/
97
 
98
// Let's try "case".
99
// The equation is: output = log2(1+input/32)*16
100
// For larger tables, better to generate a separate data file using a program!
101
 
102
always @(posedge clk)
103
case (barrelout)
104
 
105
        0:       LUTout  <=      0;
106
        1:      LUTout  <=      1;
107
        2:      LUTout  <=      1;
108
        3:      LUTout  <=      2;
109
        4:      LUTout  <=      3;
110
        5:      LUTout  <=      3;
111
        6:      LUTout  <=      4;
112
        7:      LUTout  <=      5;
113
        8:      LUTout  <=      5;
114
        9:      LUTout  <=      6;
115
        10:     LUTout  <=      6;
116
        11:     LUTout  <=      7;
117
        12:     LUTout  <=      7;
118
        13:     LUTout  <=      8;
119
        14:     LUTout  <=      8;
120
        15:     LUTout  <=      9;
121
        16:     LUTout  <=      9;
122
        17:     LUTout  <=      10;
123
        18:     LUTout  <=      10;
124
        19:     LUTout  <=      11;
125
        20:     LUTout  <=      11;
126
        21:     LUTout  <=      12;
127
        22:     LUTout  <=      12;
128
        23:     LUTout  <=      13;
129
        24:     LUTout  <=      13;
130
        25:     LUTout  <=      13;
131
        26:     LUTout  <=      14;
132
        27:     LUTout  <=      14;
133
        28:     LUTout  <=      14;     // calculated value is *slightly* closer to 15, but 14 makes for a smoother curve!
134
        29:     LUTout  <=      15;
135
        30:     LUTout  <=      15;
136
        31:     LUTout  <=      15;
137
 
138
endcase
139
 
140
endmodule

powered by: WebSVN 2.1.0

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