From fa5d373aabfc384d7f85779329d4e732692556f5 Mon Sep 17 00:00:00 2001 From: Michael Boehmer Date: Fri, 11 Nov 2022 18:26:05 +0100 Subject: [PATCH] Discovery start --- gbe_trb/base/gbe_frame_receiver.vhd | 170 +-- gbe_trb/base/gbe_logic_wrapper.vhd | 844 +++++++------ gbe_trb/base/gbe_main_control.vhd | 22 +- gbe_trb/base/gbe_protocol_selector.vhd | 1075 +++++++++-------- gbe_trb/base/gbe_protocols.vhd | 8 +- gbe_trb/base/gbe_receive_control.vhd | 19 +- gbe_trb/base/gbe_wrapper_fifo.vhd | 4 +- .../gbe_response_constructor_ARP.vhd | 509 ++++---- .../gbe_response_constructor_DHCP.vhd | 22 +- .../gbe_response_constructor_Discovery.vhd | 279 +++++ .../gbe_response_constructor_Forward.vhd | 3 - .../gbe_response_constructor_Ping.vhd | 3 - .../gbe_response_constructor_SCTRL.vhd | 3 - 13 files changed, 1586 insertions(+), 1375 deletions(-) create mode 100644 gbe_trb/protocols/gbe_response_constructor_Discovery.vhd diff --git a/gbe_trb/base/gbe_frame_receiver.vhd b/gbe_trb/base/gbe_frame_receiver.vhd index 3caef26..2f53082 100644 --- a/gbe_trb/base/gbe_frame_receiver.vhd +++ b/gbe_trb/base/gbe_frame_receiver.vhd @@ -29,15 +29,12 @@ entity gbe_frame_receiver is FR_FRAME_VALID_OUT : out std_logic; -- interconnect to gbe_receive_control FR_GET_FRAME_IN : in std_logic; -- interconnect to gbe_receive_control FR_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); -- interconnect to gbe_receive_control - FR_PS_OUT : out std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - FR_INFO_OUT : out std_logic_vector(7 downto 0); + FR_PS_OUT : out std_logic_vector(7 downto 0); + FR_FRAME_INFO_OUT : out std_logic_vector(7 downto 0); -- FR_SRC_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); - FR_DEST_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); FR_SRC_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); - FR_DEST_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); FR_SRC_UDP_PORT_OUT : out std_logic_vector(15 downto 0); - FR_DEST_UDP_PORT_OUT : out std_logic_vector(15 downto 0); -- OOB_REGISTER_0_OUT : out std_logic_vector(31 downto 0); OOB_REGISTER_1_OUT : out std_logic_vector(31 downto 0); @@ -74,6 +71,7 @@ architecture gbe_frame_receiver_arch of gbe_frame_receiver is signal is_icmp_x : std_logic; -- ICMP detected signal is_dhcp_x : std_logic; -- DHCP detected signal is_sctrl_x : std_logic; -- SCTRL detected + signal is_discovery_x : std_logic; -- DISCOVERY detected signal is_my_ip_x : std_logic; -- IP match, no broadcast signal is_broadcast_ip_x : std_logic; -- broadcast IP detected signal is_empty_payload_x : std_logic; -- empty payload detected (for frames stored!) @@ -104,15 +102,12 @@ architecture gbe_frame_receiver_arch of gbe_frame_receiver is signal mon_rec_bytes : unsigned(31 downto 0); signal fr_src_ip : std_logic_vector(31 downto 0); - signal fr_dest_ip : std_logic_vector(31 downto 0); - signal fr_dest_udp : std_logic_vector(15 downto 0); signal fr_src_udp : std_logic_vector(15 downto 0); signal fr_frame_size : std_logic_vector(15 downto 0); - signal fr_dest_mac : std_logic_vector(47 downto 0); signal fr_src_mac : std_logic_vector(47 downto 0); signal fr_ps : std_logic_vector(7 downto 0); signal fr_q : std_logic_vector(8 downto 0); - signal fr_info : std_logic_vector(7 downto 0); + signal fr_info : std_logic_vector(7 downto 0); signal oob_register_0_int : std_logic_vector(31 downto 0); signal oob_register_1_int : std_logic_vector(31 downto 0); @@ -212,37 +207,40 @@ begin -- correct IPv4 header if( (is_udp_x = '1') ) then -- UDP header --- if ( (is_dhcp_x = '1') or (is_sctrl_x = '1') ) then --- -- DHCP, SCTRL --- if( (mac_rx_eof_q = '0') ) then --- -- payload available --- DECODE_NS <= STORE_FRAME; --- else --- -- empty payload, store raw frame, check that later? --- DECODE_NS <= LAST_BYTE; --- fifo_hd_wr_x <= '1'; --- end if; --- end if; - if( (is_dhcp_x = '1') ) then - -- DHCP - if( (mac_rx_eof_q = '0') ) then - -- payload available - DECODE_NS <= STORE_FRAME; - else - -- empty payload, must never happen with DHCP, so we drop it - DECODE_NS <= LAST_BYTE; - end if; - end if; - if( (is_sctrl_x = '1') ) then - -- SCTRL - if( (mac_rx_eof_q = '0') ) then - -- payload available - DECODE_NS <= STORE_FRAME; - else - -- empty payload, must never happen with SCTRL, so we drop it - DECODE_NS <= LAST_BYTE; - end if; - end if; +---------------------------------------------------------------------------------- + if( (is_dhcp_x = '1') ) then + -- DHCP + if( (mac_rx_eof_q = '0') ) then + -- payload available + DECODE_NS <= STORE_FRAME; + else + -- empty payload, must never happen with DHCP, so we drop it + DECODE_NS <= LAST_BYTE; + end if; + end if; +---------------------------------------------------------------------------------- + if( (is_sctrl_x = '1') ) then + -- SCTRL + if( (mac_rx_eof_q = '0') ) then + -- payload available + DECODE_NS <= STORE_FRAME; + else + -- empty payload, must never happen with SCTRL, so we drop it + DECODE_NS <= LAST_BYTE; + end if; + end if; +---------------------------------------------------------------------------------- + if( (is_discovery_x = '1') ) then + -- DISCOVERY + if( (mac_rx_eof_q = '0') ) then + -- payload available + DECODE_NS <= STORE_FRAME; + else + -- empty payload, must never happen with DISCOVERY, so we drop it + DECODE_NS <= LAST_BYTE; + end if; + end if; +---------------------------------------------------------------------------------- end if; end if; @@ -419,6 +417,7 @@ begin is_icmp_x <= '1' when (stored_protocol = x"01") else '0'; is_dhcp_x <= '1' when (stored_dst_port = x"0044") else '0'; is_sctrl_x <= '1' when (stored_dst_port = x"6590") else '0'; + is_discovery_x <= '1' when (stored_dst_port = x"d903") else '0'; is_my_ip_x <= '1' when (stored_dst_ip = MY_IP_IN) else '0'; is_broadcast_ip_x <= '1' when (stored_dst_ip = x"ffffffff") else '0'; is_empty_payload_x <= '1' when (rx_bytes_ctr = 0) else '0'; @@ -428,10 +427,10 @@ begin begin if( rising_edge(CLK) ) then protocol_select(7) <= '0'; - protocol_select(6) <= '0'; - protocol_select(5) <= '0'; + protocol_select(6) <= is_discovery_x; + protocol_select(5) <= '0'; -- reserved for FORWARDER protocol_select(4) <= is_icmp_x; - protocol_select(3) <= '0'; + protocol_select(3) <= '0'; -- reserved for legacy TRBnet IPU channel protocol_select(2) <= is_sctrl_x; protocol_select(1) <= is_dhcp_x; protocol_select(0) <= is_arp_x; @@ -471,15 +470,8 @@ begin -- CAVEAT: writing to FIFO and reading needs some clock cycles? -- Three is fine, two fails - data arrives late. -- Happens when main control tries to read a frame directly when it was written. - - -- OPTIMIZE: two 512x72 instead of three. - -- to be removed: dst port - -- to be reduced: dst mac -> 2bit (is_my_mac_x, is_broadcast_x) - -- dst ip -> 2bit (is_my_ip_x, is_ip_broadcast_x) - -- to be used: proto sel -> 8bit - --------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------- + -- OBSELETE. New FIFOs used. + -- FIFO for header information THE_FIFO_ONE: entity work.fifo_512x72_s port map( @@ -505,10 +497,10 @@ begin Data(57) => is_broadcast_x, Data(58) => is_my_ip_x, Data(59) => is_broadcast_ip_x, - Data(60) => is_empty_payload_x, - Data(61) => '0', -- reserved - Data(62) => '0', -- reserved - Data(63) => '0', -- reserved + Data(60) => is_empty_payload_x, + Data(61) => '0', -- reserved + Data(62) => '0', -- reserved + Data(63) => '0', -- reserved Data(71 downto 64) => (others => '0'), Clock => CLK, WrEn => fifo_hd_wr_q, @@ -519,84 +511,24 @@ begin Full => open -- BUG ); - -- decode fifo_one_q and fifo_two_q - fr_dest_mac <= (others => '0'); + -- decode fifo_one_q and fifo_two_q fr_src_mac <= fifo_one_q(47 downto 0); - fr_dest_ip <= (others => '0'); fr_src_ip <= fifo_two_q(31 downto 0); - fr_dest_udp <= (others => '0'); fr_src_udp <= fifo_one_q(63 downto 48); fr_frame_size <= fifo_two_q(47 downto 32); fr_ps <= fifo_two_q(55 downto 48); fr_info <= fifo_two_q(63 downto 56); - --------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------- --- -- FIFO for header information --- THE_FIRST_FIFO: entity work.fifo_512x72_s --- port map( --- Data(47 downto 0) => stored_src_mac, --- Data(63 downto 48) => stored_src_port, --- Data(71 downto 64) => std_logic_vector(rx_bytes_ctr(7 downto 0)), --- Clock => CLK, --- WrEn => fifo_hd_wr_q, --- RdEn => FR_GET_FRAME_IN, --- Reset => RESET, --- Q(47 downto 0) => fr_src_mac, --- Q(63 downto 48) => fr_src_udp, --- Q(71 downto 64) => fr_frame_size(7 downto 0), --- Empty => open, -- BUG --- Full => open -- BUG --- ); --- --- -- FIFO for header information --- THE_SECOND_FIFO: entity work.fifo_512x72_s --- port map( --- Data(47 downto 0) => stored_dst_mac, --- Data(63 downto 48) => stored_dst_port, --- Data(71 downto 64) => protocol_select, --- Clock => CLK, --- WrEn => fifo_hd_wr_q, --- RdEn => FR_GET_FRAME_IN, --- Reset => RESET, --- Q(47 downto 0) => fr_dest_mac, --- Q(63 downto 48) => fr_dest_udp, --- Q(71 downto 64) => fr_ps, --- Empty => open, -- BUG --- Full => open -- BUG --- ); --- --- -- FIFO for header information --- THE_THIRD_FIFO: entity work.fifo_512x72_s --- port map( --- Data(31 downto 0) => stored_src_ip, --- Data(63 downto 32) => stored_dst_ip, --- Data(71 downto 64) => std_logic_vector(rx_bytes_ctr(15 downto 8)), --- Clock => CLK, --- WrEn => fifo_hd_wr_q, --- RdEn => FR_GET_FRAME_IN, --- Reset => RESET, --- Q(31 downto 0) => fr_src_ip, --- Q(63 downto 32) => fr_dest_ip, --- Q(71 downto 64) => fr_frame_size(15 downto 8), --- Empty => open, -- BUG --- Full => open -- BUG --- ); - PROC_OUT_SYNC: process( CLK ) begin if( rising_edge(CLK) ) then FR_SRC_IP_ADDRESS_OUT <= fr_src_ip; - FR_DEST_IP_ADDRESS_OUT <= fr_dest_ip; - FR_DEST_UDP_PORT_OUT <= fr_dest_udp; - FR_DEST_MAC_ADDRESS_OUT <= fr_dest_mac; FR_SRC_MAC_ADDRESS_OUT <= fr_src_mac; FR_SRC_UDP_PORT_OUT <= fr_src_udp; FR_FRAME_SIZE_OUT <= fr_frame_size; FR_Q_OUT <= fr_q; - FR_PS_OUT <= fr_ps(c_MAX_PROTOCOLS - 1 downto 0); - FR_INFO_OUT <= fr_info; + FR_PS_OUT <= fr_ps; + FR_FRAME_INFO_OUT <= fr_info; end if; end process PROC_OUT_SYNC; diff --git a/gbe_trb/base/gbe_logic_wrapper.vhd b/gbe_trb/base/gbe_logic_wrapper.vhd index 783ad37..c2c6aad 100644 --- a/gbe_trb/base/gbe_logic_wrapper.vhd +++ b/gbe_trb/base/gbe_logic_wrapper.vhd @@ -1,435 +1,419 @@ -library ieee; - use ieee.std_logic_1164.all; - use ieee.numeric_std.all; - -library work; - use work.gbe_protocols.all; - -entity gbe_logic_wrapper is - generic( - INCLUDE_SLOWCTRL : std_logic := '0'; - INCLUDE_DHCP : std_logic := '0'; - INCLUDE_ARP : std_logic := '0'; - INCLUDE_PING : std_logic := '0'; - INCLUDE_FWD : std_logic := '0'; - SLOWCTRL_BUFFER_SIZE : integer range 1 to 4 := 1 - ); - port( - CLK_125_IN : in std_logic; - RESET : in std_logic; - MY_MAC_IN : in std_logic_vector(47 downto 0); - DHCP_DONE_OUT : out std_logic; - MY_IP_OUT : out std_logic_vector(31 downto 0); - MY_TRBNET_ADDRESS_IN : in std_logic_vector(15 downto 0); - ISSUE_REBOOT_OUT : out std_logic; - -- connection to MAC (link handling) - LINK_ACTIVE_IN : in std_logic; - -- TSMAC RX stuff - MAC_RX_DATA_IN : in std_logic_vector(7 downto 0); - MAC_RX_WRITE_IN : in std_logic; - MAC_RX_EOF_IN : in std_logic; - MAC_RX_ERROR_IN : in std_logic; - -- FIFO TX stuff - FT_TX_DATA_OUT : out std_logic_vector(8 downto 0); - FT_TX_WR_OUT : out std_logic; - FT_TX_FIFOFULL_IN : in std_logic; - -- SlowControl - GSC_CLK_IN : in std_logic; - GSC_INIT_DATAREADY_OUT : out std_logic; - GSC_INIT_DATA_OUT : out std_logic_vector(15 downto 0); - GSC_INIT_PACKET_NUM_OUT : out std_logic_vector(2 downto 0); - GSC_INIT_READ_IN : in std_logic; - GSC_REPLY_DATAREADY_IN : in std_logic; - GSC_REPLY_DATA_IN : in std_logic_vector(15 downto 0); - GSC_REPLY_PACKET_NUM_IN : in std_logic_vector(2 downto 0); - GSC_REPLY_READ_OUT : out std_logic; - GSC_BUSY_IN : in std_logic; - -- - CFG_MAX_REPLY_SIZE_IN : in std_logic_vector(31 downto 0); - CFG_MAX_FRAME_IN : in std_logic_vector(15 downto 0); - CFG_ALLOW_RX_IN : in std_logic; - -- Forwarder - FWD_DST_MAC_IN : in std_logic_vector(47 downto 0); - FWD_DST_IP_IN : in std_logic_vector(31 downto 0); - FWD_DST_UDP_IN : in std_logic_vector(15 downto 0); - FWD_DATA_IN : in std_logic_vector(7 downto 0); - FWD_DATA_VALID_IN : in std_logic; - FWD_SOP_IN : in std_logic; - FWD_EOP_IN : in std_logic; - FWD_READY_OUT : out std_logic; - FWD_FULL_OUT : out std_logic; - -- - OOB_REGISTER_0_OUT : out std_logic_vector(31 downto 0); - OOB_REGISTER_1_OUT : out std_logic_vector(31 downto 0); - OOB_REGISTER_2_OUT : out std_logic_vector(31 downto 0); - OOB_REGISTER_3_OUT : out std_logic_vector(31 downto 0); - -- Monitor - MONITOR_RX_BYTES_OUT : out std_logic_vector(31 downto 0); - MONITOR_RX_FRAMES_OUT : out std_logic_vector(31 downto 0); - MONITOR_TX_BYTES_OUT : out std_logic_vector(31 downto 0); - MONITOR_TX_FRAMES_OUT : out std_logic_vector(31 downto 0); - MONITOR_TX_PACKETS_OUT : out std_logic_vector(31 downto 0); - MONITOR_DROPPED_OUT : out std_logic_vector(31 downto 0); - MONITOR_GEN_DBG_OUT : out std_logic_vector(2 * c_MAX_PROTOCOLS * 32 - 1 downto 0); - -- - MAKE_RESET_OUT : out std_logic; - DEBUG_OUT : out std_logic_vector(31 downto 0) - ); -end entity gbe_logic_wrapper; - -architecture gbe_logic_wrapper_arch of gbe_logic_wrapper is - - signal fr_q : std_logic_vector(8 downto 0); - signal fr_rd_en : std_logic; - signal fr_frame_valid : std_logic; - signal rc_rd_en : std_logic; - signal rc_q : std_logic_vector(8 downto 0); - signal rc_frames_rec_ctr : std_logic_vector(31 downto 0); - signal mc_data : std_logic_vector(8 downto 0); - signal mc_wr_en : std_logic; - signal fc_wr_en : std_logic; - signal fc_data : std_logic_vector(7 downto 0); - signal fc_ip_size : std_logic_vector(15 downto 0); - signal fc_udp_size : std_logic_vector(15 downto 0); - signal fc_ident : std_logic_vector(15 downto 0); - signal fc_flags_offset : std_logic_vector(15 downto 0); - signal fc_sod : std_logic; - signal fc_eod : std_logic; - signal fc_h_ready : std_logic; - signal fc_ready : std_logic; - signal rc_frame_ready : std_logic; - signal fr_frame_size : std_logic_vector(15 downto 0); - signal rc_frame_size : std_logic_vector(15 downto 0); - signal mc_frame_size : std_logic_vector(15 downto 0); - signal rc_bytes_rec : std_logic_vector(31 downto 0); - signal mc_transmit_ctrl : std_logic; - signal rc_loading_done : std_logic; - signal fr_get_frame : std_logic; - signal mc_transmit_done : std_logic; - - signal rc_frame_proto : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - - signal mc_type : std_logic_vector(15 downto 0); - signal fr_src_mac : std_logic_vector(47 downto 0); - signal fr_dest_mac : std_logic_vector(47 downto 0); - signal fr_src_ip : std_logic_vector(31 downto 0); - signal fr_dest_ip : std_logic_vector(31 downto 0); - signal fr_src_udp : std_logic_vector(15 downto 0); - signal fr_dest_udp : std_logic_vector(15 downto 0); - signal rc_src_mac : std_logic_vector(47 downto 0); - signal rc_dest_mac : std_logic_vector(47 downto 0); - signal rc_src_ip : std_logic_vector(31 downto 0); - signal rc_dest_ip : std_logic_vector(31 downto 0); - signal rc_src_udp : std_logic_vector(15 downto 0); - signal rc_dest_udp : std_logic_vector(15 downto 0); - - signal mc_dest_mac : std_logic_vector(47 downto 0); - signal mc_dest_ip : std_logic_vector(31 downto 0); - signal mc_dest_udp : std_logic_vector(15 downto 0); - signal mc_src_mac : std_logic_vector(47 downto 0); - signal mc_src_ip : std_logic_vector(31 downto 0); - signal mc_src_udp : std_logic_vector(15 downto 0); - - signal fc_dest_mac : std_logic_vector(47 downto 0); - signal fc_dest_ip : std_logic_vector(31 downto 0); - signal fc_dest_udp : std_logic_vector(15 downto 0); - signal fc_src_mac : std_logic_vector(47 downto 0); - signal fc_src_ip : std_logic_vector(31 downto 0); - signal fc_src_udp : std_logic_vector(15 downto 0); - signal fc_type : std_logic_vector(15 downto 0); - signal fc_protocol : std_logic_vector(7 downto 0); - - signal ft_data : std_logic_vector(8 downto 0); - signal ft_tx_empty : std_logic; - signal ft_start_of_packet : std_logic; - - signal mc_ip_proto : std_logic_vector(7 downto 0); - signal mc_ident : std_logic_vector(15 downto 0); - - signal link_ok : std_logic; +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +library work; +-- use work.gbe_protocols.all; + +entity gbe_logic_wrapper is + generic( + INCLUDE_SLOWCTRL : std_logic := '0'; + INCLUDE_DHCP : std_logic := '0'; + INCLUDE_ARP : std_logic := '0'; + INCLUDE_PING : std_logic := '0'; + INCLUDE_FWD : std_logic := '0'; + INCLUDE_DISCOVERY : std_logic := '0'; + SLOWCTRL_BUFFER_SIZE : integer range 1 to 4 := 1 + ); + port( + CLK_125_IN : in std_logic; + RESET : in std_logic; + MY_MAC_IN : in std_logic_vector(47 downto 0); + DHCP_DONE_OUT : out std_logic; + MY_IP_OUT : out std_logic_vector(31 downto 0); + MY_TRBNET_ADDRESS_IN : in std_logic_vector(15 downto 0); + ISSUE_REBOOT_OUT : out std_logic; + -- connection to MAC (link handling) + LINK_ACTIVE_IN : in std_logic; + -- TSMAC RX stuff + MAC_RX_DATA_IN : in std_logic_vector(7 downto 0); + MAC_RX_WRITE_IN : in std_logic; + MAC_RX_EOF_IN : in std_logic; + MAC_RX_ERROR_IN : in std_logic; + -- FIFO TX stuff + FT_TX_DATA_OUT : out std_logic_vector(8 downto 0); + FT_TX_WR_OUT : out std_logic; + FT_TX_FIFOFULL_IN : in std_logic; + -- SlowControl + GSC_CLK_IN : in std_logic; + GSC_INIT_DATAREADY_OUT : out std_logic; + GSC_INIT_DATA_OUT : out std_logic_vector(15 downto 0); + GSC_INIT_PACKET_NUM_OUT : out std_logic_vector(2 downto 0); + GSC_INIT_READ_IN : in std_logic; + GSC_REPLY_DATAREADY_IN : in std_logic; + GSC_REPLY_DATA_IN : in std_logic_vector(15 downto 0); + GSC_REPLY_PACKET_NUM_IN : in std_logic_vector(2 downto 0); + GSC_REPLY_READ_OUT : out std_logic; + GSC_BUSY_IN : in std_logic; + -- + CFG_MAX_REPLY_SIZE_IN : in std_logic_vector(31 downto 0); + CFG_MAX_FRAME_IN : in std_logic_vector(15 downto 0); + CFG_ALLOW_RX_IN : in std_logic; + -- Forwarder + FWD_DST_MAC_IN : in std_logic_vector(47 downto 0); + FWD_DST_IP_IN : in std_logic_vector(31 downto 0); + FWD_DST_UDP_IN : in std_logic_vector(15 downto 0); + FWD_DATA_IN : in std_logic_vector(7 downto 0); + FWD_DATA_VALID_IN : in std_logic; + FWD_SOP_IN : in std_logic; + FWD_EOP_IN : in std_logic; + FWD_READY_OUT : out std_logic; + FWD_FULL_OUT : out std_logic; + -- + OOB_REGISTER_0_OUT : out std_logic_vector(31 downto 0); + OOB_REGISTER_1_OUT : out std_logic_vector(31 downto 0); + OOB_REGISTER_2_OUT : out std_logic_vector(31 downto 0); + OOB_REGISTER_3_OUT : out std_logic_vector(31 downto 0); + -- Monitor + MONITOR_RX_BYTES_OUT : out std_logic_vector(31 downto 0); + MONITOR_RX_FRAMES_OUT : out std_logic_vector(31 downto 0); + MONITOR_TX_BYTES_OUT : out std_logic_vector(31 downto 0); + MONITOR_TX_FRAMES_OUT : out std_logic_vector(31 downto 0); + MONITOR_TX_PACKETS_OUT : out std_logic_vector(31 downto 0); + MONITOR_DROPPED_OUT : out std_logic_vector(31 downto 0); + MONITOR_GEN_DBG_OUT : out std_logic_vector(2 * 8 * 32 - 1 downto 0); + -- + MAKE_RESET_OUT : out std_logic; + DEBUG_OUT : out std_logic_vector(31 downto 0) + ); +end entity gbe_logic_wrapper; + +architecture gbe_logic_wrapper_arch of gbe_logic_wrapper is + + signal fr_q : std_logic_vector(8 downto 0); + signal fr_rd_en : std_logic; + signal fr_frame_valid : std_logic; + signal rc_rd_en : std_logic; + signal rc_q : std_logic_vector(8 downto 0); + signal rc_frames_rec_ctr : std_logic_vector(31 downto 0); + signal mc_data : std_logic_vector(8 downto 0); + signal mc_wr_en : std_logic; + signal fc_wr_en : std_logic; + signal fc_data : std_logic_vector(7 downto 0); + signal fc_ip_size : std_logic_vector(15 downto 0); + signal fc_udp_size : std_logic_vector(15 downto 0); + signal fc_ident : std_logic_vector(15 downto 0); + signal fc_flags_offset : std_logic_vector(15 downto 0); + signal fc_sod : std_logic; + signal fc_eod : std_logic; + signal fc_h_ready : std_logic; + signal fc_ready : std_logic; + signal rc_frame_ready : std_logic; + signal fr_frame_size : std_logic_vector(15 downto 0); + signal rc_frame_size : std_logic_vector(15 downto 0); + signal mc_frame_size : std_logic_vector(15 downto 0); + signal rc_bytes_rec : std_logic_vector(31 downto 0); + signal mc_transmit_ctrl : std_logic; + signal rc_loading_done : std_logic; + signal fr_get_frame : std_logic; + signal mc_transmit_done : std_logic; + + signal rc_frame_proto : std_logic_vector(7 downto 0); + + signal mc_type : std_logic_vector(15 downto 0); + signal fr_src_mac : std_logic_vector(47 downto 0); + signal fr_src_ip : std_logic_vector(31 downto 0); + signal fr_src_udp : std_logic_vector(15 downto 0); + signal rc_src_mac : std_logic_vector(47 downto 0); + signal rc_src_ip : std_logic_vector(31 downto 0); + signal rc_src_udp : std_logic_vector(15 downto 0); + + signal mc_dest_mac : std_logic_vector(47 downto 0); + signal mc_dest_ip : std_logic_vector(31 downto 0); + signal mc_dest_udp : std_logic_vector(15 downto 0); + signal mc_src_mac : std_logic_vector(47 downto 0); + signal mc_src_ip : std_logic_vector(31 downto 0); + signal mc_src_udp : std_logic_vector(15 downto 0); + + signal fc_dest_mac : std_logic_vector(47 downto 0); + signal fc_dest_ip : std_logic_vector(31 downto 0); + signal fc_dest_udp : std_logic_vector(15 downto 0); + signal fc_src_mac : std_logic_vector(47 downto 0); + signal fc_src_ip : std_logic_vector(31 downto 0); + signal fc_src_udp : std_logic_vector(15 downto 0); + signal fc_type : std_logic_vector(15 downto 0); + signal fc_protocol : std_logic_vector(7 downto 0); + + signal ft_data : std_logic_vector(8 downto 0); + signal ft_tx_empty : std_logic; + signal ft_start_of_packet : std_logic; + + signal mc_ip_proto : std_logic_vector(7 downto 0); + signal mc_ident : std_logic_vector(15 downto 0); + + signal link_ok : std_logic; signal dhcp_done : std_logic; - signal my_ip : std_logic_vector(31 downto 0); - - signal make_reset : std_logic; - signal frame_pause : std_logic_vector(31 downto 0); - - signal fr_ps : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - signal fr_frame_info : std_logic_vector(7 downto 0); - signal rc_frame_info : std_logic_vector(7 downto 0); - - signal debug_main : std_logic_vector(63 downto 0); - signal debug_fr : std_logic_vector(31 downto 0); - signal debug_rc : std_logic_vector(31 downto 0); - - begin - ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ----- DEBUG_OUT(31 downto 0) <= (others => '0'); --- DEBUG_OUT(31 downto 28) <= debug_fr(31 downto 28); -- frame receiver state --- DEBUG_OUT(27 downto 24) <= debug_rc(3 downto 0); -- receive control state --- DEBUG_OUT(23 downto 20) <= debug_main(23 downto 20); -- redirect state --- DEBUG_OUT(19 downto 16) <= fr_ps(3 downto 0); --debug_main(27 downto 24); -- link state --- DEBUG_OUT(15) <= rc_loading_done; --- DEBUG_OUT(14) <= rc_frame_ready; --- DEBUG_OUT(13) <= fr_ps(4); --rc_frame_proto(4); -- ICMP --- DEBUG_OUT(12) <= fr_ps(1); --rc_frame_proto(1); -- DHCP --- DEBUG_OUT(11) <= fr_ps(0); --rc_frame_proto(0); -- ARP --- DEBUG_OUT(10) <= fr_get_frame; --- DEBUG_OUT(9) <= fr_frame_valid; --- DEBUG_OUT(8) <= fr_rd_en; --- DEBUG_OUT(7 downto 0) <= rc_q(7 downto 0); ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- --- DEBUG_OUT(31 downto 28) <= debug_fr(31 downto 28); --- DEBUG_OUT(27 downto 0) <= debug_main(27 downto 0); - DEBUG_OUT(31 downto 0) <= debug_main(31 downto 0); ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- - + signal my_ip : std_logic_vector(31 downto 0); + + signal make_reset : std_logic; + signal frame_pause : std_logic_vector(31 downto 0); + + signal fr_ps : std_logic_vector(7 downto 0); + signal fr_frame_info : std_logic_vector(7 downto 0); + signal rc_frame_info : std_logic_vector(7 downto 0); + + signal debug_main : std_logic_vector(63 downto 0); + signal debug_fr : std_logic_vector(31 downto 0); + signal debug_rc : std_logic_vector(31 downto 0); + + begin + +--------------------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------------------- +---- DEBUG_OUT(31 downto 0) <= (others => '0'); +-- DEBUG_OUT(31 downto 28) <= debug_fr(31 downto 28); -- frame receiver state +-- DEBUG_OUT(27 downto 24) <= debug_rc(3 downto 0); -- receive control state +-- DEBUG_OUT(23 downto 20) <= debug_main(23 downto 20); -- redirect state +-- DEBUG_OUT(19 downto 16) <= fr_ps(3 downto 0); --debug_main(27 downto 24); -- link state +-- DEBUG_OUT(15) <= rc_loading_done; +-- DEBUG_OUT(14) <= rc_frame_ready; +-- DEBUG_OUT(13) <= fr_ps(4); --rc_frame_proto(4); -- ICMP +-- DEBUG_OUT(12) <= fr_ps(1); --rc_frame_proto(1); -- DHCP +-- DEBUG_OUT(11) <= fr_ps(0); --rc_frame_proto(0); -- ARP +-- DEBUG_OUT(10) <= fr_get_frame; +-- DEBUG_OUT(9) <= fr_frame_valid; +-- DEBUG_OUT(8) <= fr_rd_en; +-- DEBUG_OUT(7 downto 0) <= rc_q(7 downto 0); +--------------------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------------------- +-- DEBUG_OUT(31 downto 28) <= debug_fr(31 downto 28); +-- DEBUG_OUT(27 downto 0) <= debug_main(27 downto 0); + DEBUG_OUT(31 downto 0) <= debug_main(31 downto 0); +--------------------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------------------- + DHCP_DONE_OUT <= dhcp_done; - MY_IP_OUT <= my_ip; - - THE_GBE_MAIN_CONTROL: entity work.gbe_main_control - generic map( - INCLUDE_SLOWCTRL => INCLUDE_SLOWCTRL, - INCLUDE_DHCP => INCLUDE_DHCP, - INCLUDE_ARP => INCLUDE_ARP, - INCLUDE_PING => INCLUDE_PING, - INCLUDE_FWD => INCLUDE_FWD, - SLOWCTRL_BUFFER_SIZE => SLOWCTRL_BUFFER_SIZE - ) - port map( - CLK => CLK_125_IN, - CLK_125 => CLK_125_IN, - RESET => RESET, - MC_LINK_OK_OUT => link_ok, - MC_DHCP_DONE_OUT => dhcp_done, - MY_IP_OUT => my_ip, --MY_IP_OUT, - MC_MY_MAC_IN => MY_MAC_IN, - MY_TRBNET_ADDRESS_IN => MY_TRBNET_ADDRESS_IN, - ISSUE_REBOOT_OUT => open, --ISSUE_REBOOT_OUT, - -- signals to/from receive controller - RC_FRAME_WAITING_IN => rc_frame_ready, - RC_LOADING_DONE_OUT => rc_loading_done, - RC_DATA_IN => rc_q, - RC_RD_EN_OUT => rc_rd_en, - RC_FRAME_SIZE_IN => rc_frame_size, + MY_IP_OUT <= my_ip; + + THE_GBE_MAIN_CONTROL: entity work.gbe_main_control + generic map( + INCLUDE_SLOWCTRL => INCLUDE_SLOWCTRL, + INCLUDE_DHCP => INCLUDE_DHCP, + INCLUDE_ARP => INCLUDE_ARP, + INCLUDE_PING => INCLUDE_PING, + INCLUDE_FWD => INCLUDE_FWD, + INCLUDE_DISCOVERY => INCLUDE_DISCOVERY, + SLOWCTRL_BUFFER_SIZE => SLOWCTRL_BUFFER_SIZE + ) + port map( + CLK => CLK_125_IN, + CLK_125 => CLK_125_IN, + RESET => RESET, + MC_LINK_OK_OUT => link_ok, + MC_DHCP_DONE_OUT => dhcp_done, + MY_IP_OUT => my_ip, + MC_MY_MAC_IN => MY_MAC_IN, + MY_TRBNET_ADDRESS_IN => MY_TRBNET_ADDRESS_IN, + ISSUE_REBOOT_OUT => open, --ISSUE_REBOOT_OUT, + -- signals to/from receive controller + RC_FRAME_WAITING_IN => rc_frame_ready, + RC_LOADING_DONE_OUT => rc_loading_done, + RC_DATA_IN => rc_q, + RC_RD_EN_OUT => rc_rd_en, + RC_FRAME_SIZE_IN => rc_frame_size, RC_FRAME_PROTO_IN => rc_frame_proto, - RC_FRAME_INFO_IN => rc_frame_info, - RC_SRC_MAC_ADDRESS_IN => rc_src_mac, - RC_DEST_MAC_ADDRESS_IN => rc_dest_mac, - RC_SRC_IP_ADDRESS_IN => rc_src_ip, - RC_DEST_IP_ADDRESS_IN => rc_dest_ip, - RC_SRC_UDP_PORT_IN => rc_src_udp, - RC_DEST_UDP_PORT_IN => rc_dest_udp, - -- signals to/from transmit controller - TC_TRANSMIT_CTRL_OUT => mc_transmit_ctrl, - TC_DATA_OUT => mc_data, - TC_RD_EN_IN => mc_wr_en, - TC_FRAME_SIZE_OUT => mc_frame_size, - TC_FRAME_TYPE_OUT => mc_type, - TC_IP_PROTOCOL_OUT => mc_ip_proto, - TC_IDENT_OUT => mc_ident, - TC_DEST_MAC_OUT => mc_dest_mac, - TC_DEST_IP_OUT => mc_dest_ip, - TC_DEST_UDP_OUT => mc_dest_udp, - TC_SRC_MAC_OUT => mc_src_mac, - TC_SRC_IP_OUT => mc_src_ip, - TC_SRC_UDP_OUT => mc_src_udp, - TC_TRANSMIT_DONE_IN => mc_transmit_done, - -- signals to/from media interface - LINK_ACTIVE_IN => LINK_ACTIVE_IN, - -- signals to/from hub - GSC_CLK_IN => GSC_CLK_IN, - GSC_INIT_DATAREADY_OUT => GSC_INIT_DATAREADY_OUT, - GSC_INIT_DATA_OUT => GSC_INIT_DATA_OUT, - GSC_INIT_PACKET_NUM_OUT => GSC_INIT_PACKET_NUM_OUT, - GSC_INIT_READ_IN => GSC_INIT_READ_IN, - GSC_REPLY_DATAREADY_IN => GSC_REPLY_DATAREADY_IN, - GSC_REPLY_DATA_IN => GSC_REPLY_DATA_IN, - GSC_REPLY_PACKET_NUM_IN => GSC_REPLY_PACKET_NUM_IN, - GSC_REPLY_READ_OUT => GSC_REPLY_READ_OUT, - GSC_BUSY_IN => GSC_BUSY_IN, - CFG_MAX_REPLY_SIZE_IN => CFG_MAX_REPLY_SIZE_IN, - -- - RESET_TRBNET_IN => '0', - RESET_SCTRL_IN => '0', - MAKE_RESET_OUT => make_reset, - -- - FWD_DST_MAC_IN => FWD_DST_MAC_IN, - FWD_DST_IP_IN => FWD_DST_IP_IN, - FWD_DST_UDP_IN => FWD_DST_UDP_IN, - FWD_DATA_IN => FWD_DATA_IN, - FWD_DATA_VALID_IN => FWD_DATA_VALID_IN, - FWD_SOP_IN => FWD_SOP_IN, - FWD_EOP_IN => FWD_EOP_IN, - FWD_READY_OUT => FWD_READY_OUT, - FWD_FULL_OUT => FWD_FULL_OUT, - -- - DEBUG_OUT => debug_main --open - ); - - MAKE_RESET_OUT <= make_reset; - - THE_TRANSMIT_CONTROL: entity work.gbe_transmit_control - port map( - CLK => CLK_125_IN, - RESET => RESET, - -- signal to/from main controller - TC_DATAREADY_IN => mc_transmit_ctrl, - TC_RD_EN_OUT => mc_wr_en, - TC_DATA_IN => mc_data(7 downto 0), - TC_FRAME_SIZE_IN => mc_frame_size, - TC_FRAME_TYPE_IN => mc_type, - TC_IP_PROTOCOL_IN => mc_ip_proto, - TC_DEST_MAC_IN => mc_dest_mac, - TC_DEST_IP_IN => mc_dest_ip, - TC_DEST_UDP_IN => mc_dest_udp, - TC_SRC_MAC_IN => mc_src_mac, - TC_SRC_IP_IN => mc_src_ip, - TC_SRC_UDP_IN => mc_src_udp, - TC_TRANSMISSION_DONE_OUT => mc_transmit_done, - TC_IDENT_IN => mc_ident, - TC_MAX_FRAME_IN => CFG_MAX_FRAME_IN, - -- signal to/from frame constructor - FC_DATA_OUT => fc_data, - FC_WR_EN_OUT => fc_wr_en, - FC_READY_IN => fc_ready, - FC_H_READY_IN => fc_h_ready, - FC_FRAME_TYPE_OUT => fc_type, - FC_IP_SIZE_OUT => fc_ip_size, - FC_UDP_SIZE_OUT => fc_udp_size, - FC_IDENT_OUT => fc_ident, - FC_FLAGS_OFFSET_OUT => fc_flags_offset, - FC_SOD_OUT => fc_sod, - FC_EOD_OUT => fc_eod, - FC_IP_PROTOCOL_OUT => fc_protocol, - DEST_MAC_ADDRESS_OUT => fc_dest_mac, - DEST_IP_ADDRESS_OUT => fc_dest_ip, - DEST_UDP_PORT_OUT => fc_dest_udp, - SRC_MAC_ADDRESS_OUT => fc_src_mac, - SRC_IP_ADDRESS_OUT => fc_src_ip, - SRC_UDP_PORT_OUT => fc_src_udp, - MONITOR_TX_PACKETS_OUT => MONITOR_TX_PACKETS_OUT - ); - - THE_FRAME_CONSTR: entity work.gbe_frame_constr - port map( - RESET => RESET, - CLK => CLK_125_IN, - LINK_OK_IN => LINK_ACTIVE_IN, - WR_EN_IN => fc_wr_en, - DATA_IN => fc_data, - START_OF_DATA_IN => fc_sod, - END_OF_DATA_IN => fc_eod, - IP_F_SIZE_IN => fc_ip_size, - UDP_P_SIZE_IN => fc_udp_size, - HEADERS_READY_OUT => fc_h_ready, - READY_OUT => fc_ready, - DEST_MAC_ADDRESS_IN => fc_dest_mac, - DEST_IP_ADDRESS_IN => fc_dest_ip, - DEST_UDP_PORT_IN => fc_dest_udp, - SRC_MAC_ADDRESS_IN => fc_src_mac, - SRC_IP_ADDRESS_IN => fc_src_ip, - SRC_UDP_PORT_IN => fc_src_udp, - FRAME_TYPE_IN => fc_type, - IHL_VERSION_IN => x"45", - TOS_IN => x"10", - IDENTIFICATION_IN => fc_ident, - FLAGS_OFFSET_IN => fc_flags_offset, - TTL_IN => x"ff", - PROTOCOL_IN => fc_protocol, - FRAME_DELAY_IN => frame_pause, - FT_TX_DATA_OUT => FT_TX_DATA_OUT, - FT_TX_WR_OUT => FT_TX_WR_OUT, - FT_TX_FIFOFULL_IN => FT_TX_FIFOFULL_IN, - MONITOR_TX_BYTES_OUT => MONITOR_TX_BYTES_OUT, - MONITOR_TX_FRAMES_OUT => MONITOR_TX_FRAMES_OUT - ); - - frame_pause <= x"0000" & x"0000"; -- TAKE CARE!!! - - THE_RECEIVE_CONTROL: entity work.gbe_receive_control - port map( - CLK => CLK_125_IN, - RESET => RESET, - -- signals to/from frame_receiver - RC_DATA_IN => fr_q, - FR_RD_EN_OUT => fr_rd_en, - FR_FRAME_VALID_IN => fr_frame_valid, - FR_GET_FRAME_OUT => fr_get_frame, - FR_FRAME_SIZE_IN => fr_frame_size, + RC_FRAME_INFO_IN => rc_frame_info, + RC_SRC_MAC_ADDRESS_IN => rc_src_mac, + RC_SRC_IP_ADDRESS_IN => rc_src_ip, + RC_SRC_UDP_PORT_IN => rc_src_udp, + -- signals to/from transmit controller + TC_TRANSMIT_CTRL_OUT => mc_transmit_ctrl, + TC_DATA_OUT => mc_data, + TC_RD_EN_IN => mc_wr_en, + TC_FRAME_SIZE_OUT => mc_frame_size, + TC_FRAME_TYPE_OUT => mc_type, + TC_IP_PROTOCOL_OUT => mc_ip_proto, + TC_IDENT_OUT => mc_ident, + TC_DEST_MAC_OUT => mc_dest_mac, + TC_DEST_IP_OUT => mc_dest_ip, + TC_DEST_UDP_OUT => mc_dest_udp, + TC_SRC_MAC_OUT => mc_src_mac, + TC_SRC_IP_OUT => mc_src_ip, + TC_SRC_UDP_OUT => mc_src_udp, + TC_TRANSMIT_DONE_IN => mc_transmit_done, + -- signals to/from media interface + LINK_ACTIVE_IN => LINK_ACTIVE_IN, + -- signals to/from hub + GSC_CLK_IN => GSC_CLK_IN, + GSC_INIT_DATAREADY_OUT => GSC_INIT_DATAREADY_OUT, + GSC_INIT_DATA_OUT => GSC_INIT_DATA_OUT, + GSC_INIT_PACKET_NUM_OUT => GSC_INIT_PACKET_NUM_OUT, + GSC_INIT_READ_IN => GSC_INIT_READ_IN, + GSC_REPLY_DATAREADY_IN => GSC_REPLY_DATAREADY_IN, + GSC_REPLY_DATA_IN => GSC_REPLY_DATA_IN, + GSC_REPLY_PACKET_NUM_IN => GSC_REPLY_PACKET_NUM_IN, + GSC_REPLY_READ_OUT => GSC_REPLY_READ_OUT, + GSC_BUSY_IN => GSC_BUSY_IN, + CFG_MAX_REPLY_SIZE_IN => CFG_MAX_REPLY_SIZE_IN, + -- + RESET_TRBNET_IN => '0', + RESET_SCTRL_IN => '0', + MAKE_RESET_OUT => make_reset, + -- + FWD_DST_MAC_IN => FWD_DST_MAC_IN, + FWD_DST_IP_IN => FWD_DST_IP_IN, + FWD_DST_UDP_IN => FWD_DST_UDP_IN, + FWD_DATA_IN => FWD_DATA_IN, + FWD_DATA_VALID_IN => FWD_DATA_VALID_IN, + FWD_SOP_IN => FWD_SOP_IN, + FWD_EOP_IN => FWD_EOP_IN, + FWD_READY_OUT => FWD_READY_OUT, + FWD_FULL_OUT => FWD_FULL_OUT, + -- + DEBUG_OUT => debug_main --open + ); + + MAKE_RESET_OUT <= make_reset; + + THE_TRANSMIT_CONTROL: entity work.gbe_transmit_control + port map( + CLK => CLK_125_IN, + RESET => RESET, + -- signal to/from main controller + TC_DATAREADY_IN => mc_transmit_ctrl, + TC_RD_EN_OUT => mc_wr_en, + TC_DATA_IN => mc_data(7 downto 0), + TC_FRAME_SIZE_IN => mc_frame_size, + TC_FRAME_TYPE_IN => mc_type, + TC_IP_PROTOCOL_IN => mc_ip_proto, + TC_DEST_MAC_IN => mc_dest_mac, + TC_DEST_IP_IN => mc_dest_ip, + TC_DEST_UDP_IN => mc_dest_udp, + TC_SRC_MAC_IN => mc_src_mac, + TC_SRC_IP_IN => mc_src_ip, + TC_SRC_UDP_IN => mc_src_udp, + TC_TRANSMISSION_DONE_OUT => mc_transmit_done, + TC_IDENT_IN => mc_ident, + TC_MAX_FRAME_IN => CFG_MAX_FRAME_IN, + -- signal to/from frame constructor + FC_DATA_OUT => fc_data, + FC_WR_EN_OUT => fc_wr_en, + FC_READY_IN => fc_ready, + FC_H_READY_IN => fc_h_ready, + FC_FRAME_TYPE_OUT => fc_type, + FC_IP_SIZE_OUT => fc_ip_size, + FC_UDP_SIZE_OUT => fc_udp_size, + FC_IDENT_OUT => fc_ident, + FC_FLAGS_OFFSET_OUT => fc_flags_offset, + FC_SOD_OUT => fc_sod, + FC_EOD_OUT => fc_eod, + FC_IP_PROTOCOL_OUT => fc_protocol, + DEST_MAC_ADDRESS_OUT => fc_dest_mac, + DEST_IP_ADDRESS_OUT => fc_dest_ip, + DEST_UDP_PORT_OUT => fc_dest_udp, + SRC_MAC_ADDRESS_OUT => fc_src_mac, + SRC_IP_ADDRESS_OUT => fc_src_ip, + SRC_UDP_PORT_OUT => fc_src_udp, + MONITOR_TX_PACKETS_OUT => MONITOR_TX_PACKETS_OUT + ); + + THE_FRAME_CONSTR: entity work.gbe_frame_constr + port map( + RESET => RESET, + CLK => CLK_125_IN, + LINK_OK_IN => LINK_ACTIVE_IN, + WR_EN_IN => fc_wr_en, + DATA_IN => fc_data, + START_OF_DATA_IN => fc_sod, + END_OF_DATA_IN => fc_eod, + IP_F_SIZE_IN => fc_ip_size, + UDP_P_SIZE_IN => fc_udp_size, + HEADERS_READY_OUT => fc_h_ready, + READY_OUT => fc_ready, + DEST_MAC_ADDRESS_IN => fc_dest_mac, + DEST_IP_ADDRESS_IN => fc_dest_ip, + DEST_UDP_PORT_IN => fc_dest_udp, + SRC_MAC_ADDRESS_IN => fc_src_mac, + SRC_IP_ADDRESS_IN => fc_src_ip, + SRC_UDP_PORT_IN => fc_src_udp, + FRAME_TYPE_IN => fc_type, + IHL_VERSION_IN => x"45", + TOS_IN => x"10", + IDENTIFICATION_IN => fc_ident, + FLAGS_OFFSET_IN => fc_flags_offset, + TTL_IN => x"ff", + PROTOCOL_IN => fc_protocol, + FRAME_DELAY_IN => frame_pause, + FT_TX_DATA_OUT => FT_TX_DATA_OUT, + FT_TX_WR_OUT => FT_TX_WR_OUT, + FT_TX_FIFOFULL_IN => FT_TX_FIFOFULL_IN, + MONITOR_TX_BYTES_OUT => MONITOR_TX_BYTES_OUT, + MONITOR_TX_FRAMES_OUT => MONITOR_TX_FRAMES_OUT + ); + + frame_pause <= x"0000" & x"0000"; -- TAKE CARE!!! + + THE_RECEIVE_CONTROL: entity work.gbe_receive_control + port map( + CLK => CLK_125_IN, + RESET => RESET, + -- signals to/from frame_receiver + RC_DATA_IN => fr_q, + FR_RD_EN_OUT => fr_rd_en, + FR_FRAME_VALID_IN => fr_frame_valid, + FR_GET_FRAME_OUT => fr_get_frame, + FR_FRAME_SIZE_IN => fr_frame_size, FR_PS_IN => fr_ps, - FR_INFO_IN => fr_frame_info, - FR_SRC_MAC_ADDRESS_IN => fr_src_mac, - FR_DEST_MAC_ADDRESS_IN => fr_dest_mac, - FR_SRC_IP_ADDRESS_IN => fr_src_ip, - FR_DEST_IP_ADDRESS_IN => fr_dest_ip, - FR_SRC_UDP_PORT_IN => fr_src_udp, - FR_DEST_UDP_PORT_IN => fr_dest_udp, - -- signals to/from main controller - RC_RD_EN_IN => rc_rd_en, - RC_Q_OUT => rc_q, - RC_FRAME_WAITING_OUT => rc_frame_ready, - RC_LOADING_DONE_IN => rc_loading_done, - RC_FRAME_SIZE_OUT => rc_frame_size, - RC_FRAME_PROTO_OUT => rc_frame_proto, - RC_SRC_MAC_ADDRESS_OUT => rc_src_mac, - RC_DEST_MAC_ADDRESS_OUT => rc_dest_mac, - RC_SRC_IP_ADDRESS_OUT => rc_src_ip, - RC_DEST_IP_ADDRESS_OUT => rc_dest_ip, - RC_SRC_UDP_PORT_OUT => rc_src_udp, - RC_DEST_UDP_PORT_OUT => rc_dest_udp, - RC_INFO_OUT => rc_frame_info, - -- statistics - FRAMES_RECEIVED_OUT => rc_frames_rec_ctr, - BYTES_RECEIVED_OUT => rc_bytes_rec, - DEBUG_OUT => debug_rc - ); - - THE_FRAME_RECEIVER: entity work.gbe_frame_receiver - port map( - CLK => CLK_125_IN, - RESET => RESET, - LINK_OK_IN => LINK_ACTIVE_IN, - ALLOW_RX_IN => CFG_ALLOW_RX_IN, + FR_FRAME_INFO_IN => fr_frame_info, + FR_SRC_MAC_ADDRESS_IN => fr_src_mac, + FR_SRC_IP_ADDRESS_IN => fr_src_ip, + FR_SRC_UDP_PORT_IN => fr_src_udp, + -- signals to/from main controller + RC_RD_EN_IN => rc_rd_en, + RC_Q_OUT => rc_q, + RC_FRAME_WAITING_OUT => rc_frame_ready, + RC_LOADING_DONE_IN => rc_loading_done, + RC_FRAME_SIZE_OUT => rc_frame_size, + RC_FRAME_PROTO_OUT => rc_frame_proto, + RC_SRC_MAC_ADDRESS_OUT => rc_src_mac, + RC_SRC_IP_ADDRESS_OUT => rc_src_ip, + RC_SRC_UDP_PORT_OUT => rc_src_udp, + RC_FRAME_INFO_OUT => rc_frame_info, + -- statistics + FRAMES_RECEIVED_OUT => rc_frames_rec_ctr, + BYTES_RECEIVED_OUT => rc_bytes_rec, + DEBUG_OUT => debug_rc + ); + + THE_FRAME_RECEIVER: entity work.gbe_frame_receiver + port map( + CLK => CLK_125_IN, + RESET => RESET, + LINK_OK_IN => LINK_ACTIVE_IN, + ALLOW_RX_IN => CFG_ALLOW_RX_IN, MY_MAC_IN => MY_MAC_IN, - MY_IP_IN => my_ip, - -- - MY_TRBNET_ADDRESS_IN => MY_TRBNET_ADDRESS_IN, - ISSUE_REBOOT_OUT => ISSUE_REBOOT_OUT, - -- input signals from TS_MAC - MAC_RX_EOF_IN => MAC_RX_EOF_IN, - MAC_RX_ER_IN => MAC_RX_ERROR_IN, - MAC_RXD_IN => MAC_RX_DATA_IN, - MAC_RX_EN_IN => MAC_RX_WRITE_IN, - -- output signal to control logic - FR_Q_OUT => fr_q, - FR_RD_EN_IN => fr_rd_en, - FR_FRAME_VALID_OUT => fr_frame_valid, - FR_GET_FRAME_IN => fr_get_frame, - FR_FRAME_SIZE_OUT => fr_frame_size, - FR_PS_OUT => fr_ps, - FR_INFO_OUT => fr_frame_info, - -- - FR_SRC_MAC_ADDRESS_OUT => fr_src_mac, - FR_DEST_MAC_ADDRESS_OUT => fr_dest_mac, - FR_SRC_IP_ADDRESS_OUT => fr_src_ip, - FR_DEST_IP_ADDRESS_OUT => fr_dest_ip, - FR_SRC_UDP_PORT_OUT => fr_src_udp, - FR_DEST_UDP_PORT_OUT => fr_dest_udp, - -- - OOB_REGISTER_0_OUT => OOB_REGISTER_0_OUT, - OOB_REGISTER_1_OUT => OOB_REGISTER_1_OUT, - OOB_REGISTER_2_OUT => OOB_REGISTER_2_OUT, - OOB_REGISTER_3_OUT => OOB_REGISTER_3_OUT, - -- - MONITOR_RX_BYTES_OUT => MONITOR_RX_BYTES_OUT, - MONITOR_RX_FRAMES_OUT => MONITOR_RX_FRAMES_OUT, - MONITOR_DROPPED_OUT => MONITOR_DROPPED_OUT, - -- - DEBUG_OUT => debug_fr - ); - -end architecture gbe_logic_wrapper_arch; + MY_IP_IN => my_ip, + -- + MY_TRBNET_ADDRESS_IN => MY_TRBNET_ADDRESS_IN, + ISSUE_REBOOT_OUT => ISSUE_REBOOT_OUT, + -- input signals from TS_MAC + MAC_RX_EOF_IN => MAC_RX_EOF_IN, + MAC_RX_ER_IN => MAC_RX_ERROR_IN, + MAC_RXD_IN => MAC_RX_DATA_IN, + MAC_RX_EN_IN => MAC_RX_WRITE_IN, + -- output signal to control logic + FR_Q_OUT => fr_q, + FR_RD_EN_IN => fr_rd_en, + FR_FRAME_VALID_OUT => fr_frame_valid, + FR_GET_FRAME_IN => fr_get_frame, + FR_FRAME_SIZE_OUT => fr_frame_size, + FR_PS_OUT => fr_ps, + FR_FRAME_INFO_OUT => fr_frame_info, + -- + FR_SRC_MAC_ADDRESS_OUT => fr_src_mac, + FR_SRC_IP_ADDRESS_OUT => fr_src_ip, + FR_SRC_UDP_PORT_OUT => fr_src_udp, + -- + OOB_REGISTER_0_OUT => OOB_REGISTER_0_OUT, + OOB_REGISTER_1_OUT => OOB_REGISTER_1_OUT, + OOB_REGISTER_2_OUT => OOB_REGISTER_2_OUT, + OOB_REGISTER_3_OUT => OOB_REGISTER_3_OUT, + -- + MONITOR_RX_BYTES_OUT => MONITOR_RX_BYTES_OUT, + MONITOR_RX_FRAMES_OUT => MONITOR_RX_FRAMES_OUT, + MONITOR_DROPPED_OUT => MONITOR_DROPPED_OUT, + -- + DEBUG_OUT => debug_fr + ); + +end architecture gbe_logic_wrapper_arch; diff --git a/gbe_trb/base/gbe_main_control.vhd b/gbe_trb/base/gbe_main_control.vhd index 8e7bc1d..12043cb 100644 --- a/gbe_trb/base/gbe_main_control.vhd +++ b/gbe_trb/base/gbe_main_control.vhd @@ -13,6 +13,7 @@ entity gbe_main_control is INCLUDE_ARP : std_logic := '0'; INCLUDE_PING : std_logic := '0'; INCLUDE_FWD : std_logic := '0'; + INCLUDE_DISCOVERY : std_logic := '0'; -- SLOWCTRL_BUFFER_SIZE : integer range 1 to 4 := 1 ); @@ -33,15 +34,12 @@ entity gbe_main_control is RC_DATA_IN : in std_logic_vector(8 downto 0); RC_RD_EN_OUT : out std_logic; RC_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); - RC_FRAME_PROTO_IN : in std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - RC_FRAME_INFO_IN : in std_logic_vector(7 downto 0); + RC_FRAME_PROTO_IN : in std_logic_vector(7 downto 0); + RC_FRAME_INFO_IN : in std_logic_vector(7 downto 0); -- RC_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - RC_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); RC_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - RC_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); RC_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - RC_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); -- signals to/from transmit controller TC_TRANSMIT_CTRL_OUT : out std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); @@ -87,10 +85,10 @@ entity gbe_main_control is FWD_READY_OUT : out std_logic; FWD_FULL_OUT : out std_logic; -- - MONITOR_SELECT_REC_OUT : out std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); - MONITOR_SELECT_REC_BYTES_OUT : out std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); - MONITOR_SELECT_SENT_BYTES_OUT : out std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); - MONITOR_SELECT_SENT_OUT : out std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); + MONITOR_SELECT_REC_OUT : out std_logic_vector(8 * 32 - 1 downto 0); + MONITOR_SELECT_REC_BYTES_OUT : out std_logic_vector(8 * 32 - 1 downto 0); + MONITOR_SELECT_SENT_BYTES_OUT : out std_logic_vector(8 * 32 - 1 downto 0); + MONITOR_SELECT_SENT_OUT : out std_logic_vector(8 * 32 - 1 downto 0); -- DEBUG_OUT : out std_logic_vector(63 downto 0) ); @@ -127,7 +125,7 @@ architecture gbe_main_control_arch of gbe_main_control is signal ps_wr_en : std_logic; signal ps_response_ready : std_logic; - signal ps_busy : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); + signal ps_busy : std_logic_vector(8 - 1 downto 0); signal loaded_bytes_ctr : unsigned(15 downto 0); signal rc_data_local : std_logic_vector(8 downto 0); @@ -407,6 +405,7 @@ begin INCLUDE_ARP => INCLUDE_ARP, INCLUDE_PING => INCLUDE_PING, INCLUDE_FWD => INCLUDE_FWD, + INCLUDE_DISCOVERY => INCLUDE_DISCOVERY, SLOWCTRL_BUFFER_SIZE => SLOWCTRL_BUFFER_SIZE ) port map( @@ -420,11 +419,8 @@ begin PS_FRAME_INFO_IN => RC_FRAME_INFO_IN, PS_RESPONSE_READY_OUT => ps_response_ready, PS_SRC_MAC_ADDRESS_IN => RC_SRC_MAC_ADDRESS_IN, - PS_DEST_MAC_ADDRESS_IN => RC_DEST_MAC_ADDRESS_IN, PS_SRC_IP_ADDRESS_IN => RC_SRC_IP_ADDRESS_IN, - PS_DEST_IP_ADDRESS_IN => RC_DEST_IP_ADDRESS_IN, PS_SRC_UDP_PORT_IN => RC_SRC_UDP_PORT_IN, - PS_DEST_UDP_PORT_IN => RC_DEST_UDP_PORT_IN, TC_DATA_OUT => tc_data, TC_RD_EN_IN => TC_RD_EN_IN, TC_FRAME_SIZE_OUT => TC_FRAME_SIZE_OUT, diff --git a/gbe_trb/base/gbe_protocol_selector.vhd b/gbe_trb/base/gbe_protocol_selector.vhd index 27fc4f8..24ec501 100644 --- a/gbe_trb/base/gbe_protocol_selector.vhd +++ b/gbe_trb/base/gbe_protocol_selector.vhd @@ -1,518 +1,559 @@ -library ieee; - use ieee.std_logic_1164.all; - use ieee.numeric_std.all; - -library work; - use work.gbe_protocols.all; - -entity gbe_protocol_selector is - generic( - INCLUDE_SLOWCTRL : std_logic := '0'; - INCLUDE_DHCP : std_logic := '0'; - INCLUDE_ARP : std_logic := '0'; - INCLUDE_PING : std_logic := '0'; - INCLUDE_FWD : std_logic := '0'; - SLOWCTRL_BUFFER_SIZE : integer range 1 to 4 - ); - port( - CLK : in std_logic; -- system clock - RESET : in std_logic; - -- signals to/from main controller - PS_DATA_IN : in std_logic_vector(8 downto 0); - PS_WR_EN_IN : in std_logic; - PS_PROTO_SELECT_IN : in std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - PS_BUSY_OUT : out std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +library work; + use work.gbe_protocols.all; + +entity gbe_protocol_selector is + generic( + INCLUDE_SLOWCTRL : std_logic := '0'; + INCLUDE_DHCP : std_logic := '0'; + INCLUDE_ARP : std_logic := '0'; + INCLUDE_PING : std_logic := '0'; + INCLUDE_FWD : std_logic := '0'; + INCLUDE_DISCOVERY : std_logic := '0'; + SLOWCTRL_BUFFER_SIZE : integer range 1 to 4 + ); + port( + CLK : in std_logic; -- system clock + RESET : in std_logic; + -- signals to/from main controller + PS_DATA_IN : in std_logic_vector(8 downto 0); + PS_WR_EN_IN : in std_logic; + PS_PROTO_SELECT_IN : in std_logic_vector(7 downto 0); + PS_BUSY_OUT : out std_logic_vector(7 downto 0); PS_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); - PS_FRAME_INFO_IN : in std_logic_vector(7 downto 0); - PS_RESPONSE_READY_OUT : out std_logic; - PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - -- signals to/from transmit controller with constructed response - TC_DATA_OUT : out std_logic_vector(8 downto 0); - TC_RD_EN_IN : in std_logic; - TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); - TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); - TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); - TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); - TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); - TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); - TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); - MC_BUSY_IN : in std_logic; - -- misc signals for response constructors - MY_MAC_IN : in std_logic_vector(47 downto 0); - MY_IP_OUT : out std_logic_vector(31 downto 0); - DHCP_START_IN : in std_logic; - DHCP_DONE_OUT : out std_logic; - GSC_CLK_IN : in std_logic; - GSC_INIT_DATAREADY_OUT : out std_logic; - GSC_INIT_DATA_OUT : out std_logic_vector(15 downto 0); - GSC_INIT_PACKET_NUM_OUT : out std_logic_vector(2 downto 0); - GSC_INIT_READ_IN : in std_logic; - GSC_REPLY_DATAREADY_IN : in std_logic; - GSC_REPLY_DATA_IN : in std_logic_vector(15 downto 0); - GSC_REPLY_PACKET_NUM_IN : in std_logic_vector(2 downto 0); - GSC_REPLY_READ_OUT : out std_logic; - GSC_BUSY_IN : in std_logic; - CFG_MAX_REPLY_SIZE_IN : in std_logic_vector(31 downto 0); -- USED IN SCTRL - MAKE_RESET_OUT : out std_logic; - MY_TRBNET_ADDRESS_IN : in std_logic_vector(15 downto 0); - ISSUE_REBOOT_OUT : out std_logic; - -- Forwarder - FWD_DST_MAC_IN : in std_logic_vector(47 downto 0); - FWD_DST_IP_IN : in std_logic_vector(31 downto 0); - FWD_DST_UDP_IN : in std_logic_vector(15 downto 0); - FWD_DATA_IN : in std_logic_vector(7 downto 0); - FWD_DATA_VALID_IN : in std_logic; - FWD_SOP_IN : in std_logic; - FWD_EOP_IN : in std_logic; - FWD_READY_OUT : out std_logic; - FWD_FULL_OUT : out std_logic; - -- input for statistics from outside - MONITOR_SELECT_REC_OUT : out std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); - MONITOR_SELECT_REC_BYTES_OUT : out std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); - MONITOR_SELECT_SENT_BYTES_OUT : out std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); - MONITOR_SELECT_SENT_OUT : out std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); - DEBUG_OUT : out std_logic_vector(63 downto 0) - ); -end gbe_protocol_selector; - -architecture gbe_protocol_selector_arch of gbe_protocol_selector is - - attribute syn_encoding : string; - - signal rd_en : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - signal resp_ready : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - signal tc_wr : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - signal tc_data : std_logic_vector(c_MAX_PROTOCOLS * 9 - 1 downto 0); - signal tc_size : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); - signal tc_type : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); - signal busy : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - signal selected : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - signal tc_mac : std_logic_vector(c_MAX_PROTOCOLS * 48 - 1 downto 0); - signal tc_ip : std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); - signal tc_udp : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); - signal tc_src_mac : std_logic_vector(c_MAX_PROTOCOLS * 48 - 1 downto 0); - signal tc_src_ip : std_logic_vector(c_MAX_PROTOCOLS * 32 - 1 downto 0); - signal tc_src_udp : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); - signal tc_ip_proto : std_logic_vector(c_MAX_PROTOCOLS * 8 - 1 downto 0); - - type select_states is (IDLE, LOOP_OVER, SELECT_ONE, PROCESS_REQUEST, CLEANUP); - signal select_current_state, select_next_state : select_states; - attribute syn_encoding of select_current_state : signal is "onehot"; - - signal state : std_logic_vector(3 downto 0); - signal index : integer range 0 to c_MAX_PROTOCOLS - 1; - - signal mult : std_logic; - - signal tc_ident : std_logic_vector(c_MAX_PROTOCOLS * 16 - 1 downto 0); - signal zeros : std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - - attribute syn_preserve : boolean; - attribute syn_keep : boolean; - attribute syn_keep of state, mult : signal is true; - attribute syn_preserve of state, mult : signal is true; - - signal my_ip : std_logic_vector(31 downto 0); - signal select_state : std_logic_vector(3 downto 0); - - signal debug_arp : std_logic_vector(63 downto 0); - signal debug_dhcp : std_logic_vector(63 downto 0); - signal debug_ping : std_logic_vector(63 downto 0); - signal debug_sctrl : std_logic_vector(63 downto 0); - signal debug_forward : std_logic_vector(63 downto 0); - -begin - zeros <= (others => '0'); - MY_IP_OUT <= my_ip; - - -- Debug lines --- DEBUG_OUT(63 downto 16) <= (others => '0'); --- DEBUG_OUT(15 downto 12) <= state; -- selector state --- DEBUG_OUT(11 downto 0) <= debug_dhcp(11 downto 0); -- FSM states DHCP - DEBUG_OUT(63 downto 32) <= (others => '0'); - DEBUG_OUT(31 downto 0) <= debug_sctrl(31 downto 0); - - ARP_GEN: if( INCLUDE_ARP = '1' ) generate - -- protocol Nr. 1 ARP - THE_ARP: entity work.gbe_response_constructor_ARP - port map( - CLK => CLK, - RESET => RESET, - -- INTERFACE - MY_MAC_IN => MY_MAC_IN, - MY_IP_IN => my_ip, - PS_DATA_IN => PS_DATA_IN, - PS_WR_EN_IN => PS_WR_EN_IN, - PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(0), - PS_RESPONSE_READY_OUT => resp_ready(0), - PS_BUSY_OUT => busy(0), - PS_SELECTED_IN => selected(0), - PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, - PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, - PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, - PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, - PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, - PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, - TC_RD_EN_IN => TC_RD_EN_IN, - TC_DATA_OUT => tc_data(1 * 9 - 1 downto 0 * 9), - TC_FRAME_SIZE_OUT => tc_size(1 * 16 - 1 downto 0 * 16), - TC_FRAME_TYPE_OUT => tc_type(1 * 16 - 1 downto 0 * 16), - TC_IP_PROTOCOL_OUT => tc_ip_proto(1 * 8 - 1 downto 0 * 8), - TC_IDENT_OUT => tc_ident(1 * 16 - 1 downto 0 * 16), - TC_DEST_MAC_OUT => tc_mac(1 * 48 - 1 downto 0 * 48), - TC_DEST_IP_OUT => tc_ip(1 * 32 - 1 downto 0 * 32), - TC_DEST_UDP_OUT => tc_udp(1 * 16 - 1 downto 0 * 16), - TC_SRC_MAC_OUT => tc_src_mac(1 * 48 - 1 downto 0 * 48), - TC_SRC_IP_OUT => tc_src_ip(1 * 32 - 1 downto 0 * 32), - TC_SRC_UDP_OUT => tc_src_udp(1 * 16 - 1 downto 0 * 16), - DEBUG_OUT => debug_arp - -- END OF INTERFACE - ); - end generate ARP_GEN; - - NO_ARP_GEN: if( INCLUDE_ARP = '0' ) generate - resp_ready(0) <= '0'; - busy(0) <= '0'; - end generate NO_ARP_GEN; - - DHCP_GEN: if( INCLUDE_DHCP = '1' ) generate - -- protocol No. 2 DHCP - THE_DHCP: entity work.gbe_response_constructor_DHCP - port map( - CLK => CLK, - RESET => RESET, - -- INTERFACE - MY_MAC_IN => MY_MAC_IN, - MY_IP_IN => my_ip, - PS_DATA_IN => PS_DATA_IN, - PS_WR_EN_IN => PS_WR_EN_IN, - PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(1), - PS_RESPONSE_READY_OUT => resp_ready(1), - PS_BUSY_OUT => busy(1), - PS_SELECTED_IN => selected(1), - PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, - PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, - PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, - PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, - PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, - PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, - PS_FRAME_INFO_IN => PS_FRAME_INFO_IN, - TC_RD_EN_IN => TC_RD_EN_IN, - TC_DATA_OUT => tc_data(2 * 9 - 1 downto 1 * 9), - TC_FRAME_SIZE_OUT => tc_size(2 * 16 - 1 downto 1 * 16), - TC_FRAME_TYPE_OUT => tc_type(2 * 16 - 1 downto 1 * 16), - TC_IP_PROTOCOL_OUT => tc_ip_proto(2 * 8 - 1 downto 1 * 8), - TC_IDENT_OUT => tc_ident(2 * 16 - 1 downto 1 * 16), - TC_DEST_MAC_OUT => tc_mac(2 * 48 - 1 downto 1 * 48), - TC_DEST_IP_OUT => tc_ip(2 * 32 - 1 downto 1 * 32), - TC_DEST_UDP_OUT => tc_udp(2 * 16 - 1 downto 1 * 16), - TC_SRC_MAC_OUT => tc_src_mac(2 * 48 - 1 downto 1 * 48), - TC_SRC_IP_OUT => tc_src_ip(2 * 32 - 1 downto 1 * 32), - TC_SRC_UDP_OUT => tc_src_udp(2 * 16 - 1 downto 1 * 16), - -- END OF INTERFACE - MY_IP_OUT => my_ip, - DHCP_START_IN => DHCP_START_IN, - DHCP_DONE_OUT => DHCP_DONE_OUT, - DEBUG_OUT => debug_dhcp - ); - end generate DHCP_GEN; - - NO_DHCP_GEN: if( INCLUDE_DHCP = '0' ) generate - resp_ready(1) <= '0'; - busy(1) <= '0'; - end generate NO_DHCP_GEN; - - PING_GEN: if( INCLUDE_PING = '1' ) generate - --protocol No. 3 Ping - THE_PING: entity work.gbe_response_constructor_Ping - port map( - CLK => CLK, - RESET => RESET, - ---- INTERFACE - MY_MAC_IN => MY_MAC_IN, - MY_IP_IN => my_ip, - PS_DATA_IN => PS_DATA_IN, - PS_WR_EN_IN => PS_WR_EN_IN, - PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(4), - PS_RESPONSE_READY_OUT => resp_ready(4), - PS_BUSY_OUT => busy(4), - PS_SELECTED_IN => selected(4), - PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, - PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, - PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, - PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, - PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, - PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, - TC_RD_EN_IN => TC_RD_EN_IN, - TC_DATA_OUT => tc_data(5 * 9 - 1 downto 4 * 9), - TC_FRAME_SIZE_OUT => tc_size(5 * 16 - 1 downto 4 * 16), - TC_FRAME_TYPE_OUT => tc_type(5 * 16 - 1 downto 4 * 16), - TC_IP_PROTOCOL_OUT => tc_ip_proto(5 * 8 - 1 downto 4 * 8), - TC_IDENT_OUT => tc_ident(5 * 16 - 1 downto 4 * 16), - TC_DEST_MAC_OUT => tc_mac(5 * 48 - 1 downto 4 * 48), - TC_DEST_IP_OUT => tc_ip(5 * 32 - 1 downto 4 * 32), - TC_DEST_UDP_OUT => tc_udp(5 * 16 - 1 downto 4 * 16), - TC_SRC_MAC_OUT => tc_src_mac(5 * 48 - 1 downto 4 * 48), - TC_SRC_IP_OUT => tc_src_ip(5 * 32 - 1 downto 4 * 32), - TC_SRC_UDP_OUT => tc_src_udp(5 * 16 - 1 downto 4 * 16), - DEBUG_OUT => debug_ping - -- END OF INTERFACE - ); - end generate PING_GEN; - - NO_PING_GEN: if( INCLUDE_PING = '0' ) generate - resp_ready(4) <= '0'; - busy(4) <= '0'; - end generate NO_PING_GEN; - - SCTRL_GEN: if( INCLUDE_SLOWCTRL = '1' ) generate - THE_SCTRL: entity work.gbe_response_constructor_SCTRL - generic map( - SLOWCTRL_BUFFER_SIZE => SLOWCTRL_BUFFER_SIZE - ) - port map( - CLK => CLK, - RESET => RESET, - -- INTERFACE - MY_MAC_IN => MY_MAC_IN, - MY_IP_IN => my_ip, - PS_DATA_IN => PS_DATA_IN, - PS_WR_EN_IN => PS_WR_EN_IN, - PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(2), - PS_RESPONSE_READY_OUT => resp_ready(2), - PS_BUSY_OUT => busy(2), - PS_SELECTED_IN => selected(2), - PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, - PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, - PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, - PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, - PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, - PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, - TC_RD_EN_IN => TC_RD_EN_IN, - TC_DATA_OUT => tc_data(3 * 9 - 1 downto 2 * 9), - TC_FRAME_SIZE_OUT => tc_size(3 * 16 - 1 downto 2 * 16), - TC_FRAME_TYPE_OUT => tc_type(3 * 16 - 1 downto 2 * 16), - TC_IP_PROTOCOL_OUT => tc_ip_proto(3 * 8 - 1 downto 2 * 8), - TC_IDENT_OUT => tc_ident(3 * 16 - 1 downto 2 * 16), - TC_DEST_MAC_OUT => tc_mac(3 * 48 - 1 downto 2 * 48), - TC_DEST_IP_OUT => tc_ip(3 * 32 - 1 downto 2 * 32), - TC_DEST_UDP_OUT => tc_udp(3 * 16 - 1 downto 2 * 16), - TC_SRC_MAC_OUT => tc_src_mac(3 * 48 - 1 downto 2 * 48), - TC_SRC_IP_OUT => tc_src_ip(3 * 32 - 1 downto 2 * 32), - TC_SRC_UDP_OUT => tc_src_udp(3 * 16 - 1 downto 2 * 16), - DEBUG_OUT => debug_sctrl, - -- END OF INTERFACE - GSC_CLK_IN => GSC_CLK_IN, - GSC_INIT_DATAREADY_OUT => GSC_INIT_DATAREADY_OUT, - GSC_INIT_DATA_OUT => GSC_INIT_DATA_OUT, - GSC_INIT_PACKET_NUM_OUT => GSC_INIT_PACKET_NUM_OUT, - GSC_INIT_READ_IN => GSC_INIT_READ_IN, - GSC_REPLY_DATAREADY_IN => GSC_REPLY_DATAREADY_IN, - GSC_REPLY_DATA_IN => GSC_REPLY_DATA_IN, - GSC_REPLY_PACKET_NUM_IN => GSC_REPLY_PACKET_NUM_IN, - GSC_REPLY_READ_OUT => GSC_REPLY_READ_OUT, - GSC_BUSY_IN => GSC_BUSY_IN, - CFG_MAX_REPLY_SIZE_IN => CFG_MAX_REPLY_SIZE_IN, - MAKE_RESET_OUT => MAKE_RESET_OUT, - MONITOR_SELECT_REC_OUT => MONITOR_SELECT_REC_OUT(3 * 32 - 1 downto 2 * 32), - MONITOR_SELECT_REC_BYTES_OUT => MONITOR_SELECT_REC_BYTES_OUT(3 * 32 - 1 downto 2 * 32), - MONITOR_SELECT_SENT_BYTES_OUT => MONITOR_SELECT_SENT_BYTES_OUT(3 * 32 - 1 downto 2 * 32), - MONITOR_SELECT_SENT_OUT => MONITOR_SELECT_SENT_OUT(3 * 32 - 1 downto 2 * 32) - ); - end generate SCTRL_GEN; - - NO_SCTRL_GEN: if( INCLUDE_SLOWCTRL = '0' ) generate - resp_ready(2) <= '0'; - busy(2) <= '0'; - MAKE_RESET_OUT <= '0'; - - GSC_INIT_DATAREADY_OUT <= '0'; - GSC_INIT_DATA_OUT <= (others => '0'); - GSC_INIT_PACKET_NUM_OUT <= (others => '0'); - GSC_REPLY_READ_OUT <= '1'; - end generate NO_SCTRL_GEN; - - --------------------------------------------------------------------------------------- - -- once upon a time, this was "READOUT" - resp_ready(3) <= '0'; - busy(3) <= '0'; - --------------------------------------------------------------------------------------- - - FWD_GEN: if( INCLUDE_FWD = '1' ) generate - - THE_FORWARD: entity work.gbe_response_constructor_Forward - port map( - CLK => CLK, - RESET => RESET, - ---- INTERFACE - MY_MAC_IN => MY_MAC_IN, - MY_IP_IN => my_ip, - PS_DATA_IN => PS_DATA_IN, - PS_WR_EN_IN => PS_WR_EN_IN, - PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(5), - PS_RESPONSE_READY_OUT => resp_ready(5), - PS_BUSY_OUT => busy(5), - PS_SELECTED_IN => selected(5), - PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, - PS_DEST_MAC_ADDRESS_IN => PS_DEST_MAC_ADDRESS_IN, - PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, - PS_DEST_IP_ADDRESS_IN => PS_DEST_IP_ADDRESS_IN, - PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, - PS_DEST_UDP_PORT_IN => PS_DEST_UDP_PORT_IN, - TC_RD_EN_IN => TC_RD_EN_IN, - TC_DATA_OUT => tc_data(6 * 9 - 1 downto 5 * 9), - TC_FRAME_SIZE_OUT => tc_size(6 * 16 - 1 downto 5 * 16), - TC_FRAME_TYPE_OUT => tc_type(6 * 16 - 1 downto 5 * 16), - TC_IP_PROTOCOL_OUT => tc_ip_proto(6 * 8 - 1 downto 5 * 8), - TC_IDENT_OUT => tc_ident(6 * 16 - 1 downto 5 * 16), - TC_DEST_MAC_OUT => tc_mac(6 * 48 - 1 downto 5 * 48), - TC_DEST_IP_OUT => tc_ip(6 * 32 - 1 downto 5 * 32), - TC_DEST_UDP_OUT => tc_udp(6 * 16 - 1 downto 5 * 16), - TC_SRC_MAC_OUT => tc_src_mac(6 * 48 - 1 downto 5 * 48), - TC_SRC_IP_OUT => tc_src_ip(6 * 32 - 1 downto 5 * 32), - TC_SRC_UDP_OUT => tc_src_udp(6 * 16 - 1 downto 5 * 16), - RECEIVED_FRAMES_OUT => open, - SENT_FRAMES_OUT => open, - FWD_DST_MAC_IN => FWD_DST_MAC_IN, - FWD_DST_IP_IN => FWD_DST_IP_IN, - FWD_DST_UDP_IN => FWD_DST_UDP_IN, - FWD_DATA_IN => FWD_DATA_IN, - FWD_DATA_VALID_IN => FWD_DATA_VALID_IN, - FWD_SOP_IN => FWD_SOP_IN, - FWD_EOP_IN => FWD_EOP_IN, - FWD_READY_OUT => FWD_READY_OUT, - FWD_FULL_OUT => FWD_FULL_OUT, - DEBUG_OUT => debug_forward - -- END OF INTERFACE - ); - - end generate FWD_GEN; - - NO_FWD_GEN: if( INCLUDE_FWD = '0' ) generate - resp_ready(5) <= '0'; - busy(5) <= '0'; - end generate NO_FWD_GEN; - - PS_BUSY_OUT <= busy; - - PROC_SELECT_MACHINE: process( CLK, RESET ) - begin - if ( RESET = '1' ) then - select_current_state <= IDLE; - elsif( rising_edge(CLK) ) then - select_current_state <= select_next_state; - end if; - end process PROC_SELECT_MACHINE; - - PROC_SELECT_TRANSITIONS: process(select_current_state, MC_BUSY_IN, resp_ready, index, zeros, busy) - begin - select_state <= x"0"; - - case (select_current_state) is - when IDLE => - select_state <= x"1"; - if (MC_BUSY_IN = '0') then - select_next_state <= LOOP_OVER; - else - select_next_state <= IDLE; - end if; - - when LOOP_OVER => - select_state <= x"2"; - if (resp_ready /= zeros) then - if (resp_ready(index) = '1') then - select_next_state <= SELECT_ONE; - elsif (index = c_MAX_PROTOCOLS) then - select_next_state <= CLEANUP; - else - select_next_state <= LOOP_OVER; - end if; - else - select_next_state <= CLEANUP; - end if; - - when SELECT_ONE => - select_state <= x"3"; - if (MC_BUSY_IN = '1') then - select_next_state <= PROCESS_REQUEST; - else - select_next_state <= SELECT_ONE; - end if; - - when PROCESS_REQUEST => - select_state <= x"4"; - if (busy(index) = '0') then - select_next_state <= CLEANUP; - else - select_next_state <= PROCESS_REQUEST; - end if; - - when CLEANUP => - select_state <= x"5"; - select_next_state <= IDLE; - - when others => select_next_state <= IDLE; - - end case; - end process PROC_SELECT_TRANSITIONS; - - PROC_INDEX: process( CLK ) - begin - if( rising_edge(CLK) ) then - if ( select_current_state = IDLE ) then - index <= 0; - elsif( select_current_state = LOOP_OVER and resp_ready(index) = '0' ) then - index <= index + 1; - end if; - end if; - end process PROC_INDEX; - - PROC_SELECTOR: process( CLK ) - begin - if( rising_edge(CLK) ) then - if( select_current_state = SELECT_ONE or select_current_state = PROCESS_REQUEST ) then - TC_DATA_OUT <= tc_data((index + 1) * 9 - 1 downto index * 9); - TC_FRAME_SIZE_OUT <= tc_size((index + 1) * 16 - 1 downto index * 16); - TC_FRAME_TYPE_OUT <= tc_type((index + 1) * 16 - 1 downto index * 16); - TC_DEST_MAC_OUT <= tc_mac((index + 1) * 48 - 1 downto index * 48); - TC_DEST_IP_OUT <= tc_ip((index + 1) * 32 - 1 downto index * 32); - TC_DEST_UDP_OUT <= tc_udp((index + 1) * 16 - 1 downto index * 16); - TC_SRC_MAC_OUT <= tc_src_mac((index + 1) * 48 - 1 downto index * 48); - TC_SRC_IP_OUT <= tc_src_ip((index + 1) * 32 - 1 downto index * 32); - TC_SRC_UDP_OUT <= tc_src_udp((index + 1) * 16 - 1 downto index * 16); - TC_IP_PROTOCOL_OUT <= tc_ip_proto((index + 1) * 8 - 1 downto index * 8); - TC_IDENT_OUT <= tc_ident((index + 1) * 16 - 1 downto index * 16); - if( select_current_state = SELECT_ONE ) then - PS_RESPONSE_READY_OUT <= '1'; - selected(index) <= '0'; - else - PS_RESPONSE_READY_OUT <= '0'; - selected(index) <= '1'; - end if; - else - TC_DATA_OUT <= (others => '0'); - TC_FRAME_SIZE_OUT <= (others => '0'); - TC_FRAME_TYPE_OUT <= (others => '0'); - TC_DEST_MAC_OUT <= (others => '0'); - TC_DEST_IP_OUT <= (others => '0'); - TC_DEST_UDP_OUT <= (others => '0'); - TC_SRC_MAC_OUT <= (others => '0'); - TC_SRC_IP_OUT <= (others => '0'); - TC_SRC_UDP_OUT <= (others => '0'); - TC_IP_PROTOCOL_OUT <= (others => '0'); - TC_IDENT_OUT <= (others => '0'); - PS_RESPONSE_READY_OUT <= '0'; - selected <= (others => '0'); - end if; - end if; - end process PROC_SELECTOR; - -end gbe_protocol_selector_arch; + PS_FRAME_INFO_IN : in std_logic_vector(7 downto 0); + PS_RESPONSE_READY_OUT : out std_logic; + PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); + PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); + PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); + -- signals to/from transmit controller with constructed response + TC_DATA_OUT : out std_logic_vector(8 downto 0); + TC_RD_EN_IN : in std_logic; + TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); + TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); + TC_IDENT_OUT : out std_logic_vector(15 downto 0); + TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); + TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); + TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); + TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); + TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); + TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + MC_BUSY_IN : in std_logic; + -- misc signals for response constructors + MY_MAC_IN : in std_logic_vector(47 downto 0); + MY_IP_OUT : out std_logic_vector(31 downto 0); + DHCP_START_IN : in std_logic; + DHCP_DONE_OUT : out std_logic; + GSC_CLK_IN : in std_logic; + GSC_INIT_DATAREADY_OUT : out std_logic; + GSC_INIT_DATA_OUT : out std_logic_vector(15 downto 0); + GSC_INIT_PACKET_NUM_OUT : out std_logic_vector(2 downto 0); + GSC_INIT_READ_IN : in std_logic; + GSC_REPLY_DATAREADY_IN : in std_logic; + GSC_REPLY_DATA_IN : in std_logic_vector(15 downto 0); + GSC_REPLY_PACKET_NUM_IN : in std_logic_vector(2 downto 0); + GSC_REPLY_READ_OUT : out std_logic; + GSC_BUSY_IN : in std_logic; + CFG_MAX_REPLY_SIZE_IN : in std_logic_vector(31 downto 0); -- USED IN SCTRL + MAKE_RESET_OUT : out std_logic; + MY_TRBNET_ADDRESS_IN : in std_logic_vector(15 downto 0); + ISSUE_REBOOT_OUT : out std_logic; + -- Forwarder + FWD_DST_MAC_IN : in std_logic_vector(47 downto 0); + FWD_DST_IP_IN : in std_logic_vector(31 downto 0); + FWD_DST_UDP_IN : in std_logic_vector(15 downto 0); + FWD_DATA_IN : in std_logic_vector(7 downto 0); + FWD_DATA_VALID_IN : in std_logic; + FWD_SOP_IN : in std_logic; + FWD_EOP_IN : in std_logic; + FWD_READY_OUT : out std_logic; + FWD_FULL_OUT : out std_logic; + -- input for statistics from outside + MONITOR_SELECT_REC_OUT : out std_logic_vector(8 * 32 - 1 downto 0); + MONITOR_SELECT_REC_BYTES_OUT : out std_logic_vector(8 * 32 - 1 downto 0); + MONITOR_SELECT_SENT_BYTES_OUT : out std_logic_vector(8 * 32 - 1 downto 0); + MONITOR_SELECT_SENT_OUT : out std_logic_vector(8 * 32 - 1 downto 0); + DEBUG_OUT : out std_logic_vector(63 downto 0) + ); +end gbe_protocol_selector; + +architecture gbe_protocol_selector_arch of gbe_protocol_selector is + + attribute syn_encoding : string; + + signal rd_en : std_logic_vector(8 - 1 downto 0); + signal resp_ready : std_logic_vector(8 - 1 downto 0); + signal tc_wr : std_logic_vector(8 - 1 downto 0); + signal tc_data : std_logic_vector(8 * 9 - 1 downto 0); + signal tc_size : std_logic_vector(8 * 16 - 1 downto 0); + signal tc_type : std_logic_vector(8 * 16 - 1 downto 0); + signal busy : std_logic_vector(8 - 1 downto 0); + signal selected : std_logic_vector(8 - 1 downto 0); + signal tc_mac : std_logic_vector(8 * 48 - 1 downto 0); + signal tc_ip : std_logic_vector(8 * 32 - 1 downto 0); + signal tc_udp : std_logic_vector(8 * 16 - 1 downto 0); + signal tc_src_mac : std_logic_vector(8 * 48 - 1 downto 0); + signal tc_src_ip : std_logic_vector(8 * 32 - 1 downto 0); + signal tc_src_udp : std_logic_vector(8 * 16 - 1 downto 0); + signal tc_ip_proto : std_logic_vector(8 * 8 - 1 downto 0); + + type select_states is (IDLE, LOOP_OVER, SELECT_ONE, PROCESS_REQUEST, CLEANUP); + signal select_current_state, select_next_state : select_states; + attribute syn_encoding of select_current_state : signal is "onehot"; + + signal state : std_logic_vector(3 downto 0); + signal index : integer range 0 to 7; + + signal mult : std_logic; + + signal tc_ident : std_logic_vector(8 * 16 - 1 downto 0); + signal zeros : std_logic_vector(8 - 1 downto 0); + + attribute syn_preserve : boolean; + attribute syn_keep : boolean; + attribute syn_keep of state, mult : signal is true; + attribute syn_preserve of state, mult : signal is true; + + signal my_ip : std_logic_vector(31 downto 0); + signal select_state : std_logic_vector(3 downto 0); + + signal debug_arp : std_logic_vector(63 downto 0); + signal debug_dhcp : std_logic_vector(63 downto 0); + signal debug_ping : std_logic_vector(63 downto 0); + signal debug_sctrl : std_logic_vector(63 downto 0); + signal debug_forward : std_logic_vector(63 downto 0); + signal debug_discovery : std_logic_vector(63 downto 0); + +begin + zeros <= (others => '0'); + MY_IP_OUT <= my_ip; + + -- Debug lines +-- DEBUG_OUT(63 downto 16) <= (others => '0'); +-- DEBUG_OUT(15 downto 12) <= state; -- selector state +-- DEBUG_OUT(11 downto 0) <= debug_dhcp(11 downto 0); -- FSM states DHCP + DEBUG_OUT(63 downto 32) <= (others => '0'); + DEBUG_OUT(31 downto 0) <= debug_discovery(31 downto 0); + + --------------------------------------------------------------------------------------- + ARP_GEN: if( INCLUDE_ARP = '1' ) generate + -- + THE_ARP: entity work.gbe_response_constructor_ARP + port map( + CLK => CLK, + RESET => RESET, + -- INTERFACE + MY_MAC_IN => MY_MAC_IN, + MY_IP_IN => my_ip, + PS_DATA_IN => PS_DATA_IN, + PS_WR_EN_IN => PS_WR_EN_IN, + PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(0), + PS_RESPONSE_READY_OUT => resp_ready(0), + PS_BUSY_OUT => busy(0), + PS_SELECTED_IN => selected(0), + PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, + PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, + PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, + TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => tc_data(1 * 9 - 1 downto 0 * 9), + TC_FRAME_SIZE_OUT => tc_size(1 * 16 - 1 downto 0 * 16), + TC_FRAME_TYPE_OUT => tc_type(1 * 16 - 1 downto 0 * 16), + TC_IP_PROTOCOL_OUT => tc_ip_proto(1 * 8 - 1 downto 0 * 8), + TC_IDENT_OUT => tc_ident(1 * 16 - 1 downto 0 * 16), + TC_DEST_MAC_OUT => tc_mac(1 * 48 - 1 downto 0 * 48), + TC_DEST_IP_OUT => tc_ip(1 * 32 - 1 downto 0 * 32), + TC_DEST_UDP_OUT => tc_udp(1 * 16 - 1 downto 0 * 16), + TC_SRC_MAC_OUT => tc_src_mac(1 * 48 - 1 downto 0 * 48), + TC_SRC_IP_OUT => tc_src_ip(1 * 32 - 1 downto 0 * 32), + TC_SRC_UDP_OUT => tc_src_udp(1 * 16 - 1 downto 0 * 16), + DEBUG_OUT => debug_arp + -- END OF INTERFACE + ); + end generate ARP_GEN; + + NO_ARP_GEN: if( INCLUDE_ARP = '0' ) generate + resp_ready(0) <= '0'; + busy(0) <= '0'; + end generate NO_ARP_GEN; + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + DHCP_GEN: if( INCLUDE_DHCP = '1' ) generate + -- + THE_DHCP: entity work.gbe_response_constructor_DHCP + port map( + CLK => CLK, + RESET => RESET, + -- INTERFACE + MY_MAC_IN => MY_MAC_IN, + MY_IP_IN => my_ip, + PS_DATA_IN => PS_DATA_IN, + PS_WR_EN_IN => PS_WR_EN_IN, + PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(1), + PS_RESPONSE_READY_OUT => resp_ready(1), + PS_BUSY_OUT => busy(1), + PS_SELECTED_IN => selected(1), + PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, + PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, + PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, + PS_FRAME_INFO_IN => PS_FRAME_INFO_IN, + TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => tc_data(2 * 9 - 1 downto 1 * 9), + TC_FRAME_SIZE_OUT => tc_size(2 * 16 - 1 downto 1 * 16), + TC_FRAME_TYPE_OUT => tc_type(2 * 16 - 1 downto 1 * 16), + TC_IP_PROTOCOL_OUT => tc_ip_proto(2 * 8 - 1 downto 1 * 8), + TC_IDENT_OUT => tc_ident(2 * 16 - 1 downto 1 * 16), + TC_DEST_MAC_OUT => tc_mac(2 * 48 - 1 downto 1 * 48), + TC_DEST_IP_OUT => tc_ip(2 * 32 - 1 downto 1 * 32), + TC_DEST_UDP_OUT => tc_udp(2 * 16 - 1 downto 1 * 16), + TC_SRC_MAC_OUT => tc_src_mac(2 * 48 - 1 downto 1 * 48), + TC_SRC_IP_OUT => tc_src_ip(2 * 32 - 1 downto 1 * 32), + TC_SRC_UDP_OUT => tc_src_udp(2 * 16 - 1 downto 1 * 16), + -- END OF INTERFACE + MY_IP_OUT => my_ip, + DHCP_START_IN => DHCP_START_IN, + DHCP_DONE_OUT => DHCP_DONE_OUT, + DEBUG_OUT => debug_dhcp + ); + end generate DHCP_GEN; + + NO_DHCP_GEN: if( INCLUDE_DHCP = '0' ) generate + resp_ready(1) <= '0'; + busy(1) <= '0'; + end generate NO_DHCP_GEN; + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + SCTRL_GEN: if( INCLUDE_SLOWCTRL = '1' ) generate + -- + THE_SCTRL: entity work.gbe_response_constructor_SCTRL + generic map( + SLOWCTRL_BUFFER_SIZE => SLOWCTRL_BUFFER_SIZE + ) + port map( + CLK => CLK, + RESET => RESET, + -- INTERFACE + MY_MAC_IN => MY_MAC_IN, + MY_IP_IN => my_ip, + PS_DATA_IN => PS_DATA_IN, + PS_WR_EN_IN => PS_WR_EN_IN, + PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(2), + PS_RESPONSE_READY_OUT => resp_ready(2), + PS_BUSY_OUT => busy(2), + PS_SELECTED_IN => selected(2), + PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, + PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, + PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, + TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => tc_data(3 * 9 - 1 downto 2 * 9), + TC_FRAME_SIZE_OUT => tc_size(3 * 16 - 1 downto 2 * 16), + TC_FRAME_TYPE_OUT => tc_type(3 * 16 - 1 downto 2 * 16), + TC_IP_PROTOCOL_OUT => tc_ip_proto(3 * 8 - 1 downto 2 * 8), + TC_IDENT_OUT => tc_ident(3 * 16 - 1 downto 2 * 16), + TC_DEST_MAC_OUT => tc_mac(3 * 48 - 1 downto 2 * 48), + TC_DEST_IP_OUT => tc_ip(3 * 32 - 1 downto 2 * 32), + TC_DEST_UDP_OUT => tc_udp(3 * 16 - 1 downto 2 * 16), + TC_SRC_MAC_OUT => tc_src_mac(3 * 48 - 1 downto 2 * 48), + TC_SRC_IP_OUT => tc_src_ip(3 * 32 - 1 downto 2 * 32), + TC_SRC_UDP_OUT => tc_src_udp(3 * 16 - 1 downto 2 * 16), + DEBUG_OUT => debug_sctrl, + -- END OF INTERFACE + GSC_CLK_IN => GSC_CLK_IN, + GSC_INIT_DATAREADY_OUT => GSC_INIT_DATAREADY_OUT, + GSC_INIT_DATA_OUT => GSC_INIT_DATA_OUT, + GSC_INIT_PACKET_NUM_OUT => GSC_INIT_PACKET_NUM_OUT, + GSC_INIT_READ_IN => GSC_INIT_READ_IN, + GSC_REPLY_DATAREADY_IN => GSC_REPLY_DATAREADY_IN, + GSC_REPLY_DATA_IN => GSC_REPLY_DATA_IN, + GSC_REPLY_PACKET_NUM_IN => GSC_REPLY_PACKET_NUM_IN, + GSC_REPLY_READ_OUT => GSC_REPLY_READ_OUT, + GSC_BUSY_IN => GSC_BUSY_IN, + CFG_MAX_REPLY_SIZE_IN => CFG_MAX_REPLY_SIZE_IN, + MAKE_RESET_OUT => MAKE_RESET_OUT, + MONITOR_SELECT_REC_OUT => MONITOR_SELECT_REC_OUT(3 * 32 - 1 downto 2 * 32), + MONITOR_SELECT_REC_BYTES_OUT => MONITOR_SELECT_REC_BYTES_OUT(3 * 32 - 1 downto 2 * 32), + MONITOR_SELECT_SENT_BYTES_OUT => MONITOR_SELECT_SENT_BYTES_OUT(3 * 32 - 1 downto 2 * 32), + MONITOR_SELECT_SENT_OUT => MONITOR_SELECT_SENT_OUT(3 * 32 - 1 downto 2 * 32) + ); + end generate SCTRL_GEN; + + NO_SCTRL_GEN: if( INCLUDE_SLOWCTRL = '0' ) generate + resp_ready(2) <= '0'; + busy(2) <= '0'; + MAKE_RESET_OUT <= '0'; + + GSC_INIT_DATAREADY_OUT <= '0'; + GSC_INIT_DATA_OUT <= (others => '0'); + GSC_INIT_PACKET_NUM_OUT <= (others => '0'); + GSC_REPLY_READ_OUT <= '1'; + end generate NO_SCTRL_GEN; + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + -- once upon a time, this was "READOUT" + resp_ready(3) <= '0'; + busy(3) <= '0'; + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + PING_GEN: if( INCLUDE_PING = '1' ) generate + -- + THE_PING: entity work.gbe_response_constructor_Ping + port map( + CLK => CLK, + RESET => RESET, + ---- INTERFACE + MY_MAC_IN => MY_MAC_IN, + MY_IP_IN => my_ip, + PS_DATA_IN => PS_DATA_IN, + PS_WR_EN_IN => PS_WR_EN_IN, + PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(4), + PS_RESPONSE_READY_OUT => resp_ready(4), + PS_BUSY_OUT => busy(4), + PS_SELECTED_IN => selected(4), + PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, + PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, + PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, + TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => tc_data(5 * 9 - 1 downto 4 * 9), + TC_FRAME_SIZE_OUT => tc_size(5 * 16 - 1 downto 4 * 16), + TC_FRAME_TYPE_OUT => tc_type(5 * 16 - 1 downto 4 * 16), + TC_IP_PROTOCOL_OUT => tc_ip_proto(5 * 8 - 1 downto 4 * 8), + TC_IDENT_OUT => tc_ident(5 * 16 - 1 downto 4 * 16), + TC_DEST_MAC_OUT => tc_mac(5 * 48 - 1 downto 4 * 48), + TC_DEST_IP_OUT => tc_ip(5 * 32 - 1 downto 4 * 32), + TC_DEST_UDP_OUT => tc_udp(5 * 16 - 1 downto 4 * 16), + TC_SRC_MAC_OUT => tc_src_mac(5 * 48 - 1 downto 4 * 48), + TC_SRC_IP_OUT => tc_src_ip(5 * 32 - 1 downto 4 * 32), + TC_SRC_UDP_OUT => tc_src_udp(5 * 16 - 1 downto 4 * 16), + DEBUG_OUT => debug_ping + -- END OF INTERFACE + ); + end generate PING_GEN; + + NO_PING_GEN: if( INCLUDE_PING = '0' ) generate + resp_ready(4) <= '0'; + busy(4) <= '0'; + end generate NO_PING_GEN; + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + FWD_GEN: if( INCLUDE_FWD = '1' ) generate + -- + THE_FORWARD: entity work.gbe_response_constructor_Forward + port map( + CLK => CLK, + RESET => RESET, + ---- INTERFACE + MY_MAC_IN => MY_MAC_IN, + MY_IP_IN => my_ip, + PS_DATA_IN => PS_DATA_IN, + PS_WR_EN_IN => PS_WR_EN_IN, + PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(5), + PS_RESPONSE_READY_OUT => resp_ready(5), + PS_BUSY_OUT => busy(5), + PS_SELECTED_IN => selected(5), + PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, + PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, + PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, + TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => tc_data(6 * 9 - 1 downto 5 * 9), + TC_FRAME_SIZE_OUT => tc_size(6 * 16 - 1 downto 5 * 16), + TC_FRAME_TYPE_OUT => tc_type(6 * 16 - 1 downto 5 * 16), + TC_IP_PROTOCOL_OUT => tc_ip_proto(6 * 8 - 1 downto 5 * 8), + TC_IDENT_OUT => tc_ident(6 * 16 - 1 downto 5 * 16), + TC_DEST_MAC_OUT => tc_mac(6 * 48 - 1 downto 5 * 48), + TC_DEST_IP_OUT => tc_ip(6 * 32 - 1 downto 5 * 32), + TC_DEST_UDP_OUT => tc_udp(6 * 16 - 1 downto 5 * 16), + TC_SRC_MAC_OUT => tc_src_mac(6 * 48 - 1 downto 5 * 48), + TC_SRC_IP_OUT => tc_src_ip(6 * 32 - 1 downto 5 * 32), + TC_SRC_UDP_OUT => tc_src_udp(6 * 16 - 1 downto 5 * 16), + RECEIVED_FRAMES_OUT => open, + SENT_FRAMES_OUT => open, + FWD_DST_MAC_IN => FWD_DST_MAC_IN, + FWD_DST_IP_IN => FWD_DST_IP_IN, + FWD_DST_UDP_IN => FWD_DST_UDP_IN, + FWD_DATA_IN => FWD_DATA_IN, + FWD_DATA_VALID_IN => FWD_DATA_VALID_IN, + FWD_SOP_IN => FWD_SOP_IN, + FWD_EOP_IN => FWD_EOP_IN, + FWD_READY_OUT => FWD_READY_OUT, + FWD_FULL_OUT => FWD_FULL_OUT, + DEBUG_OUT => debug_forward + -- END OF INTERFACE + ); + end generate FWD_GEN; + + NO_FWD_GEN: if( INCLUDE_FWD = '0' ) generate + resp_ready(5) <= '0'; + busy(5) <= '0'; + end generate NO_FWD_GEN; + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + DISCOVERY_GEN: if( INCLUDE_DISCOVERY = '1' ) generate + -- + THE_DISCOVERY: entity gbe_response_constructor_Discovery + port map( + CLK => CLK, + RESET => RESET, + MY_MAC_IN => MY_MAC_IN, + MY_IP_IN => my_ip, + PS_DATA_IN => PS_DATA_IN, + PS_WR_EN_IN => PS_WR_EN_IN, + PS_ACTIVATE_IN => PS_PROTO_SELECT_IN(6), + PS_RESPONSE_READY_OUT => resp_ready(6), + PS_BUSY_OUT => busy(6), + PS_SELECTED_IN => selected(6), + PS_SRC_MAC_ADDRESS_IN => PS_SRC_MAC_ADDRESS_IN, + PS_SRC_IP_ADDRESS_IN => PS_SRC_IP_ADDRESS_IN, + PS_SRC_UDP_PORT_IN => PS_SRC_UDP_PORT_IN, + PS_FRAME_INFO_IN => PS_FRAME_INFO_IN, + TC_RD_EN_IN => TC_RD_EN_IN, + TC_DATA_OUT => tc_data(7 * 9 - 1 downto 6 * 9), + TC_FRAME_SIZE_OUT => tc_size(7 * 16 - 1 downto 6 * 16), + TC_FRAME_TYPE_OUT => tc_type(7 * 16 - 1 downto 6 * 16), + TC_IP_PROTOCOL_OUT => tc_ip_proto(7 * 8 - 1 downto 6 * 8), + TC_IDENT_OUT => tc_ident(7 * 16 - 1 downto 6 * 16), + TC_DEST_MAC_OUT => tc_mac(7 * 48 - 1 downto 6 * 48), + TC_DEST_IP_OUT => tc_ip(7 * 32 - 1 downto 6 * 32), + TC_DEST_UDP_OUT => tc_udp(7 * 16 - 1 downto 6 * 16), + TC_SRC_MAC_OUT => tc_src_mac(7 * 48 - 1 downto 6 * 48), + TC_SRC_IP_OUT => tc_src_ip(7 * 32 - 1 downto 6 * 32), + TC_SRC_UDP_OUT => tc_src_udp(7 * 16 - 1 downto 6 * 16), + DEBUG_OUT => debug_discovery + ); + end generate DISCOVERY_GEN; + + NO_DISCOVERY_GEN: if( INCLUDE_DISCOVERY = '0' ) generate + resp_ready(6) <= '0'; + busy(6) <= '0'; + end generate NO_DISCOVERY_GEN; + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + -- reserved + resp_ready(7) <= '0'; + busy(7) <= '0'; + --------------------------------------------------------------------------------------- + + PS_BUSY_OUT <= busy; + + PROC_SELECT_MACHINE: process( CLK, RESET ) + begin + if ( RESET = '1' ) then + select_current_state <= IDLE; + elsif( rising_edge(CLK) ) then + select_current_state <= select_next_state; + end if; + end process PROC_SELECT_MACHINE; + + PROC_SELECT_TRANSITIONS: process(select_current_state, MC_BUSY_IN, resp_ready, index, zeros, busy) + begin + select_state <= x"0"; + + case (select_current_state) is + when IDLE => + select_state <= x"1"; + if (MC_BUSY_IN = '0') then + select_next_state <= LOOP_OVER; + else + select_next_state <= IDLE; + end if; + + when LOOP_OVER => + select_state <= x"2"; + if (resp_ready /= zeros) then + if (resp_ready(index) = '1') then + select_next_state <= SELECT_ONE; + elsif (index = 8) then + select_next_state <= CLEANUP; + else + select_next_state <= LOOP_OVER; + end if; + else + select_next_state <= CLEANUP; + end if; + + when SELECT_ONE => + select_state <= x"3"; + if (MC_BUSY_IN = '1') then + select_next_state <= PROCESS_REQUEST; + else + select_next_state <= SELECT_ONE; + end if; + + when PROCESS_REQUEST => + select_state <= x"4"; + if (busy(index) = '0') then + select_next_state <= CLEANUP; + else + select_next_state <= PROCESS_REQUEST; + end if; + + when CLEANUP => + select_state <= x"5"; + select_next_state <= IDLE; + + when others => select_next_state <= IDLE; + + end case; + end process PROC_SELECT_TRANSITIONS; + + PROC_INDEX: process( CLK ) + begin + if( rising_edge(CLK) ) then + if ( select_current_state = IDLE ) then + index <= 0; + elsif( select_current_state = LOOP_OVER and resp_ready(index) = '0' ) then + index <= index + 1; + end if; + end if; + end process PROC_INDEX; + + PROC_SELECTOR: process( CLK ) + begin + if( rising_edge(CLK) ) then + if( select_current_state = SELECT_ONE or select_current_state = PROCESS_REQUEST ) then + TC_DATA_OUT <= tc_data((index + 1) * 9 - 1 downto index * 9); + TC_FRAME_SIZE_OUT <= tc_size((index + 1) * 16 - 1 downto index * 16); + TC_FRAME_TYPE_OUT <= tc_type((index + 1) * 16 - 1 downto index * 16); + TC_DEST_MAC_OUT <= tc_mac((index + 1) * 48 - 1 downto index * 48); + TC_DEST_IP_OUT <= tc_ip((index + 1) * 32 - 1 downto index * 32); + TC_DEST_UDP_OUT <= tc_udp((index + 1) * 16 - 1 downto index * 16); + TC_SRC_MAC_OUT <= tc_src_mac((index + 1) * 48 - 1 downto index * 48); + TC_SRC_IP_OUT <= tc_src_ip((index + 1) * 32 - 1 downto index * 32); + TC_SRC_UDP_OUT <= tc_src_udp((index + 1) * 16 - 1 downto index * 16); + TC_IP_PROTOCOL_OUT <= tc_ip_proto((index + 1) * 8 - 1 downto index * 8); + TC_IDENT_OUT <= tc_ident((index + 1) * 16 - 1 downto index * 16); + if( select_current_state = SELECT_ONE ) then + PS_RESPONSE_READY_OUT <= '1'; + selected(index) <= '0'; + else + PS_RESPONSE_READY_OUT <= '0'; + selected(index) <= '1'; + end if; + else + TC_DATA_OUT <= (others => '0'); + TC_FRAME_SIZE_OUT <= (others => '0'); + TC_FRAME_TYPE_OUT <= (others => '0'); + TC_DEST_MAC_OUT <= (others => '0'); + TC_DEST_IP_OUT <= (others => '0'); + TC_DEST_UDP_OUT <= (others => '0'); + TC_SRC_MAC_OUT <= (others => '0'); + TC_SRC_IP_OUT <= (others => '0'); + TC_SRC_UDP_OUT <= (others => '0'); + TC_IP_PROTOCOL_OUT <= (others => '0'); + TC_IDENT_OUT <= (others => '0'); + PS_RESPONSE_READY_OUT <= '0'; + selected <= (others => '0'); + end if; + end if; + end process PROC_SELECTOR; + +end gbe_protocol_selector_arch; diff --git a/gbe_trb/base/gbe_protocols.vhd b/gbe_trb/base/gbe_protocols.vhd index f515102..d976149 100644 --- a/gbe_trb/base/gbe_protocols.vhd +++ b/gbe_trb/base/gbe_protocols.vhd @@ -3,6 +3,8 @@ use ieee.std_logic_1164.all; USE IEEE.numeric_std.ALL; USE IEEE.std_logic_UNSIGNED.ALL; +-- OBSELETE + package gbe_protocols is type hist_array is array (31 downto 0) of std_logic_vector(31 downto 0); @@ -21,9 +23,9 @@ package gbe_protocols is -- UDP, ICMP -- this are the destination ports of the incoming packet - constant c_MAX_UDP_PROTOCOLS : integer range 1 to 16 := 4; + constant c_MAX_UDP_PROTOCOLS : integer range 1 to 16 := 3; type udp_protos_a is array (c_MAX_UDP_PROTOCOLS - 1 downto 0) of std_logic_vector(15 downto 0); - constant UDP_PROTOCOLS : udp_protos_a := (x"0044", x"6590", x"7530", x"7531"); - -- DHCP client, SCTRL, STATs + constant UDP_PROTOCOLS : udp_protos_a := (x"0044", x"6590", x"d903"); + -- DHCP client, SCTRL, Discovery end package; diff --git a/gbe_trb/base/gbe_receive_control.vhd b/gbe_trb/base/gbe_receive_control.vhd index 04b86a5..5fbb6fd 100644 --- a/gbe_trb/base/gbe_receive_control.vhd +++ b/gbe_trb/base/gbe_receive_control.vhd @@ -20,28 +20,22 @@ entity gbe_receive_control is FR_FRAME_VALID_IN : in std_logic; FR_GET_FRAME_OUT : out std_logic; FR_FRAME_SIZE_IN : in std_logic_vector(15 downto 0); - FR_PS_IN : in std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); - FR_INFO_IN : in std_logic_vector(7 downto 0); + FR_PS_IN : in std_logic_vector(7 downto 0); + FR_FRAME_INFO_IN : in std_logic_vector(7 downto 0); FR_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - FR_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); FR_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - FR_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); FR_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - FR_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); -- signals to/from main controller RC_RD_EN_IN : in std_logic; RC_Q_OUT : out std_logic_vector(8 downto 0); RC_FRAME_WAITING_OUT : out std_logic; RC_LOADING_DONE_IN : in std_logic; RC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); - RC_FRAME_PROTO_OUT : out std_logic_vector(c_MAX_PROTOCOLS - 1 downto 0); + RC_FRAME_PROTO_OUT : out std_logic_vector(7 downto 0); RC_SRC_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); - RC_DEST_MAC_ADDRESS_OUT : out std_logic_vector(47 downto 0); RC_SRC_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); - RC_DEST_IP_ADDRESS_OUT : out std_logic_vector(31 downto 0); RC_SRC_UDP_PORT_OUT : out std_logic_vector(15 downto 0); - RC_DEST_UDP_PORT_OUT : out std_logic_vector(15 downto 0); - RC_INFO_OUT : out std_logic_vector(7 downto 0); + RC_FRAME_INFO_OUT : out std_logic_vector(7 downto 0); -- statistics FRAMES_RECEIVED_OUT : out std_logic_vector(31 downto 0); BYTES_RECEIVED_OUT : out std_logic_vector(31 downto 0); @@ -73,12 +67,9 @@ begin RC_Q_OUT <= RC_DATA_IN; RC_FRAME_SIZE_OUT <= FR_FRAME_SIZE_IN; RC_SRC_MAC_ADDRESS_OUT <= FR_SRC_MAC_ADDRESS_IN; - RC_DEST_MAC_ADDRESS_OUT <= FR_DEST_MAC_ADDRESS_IN; RC_SRC_IP_ADDRESS_OUT <= FR_SRC_IP_ADDRESS_IN; - RC_DEST_IP_ADDRESS_OUT <= FR_DEST_IP_ADDRESS_IN; RC_SRC_UDP_PORT_OUT <= FR_SRC_UDP_PORT_IN; - RC_DEST_UDP_PORT_OUT <= FR_DEST_UDP_PORT_IN; - RC_INFO_OUT <= FR_INFO_IN; + RC_FRAME_INFO_OUT <= FR_FRAME_INFO_IN; RC_FRAME_PROTO_OUT <= FR_PS_IN when (load_current_state /= IDLE) else (others => '0'); LOAD_MACHINE_PROC: process( CLK, RESET ) diff --git a/gbe_trb/base/gbe_wrapper_fifo.vhd b/gbe_trb/base/gbe_wrapper_fifo.vhd index 569a6ed..ae56c10 100644 --- a/gbe_trb/base/gbe_wrapper_fifo.vhd +++ b/gbe_trb/base/gbe_wrapper_fifo.vhd @@ -11,7 +11,8 @@ entity gbe_wrapper_fifo is LINK_HAS_ARP : std_logic := '1'; LINK_HAS_DHCP : std_logic := '1'; LINK_HAS_SLOWCTRL : std_logic := '1'; - LINK_HAS_FWD : std_logic := '1' + LINK_HAS_FWD : std_logic := '1'; + LINK_HAS_DISCOVERY : std_logic := '1' ); port( CLK_125_IN : in std_logic; @@ -154,6 +155,7 @@ begin INCLUDE_ARP => LINK_HAS_ARP, INCLUDE_PING => LINK_HAS_PING, INCLUDE_FWD => LINK_HAS_FWD, + INCLUDE_DISCOVERY => LINK_HAS_DISCOVERY, SLOWCTRL_BUFFER_SIZE => 2 ) port map( diff --git a/gbe_trb/protocols/gbe_response_constructor_ARP.vhd b/gbe_trb/protocols/gbe_response_constructor_ARP.vhd index 6372d4e..d30abef 100644 --- a/gbe_trb/protocols/gbe_response_constructor_ARP.vhd +++ b/gbe_trb/protocols/gbe_response_constructor_ARP.vhd @@ -1,267 +1,264 @@ -library ieee; - use ieee.std_logic_1164.all; - use ieee.numeric_std.all; - -library work; - use work.gbe_protocols.all; - --- BUG: doesnt use FRAME_SIZE, but fixed length. - --- BUG: check (length == 28) for correct request. - --- BUG: check request type at all. - -entity gbe_response_constructor_ARP is - port ( - CLK : in std_logic; -- system clock - RESET : in std_logic; - MY_MAC_IN : in std_logic_vector(47 downto 0); - MY_IP_IN : in std_logic_vector(31 downto 0); - PS_DATA_IN : in std_logic_vector(8 downto 0); - PS_WR_EN_IN : in std_logic; - PS_ACTIVATE_IN : in std_logic; - PS_RESPONSE_READY_OUT : out std_logic; - PS_BUSY_OUT : out std_logic; - PS_SELECTED_IN : in std_logic; - PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); - TC_RD_EN_IN : in std_logic; - TC_DATA_OUT : out std_logic_vector(8 downto 0); - TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); - TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); - TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); - TC_IDENT_OUT : out std_logic_vector(15 downto 0); - TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); - TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); - TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); - TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); - TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); - TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); - DEBUG_OUT : out std_logic_vector(63 downto 0) - ); -end gbe_response_constructor_ARP; - -architecture gbe_response_constructor_ARP_arch of gbe_response_constructor_ARP is - - attribute syn_encoding: string; - - type DISSECT_STATES is (IDLE, READ_FRAME, DELAY, DECIDE, LOAD_FRAME, WAIT_FOR_LOAD, CLEANUP); - signal DISSECT_CS, DISSECT_NS : DISSECT_STATES; - attribute syn_encoding of DISSECT_CS: signal is "onehot"; - - type stats_states is (IDLE, LOAD_SENT, LOAD_RECEIVED, CLEANUP); - signal stats_current_state, stats_next_state : stats_states; - attribute syn_encoding of stats_current_state : signal is "onehot"; - - signal saved_opcode : std_logic_vector(15 downto 0); - signal saved_sender_ip : std_logic_vector(31 downto 0); - signal saved_target_ip : std_logic_vector(31 downto 0); - signal tc_data : std_logic_vector(8 downto 0); +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +library work; + use work.gbe_protocols.all; + +-- BUG: doesnt use FRAME_SIZE, but fixed length. + +-- BUG: check (length == 28) for correct request. + +-- BUG: check request type at all. + +entity gbe_response_constructor_ARP is + port ( + CLK : in std_logic; -- system clock + RESET : in std_logic; + MY_MAC_IN : in std_logic_vector(47 downto 0); + MY_IP_IN : in std_logic_vector(31 downto 0); + PS_DATA_IN : in std_logic_vector(8 downto 0); + PS_WR_EN_IN : in std_logic; + PS_ACTIVATE_IN : in std_logic; + PS_RESPONSE_READY_OUT : out std_logic; + PS_BUSY_OUT : out std_logic; + PS_SELECTED_IN : in std_logic; + PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); + PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); + PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); + TC_RD_EN_IN : in std_logic; + TC_DATA_OUT : out std_logic_vector(8 downto 0); + TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); + TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); + TC_IDENT_OUT : out std_logic_vector(15 downto 0); + TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); + TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); + TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); + TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); + TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); + TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + DEBUG_OUT : out std_logic_vector(63 downto 0) + ); +end gbe_response_constructor_ARP; + +architecture gbe_response_constructor_ARP_arch of gbe_response_constructor_ARP is + + attribute syn_encoding: string; + + type DISSECT_STATES is (IDLE, READ_FRAME, DELAY, DECIDE, LOAD_FRAME, WAIT_FOR_LOAD, CLEANUP); + signal DISSECT_CS, DISSECT_NS : DISSECT_STATES; + attribute syn_encoding of DISSECT_CS: signal is "onehot"; + + type stats_states is (IDLE, LOAD_SENT, LOAD_RECEIVED, CLEANUP); + signal stats_current_state, stats_next_state : stats_states; + attribute syn_encoding of stats_current_state : signal is "onehot"; + + signal saved_opcode : std_logic_vector(15 downto 0); -- NOT USED + signal saved_sender_ip : std_logic_vector(31 downto 0); + signal saved_target_ip : std_logic_vector(31 downto 0); + signal tc_data : std_logic_vector(8 downto 0); signal dissect_ctr : unsigned(7 downto 0); - - signal state : std_logic_vector(3 downto 0); - - attribute syn_preserve : boolean; - attribute syn_keep : boolean; - attribute syn_keep of state : signal is true; - attribute syn_preserve of state : signal is true; - -begin - - PROC_DISSECT_FSM: process( CLK, RESET ) - begin - if ( RESET = '1' ) then - DISSECT_CS <= IDLE; - elsif( rising_edge(CLK) ) then - DISSECT_CS <= DISSECT_NS; - end if; - end process PROC_DISSECT_FSM; - - PROC_DISSECT_TRANSITIONS : process( DISSECT_CS, MY_IP_IN, PS_WR_EN_IN, PS_ACTIVATE_IN, - PS_DATA_IN, dissect_ctr, PS_SELECTED_IN, saved_target_ip ) - begin - case DISSECT_CS is - - when IDLE => - state <= x"1"; - if( (PS_WR_EN_IN = '1') and (PS_ACTIVATE_IN = '1') ) then - DISSECT_NS <= READ_FRAME; - else - DISSECT_NS <= IDLE; - end if; - - when READ_FRAME => - state <= x"2"; - -- BUG: fails on empty payload - if( PS_DATA_IN(8) = '1' ) then - DISSECT_NS <= DELAY; - else - DISSECT_NS <= READ_FRAME; - end if; + + signal state : std_logic_vector(3 downto 0); + + attribute syn_preserve : boolean; + attribute syn_keep : boolean; + attribute syn_keep of state : signal is true; + attribute syn_preserve of state : signal is true; + +begin + + PROC_DISSECT_FSM: process( CLK, RESET ) + begin + if ( RESET = '1' ) then + DISSECT_CS <= IDLE; + elsif( rising_edge(CLK) ) then + DISSECT_CS <= DISSECT_NS; + end if; + end process PROC_DISSECT_FSM; + + PROC_DISSECT_TRANSITIONS : process( DISSECT_CS, MY_IP_IN, PS_WR_EN_IN, PS_ACTIVATE_IN, + PS_DATA_IN, dissect_ctr, PS_SELECTED_IN, saved_target_ip ) + begin + case DISSECT_CS is + + when IDLE => + state <= x"1"; + if( (PS_WR_EN_IN = '1') and (PS_ACTIVATE_IN = '1') ) then + DISSECT_NS <= READ_FRAME; + else + DISSECT_NS <= IDLE; + end if; + + when READ_FRAME => + state <= x"2"; + -- BUG: fails on empty payload + if( PS_DATA_IN(8) = '1' ) then + DISSECT_NS <= DELAY; + else + DISSECT_NS <= READ_FRAME; + end if; when DELAY => DISSECT_NS <= DECIDE; - - when DECIDE => - state <= x"3"; - if( saved_target_ip = MY_IP_IN ) then - DISSECT_NS <= WAIT_FOR_LOAD; - -- in case the request is not for me, drop it - else - DISSECT_NS <= IDLE; - end if; - - when WAIT_FOR_LOAD => - state <= x"4"; - if( PS_SELECTED_IN = '1' ) then - DISSECT_NS <= LOAD_FRAME; - else - DISSECT_NS <= WAIT_FOR_LOAD; - end if; - - when LOAD_FRAME => - state <= x"5"; - if( dissect_ctr = x"1c" ) then - DISSECT_NS <= CLEANUP; - else - DISSECT_NS <= LOAD_FRAME; - end if; - - when CLEANUP => - state <= x"e"; - DISSECT_NS <= IDLE; - - end case; - end process PROC_DISSECT_TRANSITIONS; - - PROC_DISSEC_CTR: process( CLK, RESET ) - begin - if ( RESET = '1' ) then - dissect_ctr <= (others => '0'); - elsif( rising_edge(CLK) ) then - if ( (DISSECT_CS = IDLE) and (PS_WR_EN_IN = '0') ) then - dissect_ctr <= (others => '0'); - elsif( (DISSECT_CS = DECIDE) ) then - dissect_ctr <= (others => '0'); - elsif( (DISSECT_CS = IDLE) and (PS_WR_EN_IN = '1') and (PS_ACTIVATE_IN = '1') ) then - dissect_ctr <= dissect_ctr + 1; - elsif( (DISSECT_CS = READ_FRAME) and (PS_WR_EN_IN = '1') and (PS_ACTIVATE_IN = '1') ) then -- in case of saving data from incoming frame - dissect_ctr <= dissect_ctr + 1; - elsif( (DISSECT_CS = LOAD_FRAME) and (PS_SELECTED_IN = '1') and (TC_RD_EN_IN = '1') ) then -- in case of constructing response - dissect_ctr <= dissect_ctr + 1; - end if; - end if; - end process PROC_DISSEC_CTR; - - PROC_SAVE_VALUES: process( CLK, RESET ) - begin - if ( RESET = '1' ) then - saved_opcode <= (others => '0'); - saved_sender_ip <= (others => '0'); - saved_target_ip <= (others => '0'); - elsif( rising_edge(CLK) ) then - if( DISSECT_CS = READ_FRAME ) then - case dissect_ctr is - - when x"06" => - saved_opcode(7 downto 0) <= PS_DATA_IN(7 downto 0); - when x"07" => - saved_opcode(15 downto 8) <= PS_DATA_IN(7 downto 0); - when x"0e" => - saved_sender_ip(7 downto 0) <= PS_DATA_IN(7 downto 0); - when x"0f" => - saved_sender_ip(15 downto 8) <= PS_DATA_IN(7 downto 0); - when x"10" => - saved_sender_ip(23 downto 16) <= PS_DATA_IN(7 downto 0); - when x"11" => - saved_sender_ip(31 downto 24) <= PS_DATA_IN(7 downto 0); - when x"18" => - saved_target_ip(7 downto 0) <= PS_DATA_IN(7 downto 0); - when x"19" => - saved_target_ip(15 downto 8) <= PS_DATA_IN(7 downto 0); - when x"1a" => - saved_target_ip(23 downto 16) <= PS_DATA_IN(7 downto 0); - when x"1b" => - saved_target_ip(31 downto 24) <= PS_DATA_IN(7 downto 0); - - when others => null; - end case; - end if; - end if; - end process PROC_SAVE_VALUES; - - PROC_TC_DATA: process( CLK ) - begin + + when DECIDE => + state <= x"3"; + if( saved_target_ip = MY_IP_IN ) then + DISSECT_NS <= WAIT_FOR_LOAD; + -- in case the request is not for me, drop it + else + DISSECT_NS <= IDLE; + end if; + + when WAIT_FOR_LOAD => + state <= x"4"; + if( PS_SELECTED_IN = '1' ) then + DISSECT_NS <= LOAD_FRAME; + else + DISSECT_NS <= WAIT_FOR_LOAD; + end if; + + when LOAD_FRAME => + state <= x"5"; + if( dissect_ctr = x"1c" ) then + DISSECT_NS <= CLEANUP; + else + DISSECT_NS <= LOAD_FRAME; + end if; + + when CLEANUP => + state <= x"e"; + DISSECT_NS <= IDLE; + + end case; + end process PROC_DISSECT_TRANSITIONS; + + PROC_DISSEC_CTR: process( CLK, RESET ) + begin + if ( RESET = '1' ) then + dissect_ctr <= (others => '0'); + elsif( rising_edge(CLK) ) then + if ( (DISSECT_CS = IDLE) and (PS_WR_EN_IN = '0') ) then + dissect_ctr <= (others => '0'); + elsif( (DISSECT_CS = DECIDE) ) then + dissect_ctr <= (others => '0'); + elsif( (DISSECT_CS = IDLE) and (PS_WR_EN_IN = '1') and (PS_ACTIVATE_IN = '1') ) then + dissect_ctr <= dissect_ctr + 1; + elsif( (DISSECT_CS = READ_FRAME) and (PS_WR_EN_IN = '1') and (PS_ACTIVATE_IN = '1') ) then -- in case of saving data from incoming frame + dissect_ctr <= dissect_ctr + 1; + elsif( (DISSECT_CS = LOAD_FRAME) and (PS_SELECTED_IN = '1') and (TC_RD_EN_IN = '1') ) then -- in case of constructing response + dissect_ctr <= dissect_ctr + 1; + end if; + end if; + end process PROC_DISSEC_CTR; + + PROC_SAVE_VALUES: process( CLK, RESET ) + begin + if ( RESET = '1' ) then + saved_opcode <= (others => '0'); + saved_sender_ip <= (others => '0'); + saved_target_ip <= (others => '0'); + elsif( rising_edge(CLK) ) then + if( DISSECT_CS = READ_FRAME ) then + case dissect_ctr is + + when x"06" => + saved_opcode(7 downto 0) <= PS_DATA_IN(7 downto 0); + when x"07" => + saved_opcode(15 downto 8) <= PS_DATA_IN(7 downto 0); + when x"0e" => + saved_sender_ip(7 downto 0) <= PS_DATA_IN(7 downto 0); + when x"0f" => + saved_sender_ip(15 downto 8) <= PS_DATA_IN(7 downto 0); + when x"10" => + saved_sender_ip(23 downto 16) <= PS_DATA_IN(7 downto 0); + when x"11" => + saved_sender_ip(31 downto 24) <= PS_DATA_IN(7 downto 0); + when x"18" => + saved_target_ip(7 downto 0) <= PS_DATA_IN(7 downto 0); + when x"19" => + saved_target_ip(15 downto 8) <= PS_DATA_IN(7 downto 0); + when x"1a" => + saved_target_ip(23 downto 16) <= PS_DATA_IN(7 downto 0); + when x"1b" => + saved_target_ip(31 downto 24) <= PS_DATA_IN(7 downto 0); + + when others => null; + end case; + end if; + end if; + end process PROC_SAVE_VALUES; + + PROC_TC_DATA: process( CLK ) + begin if( rising_edge(CLK) ) then tc_data(8) <= '0'; - tc_data(7 downto 0) <= x"00"; - if( DISSECT_CS = LOAD_FRAME ) then + tc_data(7 downto 0) <= x"00"; + if( DISSECT_CS = LOAD_FRAME ) then case dissect_ctr is when x"00" => tc_data(7 downto 0) <= x"00"; -- HWTYPE - when x"01" => tc_data(7 downto 0) <= x"01"; - when x"02" => tc_data(7 downto 0) <= x"08"; -- PTYPE - when x"03" => tc_data(7 downto 0) <= x"00"; - when x"04" => tc_data(7 downto 0) <= x"06"; -- HLEN - when x"05" => tc_data(7 downto 0) <= x"04"; -- PLEN - when x"06" => tc_data(7 downto 0) <= x"00"; -- OPER - when x"07" => tc_data(7 downto 0) <= x"02"; - when x"08" => tc_data(7 downto 0) <= MY_MAC_IN(7 downto 0); -- SHA - when x"09" => tc_data(7 downto 0) <= MY_MAC_IN(15 downto 8); - when x"0a" => tc_data(7 downto 0) <= MY_MAC_IN(23 downto 16); - when x"0b" => tc_data(7 downto 0) <= MY_MAC_IN(31 downto 24); - when x"0c" => tc_data(7 downto 0) <= MY_MAC_IN(39 downto 32); - when x"0d" => tc_data(7 downto 0) <= MY_MAC_IN(47 downto 40); - when x"0e" => tc_data(7 downto 0) <= MY_IP_IN(7 downto 0); -- SPA - when x"0f" => tc_data(7 downto 0) <= MY_IP_IN(15 downto 8); - when x"10" => tc_data(7 downto 0) <= MY_IP_IN(23 downto 16); - when x"11" => tc_data(7 downto 0) <= MY_IP_IN(31 downto 24); - when x"12" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(7 downto 0); -- THA - when x"13" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(15 downto 8); - when x"14" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(23 downto 16); - when x"15" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(31 downto 24); - when x"16" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(39 downto 32); - when x"17" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(47 downto 40); - when x"18" => tc_data(7 downto 0) <= saved_sender_ip(7 downto 0); -- TPA - when x"19" => tc_data(7 downto 0) <= saved_sender_ip(15 downto 8); - when x"1a" => tc_data(7 downto 0) <= saved_sender_ip(23 downto 16); - when x"1b" => tc_data(7 downto 0) <= saved_sender_ip(31 downto 24); tc_data(8) <= '1'; + when x"01" => tc_data(7 downto 0) <= x"01"; + when x"02" => tc_data(7 downto 0) <= x"08"; -- PTYPE + when x"03" => tc_data(7 downto 0) <= x"00"; + when x"04" => tc_data(7 downto 0) <= x"06"; -- HLEN + when x"05" => tc_data(7 downto 0) <= x"04"; -- PLEN + when x"06" => tc_data(7 downto 0) <= x"00"; -- OPER + when x"07" => tc_data(7 downto 0) <= x"02"; + when x"08" => tc_data(7 downto 0) <= MY_MAC_IN(7 downto 0); -- SHA + when x"09" => tc_data(7 downto 0) <= MY_MAC_IN(15 downto 8); + when x"0a" => tc_data(7 downto 0) <= MY_MAC_IN(23 downto 16); + when x"0b" => tc_data(7 downto 0) <= MY_MAC_IN(31 downto 24); + when x"0c" => tc_data(7 downto 0) <= MY_MAC_IN(39 downto 32); + when x"0d" => tc_data(7 downto 0) <= MY_MAC_IN(47 downto 40); + when x"0e" => tc_data(7 downto 0) <= MY_IP_IN(7 downto 0); -- SPA + when x"0f" => tc_data(7 downto 0) <= MY_IP_IN(15 downto 8); + when x"10" => tc_data(7 downto 0) <= MY_IP_IN(23 downto 16); + when x"11" => tc_data(7 downto 0) <= MY_IP_IN(31 downto 24); + when x"12" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(7 downto 0); -- THA + when x"13" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(15 downto 8); + when x"14" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(23 downto 16); + when x"15" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(31 downto 24); + when x"16" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(39 downto 32); + when x"17" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(47 downto 40); + when x"18" => tc_data(7 downto 0) <= saved_sender_ip(7 downto 0); -- TPA + when x"19" => tc_data(7 downto 0) <= saved_sender_ip(15 downto 8); + when x"1a" => tc_data(7 downto 0) <= saved_sender_ip(23 downto 16); + when x"1b" => tc_data(7 downto 0) <= saved_sender_ip(31 downto 24); tc_data(8) <= '1'; when others => tc_data(7 downto 0) <= x"00"; end case; TC_DATA_OUT <= tc_data; -- delay once clock cycle - end if; - end if; - end process PROC_TC_DATA; - - PROC_PS_RESPONSE_SYNC: process( CLK ) - begin - if( rising_edge(CLK) ) then - if( (DISSECT_CS = WAIT_FOR_LOAD) or (DISSECT_CS = LOAD_FRAME) or (DISSECT_CS = CLEANUP) ) then - PS_RESPONSE_READY_OUT <= '1'; - else - PS_RESPONSE_READY_OUT <= '0'; - end if; - - if( DISSECT_CS = IDLE ) then - PS_BUSY_OUT <= '0'; - else - PS_BUSY_OUT <= '1'; - end if; - end if; - end process PROC_PS_RESPONSE_SYNC; - - TC_FRAME_SIZE_OUT <= x"001c"; -- fixed frame size - TC_FRAME_TYPE_OUT <= x"0608"; - TC_DEST_MAC_OUT <= PS_SRC_MAC_ADDRESS_IN; - TC_DEST_IP_OUT <= x"00000000"; -- doesnt matter - TC_DEST_UDP_OUT <= x"0000"; -- doesnt matter - TC_SRC_MAC_OUT <= MY_MAC_IN; - TC_SRC_IP_OUT <= x"00000000"; -- doesnt matter - TC_SRC_UDP_OUT <= x"0000"; -- doesnt matter - TC_IP_PROTOCOL_OUT <= x"00"; -- doesnt matter - TC_IDENT_OUT <= (others => '0'); -- doesn't matter - -end gbe_response_constructor_ARP_arch; + end if; + end if; + end process PROC_TC_DATA; + + PROC_PS_RESPONSE_SYNC: process( CLK ) + begin + if( rising_edge(CLK) ) then + if( (DISSECT_CS = WAIT_FOR_LOAD) or (DISSECT_CS = LOAD_FRAME) or (DISSECT_CS = CLEANUP) ) then + PS_RESPONSE_READY_OUT <= '1'; + else + PS_RESPONSE_READY_OUT <= '0'; + end if; + + if( DISSECT_CS = IDLE ) then + PS_BUSY_OUT <= '0'; + else + PS_BUSY_OUT <= '1'; + end if; + end if; + end process PROC_PS_RESPONSE_SYNC; + + TC_FRAME_SIZE_OUT <= x"001c"; -- fixed frame size + TC_FRAME_TYPE_OUT <= x"0608"; + TC_DEST_MAC_OUT <= PS_SRC_MAC_ADDRESS_IN; + TC_DEST_IP_OUT <= x"00000000"; -- doesnt matter + TC_DEST_UDP_OUT <= x"0000"; -- doesnt matter + TC_SRC_MAC_OUT <= MY_MAC_IN; + TC_SRC_IP_OUT <= x"00000000"; -- doesnt matter + TC_SRC_UDP_OUT <= x"0000"; -- doesnt matter + TC_IP_PROTOCOL_OUT <= x"00"; -- doesnt matter + TC_IDENT_OUT <= (others => '0'); -- doesn't matter + +end gbe_response_constructor_ARP_arch; diff --git a/gbe_trb/protocols/gbe_response_constructor_DHCP.vhd b/gbe_trb/protocols/gbe_response_constructor_DHCP.vhd index 526696f..bd8df5f 100644 --- a/gbe_trb/protocols/gbe_response_constructor_DHCP.vhd +++ b/gbe_trb/protocols/gbe_response_constructor_DHCP.vhd @@ -19,11 +19,8 @@ entity gbe_response_constructor_DHCP is PS_BUSY_OUT : out std_logic; PS_SELECTED_IN : in std_logic; PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); PS_FRAME_INFO_IN : in std_logic_vector(7 downto 0); -- TC_RD_EN_IN : in std_logic; @@ -109,7 +106,7 @@ begin DEBUG_OUT(31 downto 28) <= main_state; DEBUG_OUT(27 downto 24) <= recv_state; DEBUG_OUT(23 downto 20) <= cons_state; - DEBUG_OUT(19 downto 12) <= PS_DEST_MAC_ADDRESS_IN(7 downto 0); + DEBUG_OUT(19 downto 12) <= (others => '0'); DEBUG_OUT(11) <= '0'; DEBUG_OUT(10) <= PS_WR_EN_IN; DEBUG_OUT(9) <= PS_ACTIVATE_IN; @@ -117,11 +114,11 @@ begin -- **** -- fixing the constant values for DHCP request headers - TC_DEST_MAC_OUT <= x"ffffffffffff" when (MAIN_CS = BOOTING or MAIN_CS = SENDING_DISCOVER) else saved_server_mac; - TC_DEST_IP_OUT <= x"ffffffff" when (MAIN_CS = BOOTING or MAIN_CS = SENDING_DISCOVER) else saved_server_ip; + TC_DEST_MAC_OUT <= x"ffffffffffff" when ((MAIN_CS = BOOTING) or (MAIN_CS = SENDING_DISCOVER)) else saved_server_mac; + TC_DEST_IP_OUT <= x"ffffffff" when ((MAIN_CS = BOOTING) or (MAIN_CS = SENDING_DISCOVER)) else saved_server_ip; TC_DEST_UDP_OUT <= x"4300"; TC_SRC_MAC_OUT <= MY_MAC_IN; - TC_SRC_IP_OUT <= x"00000000" when (MAIN_CS = BOOTING or MAIN_CS = SENDING_DISCOVER) else saved_proposed_ip; + TC_SRC_IP_OUT <= x"00000000" when ((MAIN_CS = BOOTING) or (MAIN_CS = SENDING_DISCOVER)) else saved_proposed_ip; TC_SRC_UDP_OUT <= x"4400"; TC_IP_PROTOCOL_OUT <= x"11"; -- udp bootp_hdr(7 downto 0) <= x"01"; -- message type(request) @@ -132,12 +129,12 @@ begin bootp_hdr(95 downto 64) <= x"0000_0000"; -- seconds elapsed/flags transaction_id <= x"cefa" & MY_MAC_IN(47 downto 40) & MY_MAC_IN(23 downto 16); vendor_values(31 downto 0) <= x"63538263"; -- magic cookie (dhcp message) - vendor_values(55 downto 32) <= x"010135" when (MAIN_CS = BOOTING or MAIN_CS = SENDING_DISCOVER) else x"030135"; -- dhcp discover, then dhcp request + vendor_values(55 downto 32) <= x"010135" when ((MAIN_CS = BOOTING) or (MAIN_CS = SENDING_DISCOVER)) else x"030135"; -- dhcp discover, then dhcp request vendor_values(79 downto 56) <= x"01073d"; -- client identifier vendor_values(127 downto 80) <= MY_MAC_IN; -- client identifier vendor_values(143 downto 128) <= x"040c"; -- client name - vendor_values(175 downto 144) <= x"33425254"; -- client name (TRB3) - --vendor_values(175 downto 144) <= x"6f72694b"; -- client name (Kiro) + --vendor_values(175 downto 144) <= x"33425254"; -- client name (TRB3) + vendor_values(175 downto 144) <= x"6f72694b"; -- client name (Kiro) vendor_values2(15 downto 0) <= x"0436"; -- server identifier vendor_values2(47 downto 16) <= saved_server_ip; @@ -270,7 +267,7 @@ begin end process PROC_RECEIVE_FSM; PROC_RECEIVE_TRANSITIONS: process( RECEIVE_CS, MAIN_CS, bootp_hdr, saved_dhcp_type, saved_transaction_id, PS_FRAME_INFO_IN, - PS_DATA_IN, PS_DEST_MAC_ADDRESS_IN, MY_MAC_IN, PS_ACTIVATE_IN, PS_WR_EN_IN, save_ctr ) + PS_DATA_IN, MY_MAC_IN, PS_ACTIVATE_IN, PS_WR_EN_IN, save_ctr ) begin recv_state <= x"0"; @@ -280,8 +277,7 @@ begin recv_state <= x"1"; if( (PS_ACTIVATE_IN = '1') and (PS_WR_EN_IN = '1') ) then if( (MAIN_CS = WAITING_FOR_OFFER) or (MAIN_CS = WAITING_FOR_ACK) ) then -- ready to receive dhcp frame --- if( PS_DEST_MAC_ADDRESS_IN = MY_MAC_IN ) then -- check if i'm the addressee (discards broadcasts also) - if( PS_FRAME_INFO_IN(0) = '1' ) then -- check if i'm the addressee (discards broadcasts also) + if( PS_FRAME_INFO_IN(0) = '1' ) then -- check if i'm the addressee (discards broadcasts also) RECEIVE_NS <= SAVE_VALUES; else RECEIVE_NS <= DISCARD; -- discard if the frame is not for me diff --git a/gbe_trb/protocols/gbe_response_constructor_Discovery.vhd b/gbe_trb/protocols/gbe_response_constructor_Discovery.vhd new file mode 100644 index 0000000..0371d02 --- /dev/null +++ b/gbe_trb/protocols/gbe_response_constructor_Discovery.vhd @@ -0,0 +1,279 @@ +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +library work; + use work.gbe_protocols.all; + +-- New protocol: will drop received frames and not send back yet + +entity gbe_response_constructor_Discovery is + port( + CLK : in std_logic; -- system clock + RESET : in std_logic; + MY_MAC_IN : in std_logic_vector(47 downto 0); + MY_IP_IN : in std_logic_vector(31 downto 0); + PS_DATA_IN : in std_logic_vector(8 downto 0); + PS_WR_EN_IN : in std_logic; + PS_ACTIVATE_IN : in std_logic; + PS_RESPONSE_READY_OUT : out std_logic; + PS_BUSY_OUT : out std_logic; + PS_SELECTED_IN : in std_logic; + PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); + PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); + PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); + PS_FRAME_INFO_IN : in std_logic_vector(7 downto 0); + TC_RD_EN_IN : in std_logic; + TC_DATA_OUT : out std_logic_vector(8 downto 0); + TC_FRAME_SIZE_OUT : out std_logic_vector(15 downto 0); + TC_FRAME_TYPE_OUT : out std_logic_vector(15 downto 0); + TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0); + TC_IDENT_OUT : out std_logic_vector(15 downto 0); + TC_DEST_MAC_OUT : out std_logic_vector(47 downto 0); + TC_DEST_IP_OUT : out std_logic_vector(31 downto 0); + TC_DEST_UDP_OUT : out std_logic_vector(15 downto 0); + TC_SRC_MAC_OUT : out std_logic_vector(47 downto 0); + TC_SRC_IP_OUT : out std_logic_vector(31 downto 0); + TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0); + DEBUG_OUT : out std_logic_vector(63 downto 0) + ); +end gbe_response_constructor_Discovery; + +architecture gbe_response_constructor_Discovery_arch of gbe_response_constructor_Discovery is + + attribute syn_encoding: string; + + type DISSECT_STATES is (IDLE, READ_FRAME, DELAY, DECIDE, LOAD_FRAME, WAIT_FOR_LOAD, CLEANUP); + signal DISSECT_CS, DISSECT_NS : DISSECT_STATES; + attribute syn_encoding of DISSECT_CS: signal is "onehot"; + + type stats_states is (IDLE, LOAD_SENT, LOAD_RECEIVED, CLEANUP); + signal stats_current_state, stats_next_state : stats_states; + attribute syn_encoding of stats_current_state : signal is "onehot"; + + signal saved_opcode : std_logic_vector(15 downto 0); -- NOT USED + signal saved_sender_ip : std_logic_vector(31 downto 0); + signal saved_target_ip : std_logic_vector(31 downto 0); + signal tc_data : std_logic_vector(8 downto 0); + signal dissect_ctr : unsigned(7 downto 0); + + signal state : std_logic_vector(3 downto 0); + + signal test_ff : std_logic; + + attribute syn_preserve : boolean; + attribute syn_keep : boolean; + attribute syn_keep of state : signal is true; + attribute syn_preserve of state : signal is true; + +begin + + DEBUG_OUT(63 downto 32) <= (others => '0'); + DEBUG_OUT(31) <= test_ff; + DEBUG_OUT(30 downto 4) <= (others => '0'); + DEBUG_OUT(3 downto 0) <= state; + + PROC_TEST_FF: process( CLK, RESET ) + begin + if ( RESET = '1' ) then + test_ff <= '0'; + elsif( rising_edge(CLK) ) then + if( DISSECT_CS = DELAY ) then + test_ff <= not test_ff; + end if; + end if; + end process PROC_TEST_FF; + + PROC_DISSECT_FSM: process( CLK, RESET ) + begin + if ( RESET = '1' ) then + DISSECT_CS <= IDLE; + elsif( rising_edge(CLK) ) then + DISSECT_CS <= DISSECT_NS; + end if; + end process PROC_DISSECT_FSM; + + PROC_DISSECT_TRANSITIONS : process( DISSECT_CS, MY_IP_IN, PS_WR_EN_IN, PS_ACTIVATE_IN, + PS_DATA_IN, dissect_ctr, PS_SELECTED_IN, saved_target_ip ) + begin + case DISSECT_CS is + + when IDLE => + state <= x"1"; + if( (PS_WR_EN_IN = '1') and (PS_ACTIVATE_IN = '1') ) then + DISSECT_NS <= READ_FRAME; + else + DISSECT_NS <= IDLE; + end if; + + when READ_FRAME => + state <= x"2"; + -- BUG: fails on empty payload + if( PS_DATA_IN(8) = '1' ) then + DISSECT_NS <= DELAY; + else + DISSECT_NS <= READ_FRAME; + end if; + + when DELAY => + DISSECT_NS <= DECIDE; + + when DECIDE => + state <= x"3"; +-- if( saved_target_ip = MY_IP_IN ) then +-- DISSECT_NS <= WAIT_FOR_LOAD; +-- -- in case the request is not for me, drop it +-- else + DISSECT_NS <= IDLE; +-- end if; + + when WAIT_FOR_LOAD => + state <= x"4"; + if( PS_SELECTED_IN = '1' ) then + DISSECT_NS <= LOAD_FRAME; + else + DISSECT_NS <= WAIT_FOR_LOAD; + end if; + + when LOAD_FRAME => + state <= x"5"; + if( dissect_ctr = x"1c" ) then + DISSECT_NS <= CLEANUP; + else + DISSECT_NS <= LOAD_FRAME; + end if; + + when CLEANUP => + state <= x"e"; + DISSECT_NS <= IDLE; + + end case; + end process PROC_DISSECT_TRANSITIONS; + + PROC_DISSEC_CTR: process( CLK, RESET ) + begin + if ( RESET = '1' ) then + dissect_ctr <= (others => '0'); + elsif( rising_edge(CLK) ) then + if ( (DISSECT_CS = IDLE) and (PS_WR_EN_IN = '0') ) then + dissect_ctr <= (others => '0'); + elsif( (DISSECT_CS = DECIDE) ) then + dissect_ctr <= (others => '0'); + elsif( (DISSECT_CS = IDLE) and (PS_WR_EN_IN = '1') and (PS_ACTIVATE_IN = '1') ) then + dissect_ctr <= dissect_ctr + 1; + elsif( (DISSECT_CS = READ_FRAME) and (PS_WR_EN_IN = '1') and (PS_ACTIVATE_IN = '1') ) then -- in case of saving data from incoming frame + dissect_ctr <= dissect_ctr + 1; + elsif( (DISSECT_CS = LOAD_FRAME) and (PS_SELECTED_IN = '1') and (TC_RD_EN_IN = '1') ) then -- in case of constructing response + dissect_ctr <= dissect_ctr + 1; + end if; + end if; + end process PROC_DISSEC_CTR; + + PROC_SAVE_VALUES: process( CLK, RESET ) + begin + if ( RESET = '1' ) then + saved_opcode <= (others => '0'); + saved_sender_ip <= (others => '0'); + saved_target_ip <= (others => '0'); + elsif( rising_edge(CLK) ) then + if( DISSECT_CS = READ_FRAME ) then + case dissect_ctr is + + when x"06" => + saved_opcode(7 downto 0) <= PS_DATA_IN(7 downto 0); + when x"07" => + saved_opcode(15 downto 8) <= PS_DATA_IN(7 downto 0); + when x"0e" => + saved_sender_ip(7 downto 0) <= PS_DATA_IN(7 downto 0); + when x"0f" => + saved_sender_ip(15 downto 8) <= PS_DATA_IN(7 downto 0); + when x"10" => + saved_sender_ip(23 downto 16) <= PS_DATA_IN(7 downto 0); + when x"11" => + saved_sender_ip(31 downto 24) <= PS_DATA_IN(7 downto 0); + when x"18" => + saved_target_ip(7 downto 0) <= PS_DATA_IN(7 downto 0); + when x"19" => + saved_target_ip(15 downto 8) <= PS_DATA_IN(7 downto 0); + when x"1a" => + saved_target_ip(23 downto 16) <= PS_DATA_IN(7 downto 0); + when x"1b" => + saved_target_ip(31 downto 24) <= PS_DATA_IN(7 downto 0); + + when others => null; + end case; + end if; + end if; + end process PROC_SAVE_VALUES; + + PROC_TC_DATA: process( CLK ) + begin + if( rising_edge(CLK) ) then + tc_data(8) <= '0'; + tc_data(7 downto 0) <= x"00"; + if( DISSECT_CS = LOAD_FRAME ) then + case dissect_ctr is + when x"00" => tc_data(7 downto 0) <= x"00"; -- HWTYPE + when x"01" => tc_data(7 downto 0) <= x"01"; + when x"02" => tc_data(7 downto 0) <= x"08"; -- PTYPE + when x"03" => tc_data(7 downto 0) <= x"00"; + when x"04" => tc_data(7 downto 0) <= x"06"; -- HLEN + when x"05" => tc_data(7 downto 0) <= x"04"; -- PLEN + when x"06" => tc_data(7 downto 0) <= x"00"; -- OPER + when x"07" => tc_data(7 downto 0) <= x"02"; + when x"08" => tc_data(7 downto 0) <= MY_MAC_IN(7 downto 0); -- SHA + when x"09" => tc_data(7 downto 0) <= MY_MAC_IN(15 downto 8); + when x"0a" => tc_data(7 downto 0) <= MY_MAC_IN(23 downto 16); + when x"0b" => tc_data(7 downto 0) <= MY_MAC_IN(31 downto 24); + when x"0c" => tc_data(7 downto 0) <= MY_MAC_IN(39 downto 32); + when x"0d" => tc_data(7 downto 0) <= MY_MAC_IN(47 downto 40); + when x"0e" => tc_data(7 downto 0) <= MY_IP_IN(7 downto 0); -- SPA + when x"0f" => tc_data(7 downto 0) <= MY_IP_IN(15 downto 8); + when x"10" => tc_data(7 downto 0) <= MY_IP_IN(23 downto 16); + when x"11" => tc_data(7 downto 0) <= MY_IP_IN(31 downto 24); + when x"12" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(7 downto 0); -- THA + when x"13" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(15 downto 8); + when x"14" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(23 downto 16); + when x"15" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(31 downto 24); + when x"16" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(39 downto 32); + when x"17" => tc_data(7 downto 0) <= PS_SRC_MAC_ADDRESS_IN(47 downto 40); + when x"18" => tc_data(7 downto 0) <= saved_sender_ip(7 downto 0); -- TPA + when x"19" => tc_data(7 downto 0) <= saved_sender_ip(15 downto 8); + when x"1a" => tc_data(7 downto 0) <= saved_sender_ip(23 downto 16); + when x"1b" => tc_data(7 downto 0) <= saved_sender_ip(31 downto 24); tc_data(8) <= '1'; + when others => tc_data(7 downto 0) <= x"00"; + end case; + TC_DATA_OUT <= tc_data; -- delay once clock cycle + end if; + end if; + end process PROC_TC_DATA; + + PROC_PS_RESPONSE_SYNC: process( CLK ) + begin + if( rising_edge(CLK) ) then + if( (DISSECT_CS = WAIT_FOR_LOAD) or (DISSECT_CS = LOAD_FRAME) or (DISSECT_CS = CLEANUP) ) then + PS_RESPONSE_READY_OUT <= '1'; + else + PS_RESPONSE_READY_OUT <= '0'; + end if; + + if( DISSECT_CS = IDLE ) then + PS_BUSY_OUT <= '0'; + else + PS_BUSY_OUT <= '1'; + end if; + end if; + end process PROC_PS_RESPONSE_SYNC; + + TC_FRAME_SIZE_OUT <= x"001c"; -- fixed frame size + TC_FRAME_TYPE_OUT <= x"0608"; + TC_DEST_MAC_OUT <= PS_SRC_MAC_ADDRESS_IN; + TC_DEST_IP_OUT <= x"00000000"; -- doesnt matter + TC_DEST_UDP_OUT <= x"0000"; -- doesnt matter + TC_SRC_MAC_OUT <= MY_MAC_IN; + TC_SRC_IP_OUT <= x"00000000"; -- doesnt matter + TC_SRC_UDP_OUT <= x"0000"; -- doesnt matter + TC_IP_PROTOCOL_OUT <= x"00"; -- doesnt matter + TC_IDENT_OUT <= (others => '0'); -- doesn't matter + +end gbe_response_constructor_Discovery_arch; diff --git a/gbe_trb/protocols/gbe_response_constructor_Forward.vhd b/gbe_trb/protocols/gbe_response_constructor_Forward.vhd index 1110fb4..83b723b 100644 --- a/gbe_trb/protocols/gbe_response_constructor_Forward.vhd +++ b/gbe_trb/protocols/gbe_response_constructor_Forward.vhd @@ -25,11 +25,8 @@ entity gbe_response_constructor_Forward is PS_BUSY_OUT : out std_logic; PS_SELECTED_IN : in std_logic; PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); -- TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); diff --git a/gbe_trb/protocols/gbe_response_constructor_Ping.vhd b/gbe_trb/protocols/gbe_response_constructor_Ping.vhd index 4b603bd..01c6318 100644 --- a/gbe_trb/protocols/gbe_response_constructor_Ping.vhd +++ b/gbe_trb/protocols/gbe_response_constructor_Ping.vhd @@ -19,11 +19,8 @@ entity gbe_response_constructor_Ping is PS_BUSY_OUT : out std_logic; PS_SELECTED_IN : in std_logic; PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); -- TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); diff --git a/gbe_trb/protocols/gbe_response_constructor_SCTRL.vhd b/gbe_trb/protocols/gbe_response_constructor_SCTRL.vhd index 6608027..39e80a0 100644 --- a/gbe_trb/protocols/gbe_response_constructor_SCTRL.vhd +++ b/gbe_trb/protocols/gbe_response_constructor_SCTRL.vhd @@ -23,11 +23,8 @@ entity gbe_response_constructor_SCTRL is PS_BUSY_OUT : out std_logic; PS_SELECTED_IN : in std_logic; PS_SRC_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); - PS_DEST_MAC_ADDRESS_IN : in std_logic_vector(47 downto 0); PS_SRC_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); - PS_DEST_IP_ADDRESS_IN : in std_logic_vector(31 downto 0); PS_SRC_UDP_PORT_IN : in std_logic_vector(15 downto 0); - PS_DEST_UDP_PORT_IN : in std_logic_vector(15 downto 0); -- TC_RD_EN_IN : in std_logic; TC_DATA_OUT : out std_logic_vector(8 downto 0); -- 2.43.0