318917987ee9e1b173da8adcb10b30513c38f925
Stefan Schuermans begin of ethernet RX implem...

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 IS
6)     PORT (
7)         rst:          IN  std_logic;
8)         clk:          IN  std_logic;
9)         i_addr:       IN  std_logic_vector( 1 DOWNTO 0);
10)         o_rd_data:    OUT std_logic_vector(31 DOWNTO 0);
11)         i_wr_data:    IN  std_logic_vector(31 DOWNTO 0);
12)         i_wr_en:      IN  std_logic_vector( 3 DOWNTO 0);
13)         pin_o_nrst:   OUT std_logic;
14)         pin_i_rx_clk: IN  std_logic;
15)         pin_i_rxd:    IN  std_logic_vector(4 DOWNTO 0);
16)         pin_i_rx_dv:  IN  std_logic;
17)         pin_i_crs:    IN  std_logic;
18)         pin_i_col:    IN  std_logic;
19)         pin_i_tx_clk: IN  std_logic;
20)         pin_o_txd:    OUT std_logic_vector(3 DOWNTO 0);
21)         pin_o_tx_en:  OUT std_logic
22)     );
23) END ENTITY e_io_eth;
24) 
25) ARCHITECTURE a_io_eth OF e_io_eth IS
26) 
27)     SIGNAL s_rx_data:    std_logic_vector(7 DOWNTO 0);
28)     SIGNAL s_rx_data_en: std_logic;
29)     SIGNAL s_rx_done:    std_logic;
30)     SIGNAL s_rx_err:     std_logic;
31) 
32)     -- so far only for testing
33)     SIGNAL s_rx_fifo_wr_rdy:  std_logic;
34)     SIGNAL s_rx_fifo_wr_data: std_logic_vector(7 DOWNTO 0);
35)     SIGNAL s_rx_fifo_wr_en:   std_logic;
36)     SIGNAL s_rx_fifo_rd_rdy:  std_logic;
37)     SIGNAL s_rx_fifo_rd_data: std_logic_vector(7 DOWNTO 0);
38)     SIGNAL s_rx_fifo_rd_en:   std_logic;
39) 
40)     COMPONENT e_io_eth_rst IS
41)         PORT (
42)             rst:        IN  std_logic;
43)             clk:        IN  std_logic;
44)             pin_o_nrst: OUT std_logic
45)         );
46)     END COMPONENT e_io_eth_rst;
47) 
48)     COMPONENT e_io_eth_rxif IS
49)         PORT (
50)             rst:          IN  std_logic;
51)             clk:          IN  std_logic;
52)             o_data:       OUT std_logic_vector(7 DOWNTO 0);
53)             o_data_en:    OUT std_logic;
54)             o_done:       OUT std_logic;
55)             o_err:        OUT std_logic;
56)             pin_i_rx_clk: IN  std_logic;
57)             pin_i_rxd:    IN  std_logic_vector(4 DOWNTO 0);
58)             pin_i_rx_dv:  IN  std_logic;
59)             pin_i_crs:    IN  std_logic;
60)             pin_i_col:    IN  std_logic
61)         );
62)     END COMPONENT e_io_eth_rxif;
63) 
64)     -- so far only for testing
65)     COMPONENT e_block_fifo IS
66)         GENERIC (
67)             addr_width: natural;
68)             data_width: natural
69)         );
70)         PORT (
71)             rst:       IN  std_logic;
72)             clk:       IN  std_logic;
73)             o_wr_rdy:  OUT std_logic;
74)             i_wr_data: IN  std_logic_vector(data_width - 1 DOWNTO 0);
75)             i_wr_en:   IN  std_logic;
76)             o_rd_rdy:  OUT std_logic;
77)             o_rd_data: OUT std_logic_vector(data_width - 1 DOWNTO 0);
78)             i_rd_en:   IN  std_logic
79)         );
80)     END COMPONENT e_block_fifo;
81) 
82) BEGIN
83) 
84)     reset: e_io_eth_rst
85)         PORT MAP (
86)             rst        => rst,
87)             clk        => clk,
88)             pin_o_nrst => pin_o_nrst
89)         );
90) 
91)     rxif: e_io_eth_rxif
92)         PORT MAP (
93)             rst          => rst,
94)             clk          => clk,
95)             o_data       => s_rx_data,
96)             o_data_en    => s_rx_data_en,
97)             o_done       => s_rx_done,
98)             o_err        => s_rx_err,
99)             pin_i_rx_clk => pin_i_rx_clk,
100)             pin_i_rxd    => pin_i_rxd,
101)             pin_i_rx_dv  => pin_i_rx_dv,
102)             pin_i_crs    => pin_i_crs,
103)             pin_i_col    => pin_i_col
104)         );
105) 
106)     -- so far only for testing
107)     p_rx_if2fifo: PROCESS (s_rx_data, s_rx_data_en, s_rx_done, s_rx_err)
108)     BEGIN
109)         IF s_rx_err = '1' THEN
110)             s_rx_fifo_wr_data <= X"EE";
111)         ELSIF s_rx_done = '1' THEN
112)             s_rx_fifo_wr_data <= X"DD";
113)         ELSE
114)             s_rx_fifo_wr_data <= s_rx_data;
115)         END IF;
116)         s_rx_fifo_wr_en <= s_rx_data_en OR s_rx_done OR s_rx_err;
117)     END PROCESS p_rx_if2fifo;
118) 
119)     -- so far only for testing
120)     rx_fifo: e_block_fifo
121)         GENERIC MAP (
122)             addr_width => 11,
123)             data_width => 8
124)         )
125)         PORT MAP (
126)             rst       => rst,
127)             clk       => clk,
128)             o_wr_rdy  => s_rx_fifo_wr_rdy,
129)             i_wr_data => s_rx_fifo_wr_data,
130)             i_wr_en   => s_rx_fifo_wr_en,
131)             o_rd_rdy  => s_rx_fifo_rd_rdy,
132)             o_rd_data => s_rx_fifo_rd_data,
133)             i_rd_en   => s_rx_fifo_rd_en
134)         );
135) 
136)     -- so far only for testing
Stefan Schuermans fix reading (1 cycle latenc...

Stefan Schuermans authored 12 years ago

137)     p_rx_test_wr: PROCESS (i_addr, i_wr_data, i_wr_en)
Stefan Schuermans begin of ethernet RX implem...

