1 --//////////////////////////////////////////////////////////////////////////////// 4 --// /___/ \ / Vendor: Xilinx 5 --// \ \ \/ Version : 3.0 6 --// \ \ Application : 7 Series FPGAs Transceivers Wizard 7 --// / / Filename : gtwizard_0_rx_startup_fsm.vhd 13 -- Description : This module performs RX reset and initialization. 17 -- Module gtwizard_0_rx_startup_fsm 18 -- Generated by Xilinx 7 Series FPGAs Transceivers Wizard 21 -- (c) Copyright 2010-2012 Xilinx, Inc. All rights reserved. 23 -- This file contains confidential and proprietary information 24 -- of Xilinx, Inc. and is protected under U.S. and 25 -- international copyright and other intellectual property 29 -- This disclaimer is not a license and does not grant any 30 -- rights to the materials distributed herewith. Except as 31 -- otherwise provided in a valid license issued to you by 32 -- Xilinx, and to the maximum extent permitted by applicable 33 -- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND 34 -- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES 35 -- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING 36 -- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- 37 -- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and 38 -- (2) Xilinx shall not be liable (whether in contract or tort, 39 -- including negligence, or under any other theory of 40 -- liability) for any loss or damage of any kind or nature 41 -- related to, arising under or in connection with these 42 -- materials, including for any direct, or any indirect, 43 -- special, incidental, or consequential loss or damage 44 -- (including loss of data, profits, goodwill, or any type of 45 -- loss or damage suffered as a result of any action brought 46 -- by a third party) even if such damage or loss was 47 -- reasonably foreseeable or Xilinx had been advised of the 48 -- possibility of the same. 50 -- CRITICAL APPLICATIONS 51 -- Xilinx products are not designed or intended to be fail- 52 -- safe, or for use in any application requiring fail-safe 53 -- performance, such as life-support or safety devices or 54 -- systems, Class III medical devices, nuclear facilities, 55 -- applications related to the deployment of airbags, or any 56 -- other applications that could lead to death, personal 57 -- injury, or severe property or environmental damage 58 -- (individually and collectively, "Critical 59 -- Applications"). Customer assumes the sole risk and 60 -- liability of any use of Xilinx products in Critical 61 -- Applications, subject only to applicable laws and 62 -- regulations governing limitations on product liability. 64 -- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS 65 -- PART OF THIS FILE AT ALL TIMES. 68 --***************************************************************************** 71 use ieee.std_logic_1164.
all;
72 use ieee.std_logic_arith.
all;
73 use ieee.std_logic_unsigned.
all;
76 --! @ingroup xilinx_7Series_gtp7 81 STABLE_CLOCK_PERIOD : range 4 to 20 := 8;
--Period of the stable clock driving this state-machine, unit is [ns] 84 RX_PLL0_USED : := false -- share these two generic values 86 port (STABLE_CLOCK : in ;
--Stable Clock, either a stable clock from the PCB 87 --or reference-clock present at startup. 94 PLL0LOCK : in ;
--Lock Detect from the PLL0 of the GT 95 PLL1LOCK : in ;
--Lock Detect from the PLL1 of the GT 117 -- Retries it took to get the transceiver up and running 122 -- * Timing depends on the frequency of the stable clock. Hence counters-sizes 123 -- are calculated at design-time based on the Generics 125 -- * if either of the PLLs is reset during TX-startup, it does not need to be reset again by RX 126 -- => signal which PLL has been reset 131 INIT, ASSERT_ALL_RESETS, RELEASE_PLL_RESET, VERIFY_RECCLK_STABLE, 132 RELEASE_MMCM_RESET, WAIT_RESET_DONE, DO_PHASE_ALIGNMENT, 133 MONITOR_DATA_VALID, FSM_DONE);
138 constant STARTUP_DELAY : := 500;
--AR43482: Transceiver needs to wait for 500 ns after configuration 169 signal time_out_2ms : := '0';
--\Flags that the various time-out points 191 constant MAX_WAIT_BYPASS : := 5000;
--5000 RXUSRCLK cycles is the max time for Multi lanes designs 208 signal fsmCnt : (15 downto 0) := (others => '0');
212 --Alias section, signals used within this module mapped to output ports: 222 -- The counter starts running when configuration has finished and 223 -- the clock is stable. When its maximum count-value has been reached, 224 -- the 500 ns from Answer Record 43482 have been passed. 233 -- Synchronize PMARESETDONE to STABLE_CLOCK 256 --This counter monitors, how many retries the RECCLK monitor 257 --runs. If during startup too many retries are necessary, the whole 258 --initialisation-process of the transceivers gets restarted. 275 -- One common large counter for generating three time-out signals. 276 -- Intermediate time-outs are derived from calculated values, based 277 -- on the period of the provided clock. 316 --The lock-signal from the MMCM is not immediately used but 317 --enabling a counter. Only when the counter hits its maximum, 318 --the MMCM is considered as "really" locked. 319 --The counter avoids that the FSM already starts on only a 320 --coarse lock of the MMCM (=toggling of the LOCK-signal). 336 -- Clock Domain Crossing 459 -- Phase aligner might run on rxusrclk in some cases 460 -- Synchronize it just in case 461 Synchronizer_PHALIGNMENT_DONE :
entity work.
Synchronizer 490 --FSM for resetting the GTX/GTH/GTP in the 7-series. 491 --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 -- Following steps are performed: 494 -- 1) After configuration wait for approximately 500 ns as specified in 495 -- answer-record 43482 496 -- 2) Assert all resets on the GT and on an MMCM potentially connected. 497 -- After that wait until a reference-clock has been detected. 498 -- 3) Release the reset to the GT and wait until the GT-PLL has locked. 499 -- 4) Release the MMCM-reset and wait until the MMCM has signalled lock. 500 -- Also get info from the TX-side which PLL has been reset. 501 -- 5) Wait for the RESET_DONE-signal from the GT. 502 -- 6) Signal to start the phase-alignment procedure and wait for it to 504 -- 7) Reset-sequence has successfully run through. Signal this to the 505 -- rest of the design by asserting RX_FSM_RESET_DONE. 529 fsmCnt <= (others => '0');
535 --Initial state after configuration. This state will be left after 536 --approx. 500 ns and not be re-entered. 541 when ASSERT_ALL_RESETS => 542 --This is the state into which the FSM will always jump back if any 543 --time-outs will occur. 544 --The number of retries is reported on the output RETRY_COUNTER. In 545 --case the transceiver never comes up for some reason, this machine 546 --will still continue its best and rerun until the FPGA is turned off 547 --or the transceivers come up correctly. 579 when RELEASE_PLL_RESET => 580 --PLL-Reset of the GTX gets released and the time-out counter 599 -- If too many retries are performed compared to what is specified in 600 -- the generic, the counter simply wraps around. 608 when VERIFY_RECCLK_STABLE => 609 --reset_time_out <= '0'; 610 --Time-out counter is not released in this state as here the FSM 611 --does not wait for a certain period of time but checks on the number 612 --of retries in the RECCLK monitor 621 --If two retries are performed in the RECCLK monitor 622 --the whole initialisation-sequence gets restarted. 624 -- If too many retries are performed compared to what is specified in 625 -- the generic, the counter simply wraps around. 633 when RELEASE_MMCM_RESET => 634 --Release of the MMCM-reset. Waiting for the MMCM to lock. 649 -- If too many retries are performed compared to what is specified in 650 -- the generic, the counter simply wraps around. 658 when WAIT_RESET_DONE => 659 --When TXOUTCLK is the source for RXUSRCLK, RXUSERRDY depends on TXUSERRDY 660 --If RXOUTCLK is the source for RXUSRCLK, TXUSERRDY can be tied to '1' 672 -- If too many retries are performed compared to what is specified in 673 -- the generic, the counter simply wraps around. 681 when DO_PHASE_ALIGNMENT => 682 --The direct handling of the signals for the Phase Alignment is done outside 683 --this state-machine. 695 -- If too many retries are performed compared to what is specified in 696 -- the generic, the counter simply wraps around. 704 when MONITOR_DATA_VALID => 707 fsmCnt <= (others => '0');
710 elsif fsmCnt = x"FFFF" then 711 fsmCnt <= (others => '0');
integer := 100000/ STABLE_CLOCK_PERIOD WAIT_TIMEOUT_100us
out RXDFEAGCHOLDstd_logic := '0'
std_logic := '0' time_out_500us
std_logic := '0' time_out_1us
std_logic := '0' rxpmaresetdone_ss
in DONT_RESET_ON_DATA_ERRORstd_logic := '0'
std_logic := '0' rxresetdone_s2
std_logic pmaresetdone_fallingedge_detect
integer range 0 to 3:= 0 recclk_mon_restart_count
std_logic := '0' mmcm_lock_int
std_logic := '0' rx_fsm_reset_done_int_s3
std_logic := '0' run_phase_alignment_int_s3
integer range 0 to WAIT_MAX:= 0 init_wait_count
integer :=( 37000000/ integer( 3.125))/ STABLE_CLOCK_PERIOD WAIT_TIME_ADAPT
out GTRXRESETstd_logic := '0'
std_logic := '0' run_phase_alignment_int
integer := 500000/ STABLE_CLOCK_PERIOD WAIT_TIMEOUT_500us
std_logic rxpmaresetdone_sync
std_logic := '1' mmcm_reset_i
std_logic := '0' time_out_wait_bypass
integer := 5000 MAX_WAIT_BYPASS
std_logic := '0' rxpmaresetdone_i
in PLL0REFCLKLOSTstd_logic
integer range 0 to MAX_RETRIES:= 0 retry_counter_int
integer := 100000/ STABLE_CLOCK_PERIOD WAIT_TLOCK_MAX
out RESET_PHALIGNMENTstd_logic := '0'
std_logic := '0' init_wait_done
std_logic := '0' pll0lock_prev
std_logic := '0' time_out_100us
std_logic := '0' run_phase_alignment_int_s2
TX_PLL0_USEDboolean := false
out MMCM_RESETstd_logic := '1'
std_logic := '0' reset_time_out
integer := 500 STARTUP_DELAY
std_logic := '0' pll_reset_asserted
std_logic := '0' mmcm_lock_i
out RX_FSM_RESET_DONEstd_logic
in PHALIGNMENT_DONEstd_logic
std_logic := '0' recclk_mon_count_reset
integer := 2** RETRY_COUNTER_BITWIDTH- 1 MAX_RETRIES
integer := 1000/ STABLE_CLOCK_PERIOD WAIT_TIMEOUT_1us
integer := 3000000/ STABLE_CLOCK_PERIOD WAIT_TIMEOUT_2ms
std_logic_vector( 15 downto 0) :=( others => '0') fsmCnt
std_logic soft_reset_fall
integer := 1024 MMCM_LOCK_CNT_MAX
integer := WAIT_CYCLES+ 10 WAIT_MAX
std_logic := '0' rxresetdone_s3
integer range 0 to MAX_WAIT_BYPASS- 1 wait_bypass_count
std_logic := '0' gtrxreset_i
out RXLPMHFHOLDstd_logic := '0'
std_logic := '0' pll1lock_sync
std_logic := '0' rx_fsm_reset_done_int
RX_PLL0_USEDboolean := false
out RXUSERRDYstd_logic := '0'
std_logic := '0' time_tlock_max
std_logic := '0' pll0lock_ris_edge
std_logic := '0' check_tlock_max
rx_rst_fsm_type := INIT rx_state
RETRY_COUNTER_BITWIDTHinteger range 2 to 8:= 8
std_logic := '0' time_out_2ms
out PLL1_RESETstd_logic := '0'
std_logic := '0' mmcm_lock_reclocked
std_logic := '0' rx_fsm_reset_done_int_s2
out RUN_PHALIGNMENTstd_logic
std_logic := '0' phalignment_done_sync
std_logic soft_reset_rise
integer := STARTUP_DELAY/ STABLE_CLOCK_PERIOD WAIT_CYCLES
out RETRY_COUNTERstd_logic_vector( RETRY_COUNTER_BITWIDTH- 1 downto 0) :=( others => '0')
out RXLPMLFHOLDstd_logic := '0'
std_logic soft_reset_sync
in RECCLK_STABLEstd_logic
STABLE_CLOCK_PERIODinteger range 4 to 20:= 8
in PLL1REFCLKLOSTstd_logic
out PLL0_RESETstd_logic := '0'
SIMULATION_Gboolean := false
in RECCLK_MONITOR_RESTARTstd_logic := '0'
(INIT,ASSERT_ALL_RESETS,RELEASE_PLL_RESET,VERIFY_RECCLK_STABLE,RELEASE_MMCM_RESET,WAIT_RESET_DONE,DO_PHASE_ALIGNMENT,MONITOR_DATA_VALID,FSM_DONE) rx_rst_fsm_type
std_logic := '0' pll1lock_ris_edge
integer range 0 to WAIT_TIMEOUT_2ms:= 0 time_out_counter
std_logic := '0' pll0lock_sync
std_logic := '0' data_valid_sync
integer range 0 to MMCM_LOCK_CNT_MAX- 1:= 0 mmcm_lock_count
std_logic := '0' pll1lock_prev
out RXDFELFHOLDstd_logic := '0'
std_logic := '0' time_out_wait_bypass_s3
std_logic := '0' time_out_wait_bypass_s2
in RXPMARESETDONEstd_logic