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

Subversion Repositories integer_square_root

[/] [integer_square_root/] [trunk/] [src/] [ISR.sv] - Diff between revs 2 and 4

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 2 Rev 4
Line 18... Line 18...
// Additional Comments:
// Additional Comments:
//
//
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
 
 
 
 
typedef enum logic [3:0] {
module ISR(
    INIT,
 
    GUESS,
 
    MULT_LOAD,
 
    MULT_WAIT,
 
    COMPARE,
 
    CHANGE,
 
    CHECK,
 
    INCRE,
 
    ENDLOOP,
 
    DONE
 
} state;
 
 
 
module ISR_FSM(
 
    input               reset,
    input               reset,
    input        [63:0] value,
    input        [63:0] value,
    input               clock,
    input               clock,
    input               mult_done,
 
    input        [63:0] mult_result,
 
    output logic        mult_start,
 
    output logic        mult_reset,
 
    output logic [63:0] mult_input,
 
    output logic [31:0] result,
    output logic [31:0] result,
    output logic        done
    output logic        done
);
);
 
    logic [63:0] new_value, proposed_solution_square;
 
    logic [31:0] proposed_solution;
 
    logic [4:0] i;
 
    logic start, it_done, flush;
 
    logic reset_sync;
 
 
    logic [63:0] value_reg;
    mult Multiplier (
    logic [31:0] result_next, guess, guess_next;
        .clock(clock),
    integer i, i_next;
        .reset(reset),
 
        .mcand({32'h00000000, proposed_solution}),
    state current_state, next_state;
        .mplier({32'h00000000, proposed_solution}),
 
        .start(start),
    assign mult_input = {32'b0, guess};
        .product(proposed_solution_square),
    assign mult_start = current_state == MULT_LOAD | current_state == MULT_WAIT;
        .done(it_done)
    assign done = current_state == DONE;
    );
    assign mult_reset = current_state == INIT | current_state == COMPARE;
 
 
 
 
 
    always_comb begin
    always_comb begin
        guess_next = guess;
//        if (reset_async) begin
        i_next = i;
//            done = 0;
        result_next = result;
//            result = 0;
        case (current_state)
//        end
            INIT: begin
//        else begin
                guess_next = 32'h0000_0000;
            // Reduction operator
                i_next = 31;
            // see http://www.asic-world.com/verilog/operators2.html
                result_next = 0;
            // done = ~|i & it_done & ~flush;
                next_state = GUESS;
            // result[i] = (proposed_solution_square <= new_value) & it_done;
            end
        done = ~|i & it_done & ~flush & ~reset_sync;
            GUESS: begin
        result[i] = (proposed_solution_square <= new_value) & it_done & ~reset_sync;
                guess_next = guess + (32'h0000_0001 << i);
//        end
                next_state = MULT_LOAD;
 
            end
 
            MULT_LOAD: next_state = MULT_WAIT;
 
            MULT_WAIT: next_state = (mult_done) ? COMPARE : MULT_WAIT;
 
            COMPARE: next_state = (mult_result > value_reg) ? CHANGE : CHECK;
 
            CHANGE: begin
 
                guess_next = guess - (32'h0000_0001 << i);
 
                next_state = CHECK;
 
            end
 
            CHECK: next_state = i ? INCRE : ENDLOOP;
 
            INCRE: begin
 
                i_next = i - 1;
 
                next_state = GUESS;
 
            end
 
            ENDLOOP: begin
 
                result_next = guess;
 
                next_state = DONE;
 
            end
 
            DONE: next_state = DONE;
 
            default: next_state = INIT;
 
        endcase
 
    end
    end
 
 
    always_ff @(posedge clock) begin
    always_ff @(posedge clock or posedge reset) begin
        if (reset) begin
        if (reset) begin
            current_state <= INIT;
            // done <= 0;
            value_reg <= value;
            // result <= 0;
            result <= 32'b0;
            reset_sync <= 1;
            i <= 31;
            start <= 0;
            guess <= 32'h0000_0000;
            flush <= 0;
 
            i <= 5'b11111;
 
            proposed_solution <= 32'h80000000;
 
            new_value <= value;
        end
        end
        else begin
        else begin
            current_state <= next_state;
            reset_sync <= 0;
            value_reg <= value_reg;
            start <= !it_done || !flush;
            result <= result_next;
            flush <= it_done;
            i <= i_next;
            // if (!it_done && flush) begin
            guess <= guess_next;
            //     flush <= 0;
 
            // end
 
            if (i && it_done && !flush) begin
 
                // flush <= 1;
 
                i <= i - 1;
 
                proposed_solution[i-1] <= 1;
 
                proposed_solution[i] <= result[i];
 
            end
        end
        end
    end
    end
 
 
endmodule
 
 
 
 
 
 
 
module ISR(
 
    input               reset,
 
    input        [63:0] value,
 
    input               clock,
 
    output logic [31:0] result,
 
    output logic        done
 
);
 
    logic mult_start;
 
    logic mult_done;
 
    logic [63:0] mult_result;
 
    logic [63:0] mult_input;
 
    logic mult_reset;
 
 
 
 
 
    mult multiplier(
 
        .clock(clock),
 
        .reset(mult_reset),
 
        .mcand(mult_input),
 
        .mplier(mult_input),
 
        .start(mult_start),
 
        .product(mult_result),
 
        .done(mult_done)
 
    );
 
 
 
    ISR_FSM FSM(
 
        .reset(reset),
 
        .value(value),
 
        .clock(clock),
 
        .mult_done(mult_done),
 
        .mult_result(mult_result),
 
        .mult_start(mult_start),
 
        .mult_reset(mult_reset),
 
        .mult_input(mult_input),
 
        .result(result),
 
        .done(done)
 
    );
 
 
 
 
 
endmodule
endmodule
 
 
 
 
 
 
 
 
 
 
 
 

powered by: WebSVN 2.1.0

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