22b456946e289c89da296dcaceeb18de71761713
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);
Stefan Schuermans add read_enable signal to d...

Stefan Schuermans authored 12 years ago

11)         i_rd_en:      IN  std_logic_vector( 3 DOWNTO 0);
Stefan Schuermans begin of ethernet RX implem...

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

138)     s_rx_fifo_rd_en <= '1' WHEN i_addr = "01" AND i_rd_en(0) = '1' ELSE '0';
Stefan Schuermans fix reading (1 cycle latenc...

Stefan Schuermans authored 12 years ago

139) 
140)     -- so far only for testing
141)     p_rx_test_rd: PROCESS (rst, clk)
142)     BEGIN
143)         IF rst = '1' THEN
144)             o_rd_data       <= X"00000000";
145)         ELSIF rising_edge(clk) THEN
146)             o_rd_data       <= X"00000000";
147)             IF i_addr = "00" THEN
148)                 o_rd_data(0) <= s_rx_fifo_rd_rdy;
149)             ELSIF i_addr = "01" THEN
150)                 o_rd_data(7 DOWNTO 0) <= s_rx_fifo_rd_data;
151)             END IF;
152)         END IF;
153)     END PROCESS p_rx_test_rd;