Compare commits
2 Commits
651b6bb11e
...
3240f363ba
Author | SHA1 | Date | |
---|---|---|---|
3240f363ba | |||
a5d5ca280d |
@ -215,9 +215,13 @@ architecture eth of top_hwitl is
|
||||
signal arp_in : arp_in_t;
|
||||
begin
|
||||
trashernet_arp_inst : entity trashernet.trashernet_arp
|
||||
generic map(
|
||||
TIMEOUT_TICK_FREQ => F_CLK
|
||||
)
|
||||
port map(
|
||||
clk => clk,
|
||||
rst => rst,
|
||||
timeout_tick => '1',
|
||||
mac_config => ETH_CONFIG,
|
||||
ip_config => IP_CONFIG,
|
||||
arp_out => arp_out,
|
||||
|
@ -16,10 +16,14 @@ use ieee.numeric_std.all;
|
||||
use work.trashernet_pkg.all;
|
||||
|
||||
entity trashernet_arp is
|
||||
generic(
|
||||
TIMEOUT_TICK_FREQ : integer
|
||||
);
|
||||
port(
|
||||
-- Global
|
||||
clk : in std_logic; -- Global clock
|
||||
rst : in std_logic; -- Asynchronous reset
|
||||
timeout_tick : in std_logic; -- Global timeout tick strobe
|
||||
|
||||
-- Configuration
|
||||
mac_config : in configuration_t; -- Trashernet MAC configuration
|
||||
@ -43,6 +47,8 @@ architecture rtl of trashernet_arp is
|
||||
constant OPER_REQUEST : byte_vector := (x"00", x"01");
|
||||
constant OPER_REPLY : byte_vector := (x"00", x"02");
|
||||
|
||||
constant ARP_TIMEOUT : time := 1 sec;
|
||||
|
||||
signal arp_tx_reply_rq : std_logic; -- Request to transmit an ARP reply
|
||||
signal arp_tx_reply_tha : mac_addr_t; -- Target MAC to use in reply (SHA in received packet)
|
||||
signal arp_tx_reply_tpa : ip_addr_t; -- Target IP to use in reply (SPA in received packet)
|
||||
@ -55,6 +61,7 @@ architecture rtl of trashernet_arp is
|
||||
signal arp_rx_reply_stb : std_logic; -- An ARP reply was received (strobe)
|
||||
signal arp_rx_sha : mac_addr_t; -- The MAC address of the reply sender, valid with arp_rx_reply
|
||||
signal arp_rx_spa : ip_addr_t; -- The IP address of the reply sender, valid with arp_rx_reply
|
||||
|
||||
begin
|
||||
resolver : block
|
||||
type resolver_state_t is (IDLE, QUERY_MAC);
|
||||
@ -74,7 +81,7 @@ begin
|
||||
replied_ip <= (others => x"00"); -- 0.0.0.0
|
||||
arp_out.arp_ok_stb <= '0';
|
||||
arp_out.arp_fail_stb <= '0';
|
||||
arp_tx_request_rq <= '0';
|
||||
arp_tx_request_rq <= '0';
|
||||
|
||||
elsif rising_edge(clk) then
|
||||
arp_out.arp_ok_stb <= '0';
|
||||
@ -103,16 +110,33 @@ begin
|
||||
arp_tx_request_rq <= '0';
|
||||
end if;
|
||||
if query_mac_found or query_timeout then
|
||||
arp_out.arp_ok_stb <= query_mac_found;
|
||||
arp_out.arp_ok_stb <= query_mac_found;
|
||||
arp_out.arp_fail_stb <= not query_mac_found;
|
||||
state <= IDLE;
|
||||
state <= IDLE;
|
||||
end if;
|
||||
end case;
|
||||
end if;
|
||||
end process arp_resolver_main;
|
||||
query_mac_found <= '1' when (arp_tx_request_tpa = replied_ip) else '0';
|
||||
query_mac_found <= '1' when (arp_tx_request_tpa = replied_ip) else '0';
|
||||
|
||||
arp_out.arp_mac <= replied_mac;
|
||||
arp_tx_request_tpa <= arp_in.arp_ip;
|
||||
|
||||
timeout_timer_inst : entity work.timer
|
||||
generic map(
|
||||
F_TICK => TIMEOUT_TICK_FREQ,
|
||||
DURATION => ARP_TIMEOUT,
|
||||
AUTOSTART => false
|
||||
)
|
||||
port map(
|
||||
clk => clk,
|
||||
rst => rst,
|
||||
tick => timeout_tick,
|
||||
start => arp_tx_request_rq,
|
||||
expired => query_timeout,
|
||||
expired_stb => open
|
||||
);
|
||||
|
||||
end block resolver;
|
||||
|
||||
rx : block
|
||||
@ -250,7 +274,7 @@ begin
|
||||
tx_fsm : process(clk, rst) is
|
||||
begin
|
||||
if rst then
|
||||
arp_tx_reply_ack <= '0';
|
||||
arp_tx_reply_ack <= '0';
|
||||
arp_tx_request_ack <= '0';
|
||||
|
||||
elsif rising_edge(clk) then
|
||||
@ -265,14 +289,14 @@ begin
|
||||
case state is
|
||||
when IDLE =>
|
||||
if arp_tx_reply_rq then
|
||||
state <= TRANSMIT;
|
||||
arp_tx_reply_ack <= '1';
|
||||
sr <= arp_reply_preload;
|
||||
state <= TRANSMIT;
|
||||
arp_tx_reply_ack <= '1';
|
||||
sr <= arp_reply_preload;
|
||||
ethernet_ii_in.tx_mac_address <= arp_tx_reply_tha;
|
||||
elsif arp_tx_request_rq then
|
||||
state <= TRANSMIT;
|
||||
arp_tx_request_ack <= '1';
|
||||
sr <= arp_request_preload;
|
||||
state <= TRANSMIT;
|
||||
arp_tx_request_ack <= '1';
|
||||
sr <= arp_request_preload;
|
||||
ethernet_ii_in.tx_mac_address <= MAC_ADDR_BROADCAST;
|
||||
end if;
|
||||
|
||||
@ -286,8 +310,8 @@ begin
|
||||
end if;
|
||||
end process tx_fsm;
|
||||
|
||||
ethernet_ii_in.tx_en <= '1' when state = TRANSMIT else '0';
|
||||
ethernet_ii_in.tx_data <= sr(0);
|
||||
ethernet_ii_in.tx_en <= '1' when state = TRANSMIT else '0';
|
||||
ethernet_ii_in.tx_data <= sr(0);
|
||||
|
||||
end block tx;
|
||||
end architecture rtl;
|
||||
|
Loading…
Reference in New Issue
Block a user