From cfa1a3f8a22a90b205657cbc1c2d35d719433fe3 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Wed, 7 Apr 2010 15:28:23 +0000 Subject: [PATCH] - separate RX/TX status and size register Committed on the Free edition of March Hare Software CVSNT Server. Upgrade to CVS Suite for more features and support: http://march-hare.com/cvsnt/ git-svn-id: http://moon:8086/svn/vhdl/trunk@868 cc03376c-175c-47c8-b038-4cd826a8556b --- lib/emac/src/emac_top_jb.vhd | 91 +++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 32 deletions(-) diff --git a/lib/emac/src/emac_top_jb.vhd b/lib/emac/src/emac_top_jb.vhd index 2e9a714..5456b48 100644 --- a/lib/emac/src/emac_top_jb.vhd +++ b/lib/emac/src/emac_top_jb.vhd @@ -86,43 +86,55 @@ registers_write: if RST_I = '1' then rx_int_en <= '0'; tx_int_en <= '0'; - tx_ctrl_in.tx_er <= '0'; tx_ctrl_in.tx_size <= (others => '0'); rx_ctrl_in.mac_addr <= (X"03", X"02", X"01", X"00", X"07", X"06"); - rx_ctrl_in.promiscious <= '1'; + rx_ctrl_in.promiscious <= '0'; tx_ctrl_in.Gbps_en <= '0'; rx_ctrl_in.Gbps_en <= '0'; elsif (STB_I and CYC_I and WE_I) = '1' then case ADDR_I(5 downto 2) is + -- 0x0000 when "0000" => - tx_ctrl_in.tx_er <= DAT_I(31); - tx_ctrl_in.reset <= DAT_I(27); - tx_ctrl_in.Gbps_en <= DAT_I(26); - tx_ctrl_in.pkt_alloc_en <= DAT_I(25); - tx_ctrl_in.pkt_commit_en <= DAT_I(24); - rx_ctrl_in.reset <= DAT_I(23); - rx_ctrl_in.Gbps_en <= DAT_I(22); + rx_ctrl_in.reset <= DAT_I(31); + rx_ctrl_in.Gbps_en <= DAT_I(30); + rx_ctrl_in.promiscious <= DAT_I(23); rx_ctrl_in.pkt_req_en <= DAT_I(17); rx_ctrl_in.pkt_free_en <= DAT_I(16); - tx_int_en <= DAT_I(5); rx_int_en <= DAT_I(4); - rx_ctrl_in.promiscious <= DAT_I(3); - - when "0001" => - tx_ctrl_in.tx_size <= DAT_I(31 downto 16); + -- 0x0004 + -- rx_size R/O + + -- 0x0008 when "0010" => + tx_ctrl_in.reset <= DAT_I(31); + tx_ctrl_in.Gbps_en <= DAT_I(30); + tx_ctrl_in.pkt_alloc_en <= DAT_I(17); + tx_ctrl_in.pkt_commit_en <= DAT_I(16); + tx_int_en <= DAT_I(4); + + -- 0x000C + when "0011" => + tx_ctrl_in.tx_size <= DAT_I(15 downto 0); + + -- 0x0010 + when "0100" => tx_din_vld <= '1'; tx_din <= DAT_I; - when "0100" => + -- 0x0014 + -- Gap + + -- 0x0018 + when "0110" => rx_ctrl_in.mac_addr(0) <= DAT_I(31 downto 24); rx_ctrl_in.mac_addr(1) <= DAT_I(23 downto 16); rx_ctrl_in.mac_addr(2) <= DAT_I(15 downto 8); rx_ctrl_in.mac_addr(3) <= DAT_I(7 downto 0); - when "0101" => + -- 0x001C + when "0111" => rx_ctrl_in.mac_addr(4) <= DAT_I(31 downto 24); rx_ctrl_in.mac_addr(5) <= DAT_I(23 downto 16); @@ -142,39 +154,54 @@ registers_read: if (STB_I and CYC_I) = '1' and WE_I = '0' then case ADDR_I(5 downto 2) is - when "0000" => + -- 0x0000 + when "0000" => ACK_O <= ready; DAT_O <= (others => '0'); - DAT_O(31) <= tx_ctrl_in.tx_er; - DAT_O(30) <= '0'; - DAT_O(29) <= '0'; - DAT_O(28) <= tx_ctrl_out.pkt_done; - DAT_O(27) <= tx_ctrl_out.reset_busy; - DAT_O(26) <= tx_ctrl_in.Gbps_en; - DAT_O(25) <= tx_ctrl_out.pkt_alloc_req; - DAT_O(24) <= tx_ctrl_out.pkt_armed; - DAT_O(23) <= rx_ctrl_out.reset_busy; - DAT_O(22) <= rx_ctrl_in.Gbps_en; + DAT_O(31) <= rx_ctrl_out.reset_busy; + DAT_O(30) <= rx_ctrl_in.Gbps_en; + DAT_O(23) <= rx_ctrl_in.promiscious; DAT_O(19) <= rx_ctrl_out.pkt_bcast; DAT_O(18) <= rx_ctrl_out.pkt_mac_match; DAT_O(17) <= rx_ctrl_out.pkt_valid; DAT_O(16) <= rx_ctrl_out.pkt_avail; - DAT_O(5) <= tx_int_en; DAT_O(4) <= rx_int_en; - DAT_O(3) <= rx_ctrl_in.promiscious; + -- 0x0004 when "0001" => ACK_O <= '1'; - DAT_O <= tx_ctrl_out.tx_size & rx_ctrl_out.rx_size; + DAT_O <= X"0000" & rx_ctrl_out.rx_size; + -- 0x0008 when "0010" => + ACK_O <= ready; + DAT_O <= (others => '0'); + DAT_O(31) <= tx_ctrl_out.reset_busy; + DAT_O(30) <= tx_ctrl_in.Gbps_en; + DAT_O(24) <= tx_ctrl_out.pkt_done; + DAT_O(17) <= tx_ctrl_out.pkt_alloc_req; + DAT_O(16) <= tx_ctrl_out.pkt_armed; + DAT_O(4) <= tx_int_en; + + -- 0x000C + when "0011" => + ACK_O <= '1'; + DAT_O <= X"0000" & tx_ctrl_out.tx_size; + + -- 0x0010 + when "0100" => rx_ctrl_in.pkt_read_en <= '1'; - when "0100" => + -- 0x0014 + -- Gap + + -- 0x0018 + when "0110" => ACK_O <= '1'; DAT_O <= rx_ctrl_in.mac_addr(0) & rx_ctrl_in.mac_addr(1) & rx_ctrl_in.mac_addr(2) & rx_ctrl_in.mac_addr(3); - when "0101" => + -- 0x001C + when "0111" => ACK_O <= '1'; DAT_O <= rx_ctrl_in.mac_addr(4) & rx_ctrl_in.mac_addr(5) & X"0000";