@@ -40,8 +40,8 @@ architecture RTL of ctrl_fsm is
40
40
type state_t is (fetch, fetch_w,
41
41
decode,
42
42
read_dab, read_dai, read_d_b, read_d_i,
43
- exec_0, exec_1, exec_2, exec_3, exec_4 ,
44
- write_reg,
43
+ add, sub, addi, log , logi, ld, st ,
44
+ write_reg_alu, write_reg_mem, write_reg_mem_w, write_mem,
45
45
hlt
46
46
);
47
47
@@ -164,7 +164,7 @@ begin
164
164
when X"0" | X"1" =>
165
165
state_n <= read_dab;
166
166
167
- when X"2" =>
167
+ when X"2" | X"5" | X"6" | X"8" | X"9" =>
168
168
state_n <= read_dai;
169
169
170
170
when X"3" =>
@@ -183,80 +183,118 @@ begin
183
183
when read_dab =>
184
184
reg_op_a_sel_n <= '1' ; -- 1st operand = Ra
185
185
reg_op_b_sel_n <= '1' ; -- 2nd operand = Rb
186
- reg_wr_d_sel_n <= '1' ; -- Result = ALU
187
186
188
187
alu_op_b_sel_n <= '0' ; -- 2nd ALU operand = Rb
189
188
190
189
case opcode is
191
190
when X"0" =>
192
- state_n <= exec_0;
191
+ state_n <= add;
192
+
193
193
when X"1" =>
194
- state_n <= exec_1;
194
+ state_n <= sub;
195
+
195
196
when others =>
196
- null ;
197
+ state_n <= hlt ;
197
198
end case ;
198
199
199
200
when read_dai =>
200
201
reg_op_a_sel_n <= '1' ; -- 1st operand = Ra
201
- reg_op_b_sel_n <= '0' ; -- 2nd operand = Don't care
202
- reg_wr_d_sel_n <= '1' ; -- Result = ALU
202
+ reg_op_b_sel_n <= '0' ; -- 2nd operand = Rd
203
203
204
204
alu_op_b_sel_n <= '1' ; -- 2nd ALU operand = Immediate
205
205
206
- state_n <= exec_2;
206
+ case opcode is
207
+ when X"2" =>
208
+ state_n <= addi;
209
+
210
+ when X"5" | X"6" =>
211
+ state_n <= ld;
212
+
213
+ when X"8" | X"9" =>
214
+ state_n <= st;
215
+
216
+ when others =>
217
+ state_n <= hlt;
218
+ end case ;
207
219
208
220
when read_d_b =>
209
221
reg_op_a_sel_n <= '0' ; -- 1st operand = Rd
210
222
reg_op_b_sel_n <= '1' ; -- 2nd operand = Rb
211
- reg_wr_d_sel_n <= '1' ; -- Result = ALU
212
223
213
224
alu_op_b_sel_n <= '0' ; -- 2nd ALU operand = Rb
214
225
215
- state_n <= exec_3 ;
226
+ state_n <= log ;
216
227
217
228
when read_d_i =>
218
229
reg_op_a_sel_n <= '0' ; -- 1st operand = Rd
219
230
reg_op_b_sel_n <= '0' ; -- 2nd operand = Don't care
220
- reg_wr_d_sel_n <= '1' ; -- Result = ALU
221
231
222
232
alu_op_b_sel_n <= '1' ; -- 2nd ALU operand = Immediate
223
233
224
- state_n <= exec_4 ;
234
+ state_n <= logi ;
225
235
226
236
-- ===================
227
237
-- | Execution phase |
228
238
-- ===================
229
- when exec_0 =>
239
+ when add =>
230
240
alu_ctrl_op_n <= "10" ; -- Ra + Rb
231
241
232
- state_n <= write_reg ;
242
+ state_n <= write_reg_alu ;
233
243
234
- when exec_1 =>
244
+ when sub =>
235
245
alu_ctrl_op_n <= "11" ; -- Ra - Rb
236
246
237
- state_n <= write_reg ;
247
+ state_n <= write_reg_alu ;
238
248
239
- when exec_2 =>
249
+ when addi =>
240
250
alu_ctrl_op_n <= "10" ; -- Ra + imm
241
251
242
- state_n <= write_reg ;
252
+ state_n <= write_reg_alu ;
243
253
244
- when exec_3 =>
254
+ when log =>
245
255
alu_ctrl_op_n <= "00" ; -- Rd {&|!x} Rb
246
256
247
- state_n <= write_reg ;
257
+ state_n <= write_reg_alu ;
248
258
249
- when exec_4 =>
259
+ when logi =>
250
260
alu_ctrl_op_n <= "00" ; -- Rd {&|!x} imm
251
261
252
- state_n <= write_reg;
262
+ state_n <= write_reg_alu;
263
+
264
+ when ld =>
265
+ alu_ctrl_op_n <= "10" ; -- Ra + imm
266
+
267
+ state_n <= write_reg_mem;
268
+
269
+ when st =>
270
+ alu_ctrl_op_n <= "10" ; -- Ra + imm
271
+
272
+ state_n <= write_mem;
253
273
254
274
-- ===============
255
275
-- | Write phase |
256
276
-- ===============
257
- when write_reg =>
277
+ when write_reg_alu =>
278
+ reg_wr_d_sel_n <= '1' ; -- Result = ALU
279
+ reg_we_l_n <= '0' ;
280
+
281
+ state_n <= fetch;
282
+
283
+ when write_reg_mem =>
284
+ reg_wr_d_sel_n <= '0' ; -- Result = Memory
258
285
reg_we_l_n <= '0' ;
259
286
287
+ mem_sel_l_n <= '0' ;
288
+
289
+ state_n <= write_reg_mem_w;
290
+
291
+ when write_reg_mem_w =>
292
+ state_n <= fetch;
293
+
294
+ when write_mem =>
295
+ mem_sel_l_n <= '0' ;
296
+ mem_we_l_n <= '0' ;
297
+
260
298
state_n <= fetch;
261
299
262
300
-- ================
0 commit comments