Line 17... |
Line 17... |
--
|
--
|
-- Revision:
|
-- Revision:
|
-- Revision 0.01 - File Created
|
-- Revision 0.01 - File Created
|
-- Revision 0.02 - fixed up setting of tx_result control defaults
|
-- Revision 0.02 - fixed up setting of tx_result control defaults
|
-- Revision 0.03 - Added data_out_first
|
-- Revision 0.03 - Added data_out_first
|
|
-- Revision 0.04 - Added handling of broadcast address
|
-- Additional Comments:
|
-- Additional Comments:
|
--
|
--
|
----------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------
|
library IEEE;
|
library IEEE;
|
use IEEE.STD_LOGIC_1164.ALL;
|
use IEEE.STD_LOGIC_1164.ALL;
|
Line 92... |
Line 93... |
-- tx control signals
|
-- tx control signals
|
signal next_tx_state : tx_state_type;
|
signal next_tx_state : tx_state_type;
|
signal set_tx_state : std_logic;
|
signal set_tx_state : std_logic;
|
signal next_tx_result : std_logic_vector (1 downto 0);
|
signal next_tx_result : std_logic_vector (1 downto 0);
|
signal set_tx_result : std_logic;
|
signal set_tx_result : std_logic;
|
|
signal tx_mac_value : std_logic_vector (47 downto 0);
|
signal set_tx_mac : std_logic;
|
signal set_tx_mac : std_logic;
|
signal tx_count_val : unsigned (11 downto 0);
|
signal tx_count_val : unsigned (11 downto 0);
|
signal tx_count_mode : settable_cnt_type;
|
signal tx_count_mode : settable_cnt_type;
|
signal tx_data : std_logic_vector (7 downto 0);
|
signal tx_data : std_logic_vector (7 downto 0);
|
signal set_last : std_logic;
|
signal set_last : std_logic;
|
Line 161... |
Line 163... |
mac_tx_granted, mac_data_out_ready,
|
mac_tx_granted, mac_data_out_ready,
|
-- state variables
|
-- state variables
|
tx_state, tx_count, tx_result_reg, tx_mac, tx_mac_chn_reqd,
|
tx_state, tx_count, tx_result_reg, tx_mac, tx_mac_chn_reqd,
|
mac_lookup_req, tx_hdr_cks, arp_req_ip_reg, mac_data_out_ready_reg,
|
mac_lookup_req, tx_hdr_cks, arp_req_ip_reg, mac_data_out_ready_reg,
|
-- control signals
|
-- control signals
|
next_tx_state, set_tx_state, next_tx_result, set_tx_result, set_tx_mac, tx_count_mode,
|
next_tx_state, set_tx_state, next_tx_result, set_tx_result, tx_mac_value, set_tx_mac, tx_count_mode,
|
tx_data, set_last, set_chn_reqd, set_mac_lku_req, total_length,
|
tx_data, set_last, set_chn_reqd, set_mac_lku_req, total_length,
|
tx_data_valid, tx_count_val
|
tx_data_valid, tx_count_val
|
)
|
)
|
begin
|
begin
|
-- set output followers
|
-- set output followers
|
Line 206... |
Line 208... |
set_chn_reqd <= HOLD;
|
set_chn_reqd <= HOLD;
|
set_mac_lku_req <= HOLD;
|
set_mac_lku_req <= HOLD;
|
next_tx_result <= IPTX_RESULT_NONE;
|
next_tx_result <= IPTX_RESULT_NONE;
|
set_tx_result <= '0';
|
set_tx_result <= '0';
|
tx_count_val <= (others => '0');
|
tx_count_val <= (others => '0');
|
|
tx_mac_value <= (others => '0');
|
|
|
-- set temp signals
|
-- set temp signals
|
total_length <= std_logic_vector(unsigned(ip_tx.hdr.data_length) + 20); -- total length = user data length + header length (bytes)
|
total_length <= std_logic_vector(unsigned(ip_tx.hdr.data_length) + 20); -- total length = user data length + header length (bytes)
|
|
|
-- TX FSM
|
-- TX FSM
|
Line 222... |
Line 225... |
-- check header count for error if too high
|
-- check header count for error if too high
|
if unsigned(ip_tx.hdr.data_length) > 1480 then
|
if unsigned(ip_tx.hdr.data_length) > 1480 then
|
next_tx_result <= IPTX_RESULT_ERR;
|
next_tx_result <= IPTX_RESULT_ERR;
|
set_tx_result <= '1';
|
set_tx_result <= '1';
|
else
|
else
|
|
next_tx_result <= IPTX_RESULT_SENDING;
|
|
set_tx_result <= '1';
|
|
|
-- TODO - check if we already have the mac addr for this ip, if so, bypass the WAIT_MAC state
|
-- TODO - check if we already have the mac addr for this ip, if so, bypass the WAIT_MAC state
|
|
|
-- req the mac address for this ip
|
if ip_tx.hdr.dst_ip_addr = IP_BC_ADDR then
|
|
-- for IP broadcast, dont need to look up the MAC addr
|
|
tx_mac_value <= MAC_BC_ADDR;
|
|
set_tx_mac <= '1';
|
|
next_tx_state <= WAIT_CHN;
|
|
set_tx_state <= '1';
|
|
else
|
|
-- need to req the mac address for this ip
|
set_mac_lku_req <= SET;
|
set_mac_lku_req <= SET;
|
next_tx_result <= IPTX_RESULT_SENDING;
|
|
set_tx_result <= '1';
|
|
next_tx_state <= WAIT_MAC;
|
next_tx_state <= WAIT_MAC;
|
set_tx_state <= '1';
|
set_tx_state <= '1';
|
end if;
|
end if;
|
|
end if;
|
else
|
else
|
set_mac_lku_req <= CLR;
|
set_mac_lku_req <= CLR;
|
end if;
|
end if;
|
|
|
when WAIT_MAC =>
|
when WAIT_MAC =>
|
ip_tx_data_out_ready <= '0'; -- in this state, we are unable to accept user data for tx
|
ip_tx_data_out_ready <= '0'; -- in this state, we are unable to accept user data for tx
|
if arp_req_rslt.got_mac = '1' then
|
if arp_req_rslt.got_mac = '1' then
|
-- save the MAC we got back from the ARP lookup
|
-- save the MAC we got back from the ARP lookup
|
|
tx_mac_value <= arp_req_rslt.mac;
|
set_tx_mac <= '1';
|
set_tx_mac <= '1';
|
set_chn_reqd <= SET;
|
set_chn_reqd <= SET;
|
set_mac_lku_req <= CLR;
|
set_mac_lku_req <= CLR;
|
-- check for optimise when already have the channel
|
-- check for optimise when already have the channel
|
if mac_tx_granted = '1' then
|
if mac_tx_granted = '1' then
|
Line 423... |
Line 436... |
arp_req_ip_reg <= arp_req_ip_reg;
|
arp_req_ip_reg <= arp_req_ip_reg;
|
end case;
|
end case;
|
|
|
-- save MAC
|
-- save MAC
|
if set_tx_mac = '1' then
|
if set_tx_mac = '1' then
|
tx_mac <= arp_req_rslt.mac;
|
tx_mac <= tx_mac_value;
|
else
|
else
|
tx_mac <= tx_mac;
|
tx_mac <= tx_mac;
|
end if;
|
end if;
|
|
|
-- control access request to mac tx chn
|
-- control access request to mac tx chn
|