diff options
Diffstat (limited to 'eater_cpu/eater_decoder.sv')
| -rw-r--r-- | eater_cpu/eater_decoder.sv | 71 |
1 files changed, 59 insertions, 12 deletions
diff --git a/eater_cpu/eater_decoder.sv b/eater_cpu/eater_decoder.sv index 2246826..4e8973c 100644 --- a/eater_cpu/eater_decoder.sv +++ b/eater_cpu/eater_decoder.sv @@ -12,6 +12,8 @@ CpuState internal_state; CpuState next_state; CpuControlFlags internal_flags; +wire [3:0] actual_instruction = instruction_i[7:4]; + assign flags_o = internal_flags; initial begin @@ -21,25 +23,38 @@ initial begin // internal_flags = '{default: '0}; end +function CpuState insdep_state; + case (actual_instruction) + LDA: insdep_state = LDA_INS_to_MAR; + ADD: insdep_state = ADD_INS_to_MAR; + OUT: insdep_state = OUT_A_to_OUT; + + default: insdep_state = INIT; + endcase +endfunction + // next-state machine always @(posedge clk_i) begin next_state = INIT; case (internal_state) - INIT: begin - next_state = PC_to_MAR; - end - PC_to_MAR: begin - next_state = MEM_to_INS; - end - MEM_to_INS: begin - next_state = PC_inc; - end + INIT: next_state = PC_to_MAR; - PC_inc: begin - next_state = PC_to_MAR; - end + PC_to_MAR: next_state = MEM_to_INS; + + MEM_to_INS: next_state = PC_inc; + + PC_inc: next_state = insdep_state(); + + LDA_INS_to_MAR: next_state = LDA_MEM_to_A; + LDA_MEM_to_A: next_state = PC_to_MAR; + + ADD_INS_to_MAR: next_state = ADD_MEM_to_B; + ADD_MEM_to_B: next_state = ADD_ALU_to_A; + ADD_ALU_to_A: next_state = PC_to_MAR; + + OUT_A_to_OUT: next_state = PC_to_MAR; default: begin next_state = INIT; @@ -73,8 +88,40 @@ always_comb begin PC_inc: begin internal_flags.PC_count = 1; end + + LDA_INS_to_MAR: begin + internal_flags.INS_out = 1; + internal_flags.MAR_in = 1; + end + + LDA_MEM_to_A: begin + internal_flags.RAM_out = 1; + internal_flags.A_in = 1; + end + + ADD_INS_to_MAR: begin + internal_flags.INS_out = 1; + internal_flags.MAR_in = 1; + end + + ADD_MEM_to_B: begin + internal_flags.RAM_out = 1; + internal_flags.B_in = 1; + end + + ADD_ALU_to_A: begin + internal_flags.ALU_out = 1; + internal_flags.A_in = 1; + end + + OUT_A_to_OUT: begin + internal_flags.A_out = 1; + internal_flags.OUT_in = 1; + end + default: begin end + endcase end |
