Stefan Schuermans commited on 2012-02-29 21:28:37
Showing 3 changed files, with 36 additions and 19 deletions.
... | ... |
@@ -7,14 +7,15 @@ ENTITY e_mips_core IS |
7 | 7 |
PORT ( |
8 | 8 |
rst: IN std_logic; |
9 | 9 |
clk: IN std_logic; |
10 |
- i_stall: IN std_logic; |
|
11 | 10 |
o_instr_addr: OUT std_logic_vector(31 DOWNTO 0); |
12 | 11 |
i_instr_data: IN std_logic_vector(31 DOWNTO 0); |
13 | 12 |
o_data_addr: OUT std_logic_vector(31 DOWNTO 0); |
14 | 13 |
i_data_rd_data: IN std_logic_vector(31 DOWNTO 0); |
15 | 14 |
o_data_rd_en: OUT std_logic_vector( 3 DOWNTO 0); |
15 |
+ i_data_rd_ack: IN std_logic; |
|
16 | 16 |
o_data_wr_data: OUT std_logic_vector(31 DOWNTO 0); |
17 |
- o_data_wr_en: OUT std_logic_vector( 3 DOWNTO 0) |
|
17 |
+ o_data_wr_en: OUT std_logic_vector( 3 DOWNTO 0); |
|
18 |
+ i_data_wr_ack: IN std_logic |
|
18 | 19 |
); |
19 | 20 |
END ENTITY e_mips_core; |
20 | 21 |
|
... | ... |
@@ -23,6 +24,7 @@ ARCHITECTURE a_mips_core OF e_mips_core IS |
23 | 24 |
SIGNAL s_stall: std_logic; |
24 | 25 |
SIGNAL r_stall_reset: std_logic := '1'; |
25 | 26 |
SIGNAL s_stall_data_rd: std_logic; |
27 |
+ SIGNAL s_stall_data_wr: std_logic; |
|
26 | 28 |
|
27 | 29 |
SIGNAL r_pc: std_logic_vector(31 DOWNTO 0) := X"FFFFFFFC"; |
28 | 30 |
SIGNAL n_pc: std_logic_vector(31 DOWNTO 0); |
... | ... |
@@ -186,7 +188,7 @@ ARCHITECTURE a_mips_core OF e_mips_core IS |
186 | 188 |
|
187 | 189 |
BEGIN |
188 | 190 |
|
189 |
- s_stall <= i_stall OR r_stall_reset OR s_stall_data_rd OR s_mul_busy OR s_div_busy; |
|
191 |
+ s_stall <= r_stall_reset OR s_stall_data_rd OR s_stall_data_wr OR s_mul_busy OR s_div_busy; |
|
190 | 192 |
|
191 | 193 |
decoder: e_mips_decoder |
192 | 194 |
PORT MAP ( |
... | ... |
@@ -476,16 +478,16 @@ BEGIN |
476 | 478 |
END IF; |
477 | 479 |
END PROCESS p_data_rd_en; |
478 | 480 |
|
479 |
- p_data_rd: PROCESS(r_data_rd, r_op, r_ldst, s_data_addr, r_reg_t, i_data_rd_data, s_val_t) |
|
481 |
+ p_data_rd: PROCESS(r_data_rd, r_op, r_ldst, s_data_addr, r_reg_t, |
|
482 |
+ i_data_rd_data, i_data_rd_ack, s_val_t) |
|
483 |
+ VARIABLE v_read: boolean; |
|
480 | 484 |
VARIABLE v_b: std_logic_vector( 7 DOWNTO 0); |
481 | 485 |
VARIABLE v_h: std_logic_vector(15 DOWNTO 0); |
482 | 486 |
VARIABLE v_w: std_logic_vector(31 DOWNTO 0); |
483 | 487 |
BEGIN |
488 |
+ v_read := false; |
|
484 | 489 |
s_stall_data_rd <= '0'; |
485 | 490 |
n_data_rd <= data_rd_idle; |
486 |
- s_reg_wr_data_no <= (OTHERS => '0'); |
|
487 |
- s_reg_wr_data_data <= (OTHERS => '0'); |
|
488 |
- s_reg_wr_data_en <= '0'; |
|
489 | 491 |
CASE r_data_rd IS |
490 | 492 |
WHEN data_rd_idle => |
491 | 493 |
IF r_op = op_l THEN |
... | ... |
@@ -493,6 +495,18 @@ BEGIN |
493 | 495 |
n_data_rd <= data_rd_read; |
494 | 496 |
END IF; |
495 | 497 |
WHEN data_rd_read => |
498 |
+ IF i_data_rd_ack = '0' THEN |
|
499 |
+ s_stall_data_rd <= '1'; |
|
500 |
+ n_data_rd <= data_rd_read; |
|
501 |
+ ELSE |
|
502 |
+ v_read := true; |
|
503 |
+ END IF; |
|
504 |
+ WHEN OTHERS => NULL; |
|
505 |
+ END CASE; |
|
506 |
+ s_reg_wr_data_no <= (OTHERS => '0'); |
|
507 |
+ s_reg_wr_data_data <= (OTHERS => '0'); |
|
508 |
+ s_reg_wr_data_en <= '0'; |
|
509 |
+ IF v_read THEN |
|
496 | 510 |
CASE r_ldst IS |
497 | 511 |
WHEN ldst_b | ldst_bu => |
498 | 512 |
CASE s_data_addr(1 DOWNTO 0) IS |
... | ... |
@@ -542,8 +556,7 @@ BEGIN |
542 | 556 |
END CASE; |
543 | 557 |
s_reg_wr_data_no <= r_reg_t; |
544 | 558 |
s_reg_wr_data_en <= '1'; |
545 |
- WHEN OTHERS => NULL; |
|
546 |
- END CASE; |
|
559 |
+ END IF; |
|
547 | 560 |
END PROCESS p_data_rd; |
548 | 561 |
|
549 | 562 |
p_sync_data_rd: PROCESS(rst, clk) |
... | ... |
@@ -551,16 +564,15 @@ BEGIN |
551 | 564 |
IF rst = '1' THEN |
552 | 565 |
r_data_rd <= data_rd_idle; |
553 | 566 |
ELSIF rising_edge(clk) THEN |
554 |
- IF i_stall = '0' THEN |
|
555 | 567 |
r_data_rd <= n_data_rd; |
556 | 568 |
END IF; |
557 |
- END IF; |
|
558 | 569 |
END PROCESS p_sync_data_rd; |
559 | 570 |
|
560 |
- p_data_wr: PROCESS(r_op, r_ldst, s_data_addr, s_val_t) |
|
571 |
+ p_data_wr: PROCESS(r_op, r_ldst, s_data_addr, s_val_t, i_data_wr_ack) |
|
561 | 572 |
BEGIN |
562 | 573 |
o_data_wr_data <= (OTHERS => '0'); |
563 | 574 |
o_data_wr_en <= "0000"; |
575 |
+ s_stall_data_wr <= '0'; |
|
564 | 576 |
IF r_op = op_s THEN |
565 | 577 |
CASE r_ldst IS |
566 | 578 |
WHEN ldst_b => |
... | ... |
@@ -626,6 +638,9 @@ BEGIN |
626 | 638 |
END CASE; |
627 | 639 |
WHEN OTHERS => NULL; |
628 | 640 |
END CASE; |
641 |
+ IF i_data_wr_ack = '0' THEN |
|
642 |
+ s_stall_data_wr <= '1'; |
|
643 |
+ END IF; |
|
629 | 644 |
END IF; |
630 | 645 |
END PROCESS p_data_wr; |
631 | 646 |
|
... | ... |
@@ -674,10 +689,10 @@ BEGIN |
674 | 689 |
END PROCESS p_sync_reg_hi_lo; |
675 | 690 |
|
676 | 691 |
s_mul_signed <= '1' WHEN r_op = op_mult ELSE '0'; |
677 |
- s_mul_start <= '1' WHEN i_stall = '0' AND (r_op = op_mult OR r_op = op_multu) ELSE '0'; |
|
692 |
+ s_mul_start <= '1' WHEN r_op = op_mult OR r_op = op_multu ELSE '0'; |
|
678 | 693 |
|
679 | 694 |
s_div_signed <= '1' WHEN r_op = op_div ELSE '0'; |
680 |
- s_div_start <= '1' WHEN i_stall = '0' AND (r_op = op_div OR r_op = op_divu) ELSE '0'; |
|
695 |
+ s_div_start <= '1' WHEN r_op = op_div OR r_op = op_divu ELSE '0'; |
|
681 | 696 |
|
682 | 697 |
p_link: PROCESS(r_pc, r_link) |
683 | 698 |
BEGIN |
... | ... |
@@ -387,7 +387,7 @@ |
387 | 387 |
<property xil_pn:name="Shift Register Extraction" xil_pn:value="true" xil_pn:valueState="default"/> |
388 | 388 |
<property xil_pn:name="Show All Models" xil_pn:value="false" xil_pn:valueState="default"/> |
389 | 389 |
<property xil_pn:name="Simulation Model Target" xil_pn:value="VHDL" xil_pn:valueState="default"/> |
390 |
- <property xil_pn:name="Simulation Run Time ISim" xil_pn:value="100 us" xil_pn:valueState="non-default"/> |
|
390 |
+ <property xil_pn:name="Simulation Run Time ISim" xil_pn:value="1 ms" xil_pn:valueState="non-default"/> |
|
391 | 391 |
<property xil_pn:name="Simulation Run Time Map" xil_pn:value="1000 ns" xil_pn:valueState="default"/> |
392 | 392 |
<property xil_pn:name="Simulation Run Time Par" xil_pn:value="1000 ns" xil_pn:valueState="default"/> |
393 | 393 |
<property xil_pn:name="Simulation Run Time Translate" xil_pn:value="1000 ns" xil_pn:valueState="default"/> |
... | ... |
@@ -71,14 +71,15 @@ ARCHITECTURE a_system OF e_system IS |
71 | 71 |
PORT ( |
72 | 72 |
rst: IN std_logic; |
73 | 73 |
clk: IN std_logic; |
74 |
- i_stall: IN std_logic; |
|
75 | 74 |
o_instr_addr: OUT std_logic_vector(31 DOWNTO 0); |
76 | 75 |
i_instr_data: IN std_logic_vector(31 DOWNTO 0); |
77 | 76 |
o_data_addr: OUT std_logic_vector(31 DOWNTO 0); |
78 | 77 |
i_data_rd_data: IN std_logic_vector(31 DOWNTO 0); |
79 | 78 |
o_data_rd_en: OUT std_logic_vector( 3 DOWNTO 0); |
79 |
+ i_data_rd_ack: IN std_logic; |
|
80 | 80 |
o_data_wr_data: OUT std_logic_vector(31 DOWNTO 0); |
81 |
- o_data_wr_en: OUT std_logic_vector( 3 DOWNTO 0) |
|
81 |
+ o_data_wr_en: OUT std_logic_vector( 3 DOWNTO 0); |
|
82 |
+ i_data_wr_ack: IN std_logic |
|
82 | 83 |
); |
83 | 84 |
END COMPONENT e_mips_core; |
84 | 85 |
|
... | ... |
@@ -228,14 +229,15 @@ BEGIN |
228 | 229 |
PORT MAP ( |
229 | 230 |
rst => rst, |
230 | 231 |
clk => clk, |
231 |
- i_stall => '0', |
|
232 | 232 |
o_instr_addr => s_instr_addr, |
233 | 233 |
i_instr_data => s_instr_data, |
234 | 234 |
o_data_addr => s_dbus_addr, |
235 | 235 |
i_data_rd_data => s_dbus_rd_data, |
236 | 236 |
o_data_rd_en => s_dbus_rd_en, |
237 |
+ i_data_rd_ack => '1', |
|
237 | 238 |
o_data_wr_data => s_dbus_wr_data, |
238 |
- o_data_wr_en => s_dbus_wr_en |
|
239 |
+ o_data_wr_en => s_dbus_wr_en, |
|
240 |
+ i_data_wr_ack => '1' |
|
239 | 241 |
); |
240 | 242 |
|
241 | 243 |
instr: e_rom |
242 | 244 |