1 --//////////////////////////////////////////////////////////////////////////////// 4 --// /___/ \ / Vendor: Xilinx 5 --// \ \ \/ Version : 2.2 6 --// \ \ Application : 7 Series FPGAs Transceivers Wizard 7 --// / / Filename : Gtx7RxRst.vhd 13 -- Description : This module performs RX reset and initialization. 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_gtx7 82 EQ_MODE : := "DFE";
--RX Equalisation Mode; set to DFE or LPM 83 STABLE_CLOCK_PERIOD : range 4 to 20 := 8;
--Period of the stable clock driving this state-machine, unit is [ns] 87 STABLE_CLOCK : in ;
--Stable Clock, either a stable clock from the PCB 88 --or reference-clock present at startup. 92 PLLLOCK : in ;
--Lock Detect from the PLL of the GT 113 -- Retries it took to get the transceiver up and running 118 -- * Timing depends on the frequency of the stable clock. Hence counters-sizes 119 -- are calculated at design-time based on the Generics 121 -- * if either of the PLLs is reset during TX-startup, it does not need to be reset again by RX 122 -- => signal which PLL has been reset 129 INIT, ASSERT_ALL_RESETS, RELEASE_PLL_RESET, VERIFY_RECCLK_STABLE, 130 RELEASE_MMCM_RESET, WAIT_RESET_DONE, DO_PHASE_ALIGNMENT, 131 MONITOR_DATA_VALID, FSM_DONE);
136 constant STARTUP_DELAY : := 500;
--AR43482: Transceiver needs to wait for 500 ns after configuration 167 signal time_out_2ms : := '0';
--\Flags that the various time-out points 181 constant MAX_WAIT_BYPASS : := 5000;
--5000 RXUSRCLK cycles is the max time for Multi lanes designs 206 attribute KEEP_HIERARCHY : ;
207 attribute KEEP_HIERARCHY of 208 Synchronizer_run_phase_alignment, 209 Synchronizer_fsm_reset_done, 210 Synchronizer_SOFT_RESET, 211 Synchronizer_RXRESETDONE, 212 Synchronizer_time_out_wait_bypass, 213 Synchronizer_mmcm_lock_reclocked, 214 Synchronizer_data_valid, 215 Synchronizer_PLLLOCK, 216 Synchronizer_PHALIGNMENT_DONE : label is "TRUE";
220 --Alias section, signals used within this module mapped to output ports: 228 -- The counter starts running when configuration has finished and 229 -- the clock is stable. When its maximum count-value has been reached, 230 -- the 500 ns from Answer Record 43482 have been passed. 262 --This counter monitors, how many retries the RECCLK monitor 263 --runs. If during startup too many retries are necessary, the whole 264 --initialisation-process of the transceivers gets restarted. 281 -- One common large counter for generating three time-out signals. 282 -- Intermediate time-outs are derived from calculated values, based 283 -- on the period of the provided clock. 321 --The lock-signal from the MMCM is not immediately used but 322 --enabling a counter. Only when the counter hits its maximum, 323 --the MMCM is considered as "really" locked. 324 --The counter avoids that the FSM already starts on only a 325 --coarse lock of the MMCM (=toggling of the LOCK-signal). 339 -- Clock Domain Crossing 340 Synchronizer_run_phase_alignment :
entity work.
Synchronizer 380 Synchronizer_time_out_wait_bypass :
entity work.
Synchronizer 390 Synchronizer_mmcm_lock_reclocked :
entity work.
Synchronizer 415 -- Phase aligner might run on rxusrclk in some cases 416 -- Synchronizer it just in case 417 Synchronizer_PHALIGNMENT_DONE :
entity work.
Synchronizer 442 -- Lock Detect Clock should be driven by STABLE_CLOCK, no need to synchronize 447 --FSM for resetting the GTX/GTH/GTP in the 7-series. 448 --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 450 -- Following steps are performed: 451 -- 1) After configuration wait for approximately 500 ns as specified in 452 -- answer-record 43482 453 -- 2) Assert all resets on the GT and on an MMCM potentially connected. 454 -- After that wait until a reference-clock has been detected. 455 -- 3) Release the reset to the GT and wait until the GT-PLL has locked. 456 -- 4) Release the MMCM-reset and wait until the MMCM has signalled lock. 457 -- Also get info from the TX-side which PLL has been reset. 458 -- 5) Wait for the RESET_DONE-signal from the GT. 459 -- 6) Signal to start the phase-alignment procedure and wait for it to 461 -- 7) Reset-sequence has successfully run through. Signal this to the 462 -- rest of the design by asserting RX_FSM_RESET_DONE. 493 --Initial state after configuration. This state will be left after 494 --approx. 500 ns and not be re-entered. 499 when ASSERT_ALL_RESETS => 500 --This is the state into which the FSM will always jump back if any 501 --time-outs will occur. 502 --The number of retries is reported on the output RETRY_COUNTER. In 503 --case the transceiver never comes up for some reason, this machine 504 --will still continue its best and rerun until the FPGA is turned off 505 --or the transceivers come up correctly. 528 when RELEASE_PLL_RESET => 529 --PLL-Reset of the GTX gets released and the time-out counter 544 -- If too many retries are performed compared to what is specified in 545 -- the generic, the counter simply wraps around. 553 when VERIFY_RECCLK_STABLE => 554 --reset_time_out <= '0'; 555 --Time-out counter is not released in this state as here the FSM 556 --does not wait for a certain period of time but checks on the number 557 --of retries in the RECCLK monitor 566 --If two retries are performed in the RECCLK monitor 567 --the whole initialisation-sequence gets restarted. 569 -- If too many retries are performed compared to what is specified in 570 -- the generic, the counter simply wraps around. 578 when RELEASE_MMCM_RESET => 579 --Release of the MMCM-reset. Waiting for the MMCM to lock. 591 -- If too many retries are performed compared to what is specified in 592 -- the generic, the counter simply wraps around. 600 when WAIT_RESET_DONE => 601 --When TXOUTCLK is the source for RXUSRCLK, RXUSERRDY depends on TXUSERRDY 602 --If RXOUTCLK is the source for RXUSRCLK, TXUSERRDY can be tied to '1' 614 -- If too many retries are performed compared to what is specified in 615 -- the generic, the counter simply wraps around. 623 when DO_PHASE_ALIGNMENT => 624 --The direct handling of the signals for the Phase Alignment is done outside 625 --this state-machine. 637 -- If too many retries are performed compared to what is specified in 638 -- the generic, the counter simply wraps around. 646 when MONITOR_DATA_VALID => 653 elsif fsmCnt = x"FFFF" then std_logic := '0' rxresetdone_s3
out RUN_PHALIGNMENTstd_logic
std_logic := '0' init_wait_done
integer := 500 STARTUP_DELAY
in RECCLK_STABLEstd_logic
std_logic := '0' time_tlock_max
std_logic := '0' check_tlock_max
rx_rst_fsm_type := INIT rx_state
std_logic := '0' time_out_2ms
std_logic_vector( 15 downto 0) fsmCnt
out RXDFEAGCHOLDstd_logic
std_logic_vector( 3 downto 0) :=( others => '0') mmcm_lock_reclocked
std_logic := '0' recclk_mon_count_reset
in RECCLK_MONITOR_RESTARTstd_logic := '0'
std_logic := '0' phalignment_done_sync
std_logic soft_reset_rise
out MMCM_RESETstd_logic := '1'
integer := 3000000/ STABLE_CLOCK_PERIOD WAIT_TIMEOUT_2ms
std_logic soft_reset_sync
std_logic soft_reset_fall
integer := 1024 MMCM_LOCK_CNT_MAX
integer := WAIT_CYCLES+ 10 WAIT_MAX
integer range 0 to MAX_WAIT_BYPASS- 1 wait_bypass_count
std_logic := '0' time_out_adapt
std_logic := '0' rx_fsm_reset_done_int
(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' time_out_wait_bypass_s3
integer := STARTUP_DELAY/ STABLE_CLOCK_PERIOD WAIT_CYCLES
integer := 100000/ STABLE_CLOCK_PERIOD WAIT_TIMEOUT_100us
RETRY_COUNTER_BITWIDTHinteger range 2 to 8:= 8
out RETRY_COUNTERstd_logic_vector( RETRY_COUNTER_BITWIDTH- 1 downto 0) :=( others => '0')
integer range 0 to WAIT_TIMEOUT_2ms:= 0 time_out_counter
STABLE_CLOCK_PERIODinteger range 4 to 20:= 8
std_logic := '0' data_valid_sync
std_logic := '0' plllock_sync
integer range 0 to MMCM_LOCK_CNT_MAX- 1:= 0 mmcm_lock_count
integer range 0 to 3:= 0 recclk_mon_restart_count
std_logic := '0' adapt_count_reset
EXAMPLE_SIMULATIONinteger := 0
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
out RESET_PHALIGNMENTstd_logic := '0'
std_logic := '0' run_phase_alignment_int
std_logic := '0' time_out_500us
std_logic := '0' time_out_wait_bypass
std_logic := '0' time_out_1us
integer := 5000 MAX_WAIT_BYPASS
out RX_FSM_RESET_DONEstd_logic
in PHALIGNMENT_DONEstd_logic
std_logic := '0' time_out_100us
in PLLREFCLKLOSTstd_logic
integer :=( 37000000/ integer( 3.125))/ STABLE_CLOCK_PERIOD WAIT_TIME_ADAPT
std_logic := '0' reset_time_out
std_logic := '0' pll_reset_asserted
integer := 500000/ STABLE_CLOCK_PERIOD WAIT_TIMEOUT_500us
integer range 0 to WAIT_TIME_ADAPT- 1 adapt_count
out PLL_RESETstd_logic := '0'
out RXUSERRDYstd_logic := '0'
integer := 2** RETRY_COUNTER_BITWIDTH- 1 MAX_RETRIES
integer := 1000/ STABLE_CLOCK_PERIOD WAIT_TIMEOUT_1us
integer range 0 to MAX_RETRIES:= 0 retry_counter_int
integer := 100000/ STABLE_CLOCK_PERIOD WAIT_TLOCK_MAX
out GTRXRESETstd_logic := '0'