Stefan Schuermans authored 12 years ago

138)     BEGIN
139)         s_rx_fifo_rd_en <= '0';
Stefan Schuermans fix reading (1 cycle latenc...

Stefan Schuermans authored 12 years ago

140)         IF i_addr = "01" THEN
Stefan Schuermans begin of ethernet RX implem...

Stefan Schuermans authored 12 years ago

141)             IF i_wr_en(0) = '1' THEN
142)                 s_rx_fifo_rd_en <= '1';
143)             END IF;
144)         END IF;
Stefan Schuermans fix reading (1 cycle latenc...

Stefan Schuermans authored 12 years ago

145)     END PROCESS p_rx_test_wr;
146) 
147)     -- so far only for testing
148)     p_rx_test_rd: PROCESS (rst, clk)
149)     BEGIN
150)         IF rst = '1' THEN
151)             o_rd_data       <= X"00000000";
152)         ELSIF rising_edge(clk) THEN
153)             o_rd_data       <= X"00000000";
154)             IF i_addr = "00" THEN
155)                 o_rd_data(0) <= s_rx_fifo_rd_rdy;
156)             ELSIF i_addr = "01" THEN
157)                 o_rd_data(7 DOWNTO 0) <= s_rx_fifo_rd_data;
158)             END IF;
159)         END IF;
160)     END PROCESS p_rx_test_rd;