-- WAP
WA_POS_OUT => wa_position_i,
WA_READ_OUT => wa_read_i, --open,
- LINK_RX_READY_IN => '0', -- BUG
+ LINK_RX_READY_IN => '0', -- NOT REALLY NEEDED
--Slowcontrol
BUS_RX => BUS_RX,
BUS_TX => BUS_TX,
STAT_DEBUG(3 downto 0) <= clk_rx_full(3 downto 0);
STAT_DEBUG(7 downto 4) <= clk_tx_full(3 downto 0);
STAT_DEBUG(63 downto 8) <= (others => '0');
-
+
+ -- SerDes #3 is used for debugging
DEBUG_OUT <= debug_i(3*32+31 downto 3*32);
--- DEBUG_OUT(11 downto 0) <= debug_i(3*32+11 downto 3*32);
--- DEBUG_OUT(12) <= debug_i(3*32+12); --debug_tx_control_i(3*32+4);
--- DEBUG_OUT(13) <= debug_i(3*32+13); --debug_tx_control_i(3*32+5);
--- DEBUG_OUT(14) <= debug_i(3*32+14); --debug_tx_control_i(3*32+30);
--- DEBUG_OUT(15) <= debug_i(3*32+15); --debug_tx_control_i(3*32+31);
--- DEBUG_OUT(31 downto 16) <= debug_i(3*32+31 downto 3*32+16);
end architecture;
SD_LOS_IN => SFP_LOS_IN,
WAP_ZERO_IN => is_wap_zero_i,
-- outputs
- RX_SERDES_RST_OUT => rx_serdes_rst_i,
- RX_PCS_RST_OUT => rx_pcs_rst_i,
- LINK_RX_READY_OUT => link_rx_ready_i,
+ RX_SERDES_RST_OUT => rx_serdes_rst_i, -- CLK_REF based
+ RX_PCS_RST_OUT => rx_pcs_rst_i, -- CLK_REF based
+ LINK_RX_READY_OUT => link_rx_ready_i, -- CLK_REF based
STATE_OUT => rx_fsm_state
);
CLK_RXI => CLK_RXI,
RX_K_IN => RX_K_IN,
RX_DATA_IN => RX_DATA_IN,
- LINK_HALF_DONE_OUT => link_half_done_i,
- LINK_FULL_DONE_OUT => link_full_done_i,
+ LINK_HALF_DONE_OUT => link_half_done_i, -- CLK_RXI based
+ LINK_FULL_DONE_OUT => link_full_done_i, -- CLK_RXI based
STATE_OUT => rx_lsm_state --open
);
link_status <= x"0" when ((link_half_done_i = '1') and (link_full_done_i = '1'))
else x"7";
-
+
SYNC_MEDIA_SIGS : entity work.signal_sync
generic map(
WIDTH => 6,
RX_RST_WORD_OUT : out std_logic_vector(7 downto 0);\r
-- link status signals\r
LINK_RX_READY_IN : in std_logic;\r
- LINK_TX_READY_IN : in std_logic;\r
- LINK_HALF_DONE_IN : in std_logic;\r
+ LINK_TX_READY_IN : in std_logic; -- unused\r
+ LINK_HALF_DONE_IN : in std_logic; -- unused\r
LINK_FULL_DONE_IN : in std_logic;\r
-- debug\r
DEBUG_OUT : out std_logic_vector(31 downto 0);\r
\r
signal reset_ctr_t : std_logic;\r
signal ce_ctr_t : std_logic;\r
+ signal ce_ctr_t_q : std_logic;\r
signal ctr_t : unsigned(4 downto 0);\r
signal ctr_t_done : std_logic;\r
signal reset_ctr_s : std_logic;\r
signal ce_ctr_s : std_logic;\r
+ signal ce_ctr_s_q : std_logic;\r
signal ctr_s : unsigned(4 downto 0);\r
signal ctr_s_done : std_logic;\r
signal link_toggling_int : std_logic;\r
\r
THE_CTR_T_PROC: process( CLK_RXI, LINK_RX_READY_IN ) \r
begin\r
- if ( LINK_RX_READY_IN <= '0' ) then\r
+ if( LINK_RX_READY_IN = '0' ) then\r
ctr_t <= (others => '0');\r
elsif( rising_edge(CLK_RXI) ) then\r
if( reset_ctr_t = '1' ) then\r
ctr_t <= (others => '0');\r
- else\r
- if( (ctr_t(4) = '0') and (ce_ctr_t = '1') ) then\r
- ctr_t <= ctr_t + 1 ;\r
- end if;\r
+ elsif( (ctr_t_done = '0') and (ce_ctr_t_q = '1') ) then\r
+ ctr_t <= ctr_t + 1 ;\r
end if;\r
end if;\r
end process THE_CTR_T_PROC;\r
\r
THE_CTR_S_PROC: process( CLK_RXI, LINK_RX_READY_IN ) \r
begin\r
- if ( LINK_RX_READY_IN = '0' ) then\r
+ if( LINK_RX_READY_IN = '0' ) then\r
ctr_s <= (others => '0');\r
elsif( rising_edge(CLK_RXI) ) then\r
if( reset_ctr_s = '1' ) then\r
ctr_s <= (others => '0');\r
- else\r
- if( (ctr_s(4) = '0') and (ce_ctr_s = '1') and (ctr_t_done = '1') ) then -- added to make sure correct sequence is done\r
- ctr_s <= ctr_s + 1 ;\r
- end if;\r
+ elsif( (ctr_s_done = '0') and (ce_ctr_s_q = '1') and (ctr_t_done = '1') ) then -- added to make sure correct sequence is done\r
+ ctr_s <= ctr_s + 1 ;\r
end if;\r
end if;\r
end process THE_CTR_S_PROC;\r
-- toggling idles sequence detected\r
THE_TOGGLE_DETECTED_PROC: process( CLK_RXI, LINK_RX_READY_IN )\r
begin\r
- if ( LINK_RX_READY_IN = '0' ) then\r
+ if( LINK_RX_READY_IN = '0' ) then\r
link_toggling_int <= '0';\r
elsif( rising_edge(CLK_RXI) ) then\r
- if( ctr_t_done = '1' ) then\r
+ if( (ce_ctr_t_q = '1') and (ctr_t_done = '1') ) then\r
link_toggling_int <= '1';\r
end if; \r
end if;\r
-- steady idles sequence detected\r
THE_STEADY_DETECTED_PROC: process( CLK_RXI, LINK_RX_READY_IN )\r
begin\r
- if ( LINK_RX_READY_IN = '0' ) then\r
+ if( LINK_RX_READY_IN = '0' ) then\r
link_steady_int <= '0';\r
elsif( rising_edge(CLK_RXI) ) then\r
- if( ctr_s_done = '1' ) then\r
+ if( (ce_ctr_s_q = '1') and (ctr_s_done = '1') ) then\r
link_steady_int <= '1';\r
end if; \r
end if;\r
begin\r
if( LINK_RX_READY_IN = '0' ) then\r
CURRENT_STATE <= IDLE;\r
- else\r
- if( rising_edge(CLK_RXI) ) then\r
- CURRENT_STATE <= NEXT_STATE;\r
- end if;\r
+ ce_ctr_t_q <= '0';\r
+ ce_ctr_s_q <= '0';\r
+ elsif( rising_edge(CLK_RXI) ) then\r
+ CURRENT_STATE <= NEXT_STATE;\r
+ ce_ctr_t_q <= ce_ctr_t;\r
+ ce_ctr_s_q <= ce_ctr_s;\r
end if;\r
end process THE_FSM_PROC;\r
\r
STATE_OUT <= x"3";\r
if ( (RX_K_IN = '0') and (RX_DATA_IN = D_IDLE1) ) then\r
NEXT_STATE <= D2FS;\r
+ ce_ctr_s <= '1';\r
elsif( (RX_K_IN = '0') and (RX_DATA_IN = D_IDLE0) ) then\r
NEXT_STATE <= D2FT;\r
+ ce_ctr_t <= '1';\r
else\r
NEXT_STATE <= IDLE;\r
end if;\r
STATE_OUT <= x"4";\r
if( (RX_K_IN = '1') and (RX_DATA_IN = K_IDLE) ) then\r
NEXT_STATE <= K1F;\r
- ce_ctr_t <= '1';\r
else\r
NEXT_STATE <= IDLE;\r
end if;\r
STATE_OUT <= x"5";\r
if( (RX_K_IN = '1') and (RX_DATA_IN = K_IDLE) ) then\r
NEXT_STATE <= K1F;\r
- ce_ctr_s <= '1';\r
else\r
NEXT_STATE <= IDLE;\r
end if;\r
\r
constant Tshort : unsigned(31 downto 0) := x"0000000a";\r
-- @200MHz 100ms\r
- constant Tplol : unsigned(31 downto 0) := x"01312d00"; --x"003fffff";\r
- constant Tcdr : unsigned(31 downto 0) := x"01312d00"; --x"003fffff";\r
- constant Tviol : unsigned(31 downto 0) := x"01312d00"; --x"003fffff";\r
+ constant Tplol : unsigned(31 downto 0) := x"003fffff"; --x"01312d00"; \r
+ constant Tcdr : unsigned(31 downto 0) := x"003fffff"; --x"01312d00"; \r
+ constant Tviol : unsigned(31 downto 0) := x"003fffff"; --x"01312d00"; \r
\r
signal pll_lol_s : std_logic;\r
signal cdr_lol_s : std_logic;\r
-- TX control state machine\r
----------------------------------------------------------------------\r
\r
- THE_DATA_CONTROL_FSM : process(CLK_TXI, LINK_TX_READY_IN, RESET)\r
+ THE_DATA_CONTROL_FSM : process(CLK_TXI, link_tx_ready_qtx, RESET)\r
begin\r
- if( (LINK_TX_READY_IN = '0') or (RESET = '1') ) then\r
+ if( RESET = '1' ) then\r
current_state <= IDLE;\r
TX_K_OUT <= '1';\r
TX_DATA_OUT <= K_NULL;\r
debug_sending_dlm <= '0';\r
debug_sending_rst <= '0';\r
case current_state is\r
+ when IDLE =>\r
+ TX_K_OUT <= '1';\r
+ TX_DATA_OUT <= K_NULL;\r
+ word_sync_i <= '0';\r
+ toggle_idle <= '1';\r
+ if( link_tx_ready_qtx = '1' ) then\r
+ current_state <= SEND_IDLE_L;\r
+ else\r
+ current_state <= IDLE;\r
+ end if;\r
+ \r
when SEND_IDLE_L =>\r
TX_DATA_OUT <= K_IDLE;\r
TX_K_OUT <= '1';\r
current_state <= SEND_RST_H;\r
debug_sending_rst <= '1';\r
\r
- when IDLE =>\r
- TX_DATA_OUT <= K_NULL;\r
- TX_K_OUT <= '1';\r
- current_state <= SEND_IDLE_L;\r
- -- used to get out of async reset\r
-\r
when SEND_RST_H =>\r
word_sync_i <= '1';\r
TX_DATA_OUT <= send_rst_word_i;\r