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

Subversion Repositories raptor64

[/] [raptor64/] [trunk/] [rtl/] [verilog/] [lib/] [math/] [isqrt.v] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 robfinch
// ============================================================================
2
//  isqrt.v
3
//  - take the integer square root
4
//
5
//
6
//      2010,2011  Robert Finch
7
//      robfinch>remove<@sympatico.ca
8
//
9
//
10
//  This source code is available for evaluation and validation purposes
11
//  only. This copyright statement and disclaimer must remain present in
12
//  the file.
13
//
14
//
15
//      NO WARRANTY.
16
//  THIS Work, IS PROVIDEDED "AS IS" WITH NO WARRANTIES OF ANY KIND, WHETHER
17
//  EXPRESS OR IMPLIED. The user must assume the entire risk of using the
18
//  Work.
19
//
20
//  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
21
//  INCIDENTAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES WHATSOEVER RELATING TO
22
//  THE USE OF THIS WORK, OR YOUR RELATIONSHIP WITH THE AUTHOR.
23
//
24
//  IN ADDITION, IN NO EVENT DOES THE AUTHOR AUTHORIZE YOU TO USE THE WORK
25
//  IN APPLICATIONS OR SYSTEMS WHERE THE WORK'S FAILURE TO PERFORM CAN
26
//  REASONABLY BE EXPECTED TO RESULT IN A SIGNIFICANT PHYSICAL INJURY, OR IN
27
//  LOSS OF LIFE. ANY SUCH USE BY YOU IS ENTIRELY AT YOUR OWN RISK, AND YOU
28
//  AGREE TO HOLD THE AUTHOR AND CONTRIBUTORS HARMLESS FROM ANY CLAIMS OR
29
//  LOSSES RELATING TO SUCH UNAUTHORIZED USE.
30
//
31
//
32
//      Verilog 1995
33
//      Webpack 13.i  xc3s1200e-4fg320
34
//      94 slices / 172 LUTs / 141.906 MHz
35
//  101 ff's
36
//
37
// ============================================================================
38
 
39
module isqrt(rst, clk, ce, ld, a, o, done);
40
parameter WID = 32;
41
localparam MSB = WID-1;
42
parameter IDLE=3'd0;
43
parameter CALC=3'd1;
44
parameter DONE=3'd2;
45
input rst;
46
input clk;
47
input ce;
48
input ld;
49
input [MSB:0] a;
50
output [MSB:0] o;
51
output done;
52
 
53
reg [2:0] state;
54
reg [MSB:0] root;
55
wire [MSB:0] testDiv;
56
reg [MSB:0] remLo;
57
reg [MSB:0] remHi;
58
 
59
wire cnt_done;
60
assign testDiv = {root,1'b1};
61
wire [MSB:0] remHiShift = {remHi[MSB-2:0],remLo[MSB:MSB-1]};
62
wire doesGoInto = remHiShift >= testDiv;
63
assign o = root[MSB:1];
64
 
65
// Iteration counter
66
reg [7:0] cnt;
67
 
68
always @(posedge clk)
69
if (rst) begin
70
        cnt <= WID>>1;
71
        remLo <= {WID{1'b0}};
72
        remHi <= {WID{1'b0}};
73
        root <= {WID{1'b0}};
74
        state <= IDLE;
75
end
76
else if (ce) begin
77
        if (!cnt_done)
78
                cnt <= cnt + 8'd1;
79
case(state)
80
IDLE:
81
        if (ld) begin
82
                cnt <= 8'd0;
83
                state <= CALC;
84
                remLo <= a;
85
                remHi <= {WID{1'b0}};
86
                root <= {WID{1'b0}};
87
        end
88
CALC:
89
        if (!cnt_done) begin
90
                // Shift the remainder low
91
                remLo <= {remLo[MSB-2:0],2'd0};
92
                // Shift the remainder high
93
                remHi <= doesGoInto ? remHiShift - testDiv: remHiShift;
94
                // Shift the root
95
                root <= {root+doesGoInto,1'b0}; // root * 2 + 1/0
96
        end
97
        else
98
                state <= DONE;
99
DONE:
100
        begin
101
                state <= IDLE;
102
        end
103
endcase
104
end
105
assign cnt_done = (cnt==WID>>1);
106
assign done = state==DONE;
107
 
108
endmodule
109
 
110
 
111
module isqrt_tb();
112
 
113
reg clk;
114
reg rst;
115
reg [31:0] a;
116
wire [31:0] o;
117
reg ld;
118
wire done;
119
reg [7:0] state;
120
 
121
initial begin
122
        clk = 1;
123
        rst = 0;
124
        #100 rst = 1;
125
        #100 rst = 0;
126
end
127
 
128
always #10 clk = ~clk;  //  50 MHz
129
 
130
always @(posedge clk)
131
if (rst) begin
132
        state <= 8'd0;
133
        a <= 32'h123456;
134
end
135
else
136
begin
137
ld <= 1'b0;
138
case(state)
139
8'd0:
140
        begin
141
                a <= 32'd1;
142
                ld <= 1'b1;
143
                state <= 8'd1;
144
        end
145
8'd1:
146
        if (done) begin
147
                $display("i=%h o=%h", a, o);
148
        end
149
endcase
150
end
151
 
152
isqrt #(32) u1 (.rst(rst), .clk(clk), .ce(1'b1), .ld(ld), .a(a), .o(o), .done(done));
153
 
154
endmodule
155
 
156
 

powered by: WebSVN 2.1.0

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