@@ -41,15 +41,17 @@ module cpu(
4141
4242 // General Purpose Registers
4343 // 0 is for accumulator
44- wire [2 :0 ] sel;
44+ wire [2 :0 ] sel_in;
45+ wire [2 :0 ] sel_out;
4546 wire rfi;
4647 wire rfo;
4748 wire [7 :0 ] rega_out;
4849 wire [7 :0 ] regb_out;
4950 cpu_registers m_registers (
5051 .clk(internal_clk),
5152 .data_in(bus),
52- .sel(sel),
53+ .sel_in(sel_in),
54+ .sel_out(sel_out),
5355 .enable_write(rfi),
5456 .output_enable(rfo),
5557 .data_out(bus),
@@ -141,31 +143,40 @@ module cpu(
141143 assign operand1 = opcode[5 :3 ];
142144 assign operand2 = opcode[2 :0 ];
143145
146+ wire mov_memory;
147+ assign mov_memory = operand1 == 3'b111 || operand2 == 3'b111 ;
148+
144149 wire jump_allowed;
145150 assign jump_allowed = opcode == `OP_JMP | (opcode == `OP_JEZ & eq_zero) | (opcode == `OP_JNZ & ! eq_zero);
146151
147152 assign c_next = state == `STATE_NEXT | reset;
148153
149154 assign alu_mode = (state == `STATE_ALU_OP) ? operand1 : 'bx;
150155
151- assign sel = (state == `STATE_ALU_OP | state == `STATE_RAM_A | state == `STATE_OUT_A | state == `STATE_STORE_A) ? 0 :
152- (state == `STATE_RAM_B) ? 1 :
153- (state == `STATE_LDI) ? operand2 :
154- 'bx;
155- assign rfi = state == `STATE_RAM_A | state == `STATE_ALU_OP | state == `STATE_RAM_B | state == `STATE_LDI;
156- assign rfo = state == `STATE_OUT_A | state == `STATE_STORE_A;
156+ assign sel_in = (state == `STATE_ALU_OP | state == `STATE_RAM_A) ? 0 :
157+ (state == `STATE_RAM_B) ? 1 :
158+ (state == `STATE_LDI) ? operand2 :
159+ (state == `STATE_MOV_STORE) ? operand1 :
160+ 'bx;
161+
162+ assign sel_out = (state == `STATE_OUT_A | state == `STATE_STORE_A) ? 0 :
163+ (state == `STATE_MOV_STORE) ? operand2 :
164+ 'bx;
165+
166+ assign rfi = state == `STATE_RAM_A | state == `STATE_ALU_OP | state == `STATE_RAM_B | state == `STATE_LDI | (state == `STATE_MOV_STORE && operand1 != 3'b111 );
167+ assign rfo = state == `STATE_OUT_A | state == `STATE_STORE_A | (state == `STATE_MOV_STORE && operand2 != 3'b111 );
157168
158- assign c_ci = state == `STATE_FETCH_INST | state == `STATE_JUMP | state == `STATE_LOAD_ADDR;
159- assign c_co = state == `STATE_FETCH_PC;
169+ assign c_ci = state == `STATE_FETCH_INST | state == `STATE_JUMP | state == `STATE_LOAD_ADDR | state == `STATE_LDI | ((state == `STATE_MOV_LOAD) & mov_memory) ;
170+ assign c_co = state == `STATE_FETCH_PC | (state == `STATE_MOV_FETCH && mov_memory) ;
160171 assign c_eo = state == `STATE_ALU_OP;
161172 assign c_halt = state == `STATE_HALT;
162173 assign c_ii = state == `STATE_FETCH_INST;
163174 assign c_j = state == `STATE_JUMP & jump_allowed;
164- assign c_mi = state == `STATE_FETCH_PC | state == `STATE_LOAD_ADDR;
175+ assign c_mi = state == `STATE_FETCH_PC | state == `STATE_LOAD_ADDR | ((state == `STATE_MOV_FETCH | state == `STATE_MOV_LOAD) & mov_memory) ;
165176 assign c_oi = state == `STATE_OUT_A;
166177 assign c_ro = state == `STATE_FETCH_INST | (state == `STATE_JUMP & jump_allowed) |
167- state == `STATE_RAM_A | state == `STATE_RAM_B | state == `STATE_LOAD_ADDR | state == `STATE_LDI;
168- assign c_ri = state == `STATE_STORE_A;
178+ state == `STATE_RAM_A | state == `STATE_RAM_B | state == `STATE_LOAD_ADDR | state == `STATE_LDI | (state == `STATE_MOV_LOAD & mov_memory) | (state == `STATE_MOV_STORE & operand2 == 3'b111 ) ;
179+ assign c_ri = state == `STATE_STORE_A | (state == `STATE_MOV_STORE && operand1 == 3'b111 ) ;
169180
170181 wire [3 :0 ] cycle;
171182 cpu_control m_ctrl (
0 commit comments