欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

dsata.vhd

Vhdl cod for a bus.For sp2e
VHD
第 1 页 / 共 5 页
字号:
            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 + -