diff options
Diffstat (limited to 'nandgame')
| -rw-r--r-- | nandgame/instruction_decode.sv | 24 |
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 |
