c2b040193a777c09bdc595c95492b57a2521db87
Stefan Schuermans added file headers

Stefan Schuermans authored 12 years ago

1) -- MIPS I system
2) -- Copyright 2011-2012 Stefan Schuermans <stefan@schuermans.info>
3) -- Copyleft GNU public license V2 or later
4) --          http://www.gnu.org/copyleft/gpl.html
5) 
Stefan Schuermans implemented ethernet RX fra...

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

65) BEGIN
66) 
Stefan Schuermans implemented ethernet RX CRC...

Stefan Schuermans authored 12 years ago

67)     crc32: e_block_crc32
68)         PORT MAP (
69)             rst     => rst,
70)             clk     => clk,
71)             i_en    => s_crc_en,
72)             i_start => s_crc_start,
73)             i_data  => s_crc_data,
74)             o_crc   => s_crc_crc
75)         );
76) 
Stefan Schuermans implemented ethernet RX fra...

Stefan Schuermans authored 12 years ago

77)     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

78)                     i_data, i_data_en, i_done, i_err, i_mac,
79)                     s_crc_crc)
Stefan Schuermans implemented ethernet RX fra...

Stefan Schuermans authored 12 years ago

80)         VARIABLE v_mac:  std_logic_vector(7 DOWNTO 0);
81)         VARIABLE v_data: boolean;
82)     BEGIN
83)         n_state       <= r_state;
84)         n_mac_cnt     <= r_mac_cnt;
85)         n_data_cnt    <= r_data_cnt;
86)         n_out_data    <= r_out_data;
87)         n_out_data_en <= '0';
88)         n_out_done    <= '0';
89)         n_out_err     <= '0';
Stefan Schuermans implemented ethernet RX CRC...

Stefan Schuermans authored 12 years ago

90)         s_crc_en    <= '0';
91)         s_crc_start <= '0';
92)         s_crc_data  <= (OTHERS => '0');
93)         -- next state
Stefan Schuermans implemented ethernet RX fra...

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

183)                     -- check CRC: last 4 bytes = 4 byte delayed CRC value
184)                     IF r_out_data = s_crc_crc THEN
185)                         n_out_done <= '1';
186)                     ELSE
187)                         n_out_err <= '1';
188)                     END IF;
Stefan Schuermans implemented ethernet RX fra...

Stefan Schuermans authored 12 years ago

189)                 ELSIF i_err = '1' THEN
190)                     n_state   <= st_idle;
191)                     n_out_err <= '1';
192)                 END IF;
193)             WHEN OTHERS => NULL;
194)         END CASE;
Stefan Schuermans implemented ethernet RX CRC...

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

196)         IF v_data THEN
197)             n_out_data(31 DOWNTO 24) <= i_data;
198)             n_out_data(23 DOWNTO  0) <= r_out_data(31 DOWNTO 8);
199)             IF r_data_cnt < 3 THEN
200)                 n_data_cnt <= r_data_cnt + 1;
201)             ELSE
202)                 n_data_cnt    <= 0;
203)                 n_out_data_en <= '1';
204)             END IF;
Stefan Schuermans implemented ethernet RX CRC...

Stefan Schuermans authored 12 years ago

205)             -- calculate CRC with 4 bytes delay,
206)             -- so CRC value is available when i_done = 1
207)             s_crc_en   <= '1';
208)             s_crc_data <= r_out_data(7 DOWNTO 0);
209)             IF r_mac_cnt = 4 THEN
210)                 s_crc_start <= '1';
211)             END IF;