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

Subversion Repositories integer_square_root

[/] [integer_square_root/] [tags/] [v2.0/] [src/] [ISR.sv] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ayka
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3
// Company:
4
// Engineer: Yihua Liu
5
//
6
// Create Date: 2022/06/08 16:50:36
7
// Design Name:
8
// Module Name: ISR
9
// Project Name: lab_3_b
10
// Target Devices: xczu7eg-ffvf1517-2-i
11
// Tool Versions:
12
// Description:
13
//
14
// Dependencies:
15
//
16
// Revision:
17
// Revision 0.01 - File Created
18
// Additional Comments:
19
//
20
//////////////////////////////////////////////////////////////////////////////////
21
 
22
 
23 6 ayka
typedef enum logic [3:0] {
24
    INIT,
25
    GUESS,
26
    MULT_LOAD,
27
    MULT_WAIT,
28
    COMPARE,
29
    CHANGE,
30
    CHECK,
31
    INCRE,
32
    ENDLOOP,
33
    DONE
34
} state;
35
 
36
module ISR_FSM(
37 2 ayka
    input               reset,
38
    input        [63:0] value,
39
    input               clock,
40 6 ayka
    input               mult_done,
41
    input        [63:0] mult_result,
42
    output logic        mult_start,
43
    output logic        mult_reset,
44
    output logic [63:0] mult_input,
45 2 ayka
    output logic [31:0] result,
46 6 ayka
    output logic        done
47 2 ayka
);
48
 
49 6 ayka
    logic [63:0] value_reg;
50
    logic [31:0] result_next, guess, guess_next;
51
    integer i, i_next;
52
 
53
    state current_state, next_state;
54
 
55
    assign mult_input = {32'b0, guess};
56
    assign mult_start = current_state == MULT_LOAD | current_state == MULT_WAIT;
57
    assign done = current_state == DONE;
58
    assign mult_reset = current_state == INIT | current_state == COMPARE;
59
 
60
 
61 2 ayka
    always_comb begin
62 6 ayka
        guess_next = guess;
63
        i_next = i;
64
        result_next = result;
65
        case (current_state)
66
            INIT: begin
67
                guess_next = 32'h0000_0000;
68
                i_next = 31;
69
                result_next = 0;
70
                next_state = GUESS;
71
            end
72
            GUESS: begin
73
                guess_next = guess + (32'h0000_0001 << i);
74
                next_state = MULT_LOAD;
75
            end
76
            MULT_LOAD: next_state = MULT_WAIT;
77
            MULT_WAIT: next_state = (mult_done) ? COMPARE : MULT_WAIT;
78
            COMPARE: next_state = (mult_result > value_reg) ? CHANGE : CHECK;
79
            CHANGE: begin
80
                guess_next = guess - (32'h0000_0001 << i);
81
                next_state = CHECK;
82
            end
83
            CHECK: next_state = i ? INCRE : ENDLOOP;
84
            INCRE: begin
85
                i_next = i - 1;
86
                next_state = GUESS;
87
            end
88
            ENDLOOP: begin
89
                result_next = guess;
90
                next_state = DONE;
91
            end
92
            DONE: next_state = DONE;
93
            default: next_state = INIT;
94
        endcase
95 2 ayka
    end
96
 
97 6 ayka
    always_ff @(posedge clock) begin
98 2 ayka
        if (reset) begin
99 6 ayka
            current_state <= INIT;
100
            value_reg <= value;
101
            result <= 32'b0;
102
            i <= 31;
103
            guess <= 32'h0000_0000;
104 2 ayka
        end
105
        else begin
106 6 ayka
            current_state <= next_state;
107
            value_reg <= value_reg;
108
            result <= result_next;
109
            i <= i_next;
110
            guess <= guess_next;
111 2 ayka
        end
112
    end
113 6 ayka
 
114 2 ayka
endmodule
115 6 ayka
 
116
 
117
 
118
module ISR(
119
    input               reset,
120
    input        [63:0] value,
121
    input               clock,
122
    output logic [31:0] result,
123
    output logic        done
124
);
125
    logic mult_start;
126
    logic mult_done;
127
    logic [63:0] mult_result;
128
    logic [63:0] mult_input;
129
    logic mult_reset;
130
 
131
 
132
    mult multiplier(
133
        .clock(clock),
134
        .reset(mult_reset),
135
        .mcand(mult_input),
136
        .mplier(mult_input),
137
        .start(mult_start),
138
        .product(mult_result),
139
        .done(mult_done)
140
    );
141
 
142
    ISR_FSM FSM(
143
        .reset(reset),
144
        .value(value),
145
        .clock(clock),
146
        .mult_done(mult_done),
147
        .mult_result(mult_result),
148
        .mult_start(mult_start),
149
        .mult_reset(mult_reset),
150
        .mult_input(mult_input),
151
        .result(result),
152
        .done(done)
153
    );
154
 
155
 
156
endmodule

powered by: WebSVN 2.1.0

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