summaryrefslogtreecommitdiff
path: root/nandgame
diff options
context:
space:
mode:
Diffstat (limited to 'nandgame')
-rw-r--r--nandgame/instruction_decode.sv24
1 files changed, 19 insertions, 5 deletions
diff --git a/nandgame/instruction_decode.sv b/nandgame/instruction_decode.sv
index eafd90c..5bf4b02 100644
--- a/nandgame/instruction_decode.sv
+++ b/nandgame/instruction_decode.sv
@@ -1,3 +1,8 @@
+// Instruction decoder of Nandgame
+// corresponds to levels
+// - control selector
+// - control unit
+
`timescale 1us/1us
`include "alu.sv"
@@ -20,9 +25,14 @@ module instruction_decode #(
output dst_pa
);
-assign dst_a = instruction[5];
-assign dst_d = instruction[4];
-assign dst_pa = instruction[3];
+wire is_immediate;
+// bit 15 set = ALU instruction
+// bit 15 unset = immediate
+assign is_immediate = !instruction[15];
+
+assign dst_a = is_immediate || instruction[5];
+assign dst_d = !is_immediate && instruction[4];
+assign dst_pa = !is_immediate && instruction[3];
wire use_pointer_a_for_alu;
wire [(DATA_WIDTH-1):0] alu_y;
@@ -43,6 +53,8 @@ alu #(
.RES(alu_res)
);
+wire result_jump;
+
cond_check #(
.DATA_WIDTH(DATA_WIDTH)
) my_cond (
@@ -50,9 +62,11 @@ cond_check #(
.ltz(instruction[2]),
.eqz(instruction[1]),
.gtz(instruction[0]),
- .res(do_jump)
+ .res(result_jump)
);
-assign RES = alu_res;
+assign do_jump = is_immediate ? 0 : result_jump;
+
+assign RES = is_immediate ? instruction : alu_res;
endmodule