dsata.vhd
字号:
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 COMRESET <= '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; align_cnt := 0; ELSE cnt := 0; COMRESET <= '0'; align_cnt := 0; END IF; ELSE cnt := 0; COMRESET <= '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'; END IF; ELSE cnt := 0; COMWAKE <= '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 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 rx_bit_cnt := 0; RX_buffer(rx_word_cnt) := RX_shift_reg; rx_word_cnt := rx_word_cnt + 1; 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; ELSIF RX_shift_reg = cK283(0) OR RX_shift_reg = cK283(1) THEN rx_word_cnt := 1; RX_buffer(0) := RX_shift_reg; ELSIF RX_shift_reg = cK285(0) OR RX_shift_reg = cK285(1) THEN rx_word_cnt := 1; RX_buffer(0) := RX_shift_reg; ELSIF 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; ---------------------------------------------------------------------------- -- Transmit clock -- ---------------------------------------------------------------------------- TXclk <= NOT(TXclk) AFTER TXPERIOD/2; ---------------------------------------------------------------------------- -- Transmitter shift register -- ---------------------------------------------------------------------------- TX_SHIFT : PROCESS(TXclk, PHYRESET, COMRESET) VARIABLE tx_cnt : INTEGER := 0; BEGIN IF rising_edge(PHYRESET) OR rising_edge(COMRESET) 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; 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_cominit, transmit_comwake, transmit_align, transmit_link_data; IF transmit_cominit = '1' AND transmit_cominit_end = '0' THEN-- WAIT UNTIL TXclk = '1'; cominit_loop : LOOP FOR i IN 0 TO 3 LOOP SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg); WAIT UNTIL TXclk = '1'; EXIT cominit_loop WHEN (RESET = '1' OR COMRESET = '1'); END LOOP; WAIT UNTIL TX_shift_reg_empty = '1'; WAIT UNTIl RESET ='1' OR COMRESET = '1' FOR 480 * TXPERIOD; EXIT cominit_loop WHEN (RESET = '1' OR COMRESET = '1'); FOR i IN 0 TO 3 LOOP SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg); WAIT UNTIL TXclk = '1'; EXIT cominit_loop WHEN (RESET = '1' OR COMRESET = '1'); END LOOP; WAIT UNTIL TX_shift_reg_empty = '1'; WAIT UNTIl RESET ='1' OR COMRESET = '1' FOR 480 * TXPERIOD; EXIT cominit_loop WHEN (RESET = '1' OR COMRESET = '1'); FOR i IN 0 TO 3 LOOP SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg); WAIT UNTIL TXclk = '1'; EXIT cominit_loop WHEN (RESET = '1' OR COMRESET = '1'); END LOOP; WAIT UNTIL TX_shift_reg_empty = '1'; WAIT UNTIl RESET ='1' OR COMRESET = '1' FOR 480 * TXPERIOD; EXIT cominit_loop WHEN (RESET = '1' OR COMRESET = '1'); FOR i IN 0 TO 3 LOOP SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg); WAIT UNTIL TXclk = '1'; EXIT cominit_loop WHEN (RESET = '1' OR COMRESET = '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'; EXIT cominit_loop WHEN (RESET = '1' OR COMRESET = '1'); END LOOP; WAIT UNTIL TX_shift_reg_empty = '1'; WAIT UNTIl RESET ='1' OR COMRESET = '1' FOR 480 * TXPERIOD; EXIT cominit_loop WHEN (RESET = '1' OR COMRESET = '1'); FOR i IN 0 TO 3 LOOP SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg); WAIT UNTIL TXclk = '1'; EXIT cominit_loop WHEN (RESET = '1' OR COMRESET = '1'); END LOOP; WAIT UNTIL TX_shift_reg_empty = '1'; WAIT UNTIl RESET ='1' OR COMRESET = '1' FOR MAX_COMINIT_SPACE; EXIT cominit_loop WHEN (RESET = '1' OR COMRESET = '1');-- WAIT FOR MAX_COMINIT_SPACE; transmit_cominit_end <= '1', '0' AFTER 40 * RXPERIOD; WAIT UNTIL TXclk = '1';-- transmit_cominit_end <= '0'; EXIT; END LOOP; END IF; IF transmit_comwake = '1' AND transmit_comwake_end = '0' THEN comwake_loop: LOOP-- WAIT UNTIL TXclk = '1'; FOR i IN 0 TO 3 LOOP SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg); WAIT UNTIL TXclk = '1'; EXIT comwake_loop WHEN (RESET = '1' OR COMRESET = '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); EXIT comwake_loop WHEN (RESET = '1' OR COMRESET = '1'); WAIT UNTIL TXclk = '1'; END LOOP; WAIT UNTIL TX_shift_reg_empty = '1'; WAIT UNTIl RESET ='1' OR COMRESET = '1' FOR 160 * TXPERIOD; EXIT comwake_loop WHEN (RESET = '1' OR COMRESET = '1'); FOR i IN 0 TO 3 LOOP SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg); EXIT comwake_loop WHEN (RESET = '1' OR COMRESET = '1'); 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); EXIT comwake_loop WHEN (RESET = '1' OR COMRESET = '1'); WAIT UNTIL TXclk = '1'; END LOOP; WAIT UNTIL TX_shift_reg_empty = '1'; WAIT UNTIl RESET ='1' OR COMRESET = '1' FOR 160 * TXPERIOD; EXIT comwake_loop WHEN (RESET = '1' OR COMRESET = '1'); FOR i IN 0 TO 3 LOOP SendAlign(TX_shift_rdy, TXclk, TX_ld, TX_reg); EXIT comwake_loop WHEN (RESET = '1' OR COMRESET = '1'); WAIT UNTIL TXclk = '1'; END LOOP; WAIT UNTIL TX_shift_reg_empty = '1';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -