📄 hsata.vhd
字号:
BEGIN IF falling_edge(rx_idle) THEN burst_start := NOW; tmp_time := NOW - space_start; IF (tmp_time > MIN_COMINIT_SPACE) AND (tmp_time < MAX_COMINIT_SPACE) THEN cominit_space_ok <= '1'; END IF; IF (tmp_time > MIN_COMWAKE_SPACE) AND (tmp_time < MAX_COMWAKE_SPACE) THEN comwake_space_ok <= '1'; END IF; ELSIF rising_edge(rx_idle) THEN space_start := NOW; tmp_time := NOW - burst_start; cominit_space_ok <= '0'; comwake_space_ok <= '0'; END IF; END PROCESS; ---------------------------------------------------------------------------- -- OOB signals, COMINIT and COMWAKE, detection -- ---------------------------------------------------------------------------- OOB_INIT : PROCESS VARIABLE cnt : INTEGER := 0; VARIABLE align_cnt : INTEGER := 0; BEGIN IF cnt > 7 THEN COMINIT <= '1'; END IF; WAIT UNTIL align = '1'; align_cnt := 1; FOR i IN 1 TO 3 LOOP WAIT UNTIL align = '1' FOR 40 * RXPERIOD; IF align = '1' THEN align_cnt := align_cnt + 1; ELSE EXIT; END IF; END LOOP; IF align_cnt = 4 THEN cnt := cnt + 1; WAIT UNTIL cominit_space_ok = '1' FOR MAX_COMINIT_SPACE; IF cominit_space_ok = '1' THEN cnt := cnt + 1; ELSE cnt := 0; COMINIT <= '0'; align_cnt := 0; END IF; ELSE cnt := 0; COMINIT <= '0'; align_cnt := 0; END IF; END PROCESS OOB_INIT; OOB_WAKE : PROCESS VARIABLE cnt : INTEGER := 0; VARIABLE align_cnt : INTEGER := 0; BEGIN IF cnt > 7 THEN COMWAKE <= '1'; END IF; WAIT UNTIL align = '1'; align_cnt := 1; FOR i IN 1 TO 3 LOOP WAIT UNTIL align = '1' FOR 40 * RXPERIOD; IF align = '1' THEN align_cnt := align_cnt + 1; ELSE EXIT; END IF; END LOOP; IF align_cnt = 4 THEN cnt := cnt + 1; WAIT UNTIL comwake_space_ok = '1' FOR MAX_COMWAKE_SPACE; IF comwake_space_ok = '1' THEN cnt := cnt + 1; align_cnt := 0; ELSE cnt := 0; COMWAKE <= '0'; align_cnt := 0; END IF; ELSE cnt := 0; COMWAKE <= '0'; align_cnt := 0; END IF; END PROCESS OOB_WAKE; ---------------------------------------------------------------------------- -- Receiver shift register and fixed pattern detection - ALIGN -- ---------------------------------------------------------------------------- RX_SHIFT : PROCESS(RXclk) VARIABLE rx_bit_cnt : INTEGER := 0; VARIABLE rx_word_cnt : INTEGER := 0; VARIABLE align_detection : std_logic_vector(39 DOWNTO 0); VARIABLE nonalign_detection : std_logic_vector(9 DOWNTO 0); VARIABLE RX_buffer : rx_buffer_type; VARIABLE RX_shift_reg : std_logic_vector(9 DOWNTO 0) := "0000000000"; BEGIN IF falling_edge(RXclk) THEN RX_shift_reg(8 DOWNTO 0) := RX_shift_reg(9 DOWNTO 1); RX_shift_reg(9) := RX_int; rx_bit_cnt := rx_bit_cnt + 1; IF rx_bit_cnt = 10 THEN nonalign <= '0'; rx_bit_cnt := 0; RX_buffer(rx_word_cnt) := RX_shift_reg; rx_word_cnt := rx_word_cnt + 1;-- IF (RX_shift_reg = K283(0)) OR (RX_shift_reg = K283(1)) THEN-- nonalign <= '1', '0' AFTER 1 ps;-- ELSE-- nonalign <= '0'; -- END IF; IF RX_shift_reg = cK285(0) OR RX_shift_reg = cK285(1) THEN COMMA <= '1'; rx_word_cnt := 1; RX_buffer(0) := RX_shift_reg; END IF; IF RX_shift_reg = cK283(0) OR RX_shift_reg = cK283(1) THEN rx_word_cnt := 1; RX_buffer(0) := RX_shift_reg; -- non-align pattern detection nonalign <= '1', '0' AFTER 1 ps; END IF; IF rx_word_cnt = 4 THEN COMMA <= '0'; rx_word_cnt := 0; IF RX_buffer(0) /= cK285(0) AND RX_buffer(0) /= cK285(1) THEN RXCLOCK <= '1', '0' AFTER 20*RXPERIOD; END IF; DATAOUT <= RX_buffer(3) & RX_buffer(2) & RX_buffer(1) & RX_buffer(0); IF ((RX_buffer(3) & RX_buffer(2) & RX_buffer(1) & RX_buffer(0)) = ALIGN_RDpos) OR ((RX_buffer(3) & RX_buffer(2) & RX_buffer(1) & RX_buffer(0)) = ALIGN_RDneg) THEN align_ctrl <= '1'; ELSE align_ctrl <= '0'; END IF; END IF; END IF; -- align pattern detection align_detection(38 DOWNTO 0) := align_detection(39 DOWNTO 1); align_detection(39) := RX_int; IF (align_detection = ALIGN_RDpos) OR (align_detection = ALIGN_RDneg) THEN align <= '1', '0' AFTER RXPERIOD; rx_bit_cnt := 0; rx_word_cnt := 0; ELSE align <= '0'; END IF; END IF; END PROCESS RX_SHIFT; NA_CNT : PROCESS(rx_idle, align, nonalign) BEGIN IF rising_edge(rx_idle) OR rising_edge(align) THEN non_align_cnt <= 0; ELSIF rising_edge(nonalign) THEN non_align_cnt <= non_align_cnt + 1; END IF; END PROCESS NA_CNT; ---------------------------------------------------------------------------- -- Transmit clock -- ---------------------------------------------------------------------------- TXclk <= NOT(TXclk) AFTER TXPERIOD/2; ---------------------------------------------------------------------------- -- Transmitter shift register -- ---------------------------------------------------------------------------- TX_SHIFT : PROCESS(TXclk, PHYRESET) VARIABLE tx_cnt : INTEGER := 0; BEGIN IF rising_edge(PHYRESET) THEN tx_cnt := 0; TX_shift_reg_empty <= '1'; TX_shift_rdy <= '1'; ELSIF rising_edge(TXclk) THEN TX_shift_rdy <= '0'; IF TX_ld = '1' THEN tx_cnt := 9; TX_shift_reg <= TX_reg; TX_shift_reg_empty <= '0'; ELSIF tx_cnt > 2 THEN TX_shift_reg(8 DOWNTO 0) <= TX_shift_reg(9 DOWNTO 1); tx_cnt := tx_cnt - 1; ELSIF tx_cnt = 2 THEN TX_shift_reg(8 DOWNTO 0) <= TX_shift_reg(9 DOWNTO 1); tx_cnt := tx_cnt - 1; TX_shift_rdy <= '1'; ELSIF tx_cnt = 1 THEN tx_cnt := tx_cnt - 1; TX_shift_reg(8 DOWNTO 0) <= TX_shift_reg(9 DOWNTO 1); TX_shift_rdy <= '1'; ELSIF tx_cnt = 0 THEN TX_shift_reg_empty <= '1'; TX_shift_rdy <= '1'; END IF; END IF; END PROCESS TX_SHIFT;-- TX_SHIFT : PROCESS -- VARIABLE tx_cnt : INTEGER := 0; -- BEGIN -- WAIT UNTIL TX_ld = '1'; -- TX_shift_reg <= TX_reg;-- TX_shift_reg_empty <= '0'; -- tx_cnt := 10; -- tx_loop: LOOP-- WAIT UNTIL TXclk = '1'; -- TX_shift_reg(8 DOWNTO 0) <= TX_shift_reg(9 DOWNTO 1);-- tx_cnt := tx_cnt - 1;-- IF tx_cnt = 0 THEN-- TX_shift_reg_empty <= '1'; -- END IF;-- EXIT tx_loop WHEN tx_cnt = 0; -- END LOOP;---- TX_shift_reg_empty <= '1'; -- END PROCESS TX_SHIFT; TXp <= TX_shift_reg(0) WHEN (TX_shift_reg_empty = '0') ELSE '0'; TXn <= NOT TX_shift_reg(0) WHEN (TX_shift_reg_empty = '0') ELSE '0'; ---------------------------------------------------------------------------- -- Data transfer -- ---------------------------------------------------------------------------- DATA_TRANS : PROCESS BEGIN WAIT ON TXclk; --transmit_comwake, transmit_comreset, transmit_align, transmit_D102; IF transmit_comreset = '1' AND transmit_comreset_end = '0' THEN-- WAIT UNTIL TXclk = '1'; 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 480 * 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 480 * 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 480 * 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 480 * 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 480 * 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_COMRESET_SPACE; transmit_comreset_end <= '1', '0' AFTER 40 * RXPERIOD; WAIT UNTIL TXclk = '1';-- transmit_comreset_end <= '0'; END IF; IF transmit_comwake = '1' AND transmit_comwake_end = '0' THEN -- WAIT UNTIL TXclk = '1'; 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';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -