Stefan Schuermans commited on 2012-01-24 21:52:18
Showing 1 changed files, with 61 additions and 7 deletions.
| ... | ... |
@@ -27,10 +27,17 @@ ARCHITECTURE a_mips_core OF e_mips_core IS |
| 27 | 27 |
SIGNAL s_alu: t_alu; |
| 28 | 28 |
SIGNAL s_imm: t_imm; |
| 29 | 29 |
|
| 30 |
+ SIGNAL s_val_s: std_logic_vector(31 DOWNTO 0); |
|
| 31 |
+ SIGNAL s_val_t: std_logic_vector(31 DOWNTO 0); |
|
| 32 |
+ |
|
| 30 | 33 |
SIGNAL s_op1: std_logic_vector(31 DOWNTO 0); |
| 31 | 34 |
SIGNAL s_op2: std_logic_vector(31 DOWNTO 0); |
| 32 | 35 |
SIGNAL s_res: std_logic_vector(31 DOWNTO 0); |
| 33 | 36 |
|
| 37 |
+ SIGNAL s_reg_wr_no: std_logic_vector( 4 DOWNTO 0); |
|
| 38 |
+ SIGNAL s_reg_wr_data: std_logic_vector(31 DOWNTO 0); |
|
| 39 |
+ SIGNAL s_reg_wr_en: std_logic; |
|
| 40 |
+ |
|
| 34 | 41 |
COMPONENT e_mips_decoder IS |
| 35 | 42 |
PORT ( |
| 36 | 43 |
i_instr: IN std_logic_vector(31 DOWNTO 0); |
| ... | ... |
@@ -94,12 +101,12 @@ BEGIN |
| 94 | 101 |
rst => rst, |
| 95 | 102 |
clk => clk, |
| 96 | 103 |
i_rd_a_no => s_reg_s, |
| 97 |
- o_rd_a_data => s_op1, |
|
| 104 |
+ o_rd_a_data => s_val_s, |
|
| 98 | 105 |
i_rd_b_no => s_reg_t, |
| 99 |
- o_rd_b_data => s_op2, |
|
| 100 |
- i_wr_no => s_reg_d, |
|
| 101 |
- i_wr_data => s_res, |
|
| 102 |
- i_wr_en => '1' |
|
| 106 |
+ o_rd_b_data => s_val_t, |
|
| 107 |
+ i_wr_no => s_reg_wr_no, |
|
| 108 |
+ i_wr_data => s_reg_wr_data, |
|
| 109 |
+ i_wr_en => s_reg_wr_en |
|
| 103 | 110 |
); |
| 104 | 111 |
|
| 105 | 112 |
alu: e_mips_alu |
| ... | ... |
@@ -113,12 +120,59 @@ BEGIN |
| 113 | 120 |
p_dummy_fetch: PROCESS(rst, clk) |
| 114 | 121 |
BEGIN |
| 115 | 122 |
IF rst = '1' THEN |
| 116 |
- r_instr <= X"00000000"; |
|
| 123 |
+ r_instr <= (OTHERS => '0'); |
|
| 117 | 124 |
ELSIF rising_edge(clk) THEN |
| 118 |
- r_instr <= std_logic_vector(unsigned(r_instr) + to_unsigned(1, 32)); |
|
| 125 |
+ r_instr <= std_logic_vector(unsigned(r_instr) + |
|
| 126 |
+ to_unsigned(1, 32)); |
|
| 119 | 127 |
END IF; |
| 120 | 128 |
END PROCESS p_dummy_fetch; |
| 121 | 129 |
|
| 130 |
+ p_alu_in: PROCESS(s_op, s_imm, s_val_s, s_val_t, s_imm_a, s_imm_16) |
|
| 131 |
+ BEGIN |
|
| 132 |
+ s_op1 <= (OTHERS => '0'); |
|
| 133 |
+ s_op2 <= (OTHERS => '0'); |
|
| 134 |
+ IF s_op = op_alu THEN |
|
| 135 |
+ CASE s_imm IS |
|
| 136 |
+ WHEN imm_none => |
|
| 137 |
+ s_op1 <= s_val_s; |
|
| 138 |
+ s_op2 <= s_val_t; |
|
| 139 |
+ WHEN imm_a => |
|
| 140 |
+ s_op1(4 DOWNTO 0) <= s_imm_a; |
|
| 141 |
+ s_op2 <= s_val_t; |
|
| 142 |
+ WHEN imm_16se => |
|
| 143 |
+ s_op1 <= s_val_s; |
|
| 144 |
+ s_op2(15 DOWNTO 0) <= s_imm_16; |
|
| 145 |
+ IF (s_imm_16(15) = '1') THEN |
|
| 146 |
+ s_op2(31 DOWNTO 16) <= (OTHERS => '1'); |
|
| 147 |
+ END IF; |
|
| 148 |
+ WHEN imm_16ze => |
|
| 149 |
+ s_op1 <= s_val_s; |
|
| 150 |
+ s_op2(15 DOWNTO 0) <= s_imm_16; |
|
| 151 |
+ WHEN OTHERS => NULL; |
|
| 152 |
+ END CASE; |
|
| 153 |
+ END IF; |
|
| 154 |
+ END PROCESS p_alu_in; |
|
| 155 |
+ |
|
| 156 |
+ p_reg_wr: PROCESS(s_op, s_imm, s_reg_t, s_reg_d) |
|
| 157 |
+ BEGIN |
|
| 158 |
+ s_reg_wr_no <= (OTHERS => '0'); |
|
| 159 |
+ s_reg_wr_data <= (OTHERS => '0'); |
|
| 160 |
+ s_reg_wr_en <= '0'; |
|
| 161 |
+ IF s_op = op_alu THEN |
|
| 162 |
+ CASE s_imm IS |
|
| 163 |
+ WHEN imm_none | imm_a => |
|
| 164 |
+ s_reg_wr_no <= s_reg_d; |
|
| 165 |
+ s_reg_wr_data <= s_res; |
|
| 166 |
+ s_reg_wr_en <= '1'; |
|
| 167 |
+ WHEN imm_16se | imm_16ze => |
|
| 168 |
+ s_reg_wr_no <= s_reg_t; |
|
| 169 |
+ s_reg_wr_data <= s_res; |
|
| 170 |
+ s_reg_wr_en <= '1'; |
|
| 171 |
+ WHEN OTHERS => NULL; |
|
| 172 |
+ END CASE; |
|
| 173 |
+ END IF; |
|
| 174 |
+ END PROCESS p_reg_wr; |
|
| 175 |
+ |
|
| 122 | 176 |
o_res <= s_res; |
| 123 | 177 |
|
| 124 | 178 |
END ARCHITECTURE a_mips_core; |
| 125 | 179 |