Skip to content

Commit 11dc945

Browse files
committed
Added LD/ST instructions
1 parent 693646e commit 11dc945

File tree

4 files changed

+78
-34
lines changed

4 files changed

+78
-34
lines changed

Diff for: .gitattributes

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
*.vhd diff
1+
*.vhd set diff

Diff for: src/ctrl_fsm.vhd

+63-25
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ architecture RTL of ctrl_fsm is
4040
type state_t is (fetch, fetch_w,
4141
decode,
4242
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,
4545
hlt
4646
);
4747

@@ -164,7 +164,7 @@ begin
164164
when X"0" | X"1" =>
165165
state_n <= read_dab;
166166

167-
when X"2" =>
167+
when X"2" | X"5" | X"6" | X"8" | X"9" =>
168168
state_n <= read_dai;
169169

170170
when X"3" =>
@@ -183,80 +183,118 @@ begin
183183
when read_dab =>
184184
reg_op_a_sel_n <= '1'; -- 1st operand = Ra
185185
reg_op_b_sel_n <= '1'; -- 2nd operand = Rb
186-
reg_wr_d_sel_n <= '1'; -- Result = ALU
187186

188187
alu_op_b_sel_n <= '0'; -- 2nd ALU operand = Rb
189188

190189
case opcode is
191190
when X"0" =>
192-
state_n <= exec_0;
191+
state_n <= add;
192+
193193
when X"1" =>
194-
state_n <= exec_1;
194+
state_n <= sub;
195+
195196
when others =>
196-
null;
197+
state_n <= hlt;
197198
end case;
198199

199200
when read_dai =>
200201
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
203203

204204
alu_op_b_sel_n <= '1'; -- 2nd ALU operand = Immediate
205205

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;
207219

208220
when read_d_b =>
209221
reg_op_a_sel_n <= '0'; -- 1st operand = Rd
210222
reg_op_b_sel_n <= '1'; -- 2nd operand = Rb
211-
reg_wr_d_sel_n <= '1'; -- Result = ALU
212223

213224
alu_op_b_sel_n <= '0'; -- 2nd ALU operand = Rb
214225

215-
state_n <= exec_3;
226+
state_n <= log;
216227

217228
when read_d_i =>
218229
reg_op_a_sel_n <= '0'; -- 1st operand = Rd
219230
reg_op_b_sel_n <= '0'; -- 2nd operand = Don't care
220-
reg_wr_d_sel_n <= '1'; -- Result = ALU
221231

222232
alu_op_b_sel_n <= '1'; -- 2nd ALU operand = Immediate
223233

224-
state_n <= exec_4;
234+
state_n <= logi;
225235

226236
-- ===================
227237
-- | Execution phase |
228238
-- ===================
229-
when exec_0 =>
239+
when add =>
230240
alu_ctrl_op_n <= "10"; -- Ra + Rb
231241

232-
state_n <= write_reg;
242+
state_n <= write_reg_alu;
233243

234-
when exec_1 =>
244+
when sub =>
235245
alu_ctrl_op_n <= "11"; -- Ra - Rb
236246

237-
state_n <= write_reg;
247+
state_n <= write_reg_alu;
238248

239-
when exec_2 =>
249+
when addi =>
240250
alu_ctrl_op_n <= "10"; -- Ra + imm
241251

242-
state_n <= write_reg;
252+
state_n <= write_reg_alu;
243253

244-
when exec_3 =>
254+
when log =>
245255
alu_ctrl_op_n <= "00"; -- Rd {&|!x} Rb
246256

247-
state_n <= write_reg;
257+
state_n <= write_reg_alu;
248258

249-
when exec_4 =>
259+
when logi =>
250260
alu_ctrl_op_n <= "00"; -- Rd {&|!x} imm
251261

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;
253273

254274
-- ===============
255275
-- | Write phase |
256276
-- ===============
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
258285
reg_we_l_n <= '0';
259286

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+
260298
state_n <= fetch;
261299

262300
-- ================

Diff for: src/i_mem.vhd

+9-7
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,15 @@ begin
4242
mem <= (others => (others => '0'));
4343

4444
-- Debug instructions
45-
mem(0) <= X"210F"; -- ADDI R1, R0, $15
46-
mem(1) <= X"2207"; -- ADDI R2, R0, $7
47-
mem(2) <= X"0312"; -- ADD R3, R1, R2
48-
mem(3) <= X"1412"; -- SUB R4, R1, R2
49-
mem(4) <= X"1521"; -- SUB R5, R2, R1
50-
mem(5) <= X"261F"; -- ADDI R6, R1, $15
51-
mem(6) <= X"3726"; -- OR R7, R6
45+
mem(0) <= X"210F"; -- ADDI R1, R0, $15
46+
mem(1) <= X"2207"; -- ADDI R2, R0, $7
47+
mem(2) <= X"0312"; -- ADD R3, R1, R2
48+
mem(3) <= X"1412"; -- SUB R4, R1, R2
49+
mem(4) <= X"1521"; -- SUB R5, R2, R1
50+
mem(5) <= X"261F"; -- ADDI R6, R1, $15
51+
mem(6) <= X"3726"; -- OR R7, R6
52+
mem(7) <= X"8700"; -- ST R7, R0, $0
53+
mem(8) <= X"5F00"; -- LD R15, R0, $0
5254

5355
else
5456
instr_q <= mem(to_integer(unsigned(addr)));

Diff for: src/processor.vhd

+5-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@
3232
-- | 1dab | rrr | rd = ra - rb |
3333
-- | 2dai | rri | rd = ra + im |
3434
-- | 3d*b | rr | rd = rd * rb |
35-
-- | 4d*i | rri | rd = rd * im |
35+
-- | 4d*i | ri | rd = rd * im |
36+
-- | 5dai | rri | rd = *(ra + im) |
37+
-- | 6dai | rri | rd = *(ra + im) |
38+
-- | 8dai | rri | *(ra + im) = rd |
39+
-- | 9dai | rri | *(ra + im) = rd |
3640
-- ==========================================
3741
--
3842
--==============================================================================

0 commit comments

Comments
 (0)