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

📄 hsata.vhd

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