Stefan Schuermans commited on 2012-03-01 21:23:47
Showing 1 changed files, with 13 additions and 12 deletions.
... | ... |
@@ -9,13 +9,13 @@ ENTITY e_mips_core IS |
9 | 9 |
clk: IN std_logic; |
10 | 10 |
o_instr_addr: OUT std_logic_vector(31 DOWNTO 0); |
11 | 11 |
i_instr_data: IN std_logic_vector(31 DOWNTO 0); |
12 |
+ o_data_req: OUT std_logic; |
|
13 |
+ i_data_grant: IN std_logic; |
|
12 | 14 |
o_data_addr: OUT std_logic_vector(31 DOWNTO 0); |
13 | 15 |
i_data_rd_data: IN std_logic_vector(31 DOWNTO 0); |
14 | 16 |
o_data_rd_en: OUT std_logic_vector( 3 DOWNTO 0); |
15 |
- i_data_rd_ack: IN std_logic; |
|
16 | 17 |
o_data_wr_data: OUT std_logic_vector(31 DOWNTO 0); |
17 |
- o_data_wr_en: OUT std_logic_vector( 3 DOWNTO 0); |
|
18 |
- i_data_wr_ack: IN std_logic |
|
18 |
+ o_data_wr_en: OUT std_logic_vector( 3 DOWNTO 0) |
|
19 | 19 |
); |
20 | 20 |
END ENTITY e_mips_core; |
21 | 21 |
|
... | ... |
@@ -421,6 +421,10 @@ BEGIN |
421 | 421 |
END IF; |
422 | 422 |
END PROCESS p_next_pc; |
423 | 423 |
|
424 |
+ o_data_req <= '1' WHEN (r_data_rd = data_rd_idle AND r_op = op_l) |
|
425 |
+ OR r_op = op_s |
|
426 |
+ ELSE '0'; |
|
427 |
+ |
|
424 | 428 |
p_data_addr: PROCESS(r_op, s_val_s, r_imm_16) |
425 | 429 |
VARIABLE v_ofs: unsigned(31 DOWNTO 0); |
426 | 430 |
VARIABLE v_addr: unsigned(31 DOWNTO 0); |
... | ... |
@@ -439,7 +443,7 @@ BEGIN |
439 | 443 |
p_data_rd_en: PROCESS(r_data_rd, r_op, r_ldst, s_data_addr) |
440 | 444 |
BEGIN |
441 | 445 |
o_data_rd_en <= "0000"; |
442 |
- IF r_op = op_l THEN |
|
446 |
+ IF r_data_rd = data_rd_idle AND r_op = op_l THEN |
|
443 | 447 |
CASE r_ldst IS |
444 | 448 |
WHEN ldst_b | ldst_bu => |
445 | 449 |
CASE s_data_addr(1 DOWNTO 0) IS |
... | ... |
@@ -479,7 +483,7 @@ BEGIN |
479 | 483 |
END PROCESS p_data_rd_en; |
480 | 484 |
|
481 | 485 |
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) |
|
486 |
+ i_data_rd_data, i_data_grant, s_val_t) |
|
483 | 487 |
VARIABLE v_read: boolean; |
484 | 488 |
VARIABLE v_b: std_logic_vector( 7 DOWNTO 0); |
485 | 489 |
VARIABLE v_h: std_logic_vector(15 DOWNTO 0); |
... | ... |
@@ -492,15 +496,12 @@ BEGIN |
492 | 496 |
WHEN data_rd_idle => |
493 | 497 |
IF r_op = op_l THEN |
494 | 498 |
s_stall_data_rd <= '1'; |
499 |
+ IF i_data_grant = '1' THEN |
|
495 | 500 |
n_data_rd <= data_rd_read; |
496 | 501 |
END IF; |
502 |
+ END IF; |
|
497 | 503 |
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 | 504 |
v_read := true; |
503 |
- END IF; |
|
504 | 505 |
WHEN OTHERS => NULL; |
505 | 506 |
END CASE; |
506 | 507 |
s_reg_wr_data_no <= (OTHERS => '0'); |
... | ... |
@@ -568,7 +569,7 @@ BEGIN |
568 | 569 |
END IF; |
569 | 570 |
END PROCESS p_sync_data_rd; |
570 | 571 |
|
571 |
- p_data_wr: PROCESS(r_op, r_ldst, s_data_addr, s_val_t, i_data_wr_ack) |
|
572 |
+ p_data_wr: PROCESS(r_op, r_ldst, s_data_addr, s_val_t, i_data_grant) |
|
572 | 573 |
BEGIN |
573 | 574 |
o_data_wr_data <= (OTHERS => '0'); |
574 | 575 |
o_data_wr_en <= "0000"; |
... | ... |
@@ -638,7 +639,7 @@ BEGIN |
638 | 639 |
END CASE; |
639 | 640 |
WHEN OTHERS => NULL; |
640 | 641 |
END CASE; |
641 |
- IF i_data_wr_ack = '0' THEN |
|
642 |
+ IF i_data_grant = '0' THEN |
|
642 | 643 |
s_stall_data_wr <= '1'; |
643 | 644 |
END IF; |
644 | 645 |
END IF; |
645 | 646 |