implemented simple store instructions, preparations for load instructions
Stefan Schuermans

Stefan Schuermans commited on 2012-02-05 13:58:17
Showing 1 changed files, with 82 additions and 5 deletions.

... ...
@@ -8,7 +8,11 @@ ENTITY e_mips_core IS
8 8
         rst:            IN  std_logic;
9 9
         clk:            IN  std_logic;
10 10
         o_instr_addr:   OUT std_logic_vector(31 DOWNTO 0);
11
-        i_instr_data: IN  std_logic_vector(31 DOWNTO 0)
11
+        i_instr_data:   IN  std_logic_vector(31 DOWNTO 0);
12
+        o_data_addr:    OUT std_logic_vector(31 DOWNTO 0);
13
+        i_data_rd_data: IN  std_logic_vector(31 DOWNTO 0);
14
+        o_data_wr_data: OUT std_logic_vector(31 DOWNTO 0);
15
+        o_data_wr_en:   OUT std_logic_vector( 3 DOWNTO 0)
12 16
     );
13 17
 END ENTITY e_mips_core;
14 18
 
... ...
@@ -60,6 +64,10 @@ ARCHITECTURE a_mips_core OF e_mips_core IS
60 64
     SIGNAL s_reg_wr_data: std_logic_vector(31 DOWNTO 0);
61 65
     SIGNAL s_reg_wr_en:   std_logic;
62 66
 
67
+    SIGNAL s_data_addr:     std_logic_vector(31 DOWNTO 0);
68
+    SIGNAL r_data_addr_dly: std_logic_vector(31 DOWNTO 0);
69
+    SIGNAL r_data_ldst_dly: t_ldst;
70
+
63 71
     COMPONENT e_mips_decoder IS
64 72
         PORT (
65 73
             i_instr:  IN  std_logic_vector(31 DOWNTO 0);
... ...
@@ -219,9 +227,7 @@ BEGIN
219 227
                 WHEN imm_16se =>
220 228
                     s_alu_op1 <= s_val_s;
221 229
                     s_alu_op2(15 DOWNTO 0) <= r_imm_16;
222
-                    IF (r_imm_16(15) = '1') THEN
223
-                        s_alu_op2(31 DOWNTO 16) <= (OTHERS => '1');
224
-                    END IF;
230
+                    s_alu_op2(31 DOWNTO 16) <= (OTHERS => r_imm_16(15));
225 231
                 WHEN imm_16ze =>
226 232
                     s_alu_op1 <= s_val_s;
227 233
                     s_alu_op2(15 DOWNTO 0) <= r_imm_16;
... ...
@@ -276,5 +282,76 @@ BEGIN
276 282
         END IF;
277 283
     END PROCESS p_next_pc;
278 284
 
279
-END ARCHITECTURE a_mips_core;
285
+    p_data_addr: PROCESS(r_op, s_val_s, r_imm_16)
286
+        VARIABLE v_ofs: signed(31 DOWNTO 0);
287
+        VARIABLE v_addr: signed(31 DOWNTO 0);
288
+    BEGIN
289
+        s_data_addr <= (OTHERS => '0');
290
+        IF r_op = op_l OR r_op = op_s THEN
291
+            v_ofs(15 DOWNTO 0)  := signed(r_imm_16);
292
+            v_ofs(31 DOWNTO 16) := (OTHERS => r_imm_16(15));
293
+            v_addr              := signed(s_val_s) + v_ofs;
294
+            s_data_addr         <= std_logic_vector(v_addr);
295
+        END IF;
296
+    END PROCESS p_data_addr;
297
+
298
+    o_data_addr <= s_data_addr(31 DOWNTO 2) & "00";
280 299
 
300
+    p_data_wr: PROCESS(r_op, r_ldst, s_data_addr, s_val_t)
301
+        VARIABLE v_ofs: signed(31 DOWNTO 0);
302
+        VARIABLE v_addr: signed(31 DOWNTO 0);
303
+    BEGIN
304
+        o_data_wr_data <= (OTHERS => '0');
305
+        o_data_wr_en   <= "0000";
306
+        IF r_op = op_s THEN
307
+            CASE r_ldst IS
308
+                WHEN ldst_b =>
309
+                    CASE s_data_addr(1 DOWNTO 0) IS
310
+                        WHEN "00" =>
311
+                            o_data_wr_data( 7 DOWNTO  0) <= s_val_t(7 DOWNTO 0);
312
+                            o_data_wr_en                 <= "0001";
313
+                        WHEN "01" =>
314
+                            o_data_wr_data(15 DOWNTO  8) <= s_val_t(7 DOWNTO 0);
315
+                            o_data_wr_en                 <= "0010";
316
+                        WHEN "10" =>
317
+                            o_data_wr_data(23 DOWNTO 16) <= s_val_t(7 DOWNTO 0);
318
+                            o_data_wr_en                 <= "0100";
319
+                        WHEN "11" =>
320
+                            o_data_wr_data(31 DOWNTO 24) <= s_val_t(7 DOWNTO 0);
321
+                            o_data_wr_en                 <= "1000";
322
+                        WHEN OTHERS => NULL;
323
+                    END CASE;
324
+                WHEN ldst_h =>
325
+                    CASE s_data_addr(1 DOWNTO 1) IS
326
+                        WHEN "0" =>
327
+                            o_data_wr_data(15 DOWNTO  0) <= s_val_t(15 DOWNTO 0);
328
+                            o_data_wr_en                 <= "0011";
329
+                        WHEN "1" =>
330
+                            o_data_wr_data(31 DOWNTO 16) <= s_val_t(15 DOWNTO 0);
331
+                            o_data_wr_en                 <= "1100";
332
+                        WHEN OTHERS => NULL;
333
+                    END CASE;
334
+                WHEN ldst_w =>
335
+                    o_data_wr_data <= s_val_t;
336
+                    o_data_wr_en   <= "1111";
337
+                WHEN OTHERS => NULL;
338
+            END CASE;
339
+        END IF;
340
+    END PROCESS p_data_wr;
341
+
342
+    p_data_rd_sync: PROCESS(rst, clk)
343
+    BEGIN
344
+        IF rst = '1' THEN
345
+            r_data_addr_dly <= (OTHERS => '0');
346
+            r_data_ldst_dly <= ldst_none;
347
+        ELSIF rising_edge(clk) THEN
348
+            r_data_addr_dly <= s_data_addr;
349
+            IF r_op = op_l THEN
350
+                r_data_ldst_dly <= r_ldst;
351
+            ELSE
352
+                r_data_ldst_dly <= ldst_none;
353
+            END IF;
354
+        END IF;
355
+    END PROCESS p_data_rd_sync;
356
+
357
+END ARCHITECTURE a_mips_core;
281 358