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 TX int...

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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