12f75e02a37862df28cbbbffa9f8abd82819e9f2
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);
Stefan Schuermans implemented multi-master fe...

Stefan Schuermans authored 12 years ago

14)         o_bm_req:     OUT std_logic;
15)         i_bm_grant:   IN  std_logic;
16)         o_bm_addr:    OUT std_logic_vector(31 DOWNTO 0);
17)         i_bm_rd_data: IN  std_logic_vector(31 DOWNTO 0);
18)         o_bm_rd_en:   OUT std_logic_vector( 3 DOWNTO 0);
19)         o_bm_wr_data: OUT std_logic_vector(31 DOWNTO 0);
20)         o_bm_wr_en:   OUT std_logic_vector( 3 DOWNTO 0);
Stefan Schuermans begin of ethernet RX implem...

Stefan Schuermans authored 12 years ago

21)         pin_o_nrst:   OUT std_logic;
22)         pin_i_rx_clk: IN  std_logic;
23)         pin_i_rxd:    IN  std_logic_vector(4 DOWNTO 0);
24)         pin_i_rx_dv:  IN  std_logic;
25)         pin_i_crs:    IN  std_logic;
26)         pin_i_col:    IN  std_logic;
27)         pin_i_tx_clk: IN  std_logic;
28)         pin_o_txd:    OUT std_logic_vector(3 DOWNTO 0);
29)         pin_o_tx_en:  OUT std_logic
30)     );
31) END ENTITY e_io_eth;
32) 
33) ARCHITECTURE a_io_eth OF e_io_eth IS
34) 
35)     SIGNAL s_rx_data:    std_logic_vector(7 DOWNTO 0);
36)     SIGNAL s_rx_data_en: std_logic;
37)     SIGNAL s_rx_done:    std_logic;
38)     SIGNAL s_rx_err:     std_logic;
39) 
40)     -- so far only for testing
41)     SIGNAL s_rx_fifo_wr_rdy:  std_logic;
42)     SIGNAL s_rx_fifo_wr_data: std_logic_vector(7 DOWNTO 0);
43)     SIGNAL s_rx_fifo_wr_en:   std_logic;
44)     SIGNAL s_rx_fifo_rd_rdy:  std_logic;
45)     SIGNAL s_rx_fifo_rd_data: std_logic_vector(7 DOWNTO 0);
46)     SIGNAL s_rx_fifo_rd_en:   std_logic;
47) 
48)     COMPONENT e_io_eth_rst IS
49)         PORT (
50)             rst:        IN  std_logic;
51)             clk:        IN  std_logic;
52)             pin_o_nrst: OUT std_logic
53)         );
54)     END COMPONENT e_io_eth_rst;
55) 
56)     COMPONENT e_io_eth_rxif IS
57)         PORT (
58)             rst:          IN  std_logic;
59)             clk:          IN  std_logic;
60)             o_data:       OUT std_logic_vector(7 DOWNTO 0);
61)             o_data_en:    OUT std_logic;
62)             o_done:       OUT std_logic;
63)             o_err:        OUT std_logic;
64)             pin_i_rx_clk: IN  std_logic;
65)             pin_i_rxd:    IN  std_logic_vector(4 DOWNTO 0);
66)             pin_i_rx_dv:  IN  std_logic;
67)             pin_i_crs:    IN  std_logic;
68)             pin_i_col:    IN  std_logic
69)         );
70)     END COMPONENT e_io_eth_rxif;
71) 
72)     -- so far only for testing
73)     COMPONENT e_block_fifo IS
74)         GENERIC (
75)             addr_width: natural;
76)             data_width: natural
77)         );
78)         PORT (
79)             rst:       IN  std_logic;
80)             clk:       IN  std_logic;
81)             o_wr_rdy:  OUT std_logic;
82)             i_wr_data: IN  std_logic_vector(data_width - 1 DOWNTO 0);
83)             i_wr_en:   IN  std_logic;
84)             o_rd_rdy:  OUT std_logic;
85)             o_rd_data: OUT std_logic_vector(data_width - 1 DOWNTO 0);
86)             i_rd_en:   IN  std_logic
87)         );
88)     END COMPONENT e_block_fifo;
89) 
Stefan Schuermans implemented multi-master fe...

Stefan Schuermans authored 12 years ago

