13632e3fb8b84f9ba839a2d899d399a135b678b7
Stefan Schuermans implemented ethernet TX fra...

Stefan Schuermans authored 12 years ago

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)
Stefan Schuermans fix CRC generation during e...

Stefan Schuermans authored 12 years ago

67)         VARIABLE v_data: std_logic_vector(31 DOWNTO 0);
Stefan Schuermans implemented ethernet TX fra...

Stefan Schuermans authored 12 years ago

68)     BEGIN
69)         n_state          <= r_state;
70)         n_data_cnt       <= r_data_cnt;
71)         n_data           <= r_data;
72)         n_crc_start      <= '0';
73)         o_if_data        <= X"00";
74)         o_if_data_en     <= '0';
75)         o_frame_data_ack <= '0';
Stefan Schuermans fixed uninitialized / not r...

Stefan Schuermans authored 12 years ago

76)         o_frame_done     <= '0';
Stefan Schuermans implemented ethernet TX fra...

Stefan Schuermans authored 12 years ago

77)         s_crc_en         <= '0';
78)         s_crc_start      <= '0';
79)         s_crc_data       <= (OTHERS => '0');
80)         CASE r_state IS
81)             WHEN st_idle =>
82)                 IF i_frame_en = '1' THEN
83)                     n_state    <= st_sync;
84)                     n_data_cnt <= 7;
85)                 END IF;
86)             WHEN st_sync =>
87)                 IF i_if_data_ack = '1' THEN
88)                     IF r_data_cnt = 1 THEN
89)                         n_state <= st_start;
90)                     ELSE
91)                         n_data_cnt <= r_data_cnt - 1;
92)                     END IF;
93)                 END IF;
94)                 o_if_data    <= X"55";
95)                 o_if_data_en <= '1';
96)             WHEN st_start =>
97)                 IF i_if_data_ack = '1' THEN
98)                     IF i_frame_data_en = '1' THEN
99)                         n_state          <= st_data;
100)                         n_data_cnt       <= 4;
101)                         n_data           <= i_frame_data;
102)                         n_crc_start      <= '1';
103)                         o_frame_data_ack <= '1';
104)                     ELSE
105)                         n_state    <= st_gap;
106)                         n_data_cnt <= 12 * 8 * 2; -- 12 octets, x2 because of clk
107)                     END IF;
108)                 END IF;
109)                 o_if_data    <= X"D5";
110)                 o_if_data_en <= '1';
111)             WHEN st_data =>
112)                 IF i_if_data_ack = '1' THEN
113)                     IF r_data_cnt = 1 THEN
114)                         IF i_frame_data_en = '1' THEN
115)                             n_state          <= st_data;
116)                             n_data_cnt       <= 4;
117)                             n_data           <= i_frame_data;
118)                             o_frame_data_ack <= '1';
119)                         ELSE
120)                             n_state          <= st_crc;
121)                             n_data_cnt       <= 4;
122)                         END IF;
123)                     ELSE
124)                         n_data_cnt          <= r_data_cnt - 1;
125)                         n_data(23 DOWNTO 0) <= r_data(31 DOWNTO 8);
126)                     END IF;
Stefan Schuermans fix CRC generation during e...

Stefan Schuermans authored 12 years ago

127)                     s_crc_en    <= '1';
128)                     s_crc_start <= r_crc_start;
129)                     s_crc_data  <= r_data(7 DOWNTO 0);
Stefan Schuermans implemented ethernet TX fra...

Stefan Schuermans authored 12 years ago

130)                 END IF;
131)                 o_if_data    <= r_data(7 DOWNTO 0);
132)                 o_if_data_en <= '1';
133)             WHEN st_crc =>
Stefan Schuermans fix CRC generation during e...

Stefan Schuermans authored 12 years ago

134)                 IF r_data_cnt = 4 THEN
135)                     v_data := s_crc_crc; -- get CRC value on first CRC byte
136)                 ELSE
137)                     v_data := r_data;
138)                 END IF;
Stefan Schuermans implemented ethernet TX fra...

Stefan Schuermans authored 12 years ago

139)                 IF i_if_data_ack = '1' THEN
140)                     IF r_data_cnt = 1 THEN
141)                         n_state    <= st_gap;
142)                         n_data_cnt <= 12 * 8 * 2; -- 12 octets, x2 because of clk
143)                     ELSE
144)                         n_data_cnt          <= r_data_cnt - 1;
Stefan Schuermans fix CRC generation during e...

Stefan Schuermans authored 12 years ago

145)                         n_data(23 DOWNTO 0) <= v_data(31 DOWNTO 8);
Stefan Schuermans implemented ethernet TX fra...

Stefan Schuermans authored 12 years ago

146)                     END IF;
147)                 END IF;
Stefan Schuermans fix CRC generation during e...

Stefan Schuermans authored 12 years ago

148)                 o_if_data    <= v_data(7 DOWNTO 0);