diff options
Diffstat (limited to 'design')
-rw-r--r-- | design/stack_machine.v | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/design/stack_machine.v b/design/stack_machine.v index 0ccc1c6..4313713 100644 --- a/design/stack_machine.v +++ b/design/stack_machine.v @@ -208,10 +208,43 @@ module stack_machine_new assign instr_sub = !set_im && !use_im && stack_shrinks_by_1 && instruction[11:0] == 12'd1; + wire instr_udiv; + assign instr_udiv = !set_im && !use_im && stack_shrinks_by_1 && + instruction[11:0] == 12'd2; + reg halt; /* Set once a halt instruction is encountered */ assign finished = halt; + + /* module for division */ + wire [31:0] div_quotient; + wire [31:0] div_remainder; + wire div_done; + + div + #( + .WIDTH(32) + ) div + ( + .clock(CLK_I), + .start(step == STEP_EXECUTING && first_execution_tick), + .dividend(r0), + .divisor(r1), + + .quotient(div_quotient), + .remainder(div_remainder), + .done(div_done) + ); + + + reg arithmetic_uncompleted; + wire arithmetic_completes; + assign arithmetic_completes = instr_udiv ? div_done : + instr_halt ? 0 : + 1; + + always @* I_ADR_O = pc / 2; @@ -284,6 +317,8 @@ module stack_machine_new I_CYC_O <= 0; end + arithmetic_uncompleted <= 1; + first_execution_tick <= 1; load_store_unrequested <= 0; stack_transfer_unrequested <= 2'b0; @@ -293,12 +328,17 @@ module stack_machine_new STEP_EXECUTING : begin first_execution_tick <= 0; + if (arithmetic_completes) + arithmetic_uncompleted <= 0; + if (((stack_grows || stack_shrinks || load || store) && first_execution_tick) || (load_store_uncompleted && !data_command_completes) || (stack_transfer_uncompleted[1] && - !stack_transfer_completes[1]) || halt) begin + !stack_transfer_completes[1]) || + (arithmetic_uncompleted && + !arithmetic_completes)) begin step <= STEP_EXECUTING; /* Remain where we are */ end else begin step <= STEP_LOADING_INSTRUCTION; @@ -457,11 +497,14 @@ module stack_machine_new r1 <= im_effective; /* Instructions, that shrink stack */ - if (instr_add && first_execution_tick) + if (instr_add && arithmetic_uncompleted) r1 <= r0 + r1; - if (instr_sub && first_execution_tick) + if (instr_sub && arithmetic_uncompleted) r1 <= r0 - r1; + + if (instr_udiv && arithmetic_uncompleted) + r1 <= div_quotient; end // case: STEP_EXECUTING endcase // case (step) end // else: !if(RST_I) |