⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hsata.vhd

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