f08af9fc9b59639677048e4f166c90f937ecffcf
Stefan Schuermans implemented ethernet TX int...

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_txif 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)         o_data_ack:   OUT std_logic;
12)         pin_i_tx_clk: IN  std_logic;
13)         pin_o_txd:    OUT std_logic_vector(3 DOWNTO 0);
14)         pin_o_tx_en:  OUT std_logic
15)     );
16) END ENTITY e_io_eth_txif;
17) 
18) ARCHITECTURE a_io_eth_txif OF e_io_eth_txif IS
19) 
20)     TYPE t_out_state IS (out_idle, out_data_l, out_data_h);
21) 
22)     SIGNAL r_out_state: t_out_state                  := out_idle;
Stefan Schuermans added dual clock FIFO imple...

Stefan Schuermans authored 12 years ago

23)     SIGNAL n_out_state: t_out_state;
Stefan Schuermans implemented ethernet TX int...

Stefan Schuermans authored 12 years ago

24)     SIGNAL r_out_data:  std_logic_vector(7 DOWNTO 0) := X"00";
Stefan Schuermans added dual clock FIFO imple...

Stefan Schuermans authored 12 years ago

25)     SIGNAL n_out_data:  std_logic_vector(7 DOWNTO 0);
Stefan Schuermans implemented ethernet TX int...

Stefan Schuermans authored 12 years ago

26) 
Stefan Schuermans added dual clock FIFO imple...

Stefan Schuermans authored 12 years ago

27)     SIGNAL s_fifo_wr_rdy:  std_logic;
28)     SIGNAL s_fifo_wr_data: std_logic_vector(7 DOWNTO 0);
29)     SIGNAL s_fifo_wr_en:   std_logic;
30)     SIGNAL s_fifo_rd_rdy:  std_logic;
31)     SIGNAL s_fifo_rd_data: std_logic_vector(7 DOWNTO 0);
32)     SIGNAL s_fifo_rd_en:   std_logic;
Stefan Schuermans implemented ethernet TX int...

Stefan Schuermans authored 12 years ago

33) 
Stefan Schuermans added dual clock FIFO imple...

Stefan Schuermans authored 12 years ago

34)     COMPONENT e_block_fifo_dc IS
35)         GENERIC (
36)             addr_width: natural;
37)             data_width: natural
38)         );
39)         PORT (
40)             rst:       IN  std_logic;
41)             wr_clk:    IN  std_logic;
42)             o_wr_rdy:  OUT std_logic;
43)             i_wr_data: IN  std_logic_vector(data_width - 1 DOWNTO 0);
44)             i_wr_en:   IN  std_logic;
45)             rd_clk:    IN  std_logic;
46)             o_rd_rdy:  OUT std_logic;
47)             o_rd_data: OUT std_logic_vector(data_width - 1 DOWNTO 0);
48)             i_rd_en:   IN  std_logic
49)         );
50)     END COMPONENT e_block_fifo_dc;
Stefan Schuermans implemented ethernet TX int...

Stefan Schuermans authored 12 years ago

51) 
52) BEGIN
53) 
54)     p_out: PROCESS(rst, pin_i_tx_clk)
55)     BEGIN
56)         IF rst = '1' THEN
57)             pin_o_txd   <= X"0";
58)             pin_o_tx_en <= '0';
Stefan Schuermans transmit data on falling ed...

Stefan Schuermans authored 12 years ago

59)         ELSIF falling_edge(pin_i_tx_clk) THEN
Stefan Schuermans implemented ethernet TX int...

Stefan Schuermans authored 12 years ago

60)             CASE r_out_state IS
61)                 WHEN out_idle =>
62)                     pin_o_txd   <= X"0";
63)                     pin_o_tx_en <= '0';
64)                 WHEN out_data_l =>
65)                     pin_o_txd   <= r_out_data(3 DOWNTO 0);
66)                     pin_o_tx_en <= '1';
67)                 WHEN out_data_h =>
68)                     pin_o_txd   <= r_out_data(7 DOWNTO 4);
69)                     pin_o_tx_en <= '1';
70)                 WHEN OTHERS => NULL;
71)             END CASE;
72)         END IF;
73)     END PROCESS p_out;
74) 
Stefan Schuermans added dual clock FIFO imple...

Stefan Schuermans authored 12 years ago

75)     p_out_next: PROCESS(r_out_state, r_out_data, s_fifo_rd_rdy, s_fifo_rd_data)
Stefan Schuermans implemented ethernet TX int...

Stefan Schuermans authored 12 years ago

76)     BEGIN
Stefan Schuermans added dual clock FIFO imple...

Stefan Schuermans authored 12 years ago

77)         n_out_state  <= r_out_state;
78)         n_out_data   <= r_out_data;
79)         s_fifo_rd_en <= '0';
80)         CASE r_out_state IS
81)             WHEN out_idle | out_data_h =>
82)                 IF s_fifo_rd_rdy = '1' THEN
83)                     n_out_state  <= out_data_l;
84)                     n_out_data   <= s_fifo_rd_data;
85)                     s_fifo_rd_en <= '1';
86)                 ELSE
87)                     n_out_state <= out_idle;
88)                 END IF;
89)             WHEN out_data_l =>
90)                 n_out_state <= out_data_h;
91)             WHEN OTHERS => NULL;
92)         END CASE;
93)     END PROCESS p_out_next;
Stefan Schuermans implemented ethernet TX int...

Stefan Schuermans authored 12 years ago

94) 
Stefan Schuermans added dual clock FIFO imple...

Stefan Schuermans authored 12 years ago

95)     p_out_sync: PROCESS(rst, pin_i_tx_clk)
Stefan Schuermans implemented ethernet TX int...

Stefan Schuermans authored 12 years ago

96)     BEGIN
97)         IF rst = '1' THEN
Stefan Schuermans added dual clock FIFO imple...

Stefan Schuermans authored 12 years ago

98)             r_out_state <= out_idle;
99)             r_out_data  <= X"00";
100)         ELSIF rising_edge(pin_i_tx_clk) THEN
101)             r_out_state <= n_out_state;
102)             r_out_data  <= n_out_data;
Stefan Schuermans implemented ethernet TX int...

Stefan Schuermans authored 12 years ago

103)         END IF;
Stefan Schuermans added dual clock FIFO imple...

Stefan Schuermans authored 12 years ago

104)     END PROCESS p_out_sync;
105) 
106)     fifo: e_block_fifo_dc
107)         GENERIC MAP (
108)             addr_width => 4,
109)             data_width => 8
110)         )
111)         PORT MAP (
112)             rst       => rst,
113)             wr_clk    => clk,
114)             o_wr_rdy  => s_fifo_wr_rdy,
115)             i_wr_data => s_fifo_wr_data,
116)             i_wr_en   => s_fifo_wr_en,
117)             rd_clk    => pin_i_tx_clk,
118)             o_rd_rdy  => s_fifo_rd_rdy,
119)             o_rd_data => s_fifo_rd_data,
120)             i_rd_en   => s_fifo_rd_en
121)         );
122) 
123)     s_fifo_wr_data <= i_data;
124)     s_fifo_wr_en   <= s_fifo_wr_rdy AND i_data_en;
125)     o_data_ack     <= s_fifo_wr_en;