From 823c128618e92e4a239862ac719958147b8ce170 Mon Sep 17 00:00:00 2001 From: hadeshyp Date: Mon, 6 Sep 2010 16:41:18 +0000 Subject: [PATCH] *** empty log message *** --- gbe_ecp2m/ip_configurator.vhd | 5 ++ .../sgmii_gbe_pcs32/sgmii_gbe_pcs32.ngo | Bin 377069 -> 377069 bytes gbe_ecp2m/trb_net16_gbe_buf.vhd | 32 ++++++++++- gbe_ecp2m/trb_net16_gbe_frame_constr.vhd | 7 +-- gbe_ecp2m/trb_net16_gbe_frame_trans.vhd | 3 +- gbe_ecp2m/trb_net16_gbe_setup.vhd | 14 +++-- gbe_ecp2m/trb_net16_med_ecp_sfp_gbe_8b.vhd | 50 +++++++++--------- gbe_ecp2m/trb_net_gbe_components.vhd | 3 ++ 8 files changed, 81 insertions(+), 33 deletions(-) diff --git a/gbe_ecp2m/ip_configurator.vhd b/gbe_ecp2m/ip_configurator.vhd index 887f562..d6b0778 100755 --- a/gbe_ecp2m/ip_configurator.vhd +++ b/gbe_ecp2m/ip_configurator.vhd @@ -32,6 +32,11 @@ end entity; architecture ip_configurator of ip_configurator is +-- -- Placer Directives +-- attribute HGROUP : string; +-- -- for whole architecture +-- attribute HGROUP of ip_configurator : architecture is "GBE_conf_group"; + type STATES is (IDLE, LOAD_REG, DELAY0, DELAY1, DELAY2, LOAD_DONE); signal CURRENT_STATE, NEXT_STATE : STATES; signal bsm : std_logic_vector(3 downto 0); diff --git a/gbe_ecp2m/ipcores/sgmii_gbe_pcs32/sgmii_gbe_pcs32.ngo b/gbe_ecp2m/ipcores/sgmii_gbe_pcs32/sgmii_gbe_pcs32.ngo index 02c5feadedc095a637bc0f6231aab6f4894bc555..4bfd6e06e5be71df4f7969a47cabece5ca352283 100755 GIT binary patch delta 28120 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 delta 28136 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 owR7(pvm1eHg(oRnP z_G4$#ADq->{YKGiPPs|76RGQB monitor_lr, MONITOR_HDR_IN => monitor_hr, MONITOR_FIFOS_IN => monitor_fifos_q, + MONITOR_DISCFRM_IN => monitor_discfrm, -- gk 01.06.10 DBG_IPU2GBE1_IN => dbg_ipu2gbe1, DBG_IPU2GBE2_IN => dbg_ipu2gbe2, @@ -566,7 +570,6 @@ port map( STAT => open ); - -- First stage: get data from IPU channel, buffer it and terminate the IPU transmission to CTS THE_IPU_INTERFACE: trb_net16_ipu2gbe port map( @@ -733,6 +736,7 @@ port map( FT_TX_RD_EN_IN => mac_tx_read, FT_START_OF_PACKET_OUT => ft_start_of_packet, FT_TX_DONE_IN => mac_tx_done, + FT_TX_DISCFRM_IN => mac_tx_discfrm, -- debug ports BSM_CONSTR_OUT => fc_bsm_constr, BSM_TRANS_OUT => fc_bsm_trans, @@ -761,6 +765,7 @@ port map( TX_FIFOEOF_OUT => mac_fifoeof, TX_FIFOEMPTY_OUT => mac_fifoempty, TX_DONE_IN => mac_tx_done, + TX_DISCFRM_IN => mac_tx_discfrm, -- Debug BSM_INIT_OUT => ft_bsm_init, BSM_MAC_OUT => ft_bsm_mac, @@ -1053,6 +1058,31 @@ begin end if; end process BYTES_SENT_CTR_PROC; +-- gk 02.08.10 +DISCFRM_PROC : process(serdes_clk_125) +begin + if rising_edge(serdes_clk_125) then + if (RESET = '1') then + discfrm_ctr <= (others => '0'); + elsif (mac_tx_discfrm = '1') then + discfrm_ctr <= discfrm_ctr + x"1"; + end if; + end if; +end process DISCFRM_PROC; + +discfrm_sync : signal_sync + generic map( + DEPTH => 2, + WIDTH => 32 + ) + port map( + RESET => RESET, + D_IN => discfrm_ctr, + CLK0 => serdes_clk_125, + CLK1 => CLK, + D_OUT => monitor_discfrm + ); + -- reset_fifo <= '1' when RESET = '1' or pc_sos = '1' else '0'; -- diff --git a/gbe_ecp2m/trb_net16_gbe_frame_constr.vhd b/gbe_ecp2m/trb_net16_gbe_frame_constr.vhd index 9112acd..d4a7ddf 100755 --- a/gbe_ecp2m/trb_net16_gbe_frame_constr.vhd +++ b/gbe_ecp2m/trb_net16_gbe_frame_constr.vhd @@ -43,6 +43,7 @@ port( FT_TX_RD_EN_IN : in std_logic; FT_START_OF_PACKET_OUT : out std_logic; FT_TX_DONE_IN : in std_logic; + FT_TX_DISCFRM_IN : in std_logic; -- debug ports BSM_CONSTR_OUT : out std_logic_vector(7 downto 0); BSM_TRANS_OUT : out std_logic_vector(3 downto 0); @@ -437,7 +438,7 @@ begin end if; end process transmitMachineProc; -transmitMachine: process( transmitCurrentState, fpf_q, FT_TX_DONE_IN, sent_frames_ctr, ready_frames_ctr_q ) +transmitMachine: process( transmitCurrentState, fpf_q, FT_TX_DONE_IN, sent_frames_ctr, ready_frames_ctr_q, FT_TX_DISCFRM_IN ) begin case transmitCurrentState is when T_IDLE => @@ -457,7 +458,7 @@ begin when T_TRANSMIT => bsm_trans <= x"2"; -- gk 03.08.10 - if (LINK_OK_IN = '1') and (ft_tx_done_in = '1') then + if (LINK_OK_IN = '1') and ((ft_tx_done_in = '1') or (FT_TX_DISCFRM_IN = '1'))then transmitNextState <= T_CLEANUP; elsif (LINK_OK_IN = '0') then transmitNextState <= T_PAUSE; @@ -496,7 +497,7 @@ begin if ( RESET = '1' ) then sent_frames_ctr <= (others => '0'); -- gk 03.08.10 - elsif( ft_tx_done_in = '1' ) or (transmitCurrentState = T_PAUSE) then + elsif( ft_tx_done_in = '1' ) or (transmitCurrentState = T_PAUSE) or (FT_TX_DISCFRM_IN = '1') then sent_frames_ctr <= sent_frames_ctr + 1; end if; end if; diff --git a/gbe_ecp2m/trb_net16_gbe_frame_trans.vhd b/gbe_ecp2m/trb_net16_gbe_frame_trans.vhd index fd808c7..c8220fb 100755 --- a/gbe_ecp2m/trb_net16_gbe_frame_trans.vhd +++ b/gbe_ecp2m/trb_net16_gbe_frame_trans.vhd @@ -29,6 +29,7 @@ port ( TX_FIFOEOF_OUT : out std_logic; TX_FIFOEMPTY_OUT : out std_logic; TX_DONE_IN : in std_logic; + TX_DISCFRM_IN : in std_logic; -- Debug BSM_INIT_OUT : out std_logic_vector(3 downto 0); BSM_MAC_OUT : out std_logic_vector(3 downto 0); @@ -133,7 +134,7 @@ begin end if; when T_WAITFORFIFO => bsm_trans <= x"2"; - if (TX_DONE_IN = '1') or (LINK_OK_IN = '0') then -- gk 03.08.10 + if (TX_DONE_IN = '1') or (LINK_OK_IN = '0') or (TX_DISCFRM_IN = '1') then -- gk 03.08.10 transmitNextState <= T_IDLE; else transmitNextState <= T_WAITFORFIFO; diff --git a/gbe_ecp2m/trb_net16_gbe_setup.vhd b/gbe_ecp2m/trb_net16_gbe_setup.vhd index ea01a75..92076fc 100644 --- a/gbe_ecp2m/trb_net16_gbe_setup.vhd +++ b/gbe_ecp2m/trb_net16_gbe_setup.vhd @@ -47,7 +47,9 @@ port( MONITOR_DROPPED_IN : in std_logic_vector(31 downto 0); MONITOR_SM_IN : in std_logic_vector(31 downto 0); MONITOR_LR_IN : in std_logic_vector(31 downto 0); - MONITOR_HDR_IN : in std_logic_vector(31 downto 0); + MONITOR_HDR_IN : in std_logic_vector(31 downto 0); + MONITOR_FIFOS_IN : in std_logic_vector(31 downto 0); + MONITOR_DISCFRM_IN : in std_logic_vector(31 downto 0); -- gk 01.06.10 DBG_IPU2GBE1_IN : in std_logic_vector(31 downto 0); DBG_IPU2GBE2_IN : in std_logic_vector(31 downto 0); @@ -77,7 +79,7 @@ architecture gbe_setup of gbe_setup is -- -- Placer Directives -- attribute HGROUP : string; -- -- for whole architecture --- attribute HGROUP of gbe_setup : architecture is "GBE_setup_group"; +-- attribute HGROUP of gbe_setup : architecture is "GBE_conf_group"; signal reset_values : std_logic; @@ -148,7 +150,7 @@ begin max_packet <= x"0000_fde8"; -- 65k --x"0000_fde8"; -- tester min_packet <= x"0000_0008"; -- gk 20.07.10 max_frame <= x"0578"; - use_gbe <= '1'; + use_gbe <= '0'; --'1'; -- gk 27.08.10 -- blocks the transmission until gbe gets configured use_trbnet <= '0'; use_multievents <= '0'; reset_values <= '0'; @@ -392,6 +394,12 @@ begin when x"f8" => data_out <= MONITOR_HDR_IN; + when x"f9" => + data_out <= MONITOR_FIFOS_IN; + + when x"fa" => + data_out <= MONITOR_DISCFRM_IN; + when others => data_out <= (others => '0'); end case; diff --git a/gbe_ecp2m/trb_net16_med_ecp_sfp_gbe_8b.vhd b/gbe_ecp2m/trb_net16_med_ecp_sfp_gbe_8b.vhd index fe9069c..f7b381a 100755 --- a/gbe_ecp2m/trb_net16_med_ecp_sfp_gbe_8b.vhd +++ b/gbe_ecp2m/trb_net16_med_ecp_sfp_gbe_8b.vhd @@ -18,8 +18,8 @@ port( CLK_125_OUT : out std_logic; CLK_125_IN : in std_logic; -- gk 28.04.10 used when intclk --SGMII connection to frame transmitter (tsmac) - FT_TX_CLK_EN_OUT : out std_logic; - FT_RX_CLK_EN_OUT : out std_logic; + FT_TX_CLK_EN_OUT : out std_logic; + FT_RX_CLK_EN_OUT : out std_logic; FT_COL_OUT : out std_logic; FT_CRS_OUT : out std_logic; FT_TXD_IN : in std_logic_vector(7 downto 0); @@ -28,22 +28,22 @@ port( --SFP Connection SD_RXD_P_IN : in std_logic; SD_RXD_N_IN : in std_logic; - SD_TXD_P_OUT : out std_logic; - SD_TXD_N_OUT : out std_logic; - SD_REFCLK_P_IN : in std_logic; - SD_REFCLK_N_IN : in std_logic; - SD_PRSNT_N_IN : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted) + SD_TXD_P_OUT : out std_logic; + SD_TXD_N_OUT : out std_logic; + SD_REFCLK_P_IN : in std_logic; + SD_REFCLK_N_IN : in std_logic; + SD_PRSNT_N_IN : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted) SD_LOS_IN : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal) - SD_TXDIS_OUT : out std_logic; -- SFP disable + SD_TXDIS_OUT : out std_logic; -- SFP disable -- Autonegotiation stuff MR_RESET_IN : in std_logic; MR_MODE_IN : in std_logic; - MR_ADV_ABILITY_IN : in std_logic_vector(15 downto 0); -- should be x"0020 - MR_AN_LP_ABILITY_OUT : out std_logic_vector(15 downto 0); -- advert page from link partner - MR_AN_PAGE_RX_OUT : out std_logic; - MR_AN_COMPLETE_OUT : out std_logic; - MR_AN_ENABLE_IN : in std_logic; - MR_RESTART_AN_IN : in std_logic; + MR_ADV_ABILITY_IN : in std_logic_vector(15 downto 0); -- should be x"0020 + MR_AN_LP_ABILITY_OUT : out std_logic_vector(15 downto 0); -- advert page from link partner + MR_AN_PAGE_RX_OUT : out std_logic; + MR_AN_COMPLETE_OUT : out std_logic; + MR_AN_ENABLE_IN : in std_logic; + MR_RESTART_AN_IN : in std_logic; -- Status and control port STAT_OP : out std_logic_vector (15 downto 0); CTRL_OP : in std_logic_vector (15 downto 0); @@ -248,23 +248,23 @@ begin THE_RESET_STATEMACHINE: trb_net16_lsm_sfp_gbe port map( SYSCLK => refclkcore, - RESET => '0', -- really? - CLEAR => RESET, -- from 100MHz PLL, includes async part + RESET => '0', -- really? + CLEAR => RESET, -- from 100MHz PLL, includes async part -- status signals - SFP_MISSING_IN => SD_PRSNT_N_IN, + SFP_MISSING_IN => SD_PRSNT_N_IN, SFP_LOS_IN => SD_LOS_IN, SD_LINK_OK_IN => '1', -- not used - SD_LOS_IN => '0', -- not used - SD_TXCLK_BAD_IN => sd_link_error(2), -- plol - SD_RXCLK_BAD_IN => sd_link_error(1), -- rlol + SD_LOS_IN => '0', -- not used + SD_TXCLK_BAD_IN => sd_link_error(2), -- plol + SD_RXCLK_BAD_IN => sd_link_error(1), -- rlol -- control signals - FULL_RESET_OUT => quad_rst, - LANE_RESET_OUT => lane_rst, - USER_RESET_OUT => user_rst, + FULL_RESET_OUT => quad_rst, + LANE_RESET_OUT => lane_rst, + USER_RESET_OUT => user_rst, -- debug signals - TIMING_CTR_OUT => open, + TIMING_CTR_OUT => open, BSM_OUT => reset_bsm, - DEBUG_OUT => reset_debug + DEBUG_OUT => reset_debug ); -- gk 28.04.10 diff --git a/gbe_ecp2m/trb_net_gbe_components.vhd b/gbe_ecp2m/trb_net_gbe_components.vhd index 72c6885..b329b0d 100644 --- a/gbe_ecp2m/trb_net_gbe_components.vhd +++ b/gbe_ecp2m/trb_net_gbe_components.vhd @@ -125,6 +125,7 @@ port( FT_TX_RD_EN_IN : in std_logic; FT_START_OF_PACKET_OUT : out std_logic; FT_TX_DONE_IN : in std_logic; + FT_TX_DISCFRM_IN : in std_logic; -- debug ports BSM_CONSTR_OUT : out std_logic_vector(7 downto 0); BSM_TRANS_OUT : out std_logic_vector(3 downto 0); @@ -153,6 +154,7 @@ port ( TX_FIFOEOF_OUT : out std_logic; TX_FIFOEMPTY_OUT : out std_logic; TX_DONE_IN : in std_logic; + TX_DISCFRM_IN : in std_logic; -- Debug BSM_INIT_OUT : out std_logic_vector(3 downto 0); BSM_MAC_OUT : out std_logic_vector(3 downto 0); @@ -246,6 +248,7 @@ port( MONITOR_LR_IN : in std_logic_vector(31 downto 0); MONITOR_HDR_IN : in std_logic_vector(31 downto 0); MONITOR_FIFOS_IN : in std_logic_vector(31 downto 0); + MONITOR_DISCFRM_IN : in std_logic_vector(31 downto 0); -- gk 01.06.10 DBG_IPU2GBE1_IN : in std_logic_vector(31 downto 0); DBG_IPU2GBE2_IN : in std_logic_vector(31 downto 0); -- 2.43.0