Functions | |
string | ExtendString ( string_in: in string , string_len: in integer ) |
extend a string | |
Processes | |
PROCESS_362 | ( CLK , START_INIT ) |
Synchronize Reset. | |
PROCESS_363 | ( CLK ) |
Synchronize LOCK. | |
PROCESS_364 | ( CLK ) |
Synchronize PCS_ERROR and generate a pulse when PCS_ERROR is high. | |
PROCESS_365 | ( CLK ) |
Counter for holding PMA reset for an amount of C_DELAY_PMA_RESET. | |
PROCESS_366 | ( CLK ) |
PROCESS_367 | ( CLK ) |
Counter for holding SYNC for an amount of C_DELAY_SYNC. | |
PROCESS_368 | ( CLK ) |
Counter for holding PCS reset for an amount of C_DELAY_PCS_RESET. | |
PROCESS_369 | ( CLK ) |
Counter for waiting C_DELAY_WAIT_PCS after de-assertion of PCS reset. | |
PROCESS_370 | ( CLK ) |
Counter for PCS error. | |
PROCESS_371 | ( CLK ) |
Counter for the READY signal. | |
PROCESS_372 | ( CLK ) |
GT11 Initialization FSM. | |
PROCESS_373 | ( reset_r(0) , pma_reset_done_i , init_fsm_wait_lock_check , lock_r , sync_done_i , pcs_reset_done_i , wait_pcs_done_i , pcs_error_r1 , pcs_error_count_done_i , wait_ready_done_i ) |
Components | |
FDE | |
component FDE | |
SRL16E | |
component SRL16 | |
FDRE | |
component FDRE | |
Constants | |
C_DELAY_PMA_RESET | unsigned ( 2 downto 0 ) := " 011 " |
C_DELAY_SYNC | unsigned ( 7 downto 0 ) := " 01000000 " |
C_DELAY_PCS_RESET | unsigned ( 2 downto 0 ) := " 011 " |
C_DELAY_LOCK | unsigned ( 4 downto 0 ) := " 10000 " |
C_DELAY_WAIT_PCS | unsigned ( 3 downto 0 ) := " 0101 " |
C_DELAY_WAIT_READY | unsigned ( 7 downto 0 ) := " 01000000 " |
C_PCS_ERROR_COUNT | unsigned ( 4 downto 0 ) := " 10000 " |
C_RESET | unsigned ( 7 downto 0 ) := " 00000001 " |
GT11 Initialization FSM. | |
C_PMA_RESET | unsigned ( 7 downto 0 ) := " 00000010 " |
GT11 Initialization FSM. | |
C_WAIT_LOCK | unsigned ( 7 downto 0 ) := " 00000100 " |
GT11 Initialization FSM. | |
C_SYNC | unsigned ( 7 downto 0 ) := " 00001000 " |
GT11 Initialization FSM. | |
C_PCS_RESET | unsigned ( 7 downto 0 ) := " 00010000 " |
GT11 Initialization FSM. | |
C_WAIT_PCS | unsigned ( 7 downto 0 ) := " 00100000 " |
GT11 Initialization FSM. | |
C_ALMOST_READY | unsigned ( 7 downto 0 ) := " 01000000 " |
GT11 Initialization FSM. | |
C_READY | unsigned ( 7 downto 0 ) := " 10000000 " |
GT11 Initialization FSM. | |
Signals | |
reset_r | unsigned ( 1 downto 0 ) |
lock_r | std_logic |
lock_r2 | std_logic |
pcs_error_r1 | std_logic |
pcs_error_r2 | std_logic |
pma_reset_count_r | unsigned ( 2 downto 0 ) |
sync_count_r | unsigned ( 7 downto 0 ) |
pcs_reset_count_r | unsigned ( 2 downto 0 ) |
wait_pcs_count_r | unsigned ( 3 downto 0 ) |
pcs_error_count_r | unsigned ( 4 downto 0 ) |
wait_ready_count_r | unsigned ( 7 downto 0 ) |
init_state_r | unsigned ( 7 downto 0 ) |
init_next_state_r | unsigned ( 7 downto 0 ) |
init_fsm_name | unsigned ( 40 *7 downto 0 ) |
init_fsm_wait_lock_check | std_logic |
pma_reset_done_i | std_logic |
lock_pulse_i | std_logic |
stage_1_enable_i | std_logic |
stage_2_enable_i | std_logic |
stage_3_enable_i | std_logic |
lockupdate_ready_i | std_logic |
shift_register_1_enable_i | std_logic |
shift_register_2_enable_i | std_logic |
shift_register_3_enable_i | std_logic |
shift_register_0_d_i | std_logic |
shift_register_1_d_i | std_logic |
shift_register_2_d_i | std_logic |
shift_register_3_d_i | std_logic |
shift_register_0_q_i | std_logic |
shift_register_1_q_i | std_logic |
shift_register_2_q_i | std_logic |
shift_register_3_q_i | std_logic |
sync_done_i | std_logic |
pcs_reset_done_i | std_logic |
wait_pcs_done_i | std_logic |
pcs_error_count_done_i | std_logic |
wait_ready_done_i | std_logic |
tied_to_ground_i | std_logic |
tied_to_vcc_i | std_logic |
not_lock_i | std_logic |
Component Instantiations | |
shift_register_0 | SRL16E |
SRL16 Stage Zero - First stage of shifting. | |
flop_stage_0 | FDE |
extra FF, last stage | |
shift_register_1 | SRL16E |
SRL16 Stage One - Second stage of shifting. | |
flop_stage_1 | FDE |
extra FF, last stage | |
shift_register_2 | SRL16E |
SRL16 Stage Two - Third stage of shifting. | |
flop_stage_2 | FDE |
extra FF, last stage | |
shift_register_3 | SRL16E |
flop_stage_3 | FDRE |
extra FF, last stage |
this entity produces signal sequences for initializing rio rx
Definition at line 79 of file sata_gt11_init_rx.vhd.
string ExtendString | ( string_in in string , | |
string_len in integer ) |
extend a string
Definition at line 208 of file sata_gt11_init_rx.vhd.
00208 function ExtendString (string_in : string; 00209 string_len : integer) 00210 return string is 00211 variable string_out : string(1 to string_len) := (others => ' '); 00212 begin 00213 if string_in'length > string_len then 00214 string_out := string_in(1 to string_len); 00215 else 00216 string_out(1 to string_in'length) := string_in; 00217 end if; 00218 return string_out; 00219 end ExtendString;
PROCESS_362 | ( CLK , | |
START_INIT ) |
Synchronize Reset.
Definition at line 231 of file sata_gt11_init_rx.vhd.
00231 process (CLK, START_INIT) 00232 begin 00233 if (START_INIT = '1') then 00234 reset_r <= "11"; 00235 elsif (rising_edge(CLK)) then 00236 reset_r <= '0' & reset_r(1); 00237 end if; 00238 end process;
PROCESS_363 | ( CLK ) |
PROCESS_364 | ( CLK ) |
Synchronize PCS_ERROR and generate a pulse when PCS_ERROR is high.
Definition at line 253 of file sata_gt11_init_rx.vhd.
00253 process(CLK) 00254 begin 00255 if(CLK'event and CLK = '1') then 00256 if(reset_r(0) = '1') then 00257 pcs_error_r1 <= '0'; 00258 else 00259 pcs_error_r1 <= PCS_ERROR; 00260 end if; 00261 end if; 00262 end process;
PROCESS_365 | ( CLK ) |
Counter for holding PMA reset for an amount of C_DELAY_PMA_RESET.
Definition at line 273 of file sata_gt11_init_rx.vhd.
00273 process(CLK) 00274 begin 00275 if(CLK'event and CLK = '1') then 00276 if(init_state_r /= C_PMA_RESET) then 00277 pma_reset_count_r <= C_DELAY_PMA_RESET; 00278 else 00279 pma_reset_count_r <= pma_reset_count_r - 1; 00280 end if; 00281 end if; 00282 end process;
PROCESS_366 | ( CLK ) |
Counter for the LOCKUPDATE cycles for RXLOCK: This is built with SRL16s. Currently, we need to wait for 16 LOCKUPDATE cycles to qualify the RXLOCK signal. Each LOCKUPDATE = 1024 REFCLK cycles. In this module, we assume 1 REFCLK = 1 USRCLK (please adjust the address of the fourth SRL16 stage as neccessary). The whole four stages give 16,304 cycles of delay (16 * 16 * 16 * 4); note that the last stage has an extra FF at the end. Create a pulse from RXLOCK to initialize SRL16's. Need to register the LOCK signal from the GT11 twice since the LOCK is based on REFCLK
Definition at line 303 of file sata_gt11_init_rx.vhd.
00303 process(CLK) 00304 begin 00305 if(CLK'event and CLK = '1') then 00306 if (reset_r(0) = '1') then 00307 lock_r2 <= '0'; 00308 else 00309 lock_r2 <= lock_r; 00310 end if; 00311 end if; 00312 end process;
PROCESS_367 | ( CLK ) |
Counter for holding SYNC for an amount of C_DELAY_SYNC.
Definition at line 440 of file sata_gt11_init_rx.vhd.
00440 process(CLK) 00441 begin 00442 if(CLK'event and CLK = '1') then 00443 if(init_state_r /= C_SYNC) then 00444 sync_count_r <= C_DELAY_SYNC; 00445 else 00446 sync_count_r <= sync_count_r - 1; 00447 end if; 00448 end if; 00449 end process;
PROCESS_368 | ( CLK ) |
Counter for holding PCS reset for an amount of C_DELAY_PCS_RESET.
Definition at line 454 of file sata_gt11_init_rx.vhd.
00454 process(CLK) 00455 begin 00456 if(CLK'event and CLK = '1') then 00457 if(init_state_r /= C_PCS_RESET) then 00458 pcs_reset_count_r <= C_DELAY_PCS_RESET; 00459 else 00460 pcs_reset_count_r <= pcs_reset_count_r - 1; 00461 end if; 00462 end if; 00463 end process;
PROCESS_369 | ( CLK ) |
Counter for waiting C_DELAY_WAIT_PCS after de-assertion of PCS reset.
Definition at line 468 of file sata_gt11_init_rx.vhd.
00468 process(CLK) 00469 begin 00470 if(CLK'event and CLK = '1') then 00471 if(init_state_r /= C_WAIT_PCS) then 00472 wait_pcs_count_r <= C_DELAY_WAIT_PCS; 00473 else 00474 wait_pcs_count_r <= wait_pcs_count_r - 1; 00475 end if; 00476 end if; 00477 end process;
PROCESS_370 | ( CLK ) |
Counter for PCS error.
Definition at line 482 of file sata_gt11_init_rx.vhd.
00482 process(CLK) 00483 begin 00484 if(CLK'event and CLK = '1') then 00485 if(init_state_r = C_PMA_RESET) then 00486 pcs_error_count_r <= C_PCS_ERROR_COUNT; 00487 elsif (((init_state_r = C_ALMOST_READY) or (init_state_r = C_READY)) and (pcs_error_r1 and lock_r) = '1') then 00488 pcs_error_count_r <= pcs_error_count_r - 1; 00489 end if; 00490 end if; 00491 end process;
PROCESS_371 | ( CLK ) |
Counter for the READY signal.
Definition at line 496 of file sata_gt11_init_rx.vhd.
00496 process(CLK) 00497 begin 00498 if(CLK'event and CLK = '1') then 00499 if((init_state_r /= C_ALMOST_READY) or (pcs_error_r1 = '1')) then 00500 wait_ready_count_r <= C_DELAY_WAIT_READY; 00501 elsif(pcs_error_r1 = '0') then 00502 wait_ready_count_r <= wait_ready_count_r - 1; 00503 end if; 00504 end if; 00505 end process;
PROCESS_372 | ( CLK ) |
GT11 Initialization FSM.
Definition at line 510 of file sata_gt11_init_rx.vhd.
00510 process (CLK) 00511 begin 00512 if (rising_edge(CLK)) then 00513 if (reset_r(0) = '1') then 00514 init_state_r <= C_RESET; 00515 else 00516 init_state_r <= init_next_state_r; 00517 end if; 00518 end if; 00519 end process;
PROCESS_373 | ( reset_r(0) , | |
pma_reset_done_i , | ||
init_fsm_wait_lock_check , | ||
lock_r , | ||
sync_done_i , | ||
pcs_reset_done_i , | ||
wait_pcs_done_i , | ||
pcs_error_r1 , | ||
pcs_error_count_done_i , | ||
wait_ready_done_i ) |
GT11 Initialization FSM - This FSM is used to initialize the GT11 block asserting the PMA and PCS reset in sequence. It also takes into account of any error that may happen during initialization. The block uses USRCLK as reference for the delay. DO NOT use the output of the GT11 clocks for this reset module, as the output clocks may change when reset is applied to the GT11. Use a system clock, and make sure that the wait time for each state equals the specified number of USRCLK cycles.
The following steps are applied:
Definition at line 554 of file sata_gt11_init_rx.vhd.
00554 process (reset_r(0), pma_reset_done_i, init_fsm_wait_lock_check, lock_r, 00555 sync_done_i, pcs_reset_done_i, wait_pcs_done_i, pcs_error_r1, 00556 pcs_error_count_done_i, wait_ready_done_i) 00557 variable init_fsm_name : string(1 to 25); 00558 begin 00559 case init_state_r is 00560 00561 when C_RESET => 00562 00563 if (reset_r(0) = '1') then 00564 init_next_state_r <= C_RESET; 00565 else 00566 init_next_state_r <= C_PMA_RESET; 00567 end if; 00568 init_fsm_name := ExtendString("C_RESET", 25); 00569 00570 when C_PMA_RESET => 00571 00572 if (pma_reset_done_i = '1') then 00573 init_next_state_r <= C_WAIT_LOCK; 00574 else 00575 init_next_state_r <= C_PMA_RESET; 00576 end if; 00577 init_fsm_name := ExtendString("C_PMA_RESET", 25); 00578 00579 when C_WAIT_LOCK => 00580 00581 if(init_fsm_wait_lock_check = '1') then 00582 init_next_state_r <= C_SYNC; 00583 else 00584 init_next_state_r <= C_WAIT_LOCK; 00585 end if; 00586 init_fsm_name := ExtendString("C_WAIT_LOCK", 25); 00587 00588 when C_SYNC => 00589 if (lock_r = '1') then 00590 if (sync_done_i = '1') then 00591 init_next_state_r <= C_PCS_RESET; 00592 else 00593 init_next_state_r <= C_SYNC; 00594 end if; 00595 else 00596 init_next_state_r <= C_PMA_RESET; --C_WAIT_LOCK; 00597 end if; 00598 init_fsm_name := ExtendString("C_SYNC", 25); 00599 00600 when C_PCS_RESET => 00601 if (lock_r = '1') then 00602 if (pcs_reset_done_i = '1') then 00603 init_next_state_r <= C_WAIT_PCS; 00604 else 00605 init_next_state_r <= C_PCS_RESET; 00606 end if; 00607 else 00608 init_next_state_r <= C_PMA_RESET; --C_WAIT_LOCK; 00609 end if; 00610 init_fsm_name := ExtendString("C_PCS_RESET", 25); 00611 00612 when C_WAIT_PCS => 00613 if (lock_r = '1') then 00614 if (wait_pcs_done_i = '1') then 00615 init_next_state_r <= C_ALMOST_READY; 00616 else 00617 init_next_state_r <= C_WAIT_PCS; 00618 end if; 00619 else 00620 init_next_state_r <= C_PMA_RESET; --C_WAIT_LOCK; 00621 end if; 00622 init_fsm_name := ExtendString("C_WAIT_PCS", 25); 00623 00624 when C_ALMOST_READY => 00625 if (lock_r = '0') then 00626 init_next_state_r <= C_PMA_RESET; --C_WAIT_LOCK; 00627 elsif ((pcs_error_r1 = '1') and (pcs_error_count_done_i = '0')) then 00628 init_next_state_r <= C_SYNC; 00629 elsif ((pcs_error_r1 = '1') and (pcs_error_count_done_i = '1')) then 00630 init_next_state_r <= C_PMA_RESET; 00631 elsif (wait_ready_done_i = '1') then 00632 init_next_state_r <= C_READY; 00633 else 00634 init_next_state_r <= C_ALMOST_READY; 00635 end if; 00636 init_fsm_name := ExtendString("C_ALMOST_READY", 25); 00637 00638 when C_READY => 00639 if ((lock_r = '1') and (pcs_error_r1 = '0')) then 00640 init_next_state_r <= C_READY; 00641 elsif ((lock_r = '1') and (pcs_error_r1 = '1')) then 00642 init_next_state_r <= C_PCS_RESET; 00643 else 00644 init_next_state_r <= C_PMA_RESET; --C_WAIT_LOCK; 00645 end if; 00646 init_fsm_name := ExtendString("C_READY", 25); 00647 00648 when others => 00649 init_next_state_r <= C_RESET; 00650 init_fsm_name := ExtendString("C_RESET", 25); 00651 00652 end case; 00653 end process;
C_ALMOST_READY unsigned ( 7 downto 0 ) := " 01000000 " [Constant] |
C_PCS_RESET unsigned ( 7 downto 0 ) := " 00010000 " [Constant] |
C_PMA_RESET unsigned ( 7 downto 0 ) := " 00000010 " [Constant] |
C_READY unsigned ( 7 downto 0 ) := " 10000000 " [Constant] |
C_RESET unsigned ( 7 downto 0 ) := " 00000001 " [Constant] |
C_SYNC unsigned ( 7 downto 0 ) := " 00001000 " [Constant] |
C_WAIT_LOCK unsigned ( 7 downto 0 ) := " 00000100 " [Constant] |
C_WAIT_PCS unsigned ( 7 downto 0 ) := " 00100000 " [Constant] |
FDE [Component] |
FDRE [Component] |
flop_stage_0 FDE [Component Instantiation] |
flop_stage_1 FDE [Component Instantiation] |
flop_stage_2 FDE [Component Instantiation] |
flop_stage_3 FDRE [Component Instantiation] |
shift_register_0 SRL16E [Component Instantiation] |
shift_register_1 SRL16E [Component Instantiation] |
shift_register_2 SRL16E [Component Instantiation] |
shift_register_3 SRL16E [Component Instantiation] |
SRL16 Stage Three - Fourth stage of shifting LOCKUPDATE ready is redundant here in resetting the SRL16 since the flop is already reset by RXLOCK from the MGT
Definition at line 412 of file sata_gt11_init_rx.vhd.
SRL16E [Component] |