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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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