Line 25... |
Line 25... |
-- Revision 0.01 - File Created - refactored from arp v0.02 module
|
-- Revision 0.01 - File Created - refactored from arp v0.02 module
|
-- Additional Comments:
|
-- Additional Comments:
|
--
|
--
|
----------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------
|
library IEEE;
|
library IEEE;
|
use IEEE.STD_LOGIC_1164.ALL;
|
use IEEE.STD_LOGIC_1164.all;
|
use IEEE.NUMERIC_STD.ALL;
|
use IEEE.NUMERIC_STD.all;
|
use work.arp_types.all;
|
use work.arp_types.all;
|
|
|
entity arp_rx is
|
entity arp_rx is
|
Port (
|
port (
|
-- MAC layer RX signals
|
-- MAC layer RX signals
|
data_in : in STD_LOGIC_VECTOR (7 downto 0); -- ethernet frame (from dst mac addr through to last byte of frame)
|
data_in : in std_logic_vector (7 downto 0); -- ethernet frame (from dst mac addr through to last byte of frame)
|
data_in_valid : in STD_LOGIC; -- indicates data_in valid on clock
|
data_in_valid : in std_logic; -- indicates data_in valid on clock
|
data_in_last : in STD_LOGIC; -- indicates last data in frame
|
data_in_last : in std_logic; -- indicates last data in frame
|
-- ARP output signals
|
-- ARP output signals
|
recv_who_has : out std_logic; -- pulse will be latched
|
recv_who_has : out std_logic; -- pulse will be latched
|
arp_entry_for_who_has : out arp_entry_t; -- target for who_has msg (Iie, who to reply to)
|
arp_entry_for_who_has : out arp_entry_t; -- target for who_has msg (Iie, who to reply to)
|
recv_I_have : out std_logic; -- pulse will be latched
|
recv_I_have : out std_logic; -- pulse will be latched
|
arp_entry_for_I_have : out arp_entry_t; -- arp target for I_have msg
|
arp_entry_for_I_have : out arp_entry_t; -- arp target for I_have msg
|
-- control and status signals
|
-- control and status signals
|
req_count : out STD_LOGIC_VECTOR(7 downto 0); -- count of arp pkts received
|
req_count : out std_logic_vector(7 downto 0); -- count of arp pkts received
|
-- system signals
|
-- system signals
|
our_ip_address : in STD_LOGIC_VECTOR (31 downto 0);
|
our_ip_address : in std_logic_vector (31 downto 0);
|
rx_clk : in std_logic;
|
rx_clk : in std_logic;
|
reset : in STD_LOGIC
|
reset : in std_logic
|
);
|
);
|
end arp_rx;
|
end arp_rx;
|
|
|
|
|
architecture Behavioral of arp_rx is
|
architecture Behavioral of arp_rx is
|
Line 112... |
Line 112... |
-- Hardware Length /= 6
|
-- Hardware Length /= 6
|
-- Protocol Length /= 4
|
-- Protocol Length /= 4
|
-- Operation /= 1 or 2
|
-- Operation /= 1 or 2
|
-- Target IP /= our IP (i.er. message is not meant for us)
|
-- Target IP /= our IP (i.er. message is not meant for us)
|
--
|
--
|
function not_our_arp(data : STD_LOGIC_VECTOR; count : unsigned; our_ip : std_logic_vector) return std_logic is
|
function not_our_arp(data : std_logic_vector; count : unsigned; our_ip : std_logic_vector) return std_logic is
|
begin
|
begin
|
if
|
if
|
(count = 12 and data /= x"08") or -- PDU type 0806 : ARP
|
(count = 12 and data /= x"08") or -- PDU type 0806 : ARP
|
(count = 13 and data /= x"06") or
|
(count = 13 and data /= x"06") or
|
(count = 14 and data /= x"00") or -- HW type 1 : eth
|
(count = 14 and data /= x"00") or -- HW type 1 : eth
|
Line 150... |
Line 150... |
dataval,set_mac5,set_mac4,set_mac3,set_mac2,set_mac1,set_mac0,set_ip3,set_ip2,set_ip1,set_ip0, set_err_data,
|
dataval,set_mac5,set_mac4,set_mac3,set_mac2,set_mac1,set_mac0,set_ip3,set_ip2,set_ip1,set_ip0, set_err_data,
|
count_arp_rcvd
|
count_arp_rcvd
|
)
|
)
|
begin
|
begin
|
-- set output followers
|
-- set output followers
|
req_count <= STD_LOGIC_VECTOR(arp_req_count);
|
req_count <= std_logic_vector(arp_req_count);
|
|
|
-- set defaults for combinatorial outputs
|
-- set defaults for combinatorial outputs
|
recv_who_has <= '0';
|
recv_who_has <= '0';
|
arp_entry_for_who_has.ip <= (others => '0');
|
arp_entry_for_who_has.ip <= (others => '0');
|
arp_entry_for_who_has.mac <= (others => '0');
|
arp_entry_for_who_has.mac <= (others => '0');
|
Line 207... |
Line 207... |
rx_count_mode <= INCR;
|
rx_count_mode <= INCR;
|
-- handle early frame termination
|
-- handle early frame termination
|
if data_in_last = '1' then
|
if data_in_last = '1' then
|
next_rx_state <= IDLE;
|
next_rx_state <= IDLE;
|
set_rx_state <= '1';
|
set_rx_state <= '1';
|
else
|
--else
|
|
end if;
|
-- check for end of frame. Also, detect and discard if not our frame
|
-- check for end of frame. Also, detect and discard if not our frame
|
if rx_count = 42 then
|
if rx_count = 41 then -- TB 2013-01-14 15:09:45 was 42
|
next_rx_state <= PROCESS_ARP;
|
next_rx_state <= PROCESS_ARP;
|
set_rx_state <= '1';
|
set_rx_state <= '1';
|
elsif not_our_arp(data_in,rx_count,our_ip_address) = '1' then
|
elsif not_our_arp(data_in,rx_count,our_ip_address) = '1' then
|
dataval <= data_in;
|
dataval <= data_in;
|
set_err_data <= '1';
|
set_err_data <= '1';
|
Line 261... |
Line 262... |
dataval <= data_in;
|
dataval <= data_in;
|
elsif rx_count = 31 then
|
elsif rx_count = 31 then
|
set_ip0 <= '1';
|
set_ip0 <= '1';
|
dataval <= data_in;
|
dataval <= data_in;
|
end if;
|
end if;
|
end if;
|
-- end if;
|
end case;
|
end case;
|
|
|
when PROCESS_ARP =>
|
when PROCESS_ARP =>
|
next_rx_state <= WAIT_END;
|
next_rx_state <= WAIT_END;
|
set_rx_state <= '1';
|
set_rx_state <= '1';
|