c906a48b0ededd4b309f78a0e70d657e561dad0a
Stefan Schuermans implemented ethernet RX 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_rxframe IS
6)     PORT (
7)         rst:       IN  std_logic;
8)         clk:       IN  std_logic;
9)         i_data:    IN  std_logic_vector( 7 DOWNTO 0);
10)         i_data_en: IN  std_logic;
11)         i_done:    IN  std_logic;
12)         i_err:     IN  std_logic;
13)         i_mac:     IN  std_logic_vector(47 DOWNTO 0);
14)         o_data:    OUT std_logic_vector(31 DOWNTO 0);
15)         o_data_en: OUT std_logic;
16)         o_done:    OUT std_logic;
17)         o_err:     OUT std_logic
18)     );
19) END ENTITY e_io_eth_rxframe;
20) 
21) ARCHITECTURE a_io_eth_rxframe OF e_io_eth_rxframe IS
22) 
23)     TYPE t_state IS (st_idle, st_sync, st_mac, st_mac_uni, st_mac_brd, st_data);
24) 
25)     SUBTYPE t_mac_cnt  IS natural RANGE 0 TO 5;
26)     SUBTYPE t_data_cnt IS natural RANGE 0 TO 3;
27) 
28)     SIGNAL r_state:    t_state    := st_idle;
29)     SIGNAL n_state:    t_state;
30)     SIGNAL r_mac_cnt:  t_mac_cnt  := 0;
31)     SIGNAL n_mac_cnt:  t_mac_cnt;
32)     SIGNAL r_data_cnt: t_data_cnt := 0;
33)     SIGNAL n_data_cnt: t_data_cnt;
34) 
35)     SIGNAL r_out_data:    std_logic_vector(31 DOWNTO 0) := (OTHERS => '0');
36)     SIGNAL n_out_data:    std_logic_vector(31 DOWNTO 0);
37)     SIGNAL r_out_data_en: std_logic                     := '0';
38)     SIGNAL n_out_data_en: std_logic;
39)     SIGNAL r_out_done:    std_logic                     := '0';
40)     SIGNAL n_out_done:    std_logic;
41)     SIGNAL r_out_err:     std_logic                     := '0';
42)     SIGNAL n_out_err:     std_logic;
43) 
Stefan Schuermans implemented ethernet RX CRC...

Stefan Schuermans authored 12 years ago

44)     SIGNAL s_crc_en:    std_logic;
45)     SIGNAL s_crc_start: std_logic;
46)     SIGNAL s_crc_data:  std_logic_vector( 7 DOWNTO 0);
47)     SIGNAL s_crc_crc:   std_logic_vector(31 DOWNTO 0);
48) 
49)     COMPONENT e_block_crc32 IS
50)         PORT (
51)             rst:     IN  std_logic;
52)             clk:     IN  std_logic;
53)             i_en:    IN  std_logic;
54)             i_start: IN  std_logic;
55)             i_data:  IN  std_logic_vector( 7 DOWNTO 0);
56)             o_crc:   OUT std_logic_vector(31 DOWNTO 0)
57)         );
58)     END COMPONENT e_block_crc32;
59) 
Stefan Schuermans implemented ethernet RX fra...

Stefan Schuermans authored 12 years ago

60) BEGIN
61) 
Stefan Schuermans implemented ethernet RX CRC...

Stefan Schuermans authored 12 years ago

62)     crc32: e_block_crc32
63)         PORT MAP (
64)             rst     => rst,
65)             clk     => clk,
66)             i_en    => s_crc_en,
67)             i_start => s_crc_start,
68)             i_data  => s_crc_data,
69)             o_crc   => s_crc_crc
70)         );
71) 
Stefan Schuermans implemented ethernet RX fra...

Stefan Schuermans authored 12 years ago

72)     p_next: PROCESS(r_state, r_mac_cnt, r_data_cnt, r_out_data,
Stefan Schuermans implemented ethernet RX bus...

Stefan Schuermans authored 12 years ago

73)                     i_data, i_data_en, i_done, i_err, i_mac,
74)                     s_crc_crc)
Stefan Schuermans implemented ethernet RX fra...

Stefan Schuermans authored 12 years ago

75)         VARIABLE v_mac:  std_logic_vector(7 DOWNTO 0);
76)         VARIABLE v_data: boolean;
77)     BEGIN
78)         n_state       <= r_state;
79)         n_mac_cnt     <= r_mac_cnt;
80)         n_data_cnt    <= r_data_cnt;
81)         n_out_data    <= r_out_data;
82)         n_out_data_en <= '0';
83)         n_out_done    <= '0';
84)         n_out_err     <= '0';
Stefan Schuermans implemented ethernet RX CRC...

Stefan Schuermans authored 12 years ago

85)         s_crc_en    <= '0';
86)         s_crc_start <= '0';
87)         s_crc_data  <= (OTHERS => '0');
88)         -- next state
Stefan Schuermans implemented ethernet RX fra...

Stefan Schuermans authored 12 years ago

