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

📄 hsata.vhd

📁 Vhdl cod for a bus.For sp2e
💻 VHD
📖 第 1 页 / 共 5 页
字号:
        END IF;    -- four-bit sub-block        n_ones := 0;        FOR i IN 0 TO 3 LOOP            IF code(6+i) = '1' THEN                n_ones := n_ones + 1;            END IF;        END LOOP;        IF (n_ones > 2) OR code(9 DOWNTO 6) = "1100" THEN             rd4 := '1';        ELSIF (n_ones < 2) OR code(9 DOWNTO 6) = "0011" THEN            rd4 := '0';        ELSE            rd4 := rd6;        END IF;                 RETURN rd4;    END new_rd;        PROCEDURE lsfr (SIGNAL state    : INOUT  std_logic_vector(15 DOWNTO 0);                    VARIABLE rnd_data : OUT    std_logic_vector(31 DOWNTO 0)) IS    VARIABLE new_bit   : std_logic;    VARIABLE lsfr_reg  : std_logic_vector(15 DOWNTO 0);     BEGIN           lsfr_reg := state;        FOR i IN 0 TO 31 LOOP            rnd_data(i) := lsfr_reg(15);              lsfr_reg := (lsfr_reg(15) XOR lsfr_reg(14))                         & lsfr_reg(13)                          & (lsfr_reg(15) XOR lsfr_reg(12))                         & lsfr_reg(11 DOWNTO 4)                          & (lsfr_reg(15) XOR lsfr_reg(3))                          & lsfr_reg(2 DOWNTO 0) & lsfr_reg(15);            END LOOP;                                     state <= lsfr_reg;    END lsfr;       PROCEDURE get_crc (VARIABLE crc_accum : INOUT std_logic_vector(31 DOWNTO 0);                       VARIABLE code      : IN std_logic_vector(31 DOWNTO 0)) IS    VARIABLE i           : INTEGER;    BEGIN              i := to_nat (crc_accum(31 DOWNTO 24) XOR code(31 DOWNTO 24));                crc_accum := (crc_accum(23 DOWNTO 0) & "00000000") XOR crc_table(i);        i := to_nat (crc_accum(31 DOWNTO 24) XOR code(23 DOWNTO 16));                crc_accum := (crc_accum(23 DOWNTO 0) & "00000000") XOR crc_table(i);        i := to_nat (crc_accum(31 DOWNTO 24) XOR code(15 DOWNTO 8));                crc_accum := (crc_accum(23 DOWNTO 0) & "00000000") XOR crc_table(i);        i := to_nat (crc_accum(31 DOWNTO 24) XOR code(7 DOWNTO 0));                crc_accum := (crc_accum(23 DOWNTO 0) & "00000000") XOR crc_table(i);    END get_crc;            -- PHYSICAL PLANT INTERFACE    SIGNAL DATAIN             : std_logic_vector(PHYDATAWIDTH-1 DOWNTO 0);    SIGNAL SLUMBER            : std_logic:= '0';    SIGNAL PARTIAL            : std_logic:= '0';    SIGNAL NEARAFELB          : std_logic:= '0';    SIGNAL FARAFELB           : std_logic:= '0';    SIGNAL SPDSEL             : std_logic:= '0';    SIGNAL SYSTEMCLOCK        : std_logic:= '1';      SIGNAL COMMA              : std_logic:= '0';      SIGNAL DATAOUT            : std_logic_vector(PHYDATAWIDTH-1 DOWNTO 0);    SIGNAL RXCLOCK            : std_logic:= '0';      SIGNAL COMINIT            : std_logic:= '0';      SIGNAL COMWAKE            : std_logic:= '0';         SIGNAL PHYRDY             : std_logic := '0';    SIGNAL PHYRESET           : std_logic := '0';            -- TRANSMITTER           SIGNAL TX_int             : std_logic := 'Z';         SIGNAL TX_shift_reg       : std_logic_vector(9 DOWNTO 0) := "0000000000";    SIGNAL TX_reg             : std_logic_vector(9 DOWNTO 0) := "0000000000";     SIGNAL TX_shift_rdy       : std_logic;    SIGNAL TX_shift_reg_empty : std_logic := '1';    SIGNAL TX_ld              : std_logic := '0';        -- RECEIVER                          SIGNAL RX_int             : std_logic := 'Z';    SIGNAL rx_idle            : std_logic := 'Z'; --    SIGNAL RX_shift_reg       : std_logic_vector(9 DOWNTO 0) := "0000000000";    SIGNAL RX_data_rdy        : std_logic;         SIGNAL cominit_space_ok   : std_logic := '0';           SIGNAL comwake_space_ok   : std_logic := '0';    SIGNAL align              : std_logic := '0'; -- ALIGN pattern detected       SIGNAL align_ctrl         : std_logic := '0'; -- ALIGN pattern detected       SIGNAL nonalign           : std_logic := '0'; -- NONALIGN pattern detected       SIGNAL non_align_cnt      : INTEGER;        -- RX clock generator    SIGNAL RXclk_timeout      : std_logic := '0';    SIGNAL RXclk              : std_logic := '0';     SIGNAL RXclk_edge         : std_logic := '0';    -- TX clock generator    SIGNAL TXclk              : std_ulogic := '1';     -- PHY control    SIGNAL init_state            : phy_init := HR_RESET;     SIGNAL resume                : std_logic := '0';    SIGNAL speed                 : INTEGER := 1;            SIGNAL transmit_comwake      : std_logic := '0';    SIGNAL transmit_comreset     : std_logic := '0';      SIGNAL transmit_align        : std_logic := '0';        SIGNAL transmit_comwake_end  : std_logic := '0';    SIGNAL transmit_comreset_end : std_logic := '0';      SIGNAL transmit_D102         : std_logic := '0';    SIGNAL transmit_D102_end     : std_logic := '0';        SIGNAL transmit_align_end    : std_logic := '0';       SIGNAL transmit_link_data    : std_logic := '0';    SIGNAL calibration_end       : std_logic := '0';      SIGNAL power_on              : std_logic := '1';      SIGNAL await_align_timeout   : std_logic := '0';        -- LINK LAYER--    SIGNAL RX_rd              : std_logic := '0'; -- receiver running disparity   --    SIGNAL TX_rd              : std_logic := '0'; -- transmitter running disparity    -- Control     SIGNAL link_state, next_link_state : link_state_type;    -- primitives    SIGNAL CONTp                : std_logic := '0';    SIGNAL DMATp                : std_logic := '0';    SIGNAL EOFp                     : std_logic := '0';    SIGNAL HOLDp                : std_logic := '0';    SIGNAL HOLDAp                : std_logic := '0';    SIGNAL PMACKp                : std_logic := '0';    SIGNAL PMNAKp                : std_logic := '0';    SIGNAL PMREQ_Pp                : std_logic := '0';    SIGNAL PMREQ_Sp                : std_logic := '0';    SIGNAL R_ERRp                : std_logic := '0';    SIGNAL R_IPp                : std_logic := '0';    SIGNAL R_OKp                : std_logic := '0';    SIGNAL R_RDYp                : std_logic := '0';    SIGNAL SOFp                    : std_logic := '0';    SIGNAL SYNCp                : std_logic := '0';    SIGNAL WTRMp                : std_logic := '0';    SIGNAL X_RDYp                : std_logic := '0';        SIGNAL lsfr_state_scramble    : std_logic_vector(15 DOWNTO 0) := "1111111111111111";    SIGNAL lsfr_state_descramble  : std_logic_vector(15 DOWNTO 0) := "1111111111111111";    SIGNAL lsfr_state_cont        : std_logic_vector(15 DOWNTO 0) := "1111111111111111";            SIGNAL crc_check            : std_logic := '0';      SIGNAL link_data            : std_logic_vector(31 DOWNTO 0);     SIGNAL link_err             : std_logic_vector(3 DOWNTO 0);    SIGNAL link_ctrl            : std_logic_vector(3 DOWNTO 0);    SIGNAL link_crc             : std_logic_vector(31 DOWNTO 0);    SIGNAL link_FIS_data        : std_logic_vector(31 DOWNTO 0);     SIGNAL link_FIS_state       : std_logic_vector(1 DOWNTO 0);        SIGNAL rcv_fifo_read        : std_logic := '0';    SIGNAL rcv_fifo_write       : std_logic := '0';        SIGNAL tr_fifo_read        : std_logic := '0';    SIGNAL tr_fifo_write       : std_logic := '0';    SIGNAL RX_fifo_empty        : std_logic := '1';    SIGNAL RX_fifo_full         : std_logic := '0';        SIGNAL TX_fifo_empty        : std_logic := '1';    SIGNAL TX_fifo_full         : std_logic := '0';            SIGNAL RX_rd_ptr            : INTEGER := 0;    SIGNAL RX_wr_ptr            : INTEGER := 0;        SIGNAL TX_rd_ptr            : INTEGER := 0;    SIGNAL TX_wr_ptr            : INTEGER := 0;    SIGNAL RX_fifo              : rx_fifo_buffer_type;    SIGNAL TX_fifo              : tx_fifo_buffer_type;        -- TRANSPORT LAYER         SIGNAL TP_state             : TP_state_type;     SIGNAL next_TP_state        : TP_state_type;     SIGNAL TP_transmission_status : std_logic := '0';    SIGNAL TP_frame_end         : std_logic := '0';    SIGNAL TP_Frame_Rdy         : std_logic := '0';    SIGNAL TP_no_data           : std_logic := '0';    SIGNAL TP_Fifo_Space_Avail  : std_logic := '1';    SIGNAL TP_result            : TP_result_type;        SIGNAL TP_dataout           : std_logic_vector(31 DOWNTO 0);    SIGNAL TP_datain            : std_logic_vector(37 DOWNTO 0);    SIGNAL TP_FIS_end           : std_logic := '0';    SIGNAL TP_FIS_OK            : std_logic := '0';    SIGNAL TP_cmd_req           : std_logic := '0';-- Register block    SHARED VARIABLE RdDataPortReg         : std_logic_vector(15 DOWNTO 0) := (others => '0');    SHARED VARIABLE WrDataPortReg         : std_logic_vector(15 DOWNTO 0) := (others => '0');    SHARED VARIABLE ErrorReg            : std_logic_vector(7 DOWNTO 0) := (others => '0');    SHARED VARIABLE FeaturesReg            : std_logic_vector(15 DOWNTO 0) := (others => '0');    SHARED VARIABLE SectorCountReg        : std_logic_vector(15 DOWNTO 0) := (others => '0');    SHARED VARIABLE SectorNumberReg        : std_logic_vector(15 DOWNTO 0) := (others => '0');    SHARED VARIABLE CylinderLowReg        : std_logic_vector(15 DOWNTO 0) := (others => '0');    SHARED VARIABLE CylinderHighReg        : std_logic_vector(15 DOWNTO 0) := (others => '0');    SHARED VARIABLE DeviceHeadReg        : std_logic_vector(7 DOWNTO 0) := (others => '0');    SHARED VARIABLE StatusReg            : std_logic_vector(7 DOWNTO 0) := (others => '0');    SHARED VARIABLE CommandReg            : std_logic_vector(7 DOWNTO 0) := (others => '0');    SHARED VARIABLE AlternateStatusReg    : std_logic_vector(15 DOWNTO 0) := (others => '0');    SHARED VARIABLE DeviceControlReg    : std_logic_vector(7 DOWNTO 0) := (others => '0');    SIGNAL Ibit                   : std_logic := '0';    SIGNAL Cbit                   : std_logic := '0';    SIGNAL inst      : inst_store;          SIGNAL instr_cnt : INTEGER := 0;       BEGIN                                              CRC_INIT : PROCESS        VARIABLE crc_accum : std_logic_vector(31 DOWNTO 0);    BEGIN                        FOR i IN 0 TO 255 LOOP            crc_accum := (others => '0');            crc_accum(31 DOWNTO 24) := to_slv(i,8);            FOR j IN 0 TO 7 LOOP                IF crc_accum(31) = '1' THEN                       crc_accum := crc_accum(30 DOWNTO 0) & '0';                    crc_accum := crc_accum XOR POLYNOMIAL;                ELSE                       crc_accum := crc_accum(30 DOWNTO 0) & '0';                                                    END IF;            END LOOP;             crc_table(i) <= crc_accum;        END LOOP;         WAIT;    END PROCESS CRC_INIT;    ----------------------------------------------------------------------------    ----------------------------------------------------------------------------    --                       Physical plant                                   --    ----------------------------------------------------------------------------    ----------------------------------------------------------------------------        PHYRESET <= RESET;    ----------------------------------------------------------------------------    -- Recived data                                                           --    ----------------------------------------------------------------------------           RX_int <= (RXp AND NOT RXn) AFTER 1 ps;    rx_idle <= NOT (RXp XOR RXn); -- line is idle if both lines have same value    ----------------------------------------------------------------------------    -- Clock extractor                                                        --    ----------------------------------------------------------------------------                       RX_CLK_timeout : PROCESS(RXclk, rx_idle)                         VARIABLE TmpPer         : Time := 0 ps;    BEGIN          IF (RXclk'EVENT AND (rx_idle = '0')) THEN                  RXclk_timeout <= '0', '1' AFTER RXPERIOD/2;        END IF;                                    IF rising_edge(rx_idle) THEN            RXclk_timeout <= '0';        END IF;    END PROCESS RX_CLK_timeout;    RX_CLK : PROCESS(RX_int, RXclk_timeout, rx_idle)                         VARIABLE TmpPer         : Time := 0 ps;    VARIABLE Last_clk_edge  : Time := 0 ps;    BEGIN                       TmpPer := NOW - Last_clk_edge;                IF falling_edge(rx_idle) OR ((RX_int'EVENT AND TmpPer > RXPERIOD/4) AND (rx_idle = '0')) OR rising_edge(RXclk_timeout) THEN              RXclk <= not(RXclk);                  Last_clk_edge := NOW;                                 RXclk_edge <= '1', '0' AFTER 1 ps;        END IF;    END PROCESS RX_CLK;            ----------------------------------------------------------------------------    -- Space duration check                                                   --    ----------------------------------------------------------------------------                       SPACE_CHECK : PROCESS(rx_idle)                         VARIABLE burst_start         : Time := 0 ps;    VARIABLE space_start         : Time := 0 ps;    VARIABLE tmp_time            : Time := 0 ps;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -