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