89)         v_data := false;
90)         CASE r_state IS
91)             WHEN st_idle =>
92)                 IF i_data_en = '1' AND i_data = X"55" THEN
93)                     n_state <= st_sync;
94)                 END IF;
95)             WHEN st_sync =>
96)                 IF i_data_en = '1' THEN
97)                     IF i_data = X"D5" THEN
98)                         n_state    <= st_mac;
99)                         n_mac_cnt  <= 0;
100)                         n_data_cnt <= 0;
101)                     ELSIF i_data /= X"55" THEN
102)                         n_state <= st_idle;
103)                     END IF;
104)                 ELSIF i_done = '1' OR i_err = '1' THEN
105)                     n_state <= st_idle;
106)                 END IF;
107)             WHEN st_mac =>
108)                 IF i_data_en = '1' THEN
109)                     v_mac := i_mac(7 + 8 * r_mac_cnt DOWNTO 8 * r_mac_cnt);
110)                     IF v_mac = X"FF" THEN
111)                         IF i_data = v_mac THEN
112)                             v_data := true;
113)                         ELSE
114)                             n_state   <= st_idle;
115)                             n_out_err <= '1';
116)                         END IF;
117)                     ELSE
118)                         IF i_data = v_mac THEN
119)                             v_data  := true;
120)                             n_state <= st_mac_uni;
121)                         ELSIF i_data = X"FF" THEN
122)                             v_data  := true;
123)                             n_state <= st_mac_brd;
124)                         ELSE
125)                             n_state   <= st_idle;
126)                             n_out_err <= '1';
127)                         END IF;
128)                     END IF;
129)                     IF r_mac_cnt < 5 THEN
130)                         n_mac_cnt <= r_mac_cnt + 1;
131)                     ELSE
132)                         n_state <= st_data;
133)                     END IF;
134)                 ELSIF i_done = '1' OR i_err = '1' THEN
135)                     n_state   <= st_idle;
136)                     n_out_err <= '1';
137)                 END IF;
138)             WHEN st_mac_uni =>
139)                 IF i_data_en = '1' THEN
140)                     v_mac := i_mac(7 + 8 * r_mac_cnt DOWNTO 8 * r_mac_cnt);
141)                     IF i_data = v_mac THEN
142)                         v_data  := true;
143)                     ELSE
144)                         n_state   <= st_idle;
145)                         n_out_err <= '1';
146)                     END IF;
147)                     IF r_mac_cnt < 5 THEN
148)                         n_mac_cnt <= r_mac_cnt + 1;
149)                     ELSE
150)                         n_state <= st_data;
151)                     END IF;
152)                 ELSIF i_done = '1' OR i_err = '1' THEN
153)                     n_state   <= st_idle;
154)                     n_out_err <= '1';
155)                 END IF;
156)             WHEN st_mac_brd =>
157)                 IF i_data_en = '1' THEN
158)                     IF i_data = X"FF" THEN
159)                         v_data  := true;
160)                     ELSE
161)                         n_state   <= st_idle;
162)                         n_out_err <= '1';
163)                     END IF;
164)                     IF r_mac_cnt < 5 THEN
165)                         n_mac_cnt <= r_mac_cnt + 1;
166)                     ELSE
167)                         n_state <= st_data;
168)                     END IF;
169)                 ELSIF i_done = '1' OR i_err = '1' THEN
170)                     n_state   <= st_idle;
171)                     n_out_err <= '1';
172)                 END IF;
173)             WHEN st_data =>
174)                 IF i_data_en = '1' THEN
175)                     v_data  := true;
176)                 ELSIF i_done = '1' THEN
177)                     n_state    <= st_idle;
Stefan Schuermans implemented ethernet RX CRC...

Stefan Schuermans authored 12 years ago

178)                     -- check CRC: last 4 bytes = 4 byte delayed CRC value
179)                     IF r_out_data = s_crc_crc THEN
180)                         n_out_done <= '1';
181)                     ELSE
182)                         n_out_err <= '1';
183)                     END IF;
Stefan Schuermans implemented ethernet RX fra...

Stefan Schuermans authored 12 years ago

184)                 ELSIF i_err = '1' THEN
185)                     n_state   <= st_idle;
186)                     n_out_err <= '1';
187)                 END IF;
188)             WHEN OTHERS => NULL;
189)         END CASE;
Stefan Schuermans implemented ethernet RX CRC...

Stefan Schuermans authored 12 years ago

190)         -- data output / CRC
Stefan Schuermans implemented ethernet RX fra...

Stefan Schuermans authored 12 years ago

191)         IF v_data THEN
192)             n_out_data(31 DOWNTO 24) <= i_data;
193)             n_out_data(23 DOWNTO  0) <= r_out_data(31 DOWNTO 8);
194)             IF r_data_cnt < 3 THEN
195)                 n_data_cnt <= r_data_cnt + 1;
196)             ELSE
197)                 n_data_cnt    <= 0;
198)                 n_out_data_en <= '1';
199)             END IF;
Stefan Schuermans implemented ethernet RX CRC...

Stefan Schuermans authored 12 years ago

200)             -- calculate CRC with 4 bytes delay,
201)             -- so CRC value is available when i_done = 1
202)             s_crc_en   <= '1';
203)             s_crc_data <= r_out_data(7 DOWNTO 0);
204)             IF r_mac_cnt = 4 THEN
205)                 s_crc_start <= '1';
206)             END IF;