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

📄 hsata.vhd

📁 Vhdl cod for a bus.For sp2e
💻 VHD
📖 第 1 页 / 共 5 页
字号:
----------------------------------------------------------------------------------------------------------------------------------------------------------  Copyright (C) 2004 Free Model Foundry; http://www.FreeModelFoundry.com/----  This program is free software; you can redistribute it and/or modify--  it under the terms of the GNU General Public License version 2 as--  published by the Free Software Foundation.---------------------------------------------------------------------------------  Company  : HDL Design House, Serbia and Montenegro--  Project  : SATA --  Module   : Host----  Date     : 26.3.2004--  Ver.     : 1.0----  Author   : Nebojsa Makljenovic--  Email    : n-makljenovic@hdl-dh.com--  Phone    : +381 11 344 23 59----  Customer :--------------------------------------------------------------------------------- Functional description of the module:-- SATA host VITAL model------------------------------------------------------------------------------------------------------------------------------------------------------------                    LIBRARY IEEE;   USE IEEE.std_logic_1164.ALL;                USE IEEE.VITAL_timing.ALL;                USE IEEE.VITAL_primitives.ALL;                USE STD.textio.ALL;LIBRARY FMF;    USE FMF.gen_utils.ALL;                USE FMF.conversions.ALL;                    ---------------------------------------------------------------------------------- ENTITY DECLARATION--------------------------------------------------------------------------------ENTITY Hsata IS       GENERIC (               -- tipd delays: interconnect path delays        tipd_RXp               : VitalDelayType01 := VitalZeroDelay01;        tipd_RXn               : VitalDelayType01 := VitalZeroDelay01;           -- generic control parameters        InstancePath        : STRING    := DefaultInstancePath;        TimingChecksOn      : BOOLEAN   := DefaultTimingChecks;        MsgOn               : BOOLEAN   := DefaultMsgOn;        XOn                 : BOOLEAN   := DefaultXon;        -- command file to be loaded        command_file_name   : STRING    := "hsata.cmd";        -- For FMF SDF technology file usage        TimingModel         : STRING    := DefaultTimingModel    );                  PORT (                  RESET            : IN    std_logic := 'L';        RXp             : IN    std_logic := 'L';        RXn             : IN    std_logic := 'L';        TXp             : OUT   std_logic := 'L';        TXn             : OUT   std_logic := 'L'    );                  ATTRIBUTE VITAL_LEVEL0 of Hsata : ENTITY IS TRUE;END Hsata;                            ---------------------------------------------------------------------------------- ARCHITECTURE DECLARATION--------------------------------------------------------------------------------ARCHITECTURE vhdl_behavioral of Hsata IS    ATTRIBUTE VITAL_LEVEL0 of vhdl_behavioral : ARCHITECTURE IS TRUE;                        CONSTANT PartID            : STRING := "Hsata";-- ipd                  SIGNAL RXp_ipd             : std_ulogic := 'U';    SIGNAL RXn_ipd             : std_ulogic := 'U';                        SIGNAL RXp_nwv             : std_ulogic := 'U';    SIGNAL RXn_nwv             : std_ulogic := 'U';    BEGIN                                       ----------------------------------------------------------------------------    -- Wire Delays      ----------------------------------------------------------------------------    WireDelay : BLOCK    BEGIN                                       w_1 : VitalWireDelay (RXp_ipd, RXp, tipd_RXp);        w_2 : VitalWireDelay (RXn_ipd, RXn, tipd_RXn);    END BLOCK;      -- sig_nwv <= To_UX01(sig_ipd);    RXp_nwv          <= To_UX01(RXp_ipd);    RXn_nwv          <= To_UX01(RXn_ipd);                                                   ----------------------------------------------------------------------------    -- Main Behavior Block    ----------------------------------------------------------------------------    Behavior: BLOCK                             PORT (                  RESET            : IN    std_logic := 'L';            RXp             : IN    std_logic := 'L';            RXn             : IN    std_logic := 'L';            TXp             : OUT   std_logic := 'L';            TXn             : OUT   std_logic := 'L'        );                  PORT MAP (                                               RESET => RESET,            RXp => RXp_nwv,            RXn => RXn_nwv,            TXp => TXp,            TXn => TXn        );        TYPE     table_line IS ARRAY(7 DOWNTO 0) OF std_ulogic_vector(9 DOWNTO 0);    TYPE     table IS ARRAY(31 DOWNTO 0) OF table_line;    TYPE     phy_init IS (HR_RESET,                           HR_AwaitCOMINIT,                           HR_AwaitNoCOMINIT,                           HR_Calibrate,                           HR_COMWAKE,                           HR_AwaitCOMWAKE,                           HR_AwaitNoCOMWAKE,                           HR_AwaitAlign,                           HR_SendAlign,                           HR_Ready,                            HR_Partial,                            HR_Slumber,                                 HR_AdjustSpeed);                 TYPE     link_state_type IS (    L1_L_IDLE,                                      LS1_L_NoCommErr,                                    LS2_L_NoComm,                                    LS3_L_SendAlign,                                    LS4_L_RESET,                                    LT1_HL_SendChkRdy,                                    LT3_L_SendSOF,                                    LT4_L_SendData,                                    LT5_L_RcvrHold,                                    LT6_L_SendHold,                                    LT7_L_SendCRC,                                    LT8_L_SendEOF,                                    LT9_L_Wait,                                    LR1_L_RcvChkRdy,                                    LR2_L_RcvWaitFifo,                                    LR3_L_RcvData,                                    LR4_L_Hold,                                    LR5_L_SendHold,                                    LR6_L_RcvEOF,                                    LR7_L_GoodCRC,                                    LR8_L_GoodEnd,                                    LR9_L_BadEnd);                                    TYPE TP_state_type IS (    HT_HostIdle,                            TP_SOF,                               HT_ChkTyp,                            HT_RegFIS,                            HT_PS_FIS,                            HT_PIOOTrans1,                            HT_PIOOTrans2,                            HT_PIOEND,                            HT_PIOITrans1,                            HT_PIOITrans2,                            HT_CmdFIS,                            HT_CmdFIS_TransStatus);     TYPE    TP_result_type IS (    GOOD,                                   NO_FIS,                                NO_RESP,                                ERR);                                      TYPE write_arg_type IS    RECORD      --        op          : NATURAL;        op          : string(1 to 5);        Data0       : NATURAL;        Data1       : NATURAL;        Data2       : NATURAL;        Remark      : string(1 to 40);    END RECORD;                     TYPE inst_store IS ARRAY(0 to 4095) OF write_arg_type;                                                        TYPE code_word_pair IS ARRAY(0 TO 1) OF std_logic_vector(9 DOWNTO 0);       TYPE rx_buffer_type IS ARRAY (0 TO 3) OF std_logic_vector(9 DOWNTO 0);    TYPE crc_table_type IS ARRAY (0 TO 255) OF std_logic_vector(31 DOWNTO 0);    CONSTANT FIFO_SIZE     : INTEGER := 16;    TYPE rx_fifo_buffer_type IS ARRAY(0 TO FIFO_SIZE - 1) OF std_logic_vector(37 DOWNTO 0);       TYPE tx_fifo_buffer_type IS ARRAY(0 TO FIFO_SIZE - 1) OF std_logic_vector(31 DOWNTO 0);           CONSTANT K283         : std_logic_vector(7 DOWNTO 0) := B"011_11100";    CONSTANT K285         : std_logic_vector(7 DOWNTO 0) := B"101_11100";    CONSTANT D102         : std_logic_vector(7 DOWNTO 0) := B"010_01010";    CONSTANT D105         : std_logic_vector(7 DOWNTO 0) := B"101_01010";    CONSTANT D211         : std_logic_vector(7 DOWNTO 0) := B"001_10101";    CONSTANT D212         : std_logic_vector(7 DOWNTO 0) := B"010_10101";    CONSTANT D213         : std_logic_vector(7 DOWNTO 0) := B"011_10101";    CONSTANT D214         : std_logic_vector(7 DOWNTO 0) := B"100_10101";    CONSTANT D215         : std_logic_vector(7 DOWNTO 0) := B"101_10101";    CONSTANT D216         : std_logic_vector(7 DOWNTO 0) := B"110_10101";    CONSTANT D217         : std_logic_vector(7 DOWNTO 0) := B"111_10101";    CONSTANT D221         : std_logic_vector(7 DOWNTO 0) := B"001_10110";    CONSTANT D222         : std_logic_vector(7 DOWNTO 0) := B"010_10110";    CONSTANT D230         : std_logic_vector(7 DOWNTO 0) := B"000_10111";    CONSTANT D231         : std_logic_vector(7 DOWNTO 0) := B"001_10111";    CONSTANT D232         : std_logic_vector(7 DOWNTO 0) := B"010_10111";    CONSTANT D242         : std_logic_vector(7 DOWNTO 0) := B"010_11000";    CONSTANT D254         : std_logic_vector(7 DOWNTO 0) := B"100_11001";    CONSTANT D273         : std_logic_vector(7 DOWNTO 0) := B"011_11011";        CONSTANT cK283         : code_word_pair := ("1100111100", "0011000011");    CONSTANT cK285         : code_word_pair := ("0101111100", "1010000011");    CONSTANT cD102          : code_word_pair := ("1010101010", "1010101010");    CONSTANT cD273          : code_word_pair := ("1100011011", "0011100100");    CONSTANT ALIGN_RDpos        : std_logic_vector(39 DOWNTO 0) := "1100011011101010101010101010101010000011";    CONSTANT ALIGN_RDneg        : std_logic_vector(39 DOWNTO 0) := "0011100100101010101010101010100101111100";    --    CONSTANT RXPERIOD          : Time := 666.43 ps;    CONSTANT RXPERIOD           : Time := 668 ps;    CONSTANT TXPERIOD           : Time := 666.43 ps;--    CONSTANT TXPERIOD           : Time := 667 ps;    CONSTANT MIN_COMRESET_SPACE : Time := 175 ns;    CONSTANT MAX_COMRESET_SPACE : Time := 525 ns;    CONSTANT MIN_COMINIT_SPACE  : Time := 175 ns;    CONSTANT MAX_COMINIT_SPACE  : Time := 525 ns;    CONSTANT MIN_COMWAKE_SPACE  : Time := 55 ns;    CONSTANT MAX_COMWAKE_SPACE  : Time := 175 ns;      CONSTANT FISt_reg_h2d      : std_logic_vector(7 DOWNTO 0) := X"27";        CONSTANT FISt_reg_d2h      : std_logic_vector(7 DOWNTO 0) := X"34";        CONSTANT FISt_set_dev_bit  : std_logic_vector(7 DOWNTO 0) := X"A1";     CONSTANT FISt_dma_activ    : std_logic_vector(7 DOWNTO 0) := X"39";     CONSTANT FISt_dma_setup    : std_logic_vector(7 DOWNTO 0) := X"41";     CONSTANT FISt_bist_activ   : std_logic_vector(7 DOWNTO 0) := X"58";     CONSTANT FISt_pio_setup    : std_logic_vector(7 DOWNTO 0) := X"5F";             CONSTANT FISt_data         : std_logic_vector(7 DOWNTO 0) := X"46";            CONSTANT FIS_SOF           : std_logic_vector(1 DOWNTO 0) := "01";        CONSTANT FIS_EOF           : std_logic_vector(1 DOWNTO 0) := "11";        CONSTANT FIS_PAYLOAD       : std_logic_vector(1 DOWNTO 0) := "10";        CONSTANT POLYNOMIAL        : std_logic_vector(31 DOWNTO 0) := X"04c11db7";        CONSTANT PHYDATAWIDTH       : INTEGER := 40;         SIGNAL crc_table          : crc_table_type;            PROCEDURE SendALIGN  (SIGNAL tx_empty : IN  std_logic;                          SIGNAL clk      : IN  std_logic;                          SIGNAL ld       : OUT std_logic;                          SIGNAL reg      : OUT std_logic_vector(9 DOWNTO 0))    IS    BEGIN                              IF tx_empty = '0' THEN            WAIT UNTIL tx_empty = '1';        END IF;               WAIT UNTIL clk='1';        -- negative rd assumed         reg <= cK285(0);--        ld <= '1', '0' AFTER 1 ps;        ld <= '1';        WAIT UNTIL clk='1';        ld <= '0';        WAIT UNTIL tx_empty = '1';        WAIT UNTIL clk='1';        reg <= cD102(1);        ld <= '1';        WAIT UNTIL clk='1';        ld <= '0';        WAIT UNTIL tx_empty = '1';        WAIT UNTIL clk='1';        reg <= cD102(0);        ld <= '1';        WAIT UNTIL clk='1';        ld <= '0';        WAIT UNTIL tx_empty = '1';        WAIT UNTIL clk='1';        reg <= cD273(1);

⌨️ 快捷键说明

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