Stefan Schuermans commited on 2012-01-25 23:17:28
Showing 1 changed files, with 103 additions and 69 deletions.
| ... | ... |
@@ -7,7 +7,8 @@ ENTITY e_mips_core IS |
| 7 | 7 |
PORT ( |
| 8 | 8 |
rst: IN std_logic; |
| 9 | 9 |
clk: IN std_logic; |
| 10 |
- o_res: OUT std_logic_vector(31 DOWNTO 0) |
|
| 10 |
+ o_instr_addr: OUT std_logic_vector(31 DOWNTO 0); |
|
| 11 |
+ i_instr_data: IN std_logic_vector(31 DOWNTO 0) |
|
| 11 | 12 |
); |
| 12 | 13 |
END ENTITY e_mips_core; |
| 13 | 14 |
|
| ... | ... |
@@ -16,19 +17,31 @@ ARCHITECTURE a_mips_core OF e_mips_core IS |
| 16 | 17 |
SIGNAL r_pc: std_logic_vector(31 DOWNTO 0); |
| 17 | 18 |
SIGNAL n_pc: std_logic_vector(31 DOWNTO 0); |
| 18 | 19 |
|
| 19 |
- SIGNAL r_instr: std_logic_vector(31 DOWNTO 0); |
|
| 20 |
+ SIGNAL s_instr: std_logic_vector(31 DOWNTO 0); |
|
| 21 |
+ |
|
| 22 |
+ SIGNAL n_reg_s: std_logic_vector( 4 DOWNTO 0); |
|
| 23 |
+ SIGNAL n_reg_t: std_logic_vector( 4 DOWNTO 0); |
|
| 24 |
+ SIGNAL n_reg_d: std_logic_vector( 4 DOWNTO 0); |
|
| 25 |
+ SIGNAL n_imm_a: std_logic_vector( 4 DOWNTO 0); |
|
| 26 |
+ SIGNAL n_imm_16: std_logic_vector(15 DOWNTO 0); |
|
| 27 |
+ SIGNAL n_imm_26: std_logic_vector(25 DOWNTO 0); |
|
| 28 |
+ SIGNAL n_op: t_op; |
|
| 29 |
+ SIGNAL n_link: t_link; |
|
| 30 |
+ SIGNAL n_cmp: t_cmp; |
|
| 31 |
+ SIGNAL n_alu: t_alu; |
|
| 32 |
+ SIGNAL n_imm: t_imm; |
|
| 20 | 33 |
|
| 21 |
- SIGNAL s_reg_s: std_logic_vector( 4 DOWNTO 0); |
|
| 22 |
- SIGNAL s_reg_t: std_logic_vector( 4 DOWNTO 0); |
|
| 23 |
- SIGNAL s_reg_d: std_logic_vector( 4 DOWNTO 0); |
|
| 24 |
- SIGNAL s_imm_a: std_logic_vector( 4 DOWNTO 0); |
|
| 25 |
- SIGNAL s_imm_16: std_logic_vector(15 DOWNTO 0); |
|
| 26 |
- SIGNAL s_imm_26: std_logic_vector(25 DOWNTO 0); |
|
| 27 |
- SIGNAL s_op: t_op; |
|
| 28 |
- SIGNAL s_link: t_link; |
|
| 29 |
- SIGNAL s_cmp: t_cmp; |
|
| 30 |
- SIGNAL s_alu: t_alu; |
|
| 31 |
- SIGNAL s_imm: t_imm; |
|
| 34 |
+ SIGNAL r_reg_s: std_logic_vector( 4 DOWNTO 0); |
|
| 35 |
+ SIGNAL r_reg_t: std_logic_vector( 4 DOWNTO 0); |
|
| 36 |
+ SIGNAL r_reg_d: std_logic_vector( 4 DOWNTO 0); |
|
| 37 |
+ SIGNAL r_imm_a: std_logic_vector( 4 DOWNTO 0); |
|
| 38 |
+ SIGNAL r_imm_16: std_logic_vector(15 DOWNTO 0); |
|
| 39 |
+ SIGNAL r_imm_26: std_logic_vector(25 DOWNTO 0); |
|
| 40 |
+ SIGNAL r_op: t_op; |
|
| 41 |
+ SIGNAL r_link: t_link; |
|
| 42 |
+ SIGNAL r_cmp: t_cmp; |
|
| 43 |
+ SIGNAL r_alu: t_alu; |
|
| 44 |
+ SIGNAL r_imm: t_imm; |
|
| 32 | 45 |
|
| 33 | 46 |
SIGNAL s_val_s: std_logic_vector(31 DOWNTO 0); |
| 34 | 47 |
SIGNAL s_val_t: std_logic_vector(31 DOWNTO 0); |
| ... | ... |
@@ -98,27 +111,27 @@ BEGIN |
| 98 | 111 |
|
| 99 | 112 |
decoder: e_mips_decoder |
| 100 | 113 |
PORT MAP ( |
| 101 |
- i_instr => r_instr, |
|
| 102 |
- o_reg_s => s_reg_s, |
|
| 103 |
- o_reg_t => s_reg_t, |
|
| 104 |
- o_reg_d => s_reg_d, |
|
| 105 |
- o_imm_a => s_imm_a, |
|
| 106 |
- o_imm_16 => s_imm_16, |
|
| 107 |
- o_imm_26 => s_imm_26, |
|
| 108 |
- o_op => s_op, |
|
| 109 |
- o_link => s_link, |
|
| 110 |
- o_cmp => s_cmp, |
|
| 111 |
- o_alu => s_alu, |
|
| 112 |
- o_imm => s_imm |
|
| 114 |
+ i_instr => s_instr, |
|
| 115 |
+ o_reg_s => n_reg_s, |
|
| 116 |
+ o_reg_t => n_reg_t, |
|
| 117 |
+ o_reg_d => n_reg_d, |
|
| 118 |
+ o_imm_a => n_imm_a, |
|
| 119 |
+ o_imm_16 => n_imm_16, |
|
| 120 |
+ o_imm_26 => n_imm_26, |
|
| 121 |
+ o_op => n_op, |
|
| 122 |
+ o_link => n_link, |
|
| 123 |
+ o_cmp => n_cmp, |
|
| 124 |
+ o_alu => n_alu, |
|
| 125 |
+ o_imm => n_imm |
|
| 113 | 126 |
); |
| 114 | 127 |
|
| 115 | 128 |
regs: e_mips_regs |
| 116 | 129 |
PORT MAP ( |
| 117 | 130 |
rst => rst, |
| 118 | 131 |
clk => clk, |
| 119 |
- i_rd_a_no => s_reg_s, |
|
| 132 |
+ i_rd_a_no => r_reg_s, |
|
| 120 | 133 |
o_rd_a_data => s_val_s, |
| 121 |
- i_rd_b_no => s_reg_t, |
|
| 134 |
+ i_rd_b_no => r_reg_t, |
|
| 122 | 135 |
o_rd_b_data => s_val_t, |
| 123 | 136 |
i_wr_no => s_reg_wr_no, |
| 124 | 137 |
i_wr_data => s_reg_wr_data, |
| ... | ... |
@@ -127,7 +140,7 @@ BEGIN |
| 127 | 140 |
|
| 128 | 141 |
alu: e_mips_alu |
| 129 | 142 |
PORT MAP ( |
| 130 |
- i_alu => s_alu, |
|
| 143 |
+ i_alu => r_alu, |
|
| 131 | 144 |
i_op1 => s_alu_op1, |
| 132 | 145 |
i_op2 => s_alu_op2, |
| 133 | 146 |
o_res => s_alu_res |
| ... | ... |
@@ -135,71 +148,105 @@ BEGIN |
| 135 | 148 |
|
| 136 | 149 |
cmp: e_mips_cmp |
| 137 | 150 |
PORT MAP ( |
| 138 |
- i_cmp => s_cmp, |
|
| 151 |
+ i_cmp => r_cmp, |
|
| 139 | 152 |
i_op1 => s_cmp_op1, |
| 140 | 153 |
i_op2 => s_cmp_op2, |
| 141 | 154 |
o_res => s_cmp_res |
| 142 | 155 |
); |
| 143 | 156 |
|
| 144 |
- p_dummy_fetch: PROCESS(rst, clk) |
|
| 157 |
+ p_sync_pc: PROCESS(rst, clk) |
|
| 158 |
+ BEGIN |
|
| 159 |
+ IF rst = '1' THEN |
|
| 160 |
+ r_pc <= (OTHERS => '0'); |
|
| 161 |
+ ELSIF rising_edge(clk) THEN |
|
| 162 |
+ r_pc <= n_pc; |
|
| 163 |
+ END IF; |
|
| 164 |
+ END PROCESS p_sync_pc; |
|
| 165 |
+ |
|
| 166 |
+ p_fetch: PROCESS(n_pc, i_instr_data) |
|
| 167 |
+ BEGIN |
|
| 168 |
+ o_instr_addr <= n_pc; |
|
| 169 |
+ s_instr <= i_instr_data; |
|
| 170 |
+ END PROCESS p_fetch; |
|
| 171 |
+ |
|
| 172 |
+ p_dec2ex: PROCESS(rst, clk) |
|
| 145 | 173 |
BEGIN |
| 146 | 174 |
IF rst = '1' THEN |
| 147 |
- r_instr <= (OTHERS => '0'); |
|
| 175 |
+ r_reg_s <= (OTHERS => '0'); |
|
| 176 |
+ r_reg_t <= (OTHERS => '0'); |
|
| 177 |
+ r_reg_d <= (OTHERS => '0'); |
|
| 178 |
+ r_imm_a <= (OTHERS => '0'); |
|
| 179 |
+ r_imm_16 <= (OTHERS => '0'); |
|
| 180 |
+ r_imm_26 <= (OTHERS => '0'); |
|
| 181 |
+ r_op <= op_none; |
|
| 182 |
+ r_link <= link_none; |
|
| 183 |
+ r_cmp <= cmp_none; |
|
| 184 |
+ r_alu <= alu_none; |
|
| 185 |
+ r_imm <= imm_none; |
|
| 148 | 186 |
ELSIF rising_edge(clk) THEN |
| 149 |
- r_instr <= std_logic_vector(unsigned(r_instr) + |
|
| 150 |
- to_unsigned(1, 32)); |
|
| 187 |
+ r_reg_s <= n_reg_s; |
|
| 188 |
+ r_reg_t <= n_reg_t; |
|
| 189 |
+ r_reg_d <= n_reg_d; |
|
| 190 |
+ r_imm_a <= n_imm_a; |
|
| 191 |
+ r_imm_16 <= n_imm_16; |
|
| 192 |
+ r_imm_26 <= n_imm_26; |
|
| 193 |
+ r_op <= n_op; |
|
| 194 |
+ r_link <= n_link; |
|
| 195 |
+ r_cmp <= n_cmp; |
|
| 196 |
+ r_alu <= n_alu; |
|
| 197 |
+ r_imm <= n_imm; |
|
| 151 | 198 |
END IF; |
| 152 |
- END PROCESS p_dummy_fetch; |
|
| 199 |
+ END PROCESS p_dec2ex; |
|
| 153 | 200 |
|
| 154 |
- p_alu_in: PROCESS(s_op, s_imm, s_val_s, s_val_t, s_imm_a, s_imm_16) |
|
| 201 |
+ p_alu_in: PROCESS(r_op, r_imm, s_val_s, s_val_t, r_imm_a, r_imm_16) |
|
| 155 | 202 |
BEGIN |
| 156 | 203 |
s_alu_op1 <= (OTHERS => '0'); |
| 157 | 204 |
s_alu_op2 <= (OTHERS => '0'); |
| 158 |
- IF s_op = op_alu THEN |
|
| 159 |
- CASE s_imm IS |
|
| 205 |
+ IF r_op = op_alu THEN |
|
| 206 |
+ CASE r_imm IS |
|
| 160 | 207 |
WHEN imm_none => |
| 161 | 208 |
s_alu_op1 <= s_val_s; |
| 162 | 209 |
s_alu_op2 <= s_val_t; |
| 163 | 210 |
WHEN imm_a => |
| 164 |
- s_alu_op1(4 DOWNTO 0) <= s_imm_a; |
|
| 211 |
+ s_alu_op1(4 DOWNTO 0) <= r_imm_a; |
|
| 165 | 212 |
s_alu_op2 <= s_val_t; |
| 166 | 213 |
WHEN imm_16se => |
| 167 | 214 |
s_alu_op1 <= s_val_s; |
| 168 |
- s_alu_op2(15 DOWNTO 0) <= s_imm_16; |
|
| 169 |
- IF (s_imm_16(15) = '1') THEN |
|
| 215 |
+ s_alu_op2(15 DOWNTO 0) <= r_imm_16; |
|
| 216 |
+ IF (r_imm_16(15) = '1') THEN |
|
| 170 | 217 |
s_alu_op2(31 DOWNTO 16) <= (OTHERS => '1'); |
| 171 | 218 |
END IF; |
| 172 | 219 |
WHEN imm_16ze => |
| 173 | 220 |
s_alu_op1 <= s_val_s; |
| 174 |
- s_alu_op2(15 DOWNTO 0) <= s_imm_16; |
|
| 221 |
+ s_alu_op2(15 DOWNTO 0) <= r_imm_16; |
|
| 175 | 222 |
WHEN OTHERS => NULL; |
| 176 | 223 |
END CASE; |
| 177 | 224 |
END IF; |
| 178 | 225 |
END PROCESS p_alu_in; |
| 179 | 226 |
|
| 180 |
- p_cmp_in: PROCESS(s_op, s_val_s, s_val_t) |
|
| 227 |
+ p_cmp_in: PROCESS(r_op, s_val_s, s_val_t) |
|
| 181 | 228 |
BEGIN |
| 182 | 229 |
s_cmp_op1 <= (OTHERS => '0'); |
| 183 | 230 |
s_cmp_op2 <= (OTHERS => '0'); |
| 184 |
- IF s_op = op_j THEN |
|
| 231 |
+ IF r_op = op_j THEN |
|
| 185 | 232 |
s_cmp_op1 <= s_val_s; |
| 186 | 233 |
s_cmp_op2 <= s_val_t; |
| 187 | 234 |
END IF; |
| 188 | 235 |
END PROCESS p_cmp_in; |
| 189 | 236 |
|
| 190 |
- p_reg_wr: PROCESS(s_op, s_imm, s_reg_t, s_reg_d) |
|
| 237 |
+ p_reg_wr: PROCESS(r_op, r_imm, r_reg_t, r_reg_d) |
|
| 191 | 238 |
BEGIN |
| 192 | 239 |
s_reg_wr_no <= (OTHERS => '0'); |
| 193 | 240 |
s_reg_wr_data <= (OTHERS => '0'); |
| 194 | 241 |
s_reg_wr_en <= '0'; |
| 195 |
- IF s_op = op_alu THEN |
|
| 196 |
- CASE s_imm IS |
|
| 242 |
+ IF r_op = op_alu THEN |
|
| 243 |
+ CASE r_imm IS |
|
| 197 | 244 |
WHEN imm_none | imm_a => |
| 198 |
- s_reg_wr_no <= s_reg_d; |
|
| 245 |
+ s_reg_wr_no <= r_reg_d; |
|
| 199 | 246 |
s_reg_wr_data <= s_alu_res; |
| 200 | 247 |
s_reg_wr_en <= '1'; |
| 201 | 248 |
WHEN imm_16se | imm_16ze => |
| 202 |
- s_reg_wr_no <= s_reg_t; |
|
| 249 |
+ s_reg_wr_no <= r_reg_t; |
|
| 203 | 250 |
s_reg_wr_data <= s_alu_res; |
| 204 | 251 |
s_reg_wr_en <= '1'; |
| 205 | 252 |
WHEN OTHERS => NULL; |
| ... | ... |
@@ -207,34 +254,21 @@ BEGIN |
| 207 | 254 |
END IF; |
| 208 | 255 |
END PROCESS p_reg_wr; |
| 209 | 256 |
|
| 210 |
- p_next_pc: PROCESS(s_op, s_imm, s_cmp_res, s_imm_16, s_imm_26) |
|
| 257 |
+ p_next_pc: PROCESS(r_pc, r_op, r_imm, s_cmp_res, r_imm_16, r_imm_26) |
|
| 211 | 258 |
VARIABLE v_pc: signed(31 DOWNTO 0); |
| 212 | 259 |
VARIABLE v_rel: signed(17 DOWNTO 0); |
| 213 | 260 |
BEGIN |
| 214 |
- -- FIXME |
|
| 215 |
- IF s_cmp_res = '1' AND s_imm = imm_26 THEN |
|
| 216 |
- n_pc <= r_pc(31 DOWNTO 28) & s_imm_26 & "00"; |
|
| 261 |
+ IF r_op = op_j AND s_cmp_res = '1' THEN |
|
| 262 |
+ IF r_imm = imm_26 THEN |
|
| 263 |
+ n_pc <= r_pc(31 DOWNTO 28) & r_imm_26 & "00"; |
|
| 217 | 264 |
ELSE |
| 218 |
- v_pc := signed(r_pc); |
|
| 219 |
- v_rel := to_signed(4, 18); |
|
| 220 |
- IF s_cmp_res = '1' THEN |
|
| 221 |
- v_rel := signed(s_imm_16 & "00"); |
|
| 265 |
+ n_pc <= std_logic_vector(signed(r_pc) + |
|
| 266 |
+ signed(r_imm_16 & "00")); |
|
| 222 | 267 |
END IF; |
| 223 |
- v_pc := v_pc + v_rel; |
|
| 224 |
- n_pc <= std_logic_vector(v_pc); |
|
| 268 |
+ ELSE |
|
| 269 |
+ n_pc <= std_logic_vector(signed(r_pc) + to_signed(4, 32)); |
|
| 225 | 270 |
END IF; |
| 226 | 271 |
END PROCESS p_next_pc; |
| 227 | 272 |
|
| 228 |
- p_sync: PROCESS(rst, clk) |
|
| 229 |
- BEGIN |
|
| 230 |
- IF rst = '1' THEN |
|
| 231 |
- r_pc <= (OTHERS => '0'); |
|
| 232 |
- ELSIF rising_edge(clk) THEN |
|
| 233 |
- r_pc <= n_pc; |
|
| 234 |
- END IF; |
|
| 235 |
- END PROCESS p_sync; |
|
| 236 |
- |
|
| 237 |
- o_res <= s_alu_res; |
|
| 238 |
- |
|
| 239 | 273 |
END ARCHITECTURE a_mips_core; |
| 240 | 274 |
|
| 241 | 275 |