signal gsc_reply_data, gsc_init_data : std_logic_vector(15 downto 0);
signal gsc_busy : std_logic;
signal gsc_init_packet_num, gsc_reply_packet_num : std_logic_vector(2 downto 0);
+signal mc_flags, mc_ip_size, mc_udp_size : std_logic_vector(15 downto 0);
begin
TC_SRC_IP_OUT => mc_src_ip,
TC_SRC_UDP_OUT => mc_src_udp,
+ TC_IP_SIZE_OUT => mc_ip_size,
+ TC_UDP_SIZE_OUT => mc_udp_size,
+ TC_FLAGS_OFFSET_OUT => mc_flags,
+
TC_BUSY_IN => MC_BUSY_IN,
TC_TRANSMIT_DONE_IN => MC_TRANSMIT_DONE_IN,
TSM_HREAD_N_OUT => open,
TSM_HREADY_N_IN => '0',
TSM_HDATA_EN_N_IN => '1',
+ TSM_RX_STAT_VEC_IN => (others => '0'),
+ TSM_RX_STAT_EN_IN => '0',
DEBUG_OUT => open
);
MC_SRC_IP_IN => mc_src_ip,
MC_SRC_UDP_IN => mc_src_udp,
+ MC_IP_SIZE_IN => mc_ip_size,
+ MC_UDP_SIZE_IN => mc_udp_size,
+ MC_FLAGS_OFFSET_IN => mc_flags,
+
MC_BUSY_OUT => MC_BUSY_IN,
MC_TRANSMIT_DONE_OUT => MC_TRANSMIT_DONE_IN,
wait until rising_edge(RX_MAC_CLK);
MAC_RX_EN_IN <= '1';
-- dest mac
- MAC_RXD_IN <= x"00";
+ MAC_RXD_IN <= x"ff";
wait until rising_edge(RX_MAC_CLK);
- MAC_RXD_IN <= x"00";
+ MAC_RXD_IN <= x"ff";
wait until rising_edge(RX_MAC_CLK);
- MAC_RXD_IN <= x"be";
+ MAC_RXD_IN <= x"ff";
wait until rising_edge(RX_MAC_CLK);
- MAC_RXD_IN <= x"ef";
+ MAC_RXD_IN <= x"ff";
wait until rising_edge(RX_MAC_CLK);
- MAC_RXD_IN <= x"be";
+ MAC_RXD_IN <= x"ff";
wait until rising_edge(RX_MAC_CLK);
- MAC_RXD_IN <= x"ef";
+ MAC_RXD_IN <= x"ff";
wait until rising_edge(RX_MAC_CLK);
-- src mac
MAC_RXD_IN <= x"00";
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;
+
+ MAKE_RESET_OUT : out std_logic;
-- for simulation of receiving part only
MAC_RX_EOF_IN : in std_logic;
signal pcs_txd_qq, pcs_rxd_qq : std_logic_vector(7 downto 0);
signal pcs_tx_en_qq, pcs_tx_er_qq, pcs_rx_en_qq, pcs_rx_er_qq, mac_col_qq, mac_crs_qq : std_logic;
+signal mc_ip_size, mc_udp_size, mc_flags : std_logic_vector(15 downto 0);
+
begin
--my_mac <= x"efbeefbe0000"; -- temporary
TC_SRC_IP_OUT => mc_src_ip,
TC_SRC_UDP_OUT => mc_src_udp,
+ TC_IP_SIZE_OUT => mc_ip_size,
+ TC_UDP_SIZE_OUT => mc_udp_size,
+ TC_FLAGS_OFFSET_OUT => mc_flags,
+
TC_BUSY_IN => mc_busy,
TC_TRANSMIT_DONE_IN => mc_transmit_done,
GSC_REPLY_READ_OUT => GSC_REPLY_READ_OUT,
GSC_BUSY_IN => GSC_BUSY_IN,
+ MAKE_RESET_OUT => MAKE_RESET_OUT,
+
-- signal to/from Host interface of TriSpeed MAC
TSM_HADDR_OUT => mac_haddr,
TSM_HDATA_OUT => mac_hdataout,
MC_SRC_MAC_IN => mc_src_mac,
MC_SRC_IP_IN => mc_src_ip,
MC_SRC_UDP_IN => mc_src_udp,
+
+ MC_IP_SIZE_IN => mc_ip_size,
+ MC_UDP_SIZE_IN => mc_udp_size,
+ MC_FLAGS_OFFSET_IN => mc_flags,
MC_BUSY_OUT => mc_busy,
MC_TRANSMIT_DONE_OUT => mc_transmit_done,
when SRC_MAC_ADDR =>\r
constructNextState <= FRAME_TYPE_S;\r
when FRAME_TYPE_S =>\r
- if (DEST_IP_ADDRESS_IN /= x"0000_0000") then -- in case of ip frame continue with ip/udp headers \r
+ --if (DEST_IP_ADDRESS_IN /= x"0000_0000") then -- in case of ip frame continue with ip/udp headers\r
+ if (FRAME_TYPE_IN = x"0008") then \r
constructNextState <= VERSION;\r
else -- otherwise transmit data as pure ethernet frame\r
constructNextState <= SAVE_DATA;\r
TC_SRC_IP_OUT : out std_logic_vector(31 downto 0);
TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0);
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
+
TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0);
TC_BUSY_IN : in std_logic;
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;
+
+ MAKE_RESET_OUT : out std_logic;
-- signal to/from Host interface of TriSpeed MAC
TSM_HADDR_OUT : out std_logic_vector(7 downto 0);
TC_SRC_IP_OUT => TC_SRC_IP_OUT,
TC_SRC_UDP_OUT => TC_SRC_UDP_OUT,
+ TC_IP_SIZE_OUT => TC_IP_SIZE_OUT,
+ TC_UDP_SIZE_OUT => TC_UDP_SIZE_OUT,
+ TC_FLAGS_OFFSET_OUT => TC_FLAGS_OFFSET_OUT,
+
TC_BUSY_IN => TC_BUSY_IN,
RECEIVED_FRAMES_OUT => SELECT_REC_FRAMES_OUT,
GSC_REPLY_PACKET_NUM_IN => GSC_REPLY_PACKET_NUM_IN,
GSC_REPLY_READ_OUT => GSC_REPLY_READ_OUT,
GSC_BUSY_IN => GSC_BUSY_IN,
+
+ MAKE_RESET_OUT => MAKE_RESET_OUT,
-- input for statistics from outside
STAT_DATA_IN => stat_data,
TC_SRC_IP_OUT : out std_logic_vector(31 downto 0);
TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0);
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
+
TC_BUSY_IN : in std_logic;
-- counters from response constructors
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;
+
+ MAKE_RESET_OUT : out std_logic;
-- input for statistics from outside
STAT_DATA_IN : in std_logic_vector(31 downto 0);
signal stat_addr : std_logic_vector((c_MAX_PROTOCOLS + 1) * 8 - 1 downto 0);
signal stat_rdy : std_logic_vector((c_MAX_PROTOCOLS + 1) - 1 downto 0);
signal stat_ack : std_logic_vector((c_MAX_PROTOCOLS + 1) - 1 downto 0);
+signal tc_ip_size : std_logic_vector((c_MAX_PROTOCOLS + 1) * 16 - 1 downto 0);
+signal tc_udp_size : std_logic_vector((c_MAX_PROTOCOLS + 1) * 16 - 1 downto 0);
+signal tc_flags_size : std_logic_vector((c_MAX_PROTOCOLS + 1) * 16 - 1 downto 0);
begin
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),
+ TC_IP_SIZE_OUT => tc_ip_size(1 * 16 - 1 downto 0 * 16),
+ TC_UDP_SIZE_OUT => tc_udp_size(1 * 16 - 1 downto 0 * 16),
+ TC_FLAGS_OFFSET_OUT => tc_flags_size(1 * 16 - 1 downto 0 * 16),
+
TC_BUSY_IN => TC_BUSY_IN,
STAT_DATA_OUT => stat_data(1 * 32 - 1 downto 0 * 32),
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),
+
+ TC_IP_SIZE_OUT => tc_ip_size(2 * 16 - 1 downto 1 * 16),
+ TC_UDP_SIZE_OUT => tc_udp_size(2 * 16 - 1 downto 1 * 16),
+ TC_FLAGS_OFFSET_OUT => tc_flags_size(2 * 16 - 1 downto 1 * 16),
TC_BUSY_IN => TC_BUSY_IN,
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),
+ TC_IP_SIZE_OUT => tc_ip_size(3 * 16 - 1 downto 2 * 16),
+ TC_UDP_SIZE_OUT => tc_udp_size(3 * 16 - 1 downto 2 * 16),
+ TC_FLAGS_OFFSET_OUT => tc_flags_size(3 * 16 - 1 downto 2 * 16),
+
TC_BUSY_IN => TC_BUSY_IN,
STAT_DATA_OUT => stat_data(3 * 32 - 1 downto 2 * 32),
TC_SRC_IP_OUT => tc_src_ip(4 * 32 - 1 downto 3 * 32),
TC_SRC_UDP_OUT => tc_src_udp(4 * 16 - 1 downto 3 * 16),
+ TC_IP_SIZE_OUT => tc_ip_size(4 * 16 - 1 downto 3 * 16),
+ TC_UDP_SIZE_OUT => tc_udp_size(4 * 16 - 1 downto 3 * 16),
+ TC_FLAGS_OFFSET_OUT => tc_flags_size(4 * 16 - 1 downto 3 * 16),
+
TC_BUSY_IN => TC_BUSY_IN,
STAT_DATA_OUT => stat_data(4 * 32 - 1 downto 3 * 32),
GSC_REPLY_READ_OUT => GSC_REPLY_READ_OUT,
GSC_BUSY_IN => GSC_BUSY_IN,
+ MAKE_RESET_OUT => MAKE_RESET_OUT,
+
DEBUG_OUT => PROTOS_DEBUG_OUT(4 * 32 - 1 downto 3 * 32)
);
+--stat_gen : if g_SIMULATE = 0 generate
Stat : trb_net16_gbe_response_constructor_Stat
generic map( STAT_ADDRESS_BASE => 10
)
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),
+ TC_IP_SIZE_OUT => tc_ip_size(5 * 16 - 1 downto 4 * 16),
+ TC_UDP_SIZE_OUT => tc_udp_size(5 * 16 - 1 downto 4 * 16),
+ TC_FLAGS_OFFSET_OUT => tc_flags_size(5 * 16 - 1 downto 4 * 16),
+
TC_BUSY_IN => TC_BUSY_IN,
STAT_DATA_OUT => stat_data(5 * 32 - 1 downto 4 * 32),
STAT_DATA_RDY_IN => stat_rdy,
STAT_DATA_ACK_OUT => stat_ack
);
+--end generate;
--***************
-- DO NOT TOUCH, response selection logic
TC_SRC_IP_OUT <= (others => '0');
TC_SRC_UDP_OUT <= (others => '0');
TC_IP_PROTOCOL_OUT <= (others => '0');
+ TC_IP_SIZE_OUT <= (others => '0');
+ TC_UDP_SIZE_OUT <= (others => '0');
+ TC_FLAGS_OFFSET_OUT <= (others => '0');
PS_RESPONSE_READY_OUT <= '0';
selected <= (others => '0');
found := false;
TC_SRC_IP_OUT <= tc_src_ip((i + 1) * 32 - 1 downto i * 32);
TC_SRC_UDP_OUT <= tc_src_udp((i + 1) * 16 - 1 downto i * 16);
TC_IP_PROTOCOL_OUT <= tc_ip_proto((i + 1) * 8 - 1 downto i * 8);
+ TC_IP_SIZE_OUT <= tc_ip_size((i + 1) * 16 - 1 downto i * 16);
+ TC_UDP_SIZE_OUT <= tc_udp_size((i + 1) * 16 - 1 downto i * 16);
+ TC_FLAGS_OFFSET_OUT <= tc_flags_size((i + 1) * 16 - 1 downto i * 16);
PS_RESPONSE_READY_OUT <= '1';
selected(i) <= '1';
found := true;
TC_SRC_IP_OUT <= (others => '0');
TC_SRC_UDP_OUT <= (others => '0');
TC_IP_PROTOCOL_OUT <= (others => '0');
+ TC_IP_SIZE_OUT <= (others => '0');
+ TC_UDP_SIZE_OUT <= (others => '0');
+ TC_FLAGS_OFFSET_OUT <= (others => '0');
PS_RESPONSE_READY_OUT <= '0';
found := false;
end if;
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);
-
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
+
TC_BUSY_IN : in std_logic;
STAT_DATA_OUT : out std_logic_vector(31 downto 0);
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_IP_SIZE_OUT <= (others => '0'); -- doesn't matter
+TC_UDP_SIZE_OUT <= (others => '0'); -- doesn't matter
+TC_FLAGS_OFFSET_OUT <= (others => '0'); -- doesn't matter
+
-- **** statistice
REC_FRAMES_PROC : process(CLK)
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);
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
TC_BUSY_IN : in std_logic;
-- fixed sizes for discover and request messages
TC_FRAME_SIZE_OUT <= x"0103" when (main_current_state = SENDING_DISCOVER) else x"0109";
+TC_IP_SIZE_OUT <= x"0103" when (main_current_state = SENDING_DISCOVER) else x"0109";
+TC_UDP_SIZE_OUT <= x"0103" when (main_current_state = SENDING_DISCOVER) else x"0109";
-TC_FRAME_TYPE_OUT <= x"0008"; -- frame type: ip
+TC_FRAME_TYPE_OUT <= x"0008"; -- frame type: ip
+
+TC_FLAGS_OFFSET_OUT <= (others => '0'); -- doesn't matter
-- **** statistics
REC_FRAMES_PROC : process(CLK)
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);
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
TC_BUSY_IN : in std_logic;
+
STAT_DATA_OUT : out std_logic_vector(31 downto 0);
STAT_ADDR_OUT : out std_logic_vector(7 downto 0);
STAT_DATA_RDY_OUT : out std_logic;
PS_RESPONSE_READY_OUT <= '1' when (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = LOAD_FRAME or dissect_current_state = CLEANUP) else '0';
TC_FRAME_SIZE_OUT <= std_logic_vector(to_unsigned(data_length, 16));
+TC_IP_SIZE_OUT <= std_logic_vector(to_unsigned(data_length, 16));
+TC_UDP_SIZE_OUT <= std_logic_vector(to_unsigned(data_length, 16));
TC_FRAME_TYPE_OUT <= x"0008";
TC_DEST_UDP_OUT <= x"0000"; -- not used
TC_SRC_IP_OUT <= g_MY_IP;
TC_SRC_UDP_OUT <= x"0000"; -- not used
TC_IP_PROTOCOL_OUT <= X"01"; -- ICMP
+TC_FLAGS_OFFSET_OUT <= (others => '0'); -- doesn't matter
ADDR_PROC : process(CLK)
begin
end if;
end process STATS_MACHINE_PROC;
-STATS_MACHINE : process(stats_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, STAT_DATA_ACK_IN, PS_DATA_IN,dissect_current_state, dissect_current_state)
+STATS_MACHINE : process(stats_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, STAT_DATA_ACK_IN, PS_DATA_IN, dissect_current_state)
begin
case (stats_current_state) is
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);
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
TC_BUSY_IN : in std_logic;
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;
+ MAKE_RESET_OUT : out std_logic;
-- end of protocol specific ports
-- debug
attribute syn_encoding : string;
-type dissect_states is (IDLE, READ_FRAME, WAIT_FOR_HUB, LOAD_TO_HUB, WAIT_FOR_RESPONSE, SAVE_RESPONSE, LOAD_FRAME, WAIT_FOR_LOAD, CLEANUP);
+type dissect_states is (IDLE, READ_FRAME, WAIT_FOR_HUB, LOAD_TO_HUB, WAIT_FOR_RESPONSE, SAVE_RESPONSE, LOAD_FRAME, DIVIDE, WAIT_FOR_LOAD, CLEANUP, WAIT_FOR_LOAD_ACK, LOAD_ACK);
signal dissect_current_state, dissect_next_state : dissect_states;
attribute syn_encoding of dissect_current_state: signal is "safe,gray";
signal tx_data_ctr : std_logic_vector(15 downto 0);
signal tx_loaded_ctr : std_logic_vector(15 downto 0);
+signal tx_frame_loaded : std_logic_vector(15 downto 0);
signal packet_num : std_logic_vector(2 downto 0);
signal rx_full, tx_full : std_logic;
+signal size_left : std_logic_vector(15 downto 0);
+
+signal make_reset : std_logic;
+
begin
+make_reset <= '0';
+
receive_fifo : fifo_2048x8x16
PORT map(
Reset => RESET,
(dissect_current_state = WAIT_FOR_HUB) else '0';
GSC_INIT_DATAREADY_OUT <= gsc_init_dataready;
-transmit_fifo : fifo_1024x16x8
+transmit_fifo : fifo_65536x18x9 --fifo_1024x16x8
PORT map(
Reset => RESET,
RPReset => RESET,
tx_fifo_wr <= '1' when GSC_REPLY_DATAREADY_IN = '1' and gsc_reply_read = '1' else '0';
tx_fifo_rd <= '1' when TC_RD_EN_IN = '1' and dissect_current_state = LOAD_FRAME else '0';
-TC_DATA_OUT(7 downto 0) <= tx_fifo_q(7 downto 0) when dissect_current_state = LOAD_FRAME else (others => '0');
-TC_DATA_OUT(8) <= '1' when tx_loaded_ctr = tx_data_ctr and dissect_current_state = LOAD_FRAME else '0';
+TC_DATA_PROC : process(dissect_current_state, tx_loaded_ctr, tx_data_ctr)
+begin
+ if (dissect_current_state = LOAD_FRAME) then
+ TC_DATA_OUT(7 downto 0) <= tx_fifo_q(7 downto 0);
+ if (tx_loaded_ctr = tx_data_ctr or tx_frame_loaded = g_MAX_FRAME_SIZE - x"1") then
+ TC_DATA_OUT(8) <= '1';
+ else
+ TC_DATA_OUT(8) <= '0';
+ end if;
+ elsif (dissect_current_state = LOAD_ACK) then
+ TC_DATA_OUT(7 downto 0) <= tx_loaded_ctr(7 downto 0);
+ if (tx_loaded_ctr = x"0010" - x"1") then
+ TC_DATA_OUT(8) <= '1';
+ else
+ TC_DATA_OUT(8) <= '0';
+ end if;
+ else
+ TC_DATA_OUT <= (others => '0');
+ end if;
+end process TC_DATA_PROC;
+--TC_DATA_OUT(7 downto 0) <= tx_fifo_q(7 downto 0) when dissect_current_state = LOAD_FRAME else (others => '0');
+--TC_DATA_OUT(8) <= '1' when ((tx_loaded_ctr = tx_data_ctr or tx_frame_loaded = g_MAX_FRAME_SIZE - x"1") and dissect_current_state = LOAD_FRAME) else '0';
GSC_REPLY_READ_OUT <= gsc_reply_read;
gsc_reply_read <= '1' when dissect_current_state = WAIT_FOR_RESPONSE or dissect_current_state = SAVE_RESPONSE else '0';
+-- counter of data received from TRBNet hub
TX_DATA_CTR_PROC : process(CLK)
begin
if rising_edge(CLK) then
end if;
end process TX_DATA_CTR_PROC;
+-- total counter of data transported to frame constructor
TX_LOADED_CTR_PROC : process(CLK)
begin
if rising_edge(CLK) then
- if (RESET = '1' or dissect_current_state = IDLE) then
+ if (RESET = '1' or dissect_current_state = IDLE or dissect_current_state = WAIT_FOR_HUB) then
tx_loaded_ctr <= (others => '0');
elsif (dissect_current_state = LOAD_FRAME and TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1') then
tx_loaded_ctr <= tx_loaded_ctr + x"1";
+ elsif (dissect_current_state = LOAD_ACK and TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1') then
+ tx_loaded_ctr <= tx_loaded_ctr + x"1";
end if;
end if;
end process TX_LOADED_CTR_PROC;
PS_BUSY_OUT <= '0' when (dissect_current_state = IDLE) else '1';
-PS_RESPONSE_READY_OUT <= '1' when (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = LOAD_FRAME or dissect_current_state = CLEANUP) else '0';
+PS_RESPONSE_READY_OUT <= '1' when (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = LOAD_FRAME or
+ dissect_current_state = CLEANUP or dissect_current_state = WAIT_FOR_LOAD_ACK or
+ dissect_current_state = LOAD_ACK or dissect_current_state = DIVIDE)
+ else '0';
+--PS_RESPONSE_READY_OUT <= '1' when (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = LOAD_FRAME or
+-- dissect_current_state = CLEANUP or dissect_current_state = DIVIDE)
+-- else '0';
-TC_FRAME_SIZE_OUT <= tx_data_ctr;
+--TC_FRAME_SIZE_OUT <= tx_data_ctr;
TC_FRAME_TYPE_OUT <= x"0008";
TC_DEST_MAC_OUT <= PS_SRC_MAC_ADDRESS_IN;
TC_DEST_IP_OUT <= PS_SRC_IP_ADDRESS_IN;
-TC_DEST_UDP_OUT <= PS_SRC_UDP_PORT_IN; --x"a861";
+TC_DEST_UDP_OUT <= x"a861";
TC_SRC_MAC_OUT <= g_MY_MAC;
TC_SRC_IP_OUT <= g_MY_IP;
TC_SRC_UDP_OUT <= x"a861";
-TC_IP_PROTOCOL_OUT <= X"11";
+TC_IP_PROTOCOL_OUT <= x"11";
+
+FRAME_SIZE_PROC : process(CLK)
+begin
+ if rising_edge(CLK) then
+ if (RESET = '1') then
+ TC_FRAME_SIZE_OUT <= (others => '0');
+ elsif (dissect_current_state = WAIT_FOR_LOAD or dissect_current_state = DIVIDE) then
+ if (size_left >= g_MAX_FRAME_SIZE) then
+ TC_FRAME_SIZE_OUT <= g_MAX_FRAME_SIZE;
+ else
+ TC_FRAME_SIZE_OUT <= size_left;
+ end if;
+ elsif (dissect_current_state = WAIT_FOR_LOAD_ACK) then
+ TC_FRAME_SIZE_OUT <= x"0010";
+ end if;
+ end if;
+end process FRAME_SIZE_PROC;
+
+IP_SIZE_PROC : process(CLK)
+begin
+ if rising_edge(CLK) then
+ if (RESET= '1') then
+ TC_IP_SIZE_OUT <= (others => '0');
+ elsif ((dissect_current_state = DIVIDE and TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1') or (dissect_current_state = WAIT_FOR_LOAD)) then
+ if (size_left >= g_MAX_FRAME_SIZE) then
+ TC_IP_SIZE_OUT <= g_MAX_FRAME_SIZE;
+ else
+ TC_IP_SIZE_OUT <= size_left(15 downto 0);
+ end if;
+ end if;
+ end if;
+end process IP_SIZE_PROC;
+TC_UDP_SIZE_OUT <= tx_data_ctr;
+
+
+TC_FLAGS_OFFSET_OUT(15 downto 14) <= "00";
+MORE_FRAGMENTS_PROC : process(CLK)
+begin
+ if rising_edge(CLK) then
+ if (RESET = '1') or (dissect_current_state = IDLE) or (dissect_current_state = CLEANUP) then
+ TC_FLAGS_OFFSET_OUT(13) <= '0';
+ elsif ((dissect_current_state = DIVIDE and TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') or (dissect_current_state = WAIT_FOR_LOAD)) then
+ if ((tx_data_ctr - tx_loaded_ctr) < g_MAX_FRAME_SIZE) then
+ TC_FLAGS_OFFSET_OUT(13) <= '0'; -- no more fragments
+ else
+ TC_FLAGS_OFFSET_OUT(13) <= '1'; -- more fragments
+ end if;
+ end if;
+ end if;
+end process MORE_FRAGMENTS_PROC;
+
+OFFSET_PROC : process(CLK)
+begin
+ if rising_edge(CLK) then
+ if (RESET = '1') or (dissect_current_state = IDLE) or (dissect_current_state = CLEANUP) then
+ TC_FLAGS_OFFSET_OUT(12 downto 0) <= (others => '0');
+ elsif (dissect_current_state = DIVIDE and TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') then
+ TC_FLAGS_OFFSET_OUT(12 downto 0) <= tx_loaded_ctr(15 downto 3);
+ end if;
+ end if;
+end process OFFSET_PROC;
PACKET_NUM_PROC : process(CLK)
begin
if rising_edge(CLK) then
if (RESET = '1') then
- dissect_current_state <= IDLE;
+ if (g_SIMULATE = 0) then
+ dissect_current_state <= IDLE;
+ else
+ dissect_current_state <= WAIT_FOR_RESPONSE;
+ end if;
else
dissect_current_state <= dissect_next_state;
end if;
end if;
end process DISSECT_MACHINE_PROC;
-DISSECT_MACHINE : process(dissect_current_state, PS_WR_EN_IN, PS_ACTIVATE_IN, PS_DATA_IN, TC_BUSY_IN, data_ctr, PS_SELECTED_IN, GSC_INIT_READ_IN, GSC_REPLY_DATAREADY_IN, tx_loaded_ctr, tx_data_ctr, rx_fifo_q, GSC_BUSY_IN)
+DISSECT_MACHINE : process(dissect_current_state, make_reset, PS_WR_EN_IN, PS_ACTIVATE_IN, PS_DATA_IN, TC_BUSY_IN, data_ctr, PS_SELECTED_IN, GSC_INIT_READ_IN, GSC_REPLY_DATAREADY_IN, tx_loaded_ctr, tx_data_ctr, rx_fifo_q, GSC_BUSY_IN, tx_frame_loaded, g_MAX_FRAME_SIZE)
begin
case dissect_current_state is
when READ_FRAME =>
state <= x"2";
if (PS_DATA_IN(8) = '1') then
- dissect_next_state <= WAIT_FOR_HUB;
+ if (make_reset = '1') then -- send ack only if reset command came
+ dissect_next_state <= WAIT_FOR_LOAD_ACK;
+ else
+ dissect_next_state <= WAIT_FOR_HUB;
+ end if;
else
dissect_next_state <= READ_FRAME;
end if;
+ when WAIT_FOR_LOAD_ACK =>
+ state <= x"a";
+ if (TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') then
+ dissect_next_state <= LOAD_ACK;
+ else
+ dissect_next_state <= WAIT_FOR_LOAD_ACK;
+ end if;
+
+ when LOAD_ACK =>
+ state <= x"b";
+ if (tx_loaded_ctr = x"0010") then
+ dissect_next_state <= WAIT_FOR_HUB;
+ else
+ dissect_next_state <= LOAD_ACK;
+ end if;
+
when WAIT_FOR_HUB =>
state <= x"3";
if (GSC_INIT_READ_IN = '1') then
state <= x"8";
if (tx_loaded_ctr = tx_data_ctr) then
dissect_next_state <= CLEANUP;
+ elsif (tx_frame_loaded = g_MAX_FRAME_SIZE - x"1") then
+ dissect_next_state <= DIVIDE;
else
dissect_next_state <= LOAD_FRAME;
end if;
+
+ when DIVIDE =>
+ state <= x"c";
+ if (TC_BUSY_IN = '0' and PS_SELECTED_IN = '1') then
+ dissect_next_state <= LOAD_FRAME;
+ else
+ dissect_next_state <= DIVIDE;
+ end if;
when CLEANUP =>
state <= x"9";
end case;
end process DISSECT_MACHINE;
+-- counter of bytes of currently constructed frame
+FRAME_LOADED_PROC : process(CLK)
+begin
+ if rising_edge(CLK) then
+ if (RESET = '1' or dissect_current_state = DIVIDE or dissect_current_state = IDLE) then
+ tx_frame_loaded <= (others => '0');
+ elsif (dissect_current_state = LOAD_FRAME and TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1') then
+ tx_frame_loaded <= tx_frame_loaded + x"1";
+ end if;
+ end if;
+end process FRAME_LOADED_PROC;
+
+-- counter down to 0 of bytes that have to be transmitted for a given packet
+SIZE_LEFT_PROC : process(CLK)
+begin
+ if rising_edge(CLK) then
+ if (RESET = '1' or dissect_current_state = SAVE_RESPONSE) then
+ size_left <= (others => '0');
+ elsif (dissect_current_state = WAIT_FOR_LOAD) then
+ size_left <= tx_data_ctr;
+ elsif (dissect_current_state = LOAD_FRAME and TC_RD_EN_IN = '1' and PS_SELECTED_IN = '1') then
+ size_left <= size_left - x"1";
+ end if;
+ end if;
+end process SIZE_LEFT_PROC;
+
+
+
+
+
+
+
+
-- statistics
TC_SRC_IP_OUT : out std_logic_vector(31 downto 0);
TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0);
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
+
TC_BUSY_IN : in std_logic;
STAT_DATA_OUT : out std_logic_vector(31 downto 0);
TC_SRC_UDP_OUT <= x"51c3";
TC_IP_PROTOCOL_OUT <= x"11"; -- udp
+TC_IP_SIZE_OUT <= x"0100";
+TC_UDP_SIZE_OUT <= x"0100";
+TC_FLAGS_OFFSET_OUT <= (others => '0');
+
end Behavioral;
MC_IP_PROTOCOL_IN : in std_logic_vector(7 downto 0);
+ MC_IP_SIZE_IN : in std_logic_vector(15 downto 0);
+ MC_UDP_SIZE_IN : in std_logic_vector(15 downto 0);
+ MC_FLAGS_OFFSET_IN : in std_logic_vector(15 downto 0);
+
MC_BUSY_OUT : out std_logic;
MC_TRANSMIT_DONE_OUT : out std_logic;
FC_EOD_OUT <= '0';
end if;
+ if (MC_FRAME_TYPE_IN = x"0008") then -- in case of ip
+ FC_IP_SIZE_OUT <= MC_IP_SIZE_IN;
+ FC_UDP_SIZE_OUT <= MC_UDP_SIZE_IN;
+ else
+ FC_IP_SIZE_OUT <= MC_FRAME_SIZE_IN;
+ FC_UDP_SIZE_OUT <= MC_FRAME_SIZE_IN;
+ end if;
- FC_IP_SIZE_OUT <= MC_FRAME_SIZE_IN;
- FC_UDP_SIZE_OUT <= MC_FRAME_SIZE_IN;
- FC_FLAGS_OFFSET_OUT <= (others => '0'); -- fixed to one-frame packets
+ FC_FLAGS_OFFSET_OUT <= MC_FLAGS_OFFSET_IN; --(others => '0'); -- fixed to one-frame packets
if (ctrl_construct_current_state = WAIT_FOR_FC) and (FC_H_READY_IN = '1') then
MC_RD_EN_OUT <= '1';
when LOAD_DATA =>
state2 <= x"3";
if (sent_bytes_ctr = MC_FRAME_SIZE_IN - x"1") then
- ctrl_construct_next_state <= CLOSE;
+ ctrl_construct_next_state <= CLOSE;
else
- ctrl_construct_next_state <= LOAD_DATA;
+ ctrl_construct_next_state <= LOAD_DATA;
end if;
when CLOSE =>
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;
+
+ MAKE_RESET_OUT : out std_logic;
-- for simulation of receiving part only
MAC_RX_EOF_IN : in std_logic;
TC_SRC_IP_OUT : out std_logic_vector(31 downto 0);
TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0);
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
+
TC_BUSY_IN : in std_logic;
-- counters from response constructors
GSC_REPLY_READ_OUT : out std_logic;
GSC_BUSY_IN : in std_logic;
+ MAKE_RESET_OUT : out std_logic;
+
-- input for statistics from outside
STAT_DATA_IN : in std_logic_vector(31 downto 0);
STAT_ADDR_IN : in std_logic_vector(7 downto 0);
TC_SRC_IP_OUT : out std_logic_vector(31 downto 0);
TC_SRC_UDP_OUT : out std_logic_vector(15 downto 0);
- TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0);
+ TC_IP_PROTOCOL_OUT : out std_logic_vector(7 downto 0);
+
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
TC_BUSY_IN : in std_logic;
TC_TRANSMIT_DONE_IN : in std_logic;
GSC_REPLY_READ_OUT : out std_logic;
GSC_BUSY_IN : in std_logic;
+ MAKE_RESET_OUT : out std_logic;
+
-- signal to/from Host interface of TriSpeed MAC
TSM_HADDR_OUT : out std_logic_vector(7 downto 0);
TSM_HDATA_OUT : out std_logic_vector(7 downto 0);
MC_IP_PROTOCOL_IN : in std_logic_vector(7 downto 0);
+ MC_IP_SIZE_IN : in std_logic_vector(15 downto 0);
+ MC_UDP_SIZE_IN : in std_logic_vector(15 downto 0);
+ MC_FLAGS_OFFSET_IN : in std_logic_vector(15 downto 0);
+
MC_BUSY_OUT : out std_logic;
MC_TRANSMIT_DONE_OUT : out std_logic;
);
end component;
+component fifo_65536x18x9 is
+port(
+ Data : in std_logic_vector(17 downto 0);
+ WrClock : in std_logic;
+ RdClock : in std_logic;
+ WrEn : in std_logic;
+ RdEn : in std_logic;
+ Reset : in std_logic;
+ RPReset : in std_logic;
+ Q : out std_logic_vector(8 downto 0);
+ Empty : out std_logic;
+ Full : out std_logic
+);
+end component;
+
component fifo_2048x8x16 is
port(
Data : in std_logic_vector(8 downto 0);
-- g_MY_MAC is being set by Main Controller
signal g_MY_MAC : std_logic_vector(47 downto 0);
+-- size of ethernet frame use for fragmentation of outgoing packets
+signal g_MAX_FRAME_SIZE : std_logic_vector(15 downto 0) := x"0578";
+
constant c_MAX_FRAME_TYPES : integer range 1 to 16 := 2;
constant c_MAX_PROTOCOLS : integer range 1 to 16 := 5;
constant c_MAX_IP_PROTOCOLS : integer range 1 to 16 := 2;
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);
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
TC_BUSY_IN : in std_logic;
STAT_DATA_OUT : out std_logic_vector(31 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);
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
TC_BUSY_IN : in std_logic;
STAT_DATA_OUT : out std_logic_vector(31 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);
-
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
TC_BUSY_IN : in std_logic;
STAT_DATA_OUT : out std_logic_vector(31 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);
-
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
TC_BUSY_IN : in std_logic;
STAT_DATA_OUT : out std_logic_vector(31 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;
+ MAKE_RESET_OUT : out std_logic;
-- end of protocol specific ports
-- debug
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);
-
+ TC_IP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_UDP_SIZE_OUT : out std_logic_vector(15 downto 0);
+ TC_FLAGS_OFFSET_OUT : out std_logic_vector(15 downto 0);
TC_BUSY_IN : in std_logic;
STAT_DATA_OUT : out std_logic_vector(31 downto 0);