1f34390a6202ad42a373516466fd9bb13fda11e2
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)     TYPE t_in_state IS (in_idle, in_wait);
23) 
24)     SIGNAL r_out_state: t_out_state                  := out_idle;
Stefan Schuermans added dual clock FIFO imple...

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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