implemented ethernet TX frame generation and register interface (no firmware yet, no simulation testbed support yet, not tested yet)
Stefan Schuermans

Stefan Schuermans commited on 2012-03-05 22:01:56
Showing 4 changed files, with 405 additions and 73 deletions.

... ...
@@ -6,7 +6,7 @@ ENTITY e_io_eth IS
6 6
     PORT (
7 7
         rst:          IN  std_logic;
8 8
         clk:          IN  std_logic;
9
-        i_addr:       IN  std_logic_vector( 2 DOWNTO 0);
9
+        i_addr:       IN  std_logic_vector( 3 DOWNTO 0);
10 10
         o_rd_data:    OUT std_logic_vector(31 DOWNTO 0);
11 11
         i_rd_en:      IN  std_logic_vector( 3 DOWNTO 0);
12 12
         i_wr_data:    IN  std_logic_vector(31 DOWNTO 0);
... ...
@@ -48,6 +48,16 @@ ARCHITECTURE a_io_eth OF e_io_eth IS
48 48
     SIGNAL s_txif_data_en:  std_logic;
49 49
     SIGNAL s_txif_data_ack: std_logic;
50 50
 
51
+    SIGNAL s_txframe_en:   std_logic;
52
+    SIGNAL s_txframe_done: std_logic;
53
+
54
+    SIGNAL s_txbuf_wr_rdy:  std_logic;
55
+    SIGNAL s_txbuf_wr_data: std_logic_vector(31 DOWNTO 0);
56
+    SIGNAL s_txbuf_wr_en:   std_logic;
57
+    SIGNAL s_txbuf_rd_rdy:  std_logic;
58
+    SIGNAL s_txbuf_rd_data: std_logic_vector(31 DOWNTO 0);
59
+    SIGNAL s_txbuf_rd_en:   std_logic;
60
+
51 61
     -- RX buffer registers
52 62
     --   start: current buffer begin
53 63
     --   cur: address of next data write
... ...
@@ -78,6 +88,23 @@ ARCHITECTURE a_io_eth OF e_io_eth IS
78 88
     SIGNAL r_rx_new_en:    std_logic                     := '0';
79 89
     SIGNAL n_rx_new_en:    std_logic;
80 90
 
91
+    -- TX buffer registers
92
+    --   start: begin of buffer
93
+    --   end: address just behind buffer
94
+    --   en: write 1 to start transmission, returns to zero if complete
95
+    --   all addresses are word-aligned
96
+    SIGNAL r_tx_start: std_logic_vector(31 DOWNTO 0) := X"00000000";
97
+    SIGNAL n_tx_start: std_logic_vector(31 DOWNTO 0);
98
+    SIGNAL r_tx_end:   std_logic_vector(31 DOWNTO 0) := X"00000000";
99
+    SIGNAL n_tx_end:   std_logic_vector(31 DOWNTO 0);
100
+    SIGNAL r_tx_en:    std_logic                     := '0';
101
+    SIGNAL n_tx_en:    std_logic;
102
+
103
+    -- TX busmaster read state machine
104
+    SIGNAL r_tx_pos:  std_logic_vector(31 DOWNTO 0) := X"00000000";
105
+    SIGNAL n_tx_pos:  std_logic_vector(31 DOWNTO 0);
106
+
107
+    -- busmaster write buffer
81 108
     SIGNAL s_wrbuf_wr_rdy:  std_logic;
82 109
     SIGNAL s_wrbuf_wr_data: std_logic_vector(63 DOWNTO 0);
83 110
     SIGNAL s_wrbuf_wr_en:   std_logic;
... ...
@@ -85,6 +112,10 @@ ARCHITECTURE a_io_eth OF e_io_eth IS
85 112
     SIGNAL s_wrbuf_rd_data: std_logic_vector(63 DOWNTO 0);
86 113
     SIGNAL s_wrbuf_rd_en:   std_logic;
87 114
 
115
+    -- busmaster read flag
116
+    SIGNAL r_bm_rd: std_logic := '0';
117
+    SIGNAL n_bm_rd: std_logic;
118
+
88 119
     COMPONENT e_io_eth_rst IS
89 120
         PORT (
90 121
             rst:        IN  std_logic;
... ...
@@ -138,6 +169,21 @@ ARCHITECTURE a_io_eth OF e_io_eth IS
138 169
         );
139 170
     END COMPONENT e_io_eth_txif;
140 171
 
172
+    COMPONENT e_io_eth_txframe IS
173
+        PORT (
174
+            rst:              IN  std_logic;
175
+            clk:              IN  std_logic;
176
+            o_if_data:        OUT std_logic_vector(7 DOWNTO 0);
177
+            o_if_data_en:     OUT std_logic;
178
+            i_if_data_ack:    IN  std_logic;
179
+            i_frame_en:       IN  std_logic;
180
+            i_frame_data:     IN  std_logic_vector(31 DOWNTO 0);
181
+            i_frame_data_en:  IN  std_logic;
182
+            o_frame_data_ack: OUT std_logic;
183
+            o_frame_done:     OUT std_logic
184
+        );
185
+    END COMPONENT e_io_eth_txframe;
186
+
141 187
     COMPONENT e_block_fifo IS
142 188
         GENERIC (
143 189
             addr_width: natural;
... ...
@@ -290,7 +336,49 @@ BEGIN
290 336
         END IF;
291 337
     END PROCESS p_rx_next;
292 338
 
293
-    p_rx_sync: PROCESS(rst, clk)
339
+    txif: e_io_eth_txif
340
+        PORT MAP (
341
+            rst          => rst,
342
+            clk          => clk,
343
+            i_data       => s_txif_data,
344
+            i_data_en    => s_txif_data_en,
345
+            o_data_ack   => s_txif_data_ack,
346
+            pin_i_tx_clk => pin_i_tx_clk,
347
+            pin_o_txd    => pin_o_txd,
348
+            pin_o_tx_en  => pin_o_tx_en
349
+        );
350
+
351
+    txframe: e_io_eth_txframe
352
+        PORT MAP (
353
+            rst              => rst,
354
+            clk              => clk,
355
+            o_if_data        => s_txif_data,
356
+            o_if_data_en     => s_txif_data_en,
357
+            i_if_data_ack    => s_txif_data_ack,
358
+            i_frame_en       => s_txframe_en,
359
+            i_frame_data     => s_txbuf_rd_data,
360
+            i_frame_data_en  => s_txbuf_rd_rdy,
361
+            o_frame_data_ack => s_txbuf_rd_en,
362
+            o_frame_done     => s_txframe_done
363
+        );
364
+
365
+    txbuf: e_block_fifo
366
+        GENERIC MAP (
367
+            addr_width => 2,
368
+            data_width => 32
369
+        )
370
+        PORT MAP (
371
+            rst       => rst,
372
+            clk       => clk,
373
+            o_wr_rdy  => s_txbuf_wr_rdy,
374
+            i_wr_data => s_txbuf_wr_data,
375
+            i_wr_en   => s_txbuf_wr_en,
376
+            o_rd_rdy  => s_txbuf_rd_rdy,
377
+            o_rd_data => s_txbuf_rd_data,
378
+            i_rd_en   => s_txbuf_rd_en
379
+        );
380
+
381
+    p_reg_sync: PROCESS(rst, clk)
294 382
     BEGIN
295 383
         IF rst = '1' THEN
296 384
             r_rx_start     <= X"00000000";
... ...
@@ -300,6 +388,9 @@ BEGIN
300 388
             r_rx_new_start <= X"00000000";
301 389
             r_rx_new_end   <= X"00000000";
302 390
             r_rx_new_en    <= '0';
391
+            r_tx_start     <= X"00000000";
392
+            r_tx_end       <= X"00000000";
393
+            r_tx_en        <= '0';
303 394
         ELSIF rising_edge(clk) THEN
304 395
             r_rx_start     <= n_rx_start;
305 396
             r_rx_cur       <= n_rx_cur;
... ...
@@ -308,46 +399,54 @@ BEGIN
308 399
             r_rx_new_start <= n_rx_new_start;
309 400
             r_rx_new_end   <= n_rx_new_end;
310 401
             r_rx_new_en    <= n_rx_new_en;
402
+            r_tx_start     <= n_tx_start;
403
+            r_tx_end       <= n_tx_end;
404
+            r_tx_en        <= n_tx_en;
311 405
         END IF;
312
-    END PROCESS p_rx_sync;
406
+    END PROCESS p_reg_sync;
313 407
 
314 408
     -- register interface write
315
-    p_write: PROCESS(r_rx_new_start, r_rx_new_end, r_rx_new_en,
316
-                     s_rx_new,
409
+    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,
317 411
                      i_addr, i_wr_data, i_wr_en)
318 412
     BEGIN
319 413
         n_rx_new_start <= r_rx_new_start;
320 414
         n_rx_new_end   <= r_rx_new_end;
321 415
         n_rx_new_en    <= r_rx_new_en;
416
+        n_tx_start     <= r_tx_start;
417
+        n_tx_end       <= r_tx_end;
418
+        n_tx_en        <= r_tx_en;
419
+        s_txframe_en   <= '0';
322 420
         IF s_rx_new = '1' THEN
323
-            n_rx_new_en <= '0'; -- new buffer has been overtaken, reset new_en
421
+            n_rx_new_en <= '0'; -- new buffer has been overtaken, reset rx_new_en
422
+        END IF;
423
+        IF s_txframe_done = '1' THEN
424
+            n_tx_en <= '0'; -- TX operation completed, reset tx_en
324 425
         END IF;
325 426
         IF i_wr_en = "1111" THEN
326 427
             CASE i_addr IS
327
-                WHEN "100" => n_rx_new_start <= i_wr_data;
328
-                WHEN "101" => n_rx_new_end   <= i_wr_data;
329
-                WHEN "110" => n_rx_new_en    <= i_wr_data(0);
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
431
+                                   n_rx_new_en <= '1';
432
+                               END IF;
433
+                WHEN "1000" => IF r_tx_en = '0' THEN
434
+                                   n_tx_start <= i_wr_data;
435
+                               END IF;
436
+                WHEN "1001" => IF r_tx_en = '0' THEN
437
+                                   n_tx_end <= i_wr_data;
438
+                               END IF;
439
+                WHEN "1010" => IF i_wr_data(0) = '1' THEN
440
+                                   IF r_tx_en = '0' THEN
441
+                                       s_txframe_en <= '1';
442
+                                   END IF;
443
+                                   n_tx_en <= '1';
444
+                               END IF;
330 445
                 WHEN OTHERS => NULL;
331 446
             END CASE;
332 447
         END IF;
333 448
     END PROCESS p_write;
334 449
 
335
-    txif: e_io_eth_txif
336
-        PORT MAP (
337
-            rst          => rst,
338
-            clk          => clk,
339
-            i_data       => s_txif_data,
340
-            i_data_en    => s_txif_data_en,
341
-            o_data_ack   => s_txif_data_ack,
342
-            pin_i_tx_clk => pin_i_tx_clk,
343
-            pin_o_txd    => pin_o_txd,
344
-            pin_o_tx_en  => pin_o_tx_en
345
-        );
346
-
347
-    -- TODO
348
-    s_txif_data    <= X"00";
349
-    s_txif_data_en <= '0';
350
-
351 450
     -- register interface read
352 451
     p_read: PROCESS(rst, clk)
353 452
     BEGIN
... ...
@@ -356,13 +455,16 @@ BEGIN
356 455
         ELSIF rising_edge(clk) THEN
357 456
             o_rd_data <= (OTHERS => '0');
358 457
             CASE i_addr IS
359
-                WHEN "000" => o_rd_data    <= r_rx_start;
360
-                WHEN "001" => o_rd_data    <= r_rx_cur;
361
-                WHEN "010" => o_rd_data    <= r_rx_size;
362
-                WHEN "011" => o_rd_data    <= r_rx_end;
363
-                WHEN "100" => o_rd_data    <= r_rx_new_start;
364
-                WHEN "101" => o_rd_data    <= r_rx_new_end;
365
-                WHEN "110" => o_rd_data(0) <= r_rx_new_en;
458
+                WHEN "0000" => o_rd_data    <= r_rx_start;
459
+                WHEN "0001" => o_rd_data    <= r_rx_cur;
460
+                WHEN "0010" => o_rd_data    <= r_rx_size;
461
+                WHEN "0011" => o_rd_data    <= r_rx_end;
462
+                WHEN "0100" => o_rd_data    <= r_rx_new_start;
463
+                WHEN "0101" => o_rd_data    <= r_rx_new_end;
464
+                WHEN "0110" => o_rd_data(0) <= r_rx_new_en;
465
+                WHEN "1000" => o_rd_data    <= r_tx_start;
466
+                WHEN "1001" => o_rd_data    <= r_tx_end;
467
+                WHEN "1010" => o_rd_data(0) <= r_tx_en;
366 468
                 WHEN OTHERS => NULL;
367 469
             END CASE;
368 470
         END IF;
... ...
@@ -388,20 +490,67 @@ BEGIN
388 490
             i_rd_en   => s_wrbuf_rd_en
389 491
         );
390 492
 
391
-    pin_o_txd   <= "0000";
392
-    pin_o_tx_en <= '0';
493
+    -- TX busmaster read state machine
494
+    p_tx_rd_next: PROCESS(r_tx_pos, r_tx_start, s_txframe_en, s_txbuf_wr_en)
495
+    BEGIN
496
+        n_tx_pos <= r_tx_pos;
497
+        IF s_txframe_en = '1' THEN
498
+            n_tx_pos <= r_tx_start;
499
+        ELSIF s_txbuf_wr_en = '1' THEN
500
+            n_tx_pos <= std_logic_vector(unsigned(r_tx_pos) + X"00000004");
501
+        END IF;
502
+    END PROCESS p_tx_rd_next;
503
+
504
+    p_tx_rd_sync: PROCESS(clk, rst)
505
+    BEGIN
506
+        IF rst = '1' THEN
507
+            r_tx_pos <= X"00000000";
508
+        ELSIF rising_edge(clk) THEN
509
+            r_tx_pos <= n_tx_pos;
510
+        END IF;
511
+    END PROCESS p_tx_rd_sync;
393 512
 
394
-    -- bus master write
395
-    p_bm_wr: PROCESS(s_wrbuf_rd_rdy, s_wrbuf_rd_data, i_bm_grant)
513
+    -- busmaster read completed    
514
+    p_bm_rd: PROCESS(r_bm_rd, i_bm_rd_data)
396 515
     BEGIN
516
+        s_txbuf_wr_data <= X"00000000";
517
+        s_txbuf_wr_en   <= '0';
518
+        -- read was just completed
519
+        IF r_bm_rd = '1' THEN
520
+            s_txbuf_wr_data <= i_bm_rd_data;
521
+            s_txbuf_wr_en   <= '1';
522
+        END IF;
523
+    END PROCESS p_bm_rd;
524
+
525
+    -- bus master write (and request side of read)
526
+    p_bm_wr: PROCESS(r_bm_rd,
527
+                     r_tx_en, r_tx_pos, r_tx_end, s_txbuf_wr_rdy,
528
+                     s_wrbuf_rd_rdy, s_wrbuf_rd_data, i_bm_grant)
529
+        VARIABLE v_read:  boolean;
530
+        VARIABLE v_write: boolean;
531
+    BEGIN
532
+        n_bm_rd       <= '0';
397 533
         s_wrbuf_rd_en <= '0';
398 534
         o_bm_req      <= '0';
399 535
         o_bm_addr     <= (OTHERS => '0');
400 536
         o_bm_rd_en    <= (OTHERS => '0');
401 537
         o_bm_wr_data  <= (OTHERS => '0');
402 538
         o_bm_wr_en    <= (OTHERS => '0');
403
-        -- process write requests from write buffer
404
-        IF s_wrbuf_rd_rdy = '1' THEN
539
+        -- check for requests
540
+        --   read: no read just completed, TX running, not reached end,
541
+        --         space in buffer
542
+        --   write: write request in write buffer
543
+        v_read  := r_bm_rd = '0' AND r_tx_en = '1' AND
544
+                   r_tx_pos /= r_tx_end AND s_txbuf_wr_rdy = '1';
545
+        v_write := s_wrbuf_rd_rdy = '1';
546
+        -- read access
547
+        IF v_read THEN
548
+            n_bm_rd    <= i_bm_grant;
549
+            o_bm_req   <= '1';
550
+            o_bm_addr  <= r_tx_pos;
551
+            o_bm_rd_en <= "1111";
552
+        -- write access (arbitrate with read)
553
+        ELSIF v_write THEN
405 554
             s_wrbuf_rd_en <= i_bm_grant;
406 555
             o_bm_req      <= '1';
407 556
             o_bm_addr     <= s_wrbuf_rd_data(63 DOWNTO 32);
... ...
@@ -410,5 +559,13 @@ BEGIN
410 559
         END IF;        
411 560
     END PROCESS p_bm_wr;
412 561
 
413
-END ARCHITECTURE a_io_eth;
562
+    p_bm_sync: PROCESS(clk, rst)
563
+    BEGIN
564
+        IF rst = '1' THEN
565
+            r_bm_rd <= '0';
566
+        ELSIF rising_edge(clk) THEN
567
+            r_bm_rd <= n_bm_rd;
568
+        END IF;
569
+    END PROCESS p_bm_sync;
414 570
 
571
+END ARCHITECTURE a_io_eth;
... ...
@@ -0,0 +1,171 @@
1
+LIBRARY IEEE;
2
+USE IEEE.STD_LOGIC_1164.ALL;
3
+USE IEEE.NUMERIC_STD.ALL;
4
+
5
+ENTITY e_io_eth_txframe IS
6
+    PORT (
7
+        rst:              IN  std_logic;
8
+        clk:              IN  std_logic;
9
+        o_if_data:        OUT std_logic_vector(7 DOWNTO 0);
10
+        o_if_data_en:     OUT std_logic;
11
+        i_if_data_ack:    IN  std_logic;
12
+        i_frame_en:       IN  std_logic;
13
+        i_frame_data:     IN  std_logic_vector(31 DOWNTO 0);
14
+        i_frame_data_en:  IN  std_logic;
15
+        o_frame_data_ack: OUT std_logic;
16
+        o_frame_done:     OUT std_logic
17
+    );
18
+END ENTITY e_io_eth_txframe;
19
+
20
+ARCHITECTURE a_io_eth_txframe OF e_io_eth_txframe IS
21
+
22
+    TYPE t_state IS (st_idle, st_sync, st_start, st_data, st_crc, st_gap);
23
+
24
+    SUBTYPE t_data_cnt IS natural RANGE 0 TO 255;
25
+
26
+    SIGNAL r_state:     t_state                       := st_idle;
27
+    SIGNAL n_state:     t_state;
28
+    SIGNAL r_data_cnt:  t_data_cnt                    := 0;
29
+    SIGNAL n_data_cnt:  t_data_cnt;
30
+    SIGNAL r_data:      std_logic_vector(31 DOWNTO 0) := (OTHERS => '0');
31
+    SIGNAL n_data:      std_logic_vector(31 DOWNTO 0);
32
+    SIGNAL r_crc_start: std_logic                     := '0';
33
+    SIGNAL n_crc_start: std_logic;
34
+
35
+    SIGNAL s_crc_en:    std_logic;
36
+    SIGNAL s_crc_start: std_logic;
37
+    SIGNAL s_crc_data:  std_logic_vector( 7 DOWNTO 0);
38
+    SIGNAL s_crc_crc:   std_logic_vector(31 DOWNTO 0);
39
+
40
+    COMPONENT e_block_crc32 IS
41
+        PORT (
42
+            rst:     IN  std_logic;
43
+            clk:     IN  std_logic;
44
+            i_en:    IN  std_logic;
45
+            i_start: IN  std_logic;
46
+            i_data:  IN  std_logic_vector( 7 DOWNTO 0);
47
+            o_crc:   OUT std_logic_vector(31 DOWNTO 0)
48
+        );
49
+    END COMPONENT e_block_crc32;
50
+
51
+BEGIN
52
+
53
+    crc32: e_block_crc32
54
+        PORT MAP (
55
+            rst     => rst,
56
+            clk     => clk,
57
+            i_en    => s_crc_en,
58
+            i_start => s_crc_start,
59
+            i_data  => s_crc_data,
60
+            o_crc   => s_crc_crc
61
+        );
62
+
63
+    p_next: PROCESS(r_state, r_data_cnt, r_data, r_crc_start,
64
+                    i_if_data_ack,
65
+                    i_frame_en, i_frame_data, i_frame_data_en,
66
+                    s_crc_crc)
67
+    BEGIN
68
+        n_state          <= r_state;
69
+        n_data_cnt       <= r_data_cnt;
70
+        n_data           <= r_data;
71
+        n_crc_start      <= '0';
72
+        o_if_data        <= X"00";
73
+        o_if_data_en     <= '0';
74
+        o_frame_data_ack <= '0';
75
+        s_crc_en         <= '0';
76
+        s_crc_start      <= '0';
77
+        s_crc_data       <= (OTHERS => '0');
78
+        CASE r_state IS
79
+            WHEN st_idle =>
80
+                IF i_frame_en = '1' THEN
81
+                    n_state    <= st_sync;
82
+                    n_data_cnt <= 7;
83
+                END IF;
84
+            WHEN st_sync =>
85
+                IF i_if_data_ack = '1' THEN
86
+                    IF r_data_cnt = 1 THEN
87
+                        n_state <= st_start;
88
+                    ELSE
89
+                        n_data_cnt <= r_data_cnt - 1;
90
+                    END IF;
91
+                END IF;
92
+                o_if_data    <= X"55";
93
+                o_if_data_en <= '1';
94
+            WHEN st_start =>
95
+                IF i_if_data_ack = '1' THEN
96
+                    IF i_frame_data_en = '1' THEN
97
+                        n_state          <= st_data;
98
+                        n_data_cnt       <= 4;
99
+                        n_data           <= i_frame_data;
100
+                        n_crc_start      <= '1';
101
+                        o_frame_data_ack <= '1';
102
+                    ELSE
103
+                        n_state    <= st_gap;
104
+                        n_data_cnt <= 12 * 8 * 2; -- 12 octets, x2 because of clk
105
+                    END IF;
106
+                END IF;
107
+                o_if_data    <= X"D5";
108
+                o_if_data_en <= '1';
109
+            WHEN st_data =>
110
+                IF i_if_data_ack = '1' THEN
111
+                    IF r_data_cnt = 1 THEN
112
+                        IF i_frame_data_en = '1' THEN
113
+                            n_state          <= st_data;
114
+                            n_data_cnt       <= 4;
115
+                            n_data           <= i_frame_data;
116
+                            o_frame_data_ack <= '1';
117
+                        ELSE
118
+                            n_state          <= st_crc;
119
+                            n_data_cnt       <= 4;
120
+                            n_data           <= s_crc_crc;
121
+                        END IF;
122
+                    ELSE
123
+                        n_data_cnt          <= r_data_cnt - 1;
124
+                        n_data(23 DOWNTO 0) <= r_data(31 DOWNTO 8);
125
+                    END IF;
126
+                END IF;
127
+                o_if_data    <= r_data(7 DOWNTO 0);
128
+                o_if_data_en <= '1';
129
+                s_crc_en     <= '1';
130
+                s_crc_start  <= r_crc_start;
131
+                s_crc_data   <= r_data(7 DOWNTO 0);
132
+            WHEN st_crc =>
133
+                IF i_if_data_ack = '1' THEN
134
+                    IF r_data_cnt = 1 THEN
135
+                        n_state    <= st_gap;
136
+                        n_data_cnt <= 12 * 8 * 2; -- 12 octets, x2 because of clk
137
+                    ELSE
138
+                        n_data_cnt          <= r_data_cnt - 1;
139
+                        n_data(23 DOWNTO 0) <= r_data(31 DOWNTO 8);
140
+                    END IF;
141
+                END IF;
142
+                o_if_data    <= r_data(7 DOWNTO 0);
143
+                o_if_data_en <= '1';
144
+            WHEN st_gap =>
145
+                IF r_data_cnt = 1 THEN
146
+                    n_state      <= st_idle;
147
+                    o_frame_done <= '1';
148
+                ELSE
149
+                    n_data_cnt <= r_data_cnt - 1;
150
+                END IF;
151
+            WHEN OTHERS => NULL;
152
+        END CASE;
153
+    END PROCESS p_next;
154
+
155
+    p_sync: PROCESS(rst, clk)
156
+    BEGIN
157
+        IF rst = '1' THEN
158
+            r_state     <= st_idle;
159
+            r_data_cnt  <= 0;
160
+            r_data      <= (OTHERS => '0');
161
+            r_crc_start <= '0';
162
+        ELSIF rising_edge(clk) THEN
163
+            r_state     <= n_state;
164
+            r_data_cnt  <= n_data_cnt;
165
+            r_data      <= n_data;
166
+            r_crc_start <= n_crc_start;
167
+        END IF;
168
+    END PROCESS p_sync;
169
+
170
+END ARCHITECTURE a_io_eth_txframe;
171
+
... ...
@@ -17,43 +17,43 @@
17 17
   <files>
18 18
     <file xil_pn:name="mips/decoder.vhd" xil_pn:type="FILE_VHDL">
19 19
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="8"/>
20
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
20
+      <association xil_pn:name="Implementation" xil_pn:seqID="8"/>
21 21
     </file>
22 22
     <file xil_pn:name="mips/types.vhd" xil_pn:type="FILE_VHDL">
23 23
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="1"/>
24
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
24
+      <association xil_pn:name="Implementation" xil_pn:seqID="1"/>
25 25
     </file>
26 26
     <file xil_pn:name="mips/alu.vhd" xil_pn:type="FILE_VHDL">
27 27
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="10"/>
28
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
28
+      <association xil_pn:name="Implementation" xil_pn:seqID="10"/>
29 29
     </file>
30 30
     <file xil_pn:name="mips/core.vhd" xil_pn:type="FILE_VHDL">
31 31
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="17"/>
32
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
32
+      <association xil_pn:name="Implementation" xil_pn:seqID="19"/>
33 33
     </file>
34 34
     <file xil_pn:name="mips/regs.vhd" xil_pn:type="FILE_VHDL">
35 35
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="5"/>
36
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
36
+      <association xil_pn:name="Implementation" xil_pn:seqID="5"/>
37 37
     </file>
38 38
     <file xil_pn:name="mips/shifter.vhd" xil_pn:type="FILE_VHDL">
39 39
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="2"/>
40
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
40
+      <association xil_pn:name="Implementation" xil_pn:seqID="2"/>
41 41
     </file>
42 42
     <file xil_pn:name="mips/cmp.vhd" xil_pn:type="FILE_VHDL">
43 43
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="9"/>
44
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
44
+      <association xil_pn:name="Implementation" xil_pn:seqID="9"/>
45 45
     </file>
46 46
     <file xil_pn:name="mips/div.vhd" xil_pn:type="FILE_VHDL">
47 47
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="7"/>
48
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
48
+      <association xil_pn:name="Implementation" xil_pn:seqID="7"/>
49 49
     </file>
50 50
     <file xil_pn:name="mips/mul_slow.vhd" xil_pn:type="FILE_VHDL">
51 51
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="6"/>
52
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
52
+      <association xil_pn:name="Implementation" xil_pn:seqID="6"/>
53 53
     </file>
54 54
     <file xil_pn:name="system/system.vhd" xil_pn:type="FILE_VHDL">
55 55
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="29"/>
56
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
56
+      <association xil_pn:name="Implementation" xil_pn:seqID="31"/>
57 57
     </file>
58 58
     <file xil_pn:name="test/testbed.vhd" xil_pn:type="FILE_VHDL">
59 59
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="30"/>
... ...
@@ -63,11 +63,11 @@
63 63
     </file>
64 64
     <file xil_pn:name="fw/rom.vhd" xil_pn:type="FILE_VHDL">
65 65
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="24"/>
66
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
66
+      <association xil_pn:name="Implementation" xil_pn:seqID="26"/>
67 67
     </file>
68 68
     <file xil_pn:name="io/leds.vhd" xil_pn:type="FILE_VHDL">
69 69
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="20"/>
70
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
70
+      <association xil_pn:name="Implementation" xil_pn:seqID="22"/>
71 71
     </file>
72 72
     <file xil_pn:name="constraints/leds.ucf" xil_pn:type="FILE_UCF">
73 73
       <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
... ...
@@ -77,87 +77,91 @@
77 77
     </file>
78 78
     <file xil_pn:name="io/cyc_cnt.vhd" xil_pn:type="FILE_VHDL">
79 79
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="23"/>
80
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
80
+      <association xil_pn:name="Implementation" xil_pn:seqID="25"/>
81 81
     </file>
82 82
     <file xil_pn:name="io/lcd.vhd" xil_pn:type="FILE_VHDL">
83 83
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="21"/>
84
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
84
+      <association xil_pn:name="Implementation" xil_pn:seqID="23"/>
85 85
     </file>
86 86
     <file xil_pn:name="io/lcd_pins.vhd" xil_pn:type="FILE_VHDL">
87 87
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="12"/>
88
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
88
+      <association xil_pn:name="Implementation" xil_pn:seqID="12"/>
89 89
     </file>
90 90
     <file xil_pn:name="constraints/lcd.ucf" xil_pn:type="FILE_UCF">
91 91
       <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
92 92
     </file>
93 93
     <file xil_pn:name="fw/ram.0.vhd" xil_pn:type="FILE_VHDL">
94 94
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="28"/>
95
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
95
+      <association xil_pn:name="Implementation" xil_pn:seqID="30"/>
96 96
     </file>
97 97
     <file xil_pn:name="fw/ram.1.vhd" xil_pn:type="FILE_VHDL">
98 98
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="27"/>
99
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
99
+      <association xil_pn:name="Implementation" xil_pn:seqID="29"/>
100 100
     </file>
101 101
     <file xil_pn:name="fw/ram.2.vhd" xil_pn:type="FILE_VHDL">
102 102
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="26"/>
103
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
103
+      <association xil_pn:name="Implementation" xil_pn:seqID="28"/>
104 104
     </file>
105 105
     <file xil_pn:name="fw/ram.3.vhd" xil_pn:type="FILE_VHDL">
106 106
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="25"/>
107
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
107
+      <association xil_pn:name="Implementation" xil_pn:seqID="27"/>
108 108
     </file>
109 109
     <file xil_pn:name="io/switches_pins.vhd" xil_pn:type="FILE_VHDL">
110 110
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="11"/>
111
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
111
+      <association xil_pn:name="Implementation" xil_pn:seqID="11"/>
112 112
     </file>
113 113
     <file xil_pn:name="io/switches.vhd" xil_pn:type="FILE_VHDL">
114 114
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="19"/>
115
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
115
+      <association xil_pn:name="Implementation" xil_pn:seqID="21"/>
116 116
     </file>
117 117
     <file xil_pn:name="constraints/switches.ucf" xil_pn:type="FILE_UCF">
118 118
       <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
119 119
     </file>
120 120
     <file xil_pn:name="io/uart.vhd" xil_pn:type="FILE_VHDL">
121 121
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="18"/>
122
-      <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
122
+      <association xil_pn:name="Implementation" xil_pn:seqID="20"/>
123 123
     </file>
124 124
     <file xil_pn:name="constraints/uart.ucf" xil_pn:type="FILE_UCF">
125 125
       <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
126 126
     </file>
127 127
     <file xil_pn:name="blocks/fifo.vhd" xil_pn:type="FILE_VHDL">
128 128
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="16"/>
129
-      <association xil_pn:name="Implementation" xil_pn:seqID="7"/>
129
+      <association xil_pn:name="Implementation" xil_pn:seqID="18"/>
130 130
     </file>
131 131
     <file xil_pn:name="blocks/rwram.vhd" xil_pn:type="FILE_VHDL">
132 132
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="3"/>
133
-      <association xil_pn:name="Implementation" xil_pn:seqID="1"/>
133
+      <association xil_pn:name="Implementation" xil_pn:seqID="3"/>
134 134
     </file>
135 135
     <file xil_pn:name="io/eth/eth.vhd" xil_pn:type="FILE_VHDL">
136 136
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="22"/>
137
-      <association xil_pn:name="Implementation" xil_pn:seqID="8"/>
137
+      <association xil_pn:name="Implementation" xil_pn:seqID="24"/>
138 138
     </file>
139 139
     <file xil_pn:name="io/eth/rst.vhd" xil_pn:type="FILE_VHDL">
140 140
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="15"/>
141
-      <association xil_pn:name="Implementation" xil_pn:seqID="6"/>
141
+      <association xil_pn:name="Implementation" xil_pn:seqID="17"/>
142 142
     </file>
143 143
     <file xil_pn:name="io/eth/rxif.vhd" xil_pn:type="FILE_VHDL">
144 144
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="13"/>
145
-      <association xil_pn:name="Implementation" xil_pn:seqID="4"/>
145
+      <association xil_pn:name="Implementation" xil_pn:seqID="15"/>
146 146
     </file>
147 147
     <file xil_pn:name="constraints/eth.ucf" xil_pn:type="FILE_UCF">
148 148
       <association xil_pn:name="Implementation" xil_pn:seqID="0"/>
149 149
     </file>
150 150
     <file xil_pn:name="blocks/crc32.vhd" xil_pn:type="FILE_VHDL">
151 151
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="4"/>
152
-      <association xil_pn:name="Implementation" xil_pn:seqID="2"/>
152
+      <association xil_pn:name="Implementation" xil_pn:seqID="4"/>
153 153
     </file>
154 154
     <file xil_pn:name="io/eth/rxframe.vhd" xil_pn:type="FILE_VHDL">
155 155
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="14"/>
156
-      <association xil_pn:name="Implementation" xil_pn:seqID="5"/>
156
+      <association xil_pn:name="Implementation" xil_pn:seqID="16"/>
157 157
     </file>
158 158
     <file xil_pn:name="io/eth/txif.vhd" xil_pn:type="FILE_VHDL">
159 159
       <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="206"/>
160
-      <association xil_pn:name="Implementation" xil_pn:seqID="3"/>
160
+      <association xil_pn:name="Implementation" xil_pn:seqID="13"/>
161
+    </file>
162
+    <file xil_pn:name="io/eth/txframe.vhd" xil_pn:type="FILE_VHDL">
163
+      <association xil_pn:name="BehavioralSimulation" xil_pn:seqID="210"/>
164
+      <association xil_pn:name="Implementation" xil_pn:seqID="14"/>
161 165
     </file>
162 166
   </files>
163 167
 
... ...
@@ -74,7 +74,7 @@ ARCHITECTURE a_system OF e_system IS
74 74
     SIGNAL s_uart_rd_en:   std_logic_vector( 3 DOWNTO 0);
75 75
     SIGNAL s_uart_wr_data: std_logic_vector(31 DOWNTO 0);
76 76
     SIGNAL s_uart_wr_en:   std_logic_vector( 3 DOWNTO 0);
77
-    SIGNAL s_eth_addr:    std_logic_vector( 4 DOWNTO 0);
77
+    SIGNAL s_eth_addr:    std_logic_vector( 5 DOWNTO 0);
78 78
     SIGNAL s_eth_rd_data: std_logic_vector(31 DOWNTO 0);
79 79
     SIGNAL s_eth_rd_en:   std_logic_vector( 3 DOWNTO 0);
80 80
     SIGNAL s_eth_wr_data: std_logic_vector(31 DOWNTO 0);
... ...
@@ -212,7 +212,7 @@ ARCHITECTURE a_system OF e_system IS
212 212
         PORT (
213 213
             rst:          IN  std_logic;
214 214
             clk:          IN  std_logic;
215
-            i_addr:       IN  std_logic_vector( 2 DOWNTO 0);
215
+            i_addr:       IN  std_logic_vector( 3 DOWNTO 0);
216 216
             o_rd_data:    OUT std_logic_vector(31 DOWNTO 0);
217 217
             i_rd_en:      IN  std_logic_vector( 3 DOWNTO 0);
218 218
             i_wr_data:    IN  std_logic_vector(31 DOWNTO 0);
... ...
@@ -393,7 +393,7 @@ BEGIN
393 393
                     s_uart_wr_data <= s_dbus_wr_data;
394 394
                     s_uart_wr_en   <= s_dbus_wr_en;
395 395
                 WHEN X"04" =>
396
-                    s_eth_addr    <= s_dbus_addr(4 DOWNTO 0);
396
+                    s_eth_addr    <= s_dbus_addr(5 DOWNTO 0);
397 397
                     s_eth_rd_en   <= s_dbus_rd_en;
398 398
                     s_eth_wr_data <= s_dbus_wr_data;
399 399
                     s_eth_wr_en   <= s_dbus_wr_en;
... ...
@@ -499,7 +499,7 @@ BEGIN
499 499
         PORT MAP (
500 500
             rst          => rst,
501 501
             clk          => clk,
502
-            i_addr       => s_eth_addr(4 DOWNTO 2),
502
+            i_addr       => s_eth_addr(5 DOWNTO 2),
503 503
             o_rd_data    => s_eth_rd_data,
504 504
             i_rd_en      => s_eth_rd_en,
505 505
             i_wr_data    => s_eth_wr_data,
506 506