Stefan Schuermans commited on 2012-03-11 20:48:30
Showing 5 changed files, with 70 additions and 11 deletions.
... | ... |
@@ -7,6 +7,17 @@ static unsigned int eth_idx_hw; |
7 | 7 |
static unsigned int eth_rx_buf[2][256]; |
8 | 8 |
static unsigned int *eth_rx_pos; |
9 | 9 |
|
10 |
+/** |
|
11 |
+ * @brief set MAC address |
|
12 |
+ * @param[in] mac MAC address |
|
13 |
+ */ |
|
14 |
+static void eth_mac_set(const unsigned char mac[6]) |
|
15 |
+{ |
|
16 |
+ unsigned int i; |
|
17 |
+ for (i = 0; i < 6; ++i) |
|
18 |
+ ((volatile unsigned char *)(eth_ptr + 12))[i] = mac[i]; |
|
19 |
+} |
|
20 |
+ |
|
10 | 21 |
/** |
11 | 22 |
* @brief provide new receive buffer |
12 | 23 |
* @param[in] ptr pointer to new receive buffer |
... | ... |
@@ -31,6 +42,13 @@ static void * eth_rx_get_pos(void) |
31 | 42 |
return (void *)eth_ptr[0]; |
32 | 43 |
} |
33 | 44 |
|
45 |
+/** initialize MAC address */ |
|
46 |
+void eth_mac_init(void) |
|
47 |
+{ |
|
48 |
+ static const unsigned char mac[6] = {0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; |
|
49 |
+ eth_mac_set(mac); |
|
50 |
+} |
|
51 |
+ |
|
34 | 52 |
/** initialize receiver */ |
35 | 53 |
void eth_rx_init(void) |
36 | 54 |
{ |
... | ... |
@@ -100,6 +100,10 @@ ARCHITECTURE a_io_eth OF e_io_eth IS |
100 | 100 |
SIGNAL r_tx_en: std_logic := '0'; |
101 | 101 |
SIGNAL n_tx_en: std_logic; |
102 | 102 |
|
103 |
+ -- MAC address register |
|
104 |
+ SIGNAL r_mac: std_logic_vector(47 DOWNTO 0) := X"FFFFFFFFFFFF"; |
|
105 |
+ SIGNAL n_mac: std_logic_vector(47 DOWNTO 0); |
|
106 |
+ |
|
103 | 107 |
-- TX busmaster read state machine |
104 | 108 |
SIGNAL r_tx_pos: std_logic_vector(31 DOWNTO 0) := X"00000000"; |
105 | 109 |
SIGNAL n_tx_pos: std_logic_vector(31 DOWNTO 0); |
... | ... |
@@ -233,7 +237,7 @@ BEGIN |
233 | 237 |
i_data_en => s_rxif_data_en, |
234 | 238 |
i_done => s_rxif_done, |
235 | 239 |
i_err => s_rxif_err, |
236 |
- i_mac => X"070605040302", |
|
240 |
+ i_mac => r_mac, |
|
237 | 241 |
o_data => s_rxframe_data, |
238 | 242 |
o_data_en => s_rxframe_data_en, |
239 | 243 |
o_done => s_rxframe_done, |
... | ... |
@@ -391,6 +395,7 @@ BEGIN |
391 | 395 |
r_tx_start <= X"00000000"; |
392 | 396 |
r_tx_end <= X"00000000"; |
393 | 397 |
r_tx_en <= '0'; |
398 |
+ r_mac <= X"FFFFFFFFFFFF"; |
|
394 | 399 |
ELSIF rising_edge(clk) THEN |
395 | 400 |
r_rx_start <= n_rx_start; |
396 | 401 |
r_rx_cur <= n_rx_cur; |
... | ... |
@@ -402,12 +407,13 @@ BEGIN |
402 | 407 |
r_tx_start <= n_tx_start; |
403 | 408 |
r_tx_end <= n_tx_end; |
404 | 409 |
r_tx_en <= n_tx_en; |
410 |
+ r_mac <= n_mac; |
|
405 | 411 |
END IF; |
406 | 412 |
END PROCESS p_reg_sync; |
407 | 413 |
|
408 | 414 |
-- register interface write |
409 | 415 |
p_write: PROCESS(r_rx_new_start, r_rx_new_end, r_rx_new_en, s_rx_new, |
410 |
- r_tx_start, r_tx_end, r_tx_en, s_txframe_done, |
|
416 |
+ r_tx_start, r_tx_end, r_tx_en, s_txframe_done, r_mac, |
|
411 | 417 |
i_addr, i_wr_data, i_wr_en) |
412 | 418 |
BEGIN |
413 | 419 |
n_rx_new_start <= r_rx_new_start; |
... | ... |
@@ -416,6 +422,7 @@ BEGIN |
416 | 422 |
n_tx_start <= r_tx_start; |
417 | 423 |
n_tx_end <= r_tx_end; |
418 | 424 |
n_tx_en <= r_tx_en; |
425 |
+ n_mac <= r_mac; |
|
419 | 426 |
s_txframe_en <= '0'; |
420 | 427 |
IF s_rx_new = '1' THEN |
421 | 428 |
n_rx_new_en <= '0'; -- new buffer has been overtaken, reset rx_new_en |
... | ... |
@@ -423,28 +430,56 @@ BEGIN |
423 | 430 |
IF s_txframe_done = '1' THEN |
424 | 431 |
n_tx_en <= '0'; -- TX operation completed, reset tx_en |
425 | 432 |
END IF; |
426 |
- IF i_wr_en = "1111" THEN |
|
427 | 433 |
CASE i_addr IS |
428 |
- WHEN "0100" => n_rx_new_start <= i_wr_data; |
|
429 |
- WHEN "0101" => n_rx_new_end <= i_wr_data; |
|
430 |
- WHEN "0110" => IF i_wr_data(0) = '1' THEN |
|
434 |
+ WHEN "0100" => |
|
435 |
+ IF i_wr_en = "1111" THEN |
|
436 |
+ n_rx_new_start <= i_wr_data; |
|
437 |
+ END IF; |
|
438 |
+ WHEN "0101" => |
|
439 |
+ IF i_wr_en = "1111" THEN |
|
440 |
+ n_rx_new_end <= i_wr_data; |
|
441 |
+ END IF; |
|
442 |
+ WHEN "0110" => |
|
443 |
+ IF i_wr_en(0) = '1' AND i_wr_data(0) = '1' THEN |
|
431 | 444 |
n_rx_new_en <= '1'; |
432 | 445 |
END IF; |
433 |
- WHEN "1000" => IF r_tx_en = '0' THEN |
|
446 |
+ WHEN "1000" => |
|
447 |
+ IF i_wr_en = "1111" AND r_tx_en = '0' THEN |
|
434 | 448 |
n_tx_start <= i_wr_data; |
435 | 449 |
END IF; |
436 |
- WHEN "1001" => IF r_tx_en = '0' THEN |
|
450 |
+ WHEN "1001" => |
|
451 |
+ IF i_wr_en = "1111" AND r_tx_en = '0' THEN |
|
437 | 452 |
n_tx_end <= i_wr_data; |
438 | 453 |
END IF; |
439 |
- WHEN "1010" => IF i_wr_data(0) = '1' THEN |
|
454 |
+ WHEN "1010" => |
|
455 |
+ IF i_wr_en(0) = '1' AND i_wr_data(0) = '1' THEN |
|
440 | 456 |
IF r_tx_en = '0' THEN |
441 | 457 |
s_txframe_en <= '1'; |
442 | 458 |
END IF; |
443 | 459 |
n_tx_en <= '1'; |
444 | 460 |
END IF; |
461 |
+ WHEN "1100" => |
|
462 |
+ IF i_wr_en(0) = '1' THEN |
|
463 |
+ n_mac(7 DOWNTO 0) <= i_wr_data(7 DOWNTO 0); |
|
464 |
+ END IF; |
|
465 |
+ IF i_wr_en(1) = '1' THEN |
|
466 |
+ n_mac(15 DOWNTO 8) <= i_wr_data(15 DOWNTO 8); |
|
467 |
+ END IF; |
|
468 |
+ IF i_wr_en(2) = '1' THEN |
|
469 |
+ n_mac(23 DOWNTO 16) <= i_wr_data(23 DOWNTO 16); |
|
470 |
+ END IF; |
|
471 |
+ IF i_wr_en(3) = '1' THEN |
|
472 |
+ n_mac(31 DOWNTO 24) <= i_wr_data(31 DOWNTO 24); |
|
473 |
+ END IF; |
|
474 |
+ WHEN "1101" => |
|
475 |
+ IF i_wr_en(0) = '1' THEN |
|
476 |
+ n_mac(39 DOWNTO 32) <= i_wr_data(7 DOWNTO 0); |
|
477 |
+ END IF; |
|
478 |
+ IF i_wr_en(1) = '1' THEN |
|
479 |
+ n_mac(47 DOWNTO 40) <= i_wr_data(15 DOWNTO 8); |
|
480 |
+ END IF; |
|
445 | 481 |
WHEN OTHERS => NULL; |
446 | 482 |
END CASE; |
447 |
- END IF; |
|
448 | 483 |
END PROCESS p_write; |
449 | 484 |
|
450 | 485 |
-- register interface read |
... | ... |
@@ -465,6 +500,8 @@ BEGIN |
465 | 500 |
WHEN "1000" => o_rd_data <= r_tx_start; |
466 | 501 |
WHEN "1001" => o_rd_data <= r_tx_end; |
467 | 502 |
WHEN "1010" => o_rd_data(0) <= r_tx_en; |
503 |
+ WHEN "1100" => o_rd_data <= r_mac(31 DOWNTO 0); |
|
504 |
+ WHEN "1101" => o_rd_data(15 DOWNTO 0) <= r_mac(47 DOWNTO 32); |
|
468 | 505 |
WHEN OTHERS => NULL; |
469 | 506 |
END CASE; |
470 | 507 |
END IF; |
... | ... |
@@ -407,7 +407,7 @@ |
407 | 407 |
<property xil_pn:name="Shift Register Extraction" xil_pn:value="true" xil_pn:valueState="default"/> |
408 | 408 |
<property xil_pn:name="Show All Models" xil_pn:value="false" xil_pn:valueState="default"/> |
409 | 409 |
<property xil_pn:name="Simulation Model Target" xil_pn:value="VHDL" xil_pn:valueState="default"/> |
410 |
- <property xil_pn:name="Simulation Run Time ISim" xil_pn:value="1 ms" xil_pn:valueState="non-default"/> |
|
410 |
+ <property xil_pn:name="Simulation Run Time ISim" xil_pn:value="2 ms" xil_pn:valueState="non-default"/> |
|
411 | 411 |
<property xil_pn:name="Simulation Run Time Map" xil_pn:value="1000 ns" xil_pn:valueState="default"/> |
412 | 412 |
<property xil_pn:name="Simulation Run Time Par" xil_pn:value="1000 ns" xil_pn:valueState="default"/> |
413 | 413 |
<property xil_pn:name="Simulation Run Time Translate" xil_pn:value="1000 ns" xil_pn:valueState="default"/> |
414 | 414 |