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

Subversion Repositories isqrt_dbd

[/] [isqrt_dbd/] [isqrt_dbd.sv] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 Papayaved
`ifndef _isqrt_dbd_
2
`define _isqrt_dbd_
3
 
4
// Digit-by-digit method
5
`define M(W, I) (W'('h1)<<(W - 2*(I + 1)))
6
 
7
module isqrt_dbd #(parameter DATA_WIDTH = 32) (clk, data, q);
8
        localparam WIDTH = (DATA_WIDTH & 1) ? DATA_WIDTH + 1 : DATA_WIDTH;
9
 
10
        input clk;
11
        input [DATA_WIDTH-1:0] data;
12
        output [WIDTH/2-1:0] q;
13
 
14
        reg [WIDTH-1:0] data_reg;
15
        reg [WIDTH/2 - 1:0][31:0] x, y;
16
        logic [WIDTH/2 - 2:0][31:0] b;
17
 
18
        always_ff @(posedge clk)
19
                data_reg <= data;
20
 
21
        always_ff @(posedge clk) begin
22
                if (data_reg >= `M(WIDTH, 0))
23
                        begin
24
                                x[0] <= data_reg - `M(WIDTH, 0);
25
                                y[0] <= `M(WIDTH, 0);
26
                        end
27
                else
28
                        begin
29
                                x[0] <= data_reg;
30
                                y[0] <= '0;
31
                        end
32
        end
33
 
34
        genvar i;
35
        generate for (i = 1; i < WIDTH/2; i++)
36
                begin :gen
37
                        always_comb
38
                                b[i-1] = y[i-1] | `M(WIDTH, i);
39
 
40
                        always_ff @(posedge clk)
41
                                if (x[i-1] >= b[i-1])
42
                                        begin
43
                                                x[i] <= x[i-1] - b[i-1];
44
                                                y[i] <= (y[i-1] >> 1'b1) | `M(WIDTH, i);
45
                                        end
46
                                else
47
                                        begin
48
                                                x[i] <= x[i-1];
49
                                                y[i] <= y[i-1] >> 1'b1;
50
                                        end
51
                end
52
        endgenerate
53
 
54
        assign q = y[WIDTH/2 - 1][WIDTH/2 - 1:0];
55
 
56
endmodule
57
 
58
//unsigned x, y;
59
//unsigned sqrt(){
60
//  y = 0;
61
//  unsigned m = 1 << 30;
62
//  while( m ){
63
//    unsigned b =  y | m;
64
//    y >>= 1;
65
//    if( x >= b ){
66
//        x -= b;
67
//        y |= m;
68
//    }
69
//    m >>= 2;
70
//  }
71
//}
72
 
73
// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots
74
//short isqrt(short num) {
75
//    short res = 0;
76
//    short bit = 1 << 14; // The second-to-top bit is set: 1 << 30 for 32 bits
77
//
78
//    // "bit" starts at the highest power of four <= the argument.
79
//    while (bit > num)
80
//        bit >>= 2;
81
//
82
//    while (bit != 0) {
83
//        if (num >= res + bit) {
84
//            num -= res + bit;
85
//            res = (res >> 1) + bit;
86
//        }
87
//        else
88
//            res >>= 1;
89
//        bit >>= 2;
90
//    }
91
//    return res;
92
//}
93
 
94
`endif

powered by: WebSVN 2.1.0

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