📄 hsata.vhd
字号:
WAIT FOR 160 * TXPERIOD; FOR i IN 0 TO 3 LOOP SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg); WAIT UNTIL TXclk = '1'; END LOOP; WAIT UNTIL TX_shift_reg_empty = '1'; WAIT FOR 160 * TXPERIOD; FOR i IN 0 TO 3 LOOP SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg); WAIT UNTIL TXclk = '1'; END LOOP; WAIT UNTIL TX_shift_reg_empty = '1'; WAIT FOR 160 * TXPERIOD; FOR i IN 0 TO 3 LOOP SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg); WAIT UNTIL TXclk = '1'; END LOOP; WAIT UNTIL TX_shift_reg_empty = '1'; WAIT FOR MAX_COMWAKE_SPACE; WAIT UNTIL TXclk = '1'; transmit_comwake_end <= '1', '0' AFTER 40 * RXPERIOD; WAIT UNTIL TXclk = '1';-- transmit_comwake_end <= '0'; END IF; IF transmit_D102 = '1' THEN IF TX_shift_rdy = '0' THEN WAIT UNTIL TX_shift_rdy = '1'; END IF; WAIT UNTIL TXclk = '1'; TX_reg <= cD102(0); TX_ld <= '1'; WAIT UNTIL TXclk = '1'; TX_ld <= '0'; FOR i IN 0 TO 2 LOOP WAIT UNTIL TX_shift_rdy = '1'; WAIT UNTIL TXclk = '1'; TX_reg <= cD102(0); TX_ld <= '1'; WAIT UNTIL TXclk = '1'; TX_ld <= '0'; END LOOP; transmit_D102_end <= '1', '0' AFTER 40 * RXPERIOD;-- transmit_D102_end <= '1'; WAIT UNTIL TXclk = '1';-- transmit_D102_end <= '0'; END IF; IF transmit_align = '1' THEN SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg);-- transmit_align_end <= '1', '0' AFTER RXPERIOD; transmit_align_end <= '1'; WAIT UNTIL TXclk = '1'; transmit_align_end <= '0'; END IF; IF transmit_link_data = '1' THEN IF TX_shift_rdy = '0' THEN WAIT UNTIL TX_shift_rdy = '1'; END IF; WAIT UNTIL TXclk = '1'; TX_reg <= DATAIN(9 DOWNTO 0); TX_ld <= '1'; WAIT UNTIL TXclk = '1'; TX_ld <= '0'; WAIT UNTIL TX_shift_rdy = '1'; WAIT UNTIL TXclk = '1'; TX_reg <= DATAIN(19 DOWNTO 10); TX_ld <= '1'; WAIT UNTIL TXclk = '1'; TX_ld <= '0'; WAIT UNTIL TX_shift_rdy = '1'; WAIT UNTIL TXclk = '1'; TX_reg <= DATAIN(29 DOWNTO 20); TX_ld <= '1'; WAIT UNTIL TXclk = '1'; TX_ld <= '0'; WAIT UNTIL TX_shift_rdy = '1'; WAIT UNTIL TXclk = '1'; TX_reg <= DATAIN(39 DOWNTO 30); TX_ld <= '1'; WAIT UNTIL TXclk = '1'; TX_ld <= '0'; END IF; END PROCESS DATA_TRANS; ---------------------------------------------------------------------------- -- Control block -- ---------------------------------------------------------------------------- PHY_CONTROL : PROCESS(SYSTEMCLOCK, PHYRESET) BEGIN IF PHYRESET = '1' THEN init_state <= HR_RESET; ELSIF rising_edge(SYSTEMCLOCK) THEN CASE init_state IS WHEN HR_RESET => IF PHYRESET = '0' THEN init_state <= HR_AwaitCOMINIT; ELSE init_state <= HR_RESET; END IF; WHEN HR_AwaitCOMINIT => IF COMINIT = '1' THEN init_state <= HR_AwaitNoCOMINIT; ELSE init_state <= HR_AwaitCOMINIT; END IF; WHEN HR_AwaitNoCOMINIT => IF COMINIT = '0' THEN init_state <= HR_Calibrate; ELSE init_state <= HR_AwaitNoCOMINIT; END IF; WHEN HR_Calibrate => IF COMINIT = '1' THEN init_state <= HR_AwaitNoCOMINIT; ELSIF calibration_end = '1' THEN init_state <= HR_COMWAKE; ELSE init_state <= HR_Calibrate; END IF; WHEN HR_COMWAKE => IF COMINIT = '1' THEN init_state <= HR_AwaitNoCOMINIT; ELSIF transmit_comwake_end = '1' THEN IF COMWAKE = '1' THEN init_state <= HR_AwaitNoCOMWAKE; ELSE init_state <= HR_AwaitCOMWAKE; END IF; ELSE init_state <= HR_COMWAKE; END IF; WHEN HR_AwaitCOMWAKE => IF COMINIT = '1' THEN init_state <= HR_AwaitNoCOMINIT; ELSIF COMWAKE = '1' THEN init_state <= HR_AwaitNoCOMWAKE; ELSE init_state <= HR_AwaitCOMWAKE; END IF; WHEN HR_AwaitNoCOMWAKE => IF COMINIT = '1' THEN init_state <= HR_AwaitNoCOMINIT; ELSIF COMWAKE = '0' THEN init_state <= HR_AwaitAlign; ELSE init_state <= HR_AwaitNoCOMWAKE; END IF; WHEN HR_AwaitAlign => IF COMINIT = '1' THEN init_state <= HR_AwaitNoCOMINIT; ELSIF align_ctrl = '1' THEN init_state <= HR_AdjustSpeed; ELSIF align = '0' AND await_align_timeout = '1' THEN init_state <= HR_RESET; ELSE init_state <= HR_AwaitAlign; END IF; WHEN HR_SendAlign => IF COMINIT = '1' THEN init_state <= HR_AwaitNoCOMINIT; ELSIF non_align_cnt = 3 THEN init_state <= HR_Ready; ELSE init_state <= HR_SendAlign; END IF; WHEN HR_Ready => IF COMINIT = '1' THEN init_state <= HR_AwaitNoCOMINIT; ELSIF PARTIAL = '1' THEN init_state <= HR_Partial; ELSIF SLUMBER = '1' THEN init_state <= HR_Slumber; ELSE init_state <= HR_Ready; END IF; WHEN HR_Partial => IF COMINIT = '1' THEN init_state <= HR_AwaitNoCOMINIT; ELSIF PARTIAL = '0' AND COMWAKE = '0' THEN init_state <= HR_COMWAKE; ELSIF PARTIAL = '0' AND COMWAKE = '1' THEN init_state <= HR_AwaitNoCOMWAKE; ELSE init_state <= HR_Partial; END IF; WHEN HR_Slumber => IF COMINIT = '1' THEN init_state <= HR_AwaitNoCOMINIT; ELSIF SLUMBER = '0' AND COMWAKE = '0' THEN init_state <= HR_COMWAKE; ELSIF SLUMBER = '0' AND COMWAKE = '1' THEN init_state <= HR_AwaitNoCOMWAKE; ELSE init_state <= HR_Slumber; END IF; WHEN HR_AdjustSpeed => IF COMINIT = '1' THEN init_state <= HR_AwaitNoCOMINIT; ELSE init_state <= HR_SendAlign; END IF; WHEN others => init_state <= HR_RESET; END CASE; END IF; END PROCESS PHY_CONTROL; CONTROL_OUT : PROCESS(init_state)--, transmit_comreset_end) BEGIN PHYRDY <= '0'; transmit_align <= '0'; transmit_D102 <= '0'; transmit_comreset <= '0'; transmit_comwake <= '0'; CASE init_state IS WHEN HR_RESET => transmit_comreset <= '1'; WHEN HR_AwaitCOMINIT => WHEN HR_AwaitNoCOMINIT => WHEN HR_Calibrate => calibration_end <= '1' AFTER 100 ns; WHEN HR_COMWAKE => transmit_comwake <= '1'; --, '0' AFTER 1 ps; WHEN HR_AwaitCOMWAKE => WHEN HR_AwaitNoCOMWAKE => WHEN HR_AwaitAlign => transmit_D102 <= '1'; WHEN HR_SendAlign => transmit_align <= '1'; WHEN HR_Ready => PHYRDY <= '1'; WHEN HR_Partial => WHEN HR_Slumber => WHEN HR_AdjustSpeed => WHEN others => END CASE; END PROCESS CONTROL_OUT; ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- -- LINK -- ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- -- SYSTEM CLOCK -- ---------------------------------------------------------------------------- SYSTEMCLOCK <= NOT(SYSTEMCLOCK) AFTER (40*TXPERIOD)/2; ---------------------------------------------------------------------------- -- Transmit control -- ---------------------------------------------------------------------------- LINK_STATE_TR : PROCESS (RESET, SYSTEMCLOCK) BEGIN IF RESET = '1' THEN link_state <= LS4_L_RESET; ELSIF rising_edge(SYSTEMCLOCK) THEN link_state <= next_link_state; END IF; END PROCESS LINK_STATE_TR; LINK_TX_NXT : PROCESS ( link_state, PHYRDY, TX_fifo_empty, RX_fifo_full, TP_result, crc_check, SYNCp, R_RDYp, X_RDYp, SOFp, EOFp, WTRMp, HOLDp, HOLDAp, R_IPp, R_OKp, R_ERRp) BEGIN CASE link_state IS WHEN L1_L_IDLE => IF PHYRDY = '0' THEN next_link_state <= LS1_L_NoCommErr; -- ELSIF TP_Frame_Rdy = '1' THEN ELSIF TX_fifo_empty = '0' THEN next_link_state <= LT1_HL_SendChkRdy; ELSIF X_RDYp = '1' THEN next_link_state <= LR2_L_RcvWaitFifo; ELSE next_link_state <= L1_L_IDLE; END IF; WHEN LS1_L_NoCommErr => next_link_state <= LS2_L_NoComm; WHEN LS2_L_NoComm => IF PHYRDY = '1' THEN next_link_state <= LS3_L_SendAlign; ELSE next_link_state <= LS2_L_NoComm; END IF; WHEN LS3_L_SendAlign => IF PHYRDY = '1' THEN next_link_state <= L1_L_IDLE; ELSE next_link_state <= LS1_L_NoCommErr; END IF; WHEN LS4_L_RESET => next_link_state <= LS2_L_NoComm; WHEN LT1_HL_SendChkRdy => IF PHYRDY = '0' THEN next_link_state <= LS1_L_NoCommErr; ELSIF R_RDYp = '1' THEN next_link_state <= LT3_L_SendSOF; ELSIF X_RDYp = '1' THEN next_link_state <= LR2_L_RcvWaitFifo; ELSE next_link_state <= LT1_HL_SendChkRdy; END IF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -