summaryrefslogtreecommitdiff
path: root/eater_cpu/eater_decoder.sv
diff options
context:
space:
mode:
authoruvok2026-01-22 19:18:37 +0100
committeruvok2026-01-22 19:18:37 +0100
commit0ae15275d34c55859d0a7b55acab132852fc7b71 (patch)
tree98a9a2f7f82acc8e3f65b4b48306d30ad27a1839 /eater_cpu/eater_decoder.sv
parent79fdec74ff93619f14d2ba1dd70f99b633316efd (diff)
Implement sub instruction
Diffstat (limited to 'eater_cpu/eater_decoder.sv')
-rw-r--r--eater_cpu/eater_decoder.sv21
1 files changed, 21 insertions, 0 deletions
diff --git a/eater_cpu/eater_decoder.sv b/eater_cpu/eater_decoder.sv
index 5bb8feb..ad0fd52 100644
--- a/eater_cpu/eater_decoder.sv
+++ b/eater_cpu/eater_decoder.sv
@@ -28,6 +28,7 @@ function CpuState insdep_state;
NOP: insdep_state = PC_to_MAR;
LDA: insdep_state = LDA_INS_to_MAR;
ADD: insdep_state = ADD_INS_to_MAR;
+ SUB: insdep_state = SUB_INS_to_MAR;
OUT: insdep_state = OUT_A_to_OUT;
HALT_op: insdep_state = HALT_st;
@@ -56,6 +57,10 @@ always @(posedge clk_i) begin
ADD_MEM_to_B: next_state = ADD_ALU_to_A;
ADD_ALU_to_A: next_state = PC_to_MAR;
+ SUB_INS_to_MAR: next_state = SUB_MEM_to_B;
+ SUB_MEM_to_B: next_state = SUB_ALU_to_A;
+ SUB_ALU_to_A: next_state = PC_to_MAR;
+
OUT_A_to_OUT: next_state = PC_to_MAR;
HALT_st: next_state = HALT_st;
@@ -118,6 +123,22 @@ always_comb begin
internal_flags.A_in = 1;
end
+ SUB_INS_to_MAR: begin
+ internal_flags.INS_out = 1;
+ internal_flags.MAR_in = 1;
+ end
+
+ SUB_MEM_to_B: begin
+ internal_flags.RAM_out = 1;
+ internal_flags.B_in = 1;
+ end
+
+ SUB_ALU_to_A: begin
+ internal_flags.ALU_out = 1;
+ internal_flags.ALU_subtract_nadd = 1;
+ internal_flags.A_in = 1;
+ end
+
OUT_A_to_OUT: begin
internal_flags.A_out = 1;
internal_flags.OUT_in = 1;