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

📄 at25320a.vhd

📁 vhdl cod for ram.For sp3e
💻 VHD
📖 第 1 页 / 共 3 页
字号:
---------------------------------------------------------------------------------  File Name: at25320a.vhd---------------------------------------------------------------------------------  Copyright (C) 2006 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.----  MODIFICATION HISTORY:----  version: |  author:        | mod date: |  changes made:--    V1.0     S.Petrovic       06 Mar 29    Inital Release--    V1.1     R. Munden        06 Nov 27    Corrected memory write---------------------------------------------------------------------------------  PART DESCRIPTION:----  Library:    RAM--  Technology: EEPROM--  Part:       AT25320A----   Description: 32K (4096 x 8) Serial EEPROM with 5MHz SPI Bus Interface---------------------------------------------------------------------------------  Known Bugs:---------------------------------------------------------------------------------LIBRARY IEEE;   USE IEEE.std_logic_1164.ALL;                USE STD.textio.ALL;                USE IEEE.VITAL_timing.ALL;                USE IEEE.VITAL_primitives.ALL;LIBRARY FMF;    USE FMF.gen_utils.ALL;                USE FMF.conversions.ALL;--------------------------------------------------------------------------------- ENTITY DECLARATION-------------------------------------------------------------------------------ENTITY at25320a IS    GENERIC (        -- tipd delays: interconnect path delays        tipd_SCK            : VitalDelayType01 := VitalZeroDelay01;        tipd_SI             : VitalDelayType01 := VitalZeroDelay01;        tipd_CSNeg          : VitalDelayType01 := VitalZeroDelay01;        tipd_HOLDNeg        : VitalDelayType01 := VitalZeroDelay01;        tipd_WPNeg          : VitalDelayType01 := VitalZeroDelay01;        -- tpd delays        tpd_SCK_SO          : VitalDelayType01z := UnitDelay01z;--tV        tpd_CSNeg_SO        : VitalDelayType01Z := UnitDelay01Z;--tDIS        tpd_HOLDNeg_SO      : VitalDelayType01Z := UnitDelay01Z;--tLZ,tHZ        --tsetup values        tsetup_SI_SCK       : VitalDelayType := UnitDelay;  --tSU /        tsetup_CSNeg_SCK    : VitalDelayType := UnitDelay;  --tCSS /        tsetup_HOLDNeg_SCK  : VitalDelayType := UnitDelay;  --tHD /        --thold values        thold_SI_SCK        : VitalDelayType := UnitDelay;  --tH /        thold_CSNeg_SCK     : VitalDelayType := UnitDelay;  --tCSH \        thold_HOLDNeg_SCK   : VitalDelayType := UnitDelay;  --tCD \        --tpw values: pulse width        tpw_SCK_posedge     : VitalDelayType := UnitDelay; --tWH        tpw_SCK_negedge     : VitalDelayType := UnitDelay; --tWL        tpw_CSNeg_posedge   : VitalDelayType := UnitDelay; --tCS        -- tperiod min (calculated as 1/max freq)        tperiod_SCK         : VitalDelayType := UnitDelay; -- fSCK=5MHz        -- tdevice values: values for internal delays            -- Write cycle time        tdevice_WR          : VitalDelayType    := 5 ms;   --tWC        -- generic control parameters        InstancePath        : STRING    := DefaultInstancePath;        TimingChecksOn      : BOOLEAN   := DefaultTimingChecks;        MsgOn               : BOOLEAN   := DefaultMsgOn;        XOn                 : BOOLEAN   := DefaultXon;        -- memory file to be loaded        mem_file_name       : STRING    := "at25320a.mem";        UserPreload         : BOOLEAN   := FALSE; --TRUE;        -- For FMF SDF technology file usage        TimingModel         : STRING    := DefaultTimingModel    );    PORT (        SCK             : IN    std_ulogic := 'U'; --serial clock input        SI              : IN    std_ulogic := 'U'; --serial data input        CSNeg           : IN    std_ulogic := 'U'; -- chip select input        HOLDNeg         : IN    std_ulogic := 'U'; -- hold input        WPNeg           : IN    std_ulogic := 'U'; -- write protect input        SO              : OUT   std_ulogic := 'U'  --serial data output    );    ATTRIBUTE VITAL_LEVEL0 of at25320a : ENTITY IS TRUE;END at25320a;--------------------------------------------------------------------------------- ARCHITECTURE DECLARATION-------------------------------------------------------------------------------ARCHITECTURE vhdl_behavioral of at25320a IS    ATTRIBUTE VITAL_LEVEL0 OF vhdl_behavioral : ARCHITECTURE IS TRUE;    CONSTANT PartID        : STRING  := "at25320a";    CONSTANT MaxData       : NATURAL := 16#FF#; --255;    CONSTANT HiAddrBit     : NATURAL := 15;    CONSTANT AddrRANGE     : NATURAL := 16#FFF#;    CONSTANT BlockNum      : NATURAL := 3;    CONSTANT BYTE          : NATURAL := 8;-- interconnect path delay signals    SIGNAL SCK_ipd         : std_ulogic := 'U';    SIGNAL SI_ipd          : std_ulogic := 'U';    SIGNAL CSNeg_ipd       : std_ulogic := 'U';    SIGNAL HOLDNeg_ipd     : std_ulogic := 'U';    SIGNAL WPNeg_ipd       : std_ulogic := 'U';    ---  internal delays    SIGNAL WR_in           : std_ulogic := '0';    SIGNAL WR_out          : std_ulogic := '0';BEGIN    ---------------------------------------------------------------------------    -- Internal Delays    ---------------------------------------------------------------------------    -- Artificial VITAL primitives to incorporate internal delays    WR     :VitalBuf(WR_out,  WR_in,      (tdevice_WR     ,UnitDelay));    ---------------------------------------------------------------------------    -- Wire Delays    ---------------------------------------------------------------------------    WireDelay : BLOCK    BEGIN        w_1 : VitalWireDelay (SCK_ipd,     SCK, tipd_SCK);        w_2 : VitalWireDelay (SI_ipd,      SI, tipd_SI);        w_3 : VitalWireDelay (CSNeg_ipd,   CSNeg, tipd_CSNeg);        w_4 : VitalWireDelay (HOLDNeg_ipd, HOLDNeg, tipd_HOLDNeg);        w_5 : VitalWireDelay (WPNeg_ipd,    WPNeg, tipd_WPNeg);    END BLOCK;    ---------------------------------------------------------------------------    -- Main Behavior Block    ---------------------------------------------------------------------------    Behavior: BLOCK        -- State Machine : State_Type        TYPE state_type IS (IDLE,                            WRITE_SR,                            PAGE_PG                            );        -- Instruction Type        TYPE instruction_type IS (NONE,                                  WREN,                                  WRDI,                                  WRSR,                                  RDSR,                                  READ,                                  PP                                  );        TYPE WByteType IS ARRAY (0 TO 31) OF INTEGER RANGE -1 TO MaxData;        -- Memory Array        TYPE MemArray IS ARRAY (0 TO AddrRANGE) OF INTEGER RANGE -1 TO MaxData;    ---------------------------------------------------------------------------    --  memory declaration    ---------------------------------------------------------------------------        SHARED VARIABLE Mem         : MemArray := (OTHERS => MaxData);        -- states        SIGNAL current_state    : state_type;        SIGNAL next_state       : state_type;        SIGNAL WByte            : WByteType := (others => 0);        SIGNAL Instruct         : instruction_type;        --zero delay signal        SIGNAL SO_zd            : std_logic :='Z';        --HOLD delay on output data        SIGNAL SO_z             : std_logic :='Z';        SHARED VARIABLE Status_reg   : std_logic_vector(7 downto 0)                                                := (others => '0');        SIGNAL Status_reg_in         : std_logic_vector(7 downto 0)                                              := (others => '0');        ALIAS RDY    :std_logic IS Status_reg(0);        ALIAS WEN    :std_logic IS Status_reg(1);        ALIAS BP0    :std_logic IS Status_reg(2);        ALIAS BP1    :std_logic IS Status_reg(3);        ALIAS WPEN   :std_logic IS Status_reg(7);        --Command Register        SIGNAL write            : std_logic := '0';        SIGNAL read_out         : std_logic := '0';        SIGNAL change_addr      : std_logic := '0';        --FSM control signals        SIGNAL WDONE            : std_logic := '1'; -- Write. Done        SIGNAL WSTART           : std_logic := '0'; --Start Write        SIGNAL Byte_number      : NATURAL RANGE 0 TO 31    := 0;        SHARED VARIABLE Block_Prot    : std_logic_vector(BlockNum downto 0) :=                                                   (OTHERS => '0');        SIGNAL Address          : NATURAL RANGE 0 TO AddrRANGE := 0;        -- timing check violation        SIGNAL Viol                : X01 := '0';        PROCEDURE ADDRHILO_PG(            VARIABLE   AddrLOW  : INOUT NATURAL RANGE 0 to AddrRANGE;            VARIABLE   AddrHIGH : INOUT NATURAL RANGE 0 to AddrRANGE;            VARIABLE   Addr     : NATURAL) IS            VARIABLE   page     : NATURAL RANGE 0 TO 32;        BEGIN            page     := Addr/16#20#;            AddrLOW  := Page*16#20#;            AddrHIGH := Page*16#20# + 16#1F#;        END AddrHILO_PG;    BEGIN    ---------------------------------------------------------------------------    -- VITAL Timing Checks Procedures    ---------------------------------------------------------------------------    VITALTimingCheck: PROCESS(SI_ipd, SCK_ipd, CSNeg_ipd, HOLDNeg_ipd)         -- Timing Check Variables        VARIABLE Tviol_SI_SCK     : X01 := '0';        VARIABLE TD_SI_SCK        : VitalTimingDataType;        VARIABLE Tviol_HOLDS_SCK  : X01 := '0';        VARIABLE TD_HOLDS_SCK     : VitalTimingDataType;        VARIABLE Tviol_HOLDH_SCK  : X01 := '0';        VARIABLE TD_HOLDH_SCK     : VitalTimingDataType;        VARIABLE Tviol_CSS_SCK     : X01 := '0';        VARIABLE TD_CSS_SCK        : VitalTimingDataType;        VARIABLE Tviol_CSH_SCK     : X01 := '0';        VARIABLE TD_CSH_SCK        : VitalTimingDataType;        VARIABLE Pviol_CS         : X01 := '0';        VARIABLE PD_CS            : VitalPeriodDataType := VitalPeriodDataInit;        VARIABLE Pviol_SCK        : X01 := '0';        VARIABLE PD_SCK           : VitalPeriodDataType := VitalPeriodDataInit;        VARIABLE Violation        : X01 := '0';    BEGIN    ---------------------------------------------------------------------------    -- Timing Check Section    ---------------------------------------------------------------------------    IF (TimingChecksOn) THEN        -- Setup/Hold Check between SI and SCK        VitalSetupHoldCheck (            TestSignal      => SI_ipd,            TestSignalName  => "SI",            RefSignal       => SCK_ipd,            RefSignalName   => "SCK",            SetupHigh       => tsetup_SI_SCK,            SetupLow        => tsetup_SI_SCK,            HoldHigh        => thold_SI_SCK,            HoldLow         => thold_SI_SCK,            CheckEnabled    => true,            RefTransition   => '/',            HeaderMsg       => InstancePath & PartID,            TimingData      => TD_SI_SCK,            Violation       => Tviol_SI_SCK        );        -- Setup Check between HOLD# and SCK /        VitalSetupHoldCheck (            TestSignal      => HOLDNeg_ipd,            TestSignalName  => "HOLD#",            RefSignal       => SCK_ipd,            RefSignalName   => "SCK",            SetupHigh       => tsetup_HOLDNeg_SCK,            SetupLow        => tsetup_HOLDNeg_SCK,            CheckEnabled    => true,

⌨️ 快捷键说明

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