90)     SIGNAL r_cnt: natural := 0;
91) 
Stefan Schuermans begin of ethernet RX implem...

Stefan Schuermans authored 12 years ago

92) BEGIN
93) 
94)     reset: e_io_eth_rst
95)         PORT MAP (
96)             rst        => rst,
97)             clk        => clk,
98)             pin_o_nrst => pin_o_nrst
99)         );
100) 
101)     rxif: e_io_eth_rxif
102)         PORT MAP (
103)             rst          => rst,
104)             clk          => clk,
105)             o_data       => s_rx_data,
106)             o_data_en    => s_rx_data_en,
107)             o_done       => s_rx_done,
108)             o_err        => s_rx_err,
109)             pin_i_rx_clk => pin_i_rx_clk,
110)             pin_i_rxd    => pin_i_rxd,
111)             pin_i_rx_dv  => pin_i_rx_dv,
112)             pin_i_crs    => pin_i_crs,
113)             pin_i_col    => pin_i_col
114)         );
115) 
116)     -- so far only for testing
117)     p_rx_if2fifo: PROCESS (s_rx_data, s_rx_data_en, s_rx_done, s_rx_err)
118)     BEGIN
119)         IF s_rx_err = '1' THEN
120)             s_rx_fifo_wr_data <= X"EE";
121)         ELSIF s_rx_done = '1' THEN
122)             s_rx_fifo_wr_data <= X"DD";
123)         ELSE
124)             s_rx_fifo_wr_data <= s_rx_data;
125)         END IF;
126)         s_rx_fifo_wr_en <= s_rx_data_en OR s_rx_done OR s_rx_err;
127)     END PROCESS p_rx_if2fifo;
128) 
129)     -- so far only for testing
130)     rx_fifo: e_block_fifo
131)         GENERIC MAP (
132)             addr_width => 11,
133)             data_width => 8
134)         )
135)         PORT MAP (
136)             rst       => rst,
137)             clk       => clk,
138)             o_wr_rdy  => s_rx_fifo_wr_rdy,
139)             i_wr_data => s_rx_fifo_wr_data,
140)             i_wr_en   => s_rx_fifo_wr_en,
141)             o_rd_rdy  => s_rx_fifo_rd_rdy,
142)             o_rd_data => s_rx_fifo_rd_data,
143)             i_rd_en   => s_rx_fifo_rd_en
144)         );
145) 
146)     -- so far only for testing
Stefan Schuermans add read_enable signal to d...

Stefan Schuermans authored 12 years ago

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

148) 
149)     -- so far only for testing
150)     p_rx_test_rd: PROCESS (rst, clk)
151)     BEGIN
152)         IF rst = '1' THEN
153)             o_rd_data       <= X"00000000";
154)         ELSIF rising_edge(clk) THEN
155)             o_rd_data       <= X"00000000";
156)             IF i_addr = "00" THEN
157)                 o_rd_data(0) <= s_rx_fifo_rd_rdy;
158)             ELSIF i_addr = "01" THEN
159)                 o_rd_data(7 DOWNTO 0) <= s_rx_fifo_rd_data;
160)             END IF;
161)         END IF;
162)     END PROCESS p_rx_test_rd;
Stefan Schuermans begin of ethernet RX implem...

Stefan Schuermans authored 12 years ago

163) 
164)     pin_o_txd   <= "0000";
165)     pin_o_tx_en <= '0';
166) 
Stefan Schuermans implemented multi-master fe...

Stefan Schuermans authored 12 years ago

167)     -- bus master: bullshit for now
168)     p_bm: PROCESS(rst, clk)
169)     BEGIN
170)         IF rst = '1' THEN
171)             r_cnt <= 0;
172)         ELSIF rising_edge(clk) THEN
173)             IF r_cnt < 3 THEN
174)                 r_cnt <= r_cnt + 1;
175)             ELSE
176)                 r_cnt <= 0;
177)             END IF;
178)         END IF;
179)     END PROCESS p_bm;
180) 
181)     -- bus master: bullshit for now
182)     o_bm_req     <= '1' WHEN r_cnt = 0 ELSE '0';
183)     o_bm_addr    <= (OTHERS => '0');
184)     o_bm_rd_en   <= (OTHERS => '0');
185)     o_bm_wr_data <= (OTHERS => '0');
186)     o_bm_wr_en   <= (OTHERS => '0');
187)