Stefan Schuermans commited on 2012-02-26 21:20:53
Showing 6 changed files, with 84 additions and 23 deletions.
| ... | ... |
@@ -18,9 +18,8 @@ int eth_can_rx(void) |
| 18 | 18 |
*/ |
| 19 | 19 |
unsigned char eth_rx(void) |
| 20 | 20 |
{
|
| 21 |
- while (!eth_ptr[0]); /* wait for data */ |
|
| 22 |
- unsigned char chr = eth_ptr[4]; /* read data */ |
|
| 23 |
- eth_ptr[4] = 0; /* remove data from FIFO */ |
|
| 21 |
+ while (!eth_ptr[0]); |
|
| 22 |
+ unsigned char chr = eth_ptr[4]; |
|
| 24 | 23 |
return chr; |
| 25 | 24 |
} |
| 26 | 25 |
|
| ... | ... |
@@ -45,8 +45,8 @@ int uart_can_tx(void) |
| 45 | 45 |
*/ |
| 46 | 46 |
void uart_tx(unsigned short chr) |
| 47 | 47 |
{
|
| 48 |
- while (!*(uart_ptr + 4)); /* wait for ready */ |
|
| 49 |
- *(unsigned short *)(uart_ptr + 8) = chr; /* write data */ |
|
| 48 |
+ while (!*(uart_ptr + 4)); |
|
| 49 |
+ *(unsigned short *)(uart_ptr + 8) = chr; |
|
| 50 | 50 |
} |
| 51 | 51 |
|
| 52 | 52 |
/** |
| ... | ... |
@@ -64,9 +64,8 @@ int uart_can_rx(void) |
| 64 | 64 |
*/ |
| 65 | 65 |
unsigned short uart_rx(void) |
| 66 | 66 |
{
|
| 67 |
- while (!*(uart_ptr + 5)); /* wait for data */ |
|
| 68 |
- unsigned short chr = *(unsigned short *)(uart_ptr + 12); /* read data */ |
|
| 69 |
- *(unsigned short *)(uart_ptr + 12) = 0; /* remove data from FIFO */ |
|
| 67 |
+ while (!*(uart_ptr + 5)); |
|
| 68 |
+ unsigned short chr = *(unsigned short *)(uart_ptr + 12); |
|
| 70 | 69 |
return chr; |
| 71 | 70 |
} |
| 72 | 71 |
|
| ... | ... |
@@ -8,6 +8,7 @@ ENTITY e_io_eth IS |
| 8 | 8 |
clk: IN std_logic; |
| 9 | 9 |
i_addr: IN std_logic_vector( 1 DOWNTO 0); |
| 10 | 10 |
o_rd_data: OUT std_logic_vector(31 DOWNTO 0); |
| 11 |
+ i_rd_en: IN std_logic_vector( 3 DOWNTO 0); |
|
| 11 | 12 |
i_wr_data: IN std_logic_vector(31 DOWNTO 0); |
| 12 | 13 |
i_wr_en: IN std_logic_vector( 3 DOWNTO 0); |
| 13 | 14 |
pin_o_nrst: OUT std_logic; |
| ... | ... |
@@ -134,15 +135,7 @@ BEGIN |
| 134 | 135 |
); |
| 135 | 136 |
|
| 136 | 137 |
-- so far only for testing |
| 137 |
- p_rx_test_wr: PROCESS (i_addr, i_wr_data, i_wr_en) |
|
| 138 |
- BEGIN |
|
| 139 |
- s_rx_fifo_rd_en <= '0'; |
|
| 140 |
- IF i_addr = "01" THEN |
|
| 141 |
- IF i_wr_en(0) = '1' THEN |
|
| 142 |
- s_rx_fifo_rd_en <= '1'; |
|
| 143 |
- END IF; |
|
| 144 |
- END IF; |
|
| 145 |
- END PROCESS p_rx_test_wr; |
|
| 138 |
+ s_rx_fifo_rd_en <= '1' WHEN i_addr = "01" AND i_rd_en(0) = '1' ELSE '0'; |
|
| 146 | 139 |
|
| 147 | 140 |
-- so far only for testing |
| 148 | 141 |
p_rx_test_rd: PROCESS (rst, clk) |
| ... | ... |
@@ -8,6 +8,7 @@ ENTITY e_io_uart IS |
| 8 | 8 |
clk: IN std_logic; |
| 9 | 9 |
i_addr: IN std_logic_vector( 1 DOWNTO 0); |
| 10 | 10 |
o_rd_data: OUT std_logic_vector(31 DOWNTO 0); |
| 11 |
+ i_rd_en: IN std_logic_vector( 3 DOWNTO 0); |
|
| 11 | 12 |
i_wr_data: IN std_logic_vector(31 DOWNTO 0); |
| 12 | 13 |
i_wr_en: IN std_logic_vector( 3 DOWNTO 0); |
| 13 | 14 |
pin_i_rx: IN std_logic; |
| ... | ... |
@@ -131,7 +132,7 @@ BEGIN |
| 131 | 132 |
END IF; |
| 132 | 133 |
END PROCESS p_cfg_sync; |
| 133 | 134 |
|
| 134 |
- s_rx_rd_en <= '1' WHEN i_addr = "11" AND i_wr_en(1 DOWNTO 0) = "11" |
|
| 135 |
+ s_rx_rd_en <= '1' WHEN i_addr = "11" AND i_rd_en(1 DOWNTO 0) = "11" |
|
| 135 | 136 |
ELSE '0'; |
| 136 | 137 |
|
| 137 | 138 |
rx_fifo: e_block_fifo |
| ... | ... |
@@ -439,14 +440,26 @@ BEGIN |
| 439 | 440 |
o_rd_data <= (OTHERS => '0'); |
| 440 | 441 |
CASE i_addr IS |
| 441 | 442 |
WHEN "00" => |
| 443 |
+ IF i_rd_en(1 DOWNTO 0) = "11" THEN |
|
| 442 | 444 |
o_rd_data(15 DOWNTO 0) <= r_cfg_scale; |
| 445 |
+ END IF; |
|
| 446 |
+ IF i_rd_en(2) = '1' THEN |
|
| 443 | 447 |
o_rd_data(19 DOWNTO 16) <= r_cfg_bits; |
| 448 |
+ END IF; |
|
| 449 |
+ IF i_rd_en(3) = '1' THEN |
|
| 444 | 450 |
o_rd_data(25 DOWNTO 24) <= r_cfg_stop; |
| 451 |
+ END IF; |
|
| 445 | 452 |
WHEN "01" => |
| 453 |
+ IF i_rd_en(0) = '1' THEN |
|
| 446 | 454 |
o_rd_data(0) <= s_tx_wr_rdy; |
| 455 |
+ END IF; |
|
| 456 |
+ IF i_rd_en(1) = '1' THEN |
|
| 447 | 457 |
o_rd_data(8) <= s_rx_rd_rdy; |
| 458 |
+ END IF; |
|
| 448 | 459 |
WHEN "11" => |
| 460 |
+ IF i_rd_en(1 DOWNTO 0) = "11" THEN |
|
| 449 | 461 |
o_rd_data(15 DOWNTO 0) <= s_rx_rd_data; |
| 462 |
+ END IF; |
|
| 450 | 463 |
WHEN OTHERS => |
| 451 | 464 |
NULL; |
| 452 | 465 |
END CASE; |
| ... | ... |
@@ -12,6 +12,7 @@ ENTITY e_mips_core IS |
| 12 | 12 |
i_instr_data: IN std_logic_vector(31 DOWNTO 0); |
| 13 | 13 |
o_data_addr: OUT std_logic_vector(31 DOWNTO 0); |
| 14 | 14 |
i_data_rd_data: IN std_logic_vector(31 DOWNTO 0); |
| 15 |
+ o_data_rd_en: OUT std_logic_vector( 3 DOWNTO 0); |
|
| 15 | 16 |
o_data_wr_data: OUT std_logic_vector(31 DOWNTO 0); |
| 16 | 17 |
o_data_wr_en: OUT std_logic_vector( 3 DOWNTO 0) |
| 17 | 18 |
); |
| ... | ... |
@@ -419,20 +420,62 @@ BEGIN |
| 419 | 420 |
END PROCESS p_next_pc; |
| 420 | 421 |
|
| 421 | 422 |
p_data_addr: PROCESS(r_op, s_val_s, r_imm_16) |
| 422 |
- VARIABLE v_ofs: signed(31 DOWNTO 0); |
|
| 423 |
- VARIABLE v_addr: signed(31 DOWNTO 0); |
|
| 423 |
+ VARIABLE v_ofs: unsigned(31 DOWNTO 0); |
|
| 424 |
+ VARIABLE v_addr: unsigned(31 DOWNTO 0); |
|
| 424 | 425 |
BEGIN |
| 425 | 426 |
s_data_addr <= (OTHERS => '0'); |
| 426 | 427 |
IF r_op = op_l OR r_op = op_s THEN |
| 427 |
- v_ofs(15 DOWNTO 0) := signed(r_imm_16); |
|
| 428 |
+ v_ofs(15 DOWNTO 0) := unsigned(r_imm_16); |
|
| 428 | 429 |
v_ofs(31 DOWNTO 16) := (OTHERS => r_imm_16(15)); |
| 429 |
- v_addr := signed(s_val_s) + v_ofs; |
|
| 430 |
+ v_addr := unsigned(s_val_s) + v_ofs; |
|
| 430 | 431 |
s_data_addr <= std_logic_vector(v_addr); |
| 431 | 432 |
END IF; |
| 432 | 433 |
END PROCESS p_data_addr; |
| 433 | 434 |
|
| 434 | 435 |
o_data_addr <= s_data_addr(31 DOWNTO 2) & "00"; |
| 435 | 436 |
|
| 437 |
+ p_data_rd_en: PROCESS(r_data_rd, r_op, r_ldst, s_data_addr) |
|
| 438 |
+ BEGIN |
|
| 439 |
+ o_data_rd_en <= "0000"; |
|
| 440 |
+ IF r_data_rd = data_rd_idle AND r_op = op_l THEN |
|
| 441 |
+ CASE r_ldst IS |
|
| 442 |
+ WHEN ldst_b | ldst_bu => |
|
| 443 |
+ CASE s_data_addr(1 DOWNTO 0) IS |
|
| 444 |
+ WHEN "00" => o_data_rd_en <= "0001"; |
|
| 445 |
+ WHEN "01" => o_data_rd_en <= "0010"; |
|
| 446 |
+ WHEN "10" => o_data_rd_en <= "0100"; |
|
| 447 |
+ WHEN "11" => o_data_rd_en <= "1000"; |
|
| 448 |
+ WHEN OTHERS => NULL; |
|
| 449 |
+ END CASE; |
|
| 450 |
+ WHEN ldst_h | ldst_hu => |
|
| 451 |
+ CASE s_data_addr(1 DOWNTO 1) IS |
|
| 452 |
+ WHEN "0" => o_data_rd_en <= "0011"; |
|
| 453 |
+ WHEN "1" => o_data_rd_en <= "1100"; |
|
| 454 |
+ WHEN OTHERS => NULL; |
|
| 455 |
+ END CASE; |
|
| 456 |
+ WHEN ldst_w => |
|
| 457 |
+ o_data_rd_en <= "1111"; |
|
| 458 |
+ WHEN ldst_wl => |
|
| 459 |
+ CASE s_data_addr(1 DOWNTO 0) IS |
|
| 460 |
+ WHEN "00" => o_data_rd_en <= "0001"; |
|
| 461 |
+ WHEN "01" => o_data_rd_en <= "0011"; |
|
| 462 |
+ WHEN "10" => o_data_rd_en <= "0111"; |
|
| 463 |
+ WHEN "11" => o_data_rd_en <= "1111"; |
|
| 464 |
+ WHEN OTHERS => NULL; |
|
| 465 |
+ END CASE; |
|
| 466 |
+ WHEN ldst_wr => |
|
| 467 |
+ CASE s_data_addr(1 DOWNTO 0) IS |
|
| 468 |
+ WHEN "00" => o_data_rd_en <= "1111"; |
|
| 469 |
+ WHEN "01" => o_data_rd_en <= "1110"; |
|
| 470 |
+ WHEN "10" => o_data_rd_en <= "1100"; |
|
| 471 |
+ WHEN "11" => o_data_rd_en <= "1000"; |
|
| 472 |
+ WHEN OTHERS => NULL; |
|
| 473 |
+ END CASE; |
|
| 474 |
+ WHEN OTHERS => NULL; |
|
| 475 |
+ END CASE; |
|
| 476 |
+ END IF; |
|
| 477 |
+ END PROCESS p_data_rd_en; |
|
| 478 |
+ |
|
| 436 | 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) |
| 437 | 480 |
VARIABLE v_b: std_logic_vector( 7 DOWNTO 0); |
| 438 | 481 |
VARIABLE v_h: std_logic_vector(15 DOWNTO 0); |
| ... | ... |
@@ -35,6 +35,7 @@ ARCHITECTURE a_system OF e_system IS |
| 35 | 35 |
SIGNAL s_instr_data: std_logic_vector(31 DOWNTO 0); |
| 36 | 36 |
SIGNAL s_dbus_addr: std_logic_vector(31 DOWNTO 0); |
| 37 | 37 |
SIGNAL s_dbus_rd_data: std_logic_vector(31 DOWNTO 0); |
| 38 |
+ SIGNAL s_dbus_rd_en: std_logic_vector( 3 DOWNTO 0); |
|
| 38 | 39 |
SIGNAL s_dbus_wr_data: std_logic_vector(31 DOWNTO 0); |
| 39 | 40 |
SIGNAL s_dbus_wr_en: std_logic_vector( 3 DOWNTO 0); |
| 40 | 41 |
|
| ... | ... |
@@ -54,10 +55,12 @@ ARCHITECTURE a_system OF e_system IS |
| 54 | 55 |
SIGNAL s_switches_rd_data: std_logic_vector(31 DOWNTO 0); |
| 55 | 56 |
SIGNAL s_uart_addr: std_logic_vector( 3 DOWNTO 0); |
| 56 | 57 |
SIGNAL s_uart_rd_data: std_logic_vector(31 DOWNTO 0); |
| 58 |
+ SIGNAL s_uart_rd_en: std_logic_vector( 3 DOWNTO 0); |
|
| 57 | 59 |
SIGNAL s_uart_wr_data: std_logic_vector(31 DOWNTO 0); |
| 58 | 60 |
SIGNAL s_uart_wr_en: std_logic_vector( 3 DOWNTO 0); |
| 59 | 61 |
SIGNAL s_eth_addr: std_logic_vector( 3 DOWNTO 0); |
| 60 | 62 |
SIGNAL s_eth_rd_data: std_logic_vector(31 DOWNTO 0); |
| 63 |
+ SIGNAL s_eth_rd_en: std_logic_vector( 3 DOWNTO 0); |
|
| 61 | 64 |
SIGNAL s_eth_wr_data: std_logic_vector(31 DOWNTO 0); |
| 62 | 65 |
SIGNAL s_eth_wr_en: std_logic_vector( 3 DOWNTO 0); |
| 63 | 66 |
SIGNAL s_cyc_cnt_rd_data: std_logic_vector(31 DOWNTO 0); |
| ... | ... |
@@ -73,6 +76,7 @@ ARCHITECTURE a_system OF e_system IS |
| 73 | 76 |
i_instr_data: IN std_logic_vector(31 DOWNTO 0); |
| 74 | 77 |
o_data_addr: OUT std_logic_vector(31 DOWNTO 0); |
| 75 | 78 |
i_data_rd_data: IN std_logic_vector(31 DOWNTO 0); |
| 79 |
+ o_data_rd_en: OUT std_logic_vector( 3 DOWNTO 0); |
|
| 76 | 80 |
o_data_wr_data: OUT std_logic_vector(31 DOWNTO 0); |
| 77 | 81 |
o_data_wr_en: OUT std_logic_vector( 3 DOWNTO 0) |
| 78 | 82 |
); |
| ... | ... |
@@ -179,6 +183,7 @@ ARCHITECTURE a_system OF e_system IS |
| 179 | 183 |
clk: IN std_logic; |
| 180 | 184 |
i_addr: IN std_logic_vector( 1 DOWNTO 0); |
| 181 | 185 |
o_rd_data: OUT std_logic_vector(31 DOWNTO 0); |
| 186 |
+ i_rd_en: IN std_logic_vector( 3 DOWNTO 0); |
|
| 182 | 187 |
i_wr_data: IN std_logic_vector(31 DOWNTO 0); |
| 183 | 188 |
i_wr_en: IN std_logic_vector( 3 DOWNTO 0); |
| 184 | 189 |
pin_i_rx: IN std_logic; |
| ... | ... |
@@ -192,6 +197,7 @@ ARCHITECTURE a_system OF e_system IS |
| 192 | 197 |
clk: IN std_logic; |
| 193 | 198 |
i_addr: IN std_logic_vector( 1 DOWNTO 0); |
| 194 | 199 |
o_rd_data: OUT std_logic_vector(31 DOWNTO 0); |
| 200 |
+ i_rd_en: IN std_logic_vector( 3 DOWNTO 0); |
|
| 195 | 201 |
i_wr_data: IN std_logic_vector(31 DOWNTO 0); |
| 196 | 202 |
i_wr_en: IN std_logic_vector( 3 DOWNTO 0); |
| 197 | 203 |
pin_o_nrst: OUT std_logic; |
| ... | ... |
@@ -227,6 +233,7 @@ BEGIN |
| 227 | 233 |
i_instr_data => s_instr_data, |
| 228 | 234 |
o_data_addr => s_dbus_addr, |
| 229 | 235 |
i_data_rd_data => s_dbus_rd_data, |
| 236 |
+ o_data_rd_en => s_dbus_rd_en, |
|
| 230 | 237 |
o_data_wr_data => s_dbus_wr_data, |
| 231 | 238 |
o_data_wr_en => s_dbus_wr_en |
| 232 | 239 |
); |
| ... | ... |
@@ -281,7 +288,8 @@ BEGIN |
| 281 | 288 |
END IF; |
| 282 | 289 |
END PROCESS p_dbus_rd; |
| 283 | 290 |
|
| 284 |
- p_dbus_wr: PROCESS(s_dbus_addr, s_dbus_wr_data, s_dbus_wr_en) |
|
| 291 |
+ p_dbus_wr: PROCESS(s_dbus_addr, s_dbus_rd_en, |
|
| 292 |
+ s_dbus_wr_data, s_dbus_wr_en) |
|
| 285 | 293 |
VARIABLE v_wr_en_word: std_logic; |
| 286 | 294 |
BEGIN |
| 287 | 295 |
v_wr_en_word := s_dbus_wr_en(0) AND s_dbus_wr_en(1) AND |
| ... | ... |
@@ -295,9 +303,11 @@ BEGIN |
| 295 | 303 |
s_lcd_wr_en <= (OTHERS => '0'); |
| 296 | 304 |
s_switches_addr <= (OTHERS => '0'); |
| 297 | 305 |
s_uart_addr <= (OTHERS => '0'); |
| 306 |
+ s_uart_rd_en <= (OTHERS => '0'); |
|
| 298 | 307 |
s_uart_wr_data <= (OTHERS => '0'); |
| 299 | 308 |
s_uart_wr_en <= (OTHERS => '0'); |
| 300 | 309 |
s_eth_addr <= (OTHERS => '0'); |
| 310 |
+ s_eth_rd_en <= (OTHERS => '0'); |
|
| 301 | 311 |
s_eth_wr_data <= (OTHERS => '0'); |
| 302 | 312 |
s_eth_wr_en <= (OTHERS => '0'); |
| 303 | 313 |
s_cyc_cnt_wr_data <= (OTHERS => '0'); |
| ... | ... |
@@ -318,10 +328,12 @@ BEGIN |
| 318 | 328 |
s_switches_addr <= s_dbus_addr(2 DOWNTO 0); |
| 319 | 329 |
WHEN X"03" => |
| 320 | 330 |
s_uart_addr <= s_dbus_addr(3 DOWNTO 0); |
| 331 |
+ s_uart_rd_en <= s_dbus_rd_en; |
|
| 321 | 332 |
s_uart_wr_data <= s_dbus_wr_data; |
| 322 | 333 |
s_uart_wr_en <= s_dbus_wr_en; |
| 323 | 334 |
WHEN X"04" => |
| 324 | 335 |
s_eth_addr <= s_dbus_addr(3 DOWNTO 0); |
| 336 |
+ s_eth_rd_en <= s_dbus_rd_en; |
|
| 325 | 337 |
s_eth_wr_data <= s_dbus_wr_data; |
| 326 | 338 |
s_eth_wr_en <= s_dbus_wr_en; |
| 327 | 339 |
WHEN X"10" => |
| ... | ... |
@@ -415,6 +427,7 @@ BEGIN |
| 415 | 427 |
clk => clk, |
| 416 | 428 |
i_addr => s_uart_addr(3 DOWNTO 2), |
| 417 | 429 |
o_rd_data => s_uart_rd_data, |
| 430 |
+ i_rd_en => s_uart_rd_en, |
|
| 418 | 431 |
i_wr_data => s_uart_wr_data, |
| 419 | 432 |
i_wr_en => s_uart_wr_en, |
| 420 | 433 |
pin_i_rx => pin_i_uart_rx, |
| ... | ... |
@@ -427,6 +440,7 @@ BEGIN |
| 427 | 440 |
clk => clk, |
| 428 | 441 |
i_addr => s_eth_addr(3 DOWNTO 2), |
| 429 | 442 |
o_rd_data => s_eth_rd_data, |
| 443 |
+ i_rd_en => s_eth_rd_en, |
|
| 430 | 444 |
i_wr_data => s_eth_wr_data, |
| 431 | 445 |
i_wr_en => s_eth_wr_en, |
| 432 | 446 |
pin_o_nrst => pin_o_eth_nrst, |
| 433 | 447 |