📄 at25320a.vhd
字号:
--------------------------------------------------------------------------------- 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 + -