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

📄 mt48lc4m32b2.vhd

📁 vhdl cod for ram.For sp3e
💻 VHD
📖 第 1 页 / 共 5 页
字号:
        SHARED VARIABLE Mem : MemBlock;        SHARED VARIABLE DataDrive  : std_logic_vector(31 DOWNTO 0);    BEGIN        PoweredUp <= false, true after tpowerup;    ---------------------------------------------------------------------------    -- Main Behavior Process    ---------------------------------------------------------------------------    Behavior : PROCESS (BAIn, DQM0In, DQM1In, DQM2In, DQM3In, DataIn, CLKIn,                        CKEIn, AddressIn, WENegIn, RASNegIn, CSNegIn,                        CASNegIn, PoweredUp)    -- Timing Check Variables    VARIABLE Tviol_BA_CLK       : X01 := '0';    VARIABLE TD_BA_CLK          : VitalTimingDataType;    VARIABLE Tviol_DQM0_CLK     : X01 := '0';    VARIABLE TD_DQM0_CLK        : VitalTimingDataType;    VARIABLE Tviol_DQM1_CLK     : X01 := '0';    VARIABLE TD_DQM1_CLK        : VitalTimingDataType;    VARIABLE Tviol_DQM2_CLK     : X01 := '0';    VARIABLE TD_DQM2_CLK        : VitalTimingDataType;    VARIABLE Tviol_DQM3_CLK     : X01 := '0';    VARIABLE TD_DQM3_CLK        : VitalTimingDataType;    VARIABLE Tviol_D0_CLK       : X01 := '0';    VARIABLE TD_D0_CLK          : VitalTimingDataType;    VARIABLE Tviol_CKE_CLK      : X01 := '0';    VARIABLE TD_CKE_CLK         : VitalTimingDataType;    VARIABLE Tviol_Address_CLK  : X01 := '0';    VARIABLE TD_Address_CLK     : VitalTimingDataType;    VARIABLE Tviol_WENeg_CLK    : X01 := '0';    VARIABLE TD_WENeg_CLK       : VitalTimingDataType;    VARIABLE Tviol_RASNeg_CLK   : X01 := '0';    VARIABLE TD_RASNeg_CLK      : VitalTimingDataType;    VARIABLE Tviol_CSNeg_CLK    : X01 := '0';    VARIABLE TD_CSNeg_CLK       : VitalTimingDataType;    VARIABLE Tviol_CASNeg_CLK   : X01 := '0';    VARIABLE TD_CASNeg_CLK      : VitalTimingDataType;    VARIABLE Pviol0_CLK  : X01 := '0';    VARIABLE PD0_CLK     : VitalPeriodDataType := VitalPeriodDataInit;    VARIABLE Pviol1_CLK  : X01 := '0';    VARIABLE PD1_CLK     : VitalPeriodDataType := VitalPeriodDataInit;    VARIABLE Pviol2_CLK  : X01 := '0';    VARIABLE PD2_CLK     : VitalPeriodDataType := VitalPeriodDataInit;    -- Type definition for commands    TYPE command_type is (                        desl,                        nop,                        bst,                        read,                        writ,                        act,                        pre,                        mrs,                        ref                        );    TYPE Burst_type IS (sequential, interleave);    TYPE Write_Burst_type IS (programmed, single);    TYPE sequence       IS ARRAY (0 to 7) OF NATURAL RANGE 0 to 7;    TYPE seqtab         IS ARRAY (0 to 7) OF sequence;    TYPE MemLoc         IS ARRAY (0 to 3) OF std_logic_vector(19 DOWNTO 0);    TYPE burst_counter  IS ARRAY (0 to 3) OF NATURAL RANGE 0 to 257;    TYPE StartAddr_type IS ARRAY (0 to 3) OF NATURAL RANGE 0 TO 7;    TYPE BurstInc_type  IS ARRAY (0 to 3) OF NATURAL RANGE 0 TO 255;    TYPE BaseLoc_type   IS ARRAY (0 to 3) OF NATURAL RANGE 0 TO depth;    CONSTANT seq0 : sequence := (0 & 1 & 2 & 3 & 4 & 5 & 6 & 7);    CONSTANT seq1 : sequence := (1 & 0 & 3 & 2 & 5 & 4 & 7 & 6);    CONSTANT seq2 : sequence := (2 & 3 & 0 & 1 & 6 & 7 & 4 & 5);    CONSTANT seq3 : sequence := (3 & 2 & 1 & 0 & 7 & 6 & 5 & 4);    CONSTANT seq4 : sequence := (4 & 5 & 6 & 7 & 0 & 1 & 2 & 3);    CONSTANT seq5 : sequence := (5 & 4 & 7 & 6 & 1 & 0 & 3 & 2);    CONSTANT seq6 : sequence := (6 & 7 & 4 & 5 & 2 & 3 & 0 & 1);    CONSTANT seq7 : sequence := (7 & 6 & 5 & 4 & 3 & 2 & 1 & 0);    CONSTANT intab : seqtab :=(seq0, seq1, seq2, seq3, seq4, seq5, seq6, seq7);    FILE mem_file       : text IS mem_file_name;    VARIABLE file_bank  : NATURAL := 0;    VARIABLE ind        : NATURAL := 0;    VARIABLE buf        : line;    VARIABLE MemAddr     : MemLoc;    VARIABLE Loc         : NATURAL RANGE 0 TO 4*depth := 0;    VARIABLE BaseLoc     : BaseLoc_type;    VARIABLE BurstInc    : BurstInc_type;    VARIABLE StartAddr   : StartAddr_type;    VARIABLE BurstLen    : NATURAL RANGE 0 TO 256 := 0;    VARIABLE Burst_Bits  : NATURAL RANGE 0 TO 7   := 0;    VARIABLE Burst       : Burst_Type;    VARIABLE WB          : Write_Burst_Type;    VARIABLE BurstCnt    : burst_counter;    VARIABLE command   : command_type;    VARIABLE written   : boolean := false;    VARIABLE chip_en   : boolean := false;    VARIABLE cur_bank  : natural range 0 to hi_bank;    VARIABLE ModeReg      : std_logic_vector(11 DOWNTO 0) := (OTHERS => 'X');    VARIABLE Ref_Cnt      : NATURAL RANGE 0 TO 4096 := 0;    VARIABLE Next_Ref     : TIME;    VARIABLE BankString   : STRING(8 DOWNTO 1) := " Bank-X ";    -- Functionality Results Variables    VARIABLE Violation     : X01 := '0';    VARIABLE DataDriveOut  :  std_logic_vector(31 DOWNTO 0) := (OTHERS => 'Z');    SUBTYPE OutWord   IS std_logic_vector(31 DOWNTO 0);    VARIABLE DataDrive1 : OutWord;    VARIABLE DataDrive2 : OutWord;    VARIABLE DataDrive3 : OutWord;    VARIABLE DQM0_reg0  : UX01;    VARIABLE DQM0_reg1  : UX01;    VARIABLE DQM0_reg2  : UX01;    VARIABLE DQM1_reg0  : UX01;    VARIABLE DQM1_reg1  : UX01;    VARIABLE DQM1_reg2  : UX01;    VARIABLE DQM2_reg0  : UX01;    VARIABLE DQM2_reg1  : UX01;    VARIABLE DQM2_reg2  : UX01;    VARIABLE DQM3_reg0  : UX01;    VARIABLE DQM3_reg1  : UX01;    VARIABLE DQM3_reg2  : UX01;    VARIABLE report_err : BOOLEAN := FALSE;    VARIABLE line       : NATURAL := 0;    PROCEDURE generate_out    (Bank  :   IN  NATURAL )    IS    BEGIN        DataDrive(7 downto 0) := (others => 'U');        IF Mem(Bank)(Loc) > -2 THEN            DataDrive(7 downto 0) := (others => 'X');        END IF;        IF Mem(Bank)(Loc) > -1 THEN            DataDrive(7 downto 0) := to_slv(Mem(Bank)(Loc),8);        END IF;        DataDrive(15 downto 8) := (others => 'U');        IF Mem(Bank)(Loc+1) > -2 THEN            DataDrive(15 downto 8) := (others => 'X');        END IF;        IF Mem(Bank)(Loc+1) > -1 THEN            DataDrive(15 downto 8) := to_slv(Mem(Bank)(Loc+1),8);        END IF;        DataDrive(23 downto 16) := (others => 'U');        IF Mem(Bank)(Loc+2) > -2 THEN            DataDrive(23 downto 16) := (others => 'X');        END IF;        IF Mem(Bank)(Loc+2) > -1 THEN            DataDrive(23 downto 16) := to_slv(Mem(Bank)(Loc+2),8);        END IF;        DataDrive(31 downto 24) := (others => 'U');        IF Mem(Bank)(Loc+3) > -2 THEN            DataDrive(31 downto 24) := (others => 'X');        END IF;        IF Mem(Bank)(Loc+3) > -1 THEN            DataDrive(31 downto 24) := to_slv(Mem(Bank)(Loc+3),8);        END IF;    END PROCEDURE generate_out;    PROCEDURE MemWrite    (Bank  :   IN  NATURAL )    IS    BEGIN        IF (DQM0_nwv = '0') THEN            Mem(Bank)(Loc) := -1;            IF Violation = '0' THEN                Mem(Bank)(Loc) := to_nat(DataIn(7 downto 0));            END IF;        END IF;        IF (DQM1_nwv = '0') THEN            Mem(Bank)(Loc+1) := -1;            IF Violation = '0' THEN                Mem(Bank)(Loc+1) := to_nat(DataIn(15 downto 8));            END IF;        END IF;        IF (DQM2_nwv = '0') THEN            Mem(Bank)(Loc+2) := -1;            IF Violation = '0' THEN                Mem(Bank)(Loc+2) := to_nat(DataIn(23 downto 16));            END IF;        END IF;        IF (DQM3_nwv = '0') THEN            Mem(Bank)(Loc+3) := -1;            IF Violation = '0' THEN                Mem(Bank)(Loc+3) := to_nat(DataIn(31 downto 24));            END IF;        END IF;    END PROCEDURE MemWrite;    PROCEDURE BurstIncProc    (Bank  :   IN  NATURAL )    IS    BEGIN        BurstInc(bank) := 0;        IF (Burst_Bits > 0) THEN            BurstInc(bank) := to_nat(AddressIn(Burst_Bits-1 downto 0));        END IF;    END PROCEDURE BurstIncProc;    PROCEDURE NextStateAuto    (Bank  :   IN  NATURAL;     state :   IN mem_state )    IS    BEGIN        IF (AddressIn(10) = '0') THEN            statebank(bank) <= state;        ELSIF (AddressIn(10) = '1') THEN            IF state = write THEN                statebank(bank) <= write_auto_pre;            ELSE                statebank(bank) <= read_auto_pre;            END IF;        END IF;    END PROCEDURE NextStateAuto;    BEGIN        --------------------------------------------------------------------        -- Timing Check Section        --------------------------------------------------------------------        IF (TimingChecksOn) THEN            VitalSetupHoldCheck (                TestSignal      => BAIn,                TestSignalName  => "BA",                RefSignal       => CLKIn,                RefSignalName   => "CLK",                SetupHigh       => tsetup_DQ0_CLK,                SetupLow        => tsetup_DQ0_CLK,                HoldHigh        => thold_DQ0_CLK,                HoldLow         => thold_DQ0_CLK,                CheckEnabled    => chip_en,                RefTransition   => '/',                HeaderMsg       => InstancePath & PartID,                TimingData      => TD_BA_CLK,                XOn             => XOn,                MsgOn           => MsgOn,                Violation       => Tviol_BA_CLK );            VitalSetupHoldCheck (                TestSignal      => DQM0In,                TestSignalName  => "DQM0",                RefSignal       => CLKIn,                RefSignalName   => "CLK",                SetupHigh       => tsetup_DQ0_CLK,                SetupLow        => tsetup_DQ0_CLK,                HoldHigh        => thold_DQ0_CLK,                HoldLow         => thold_DQ0_CLK,                CheckEnabled    => chip_en,                RefTransition   => '/',                HeaderMsg       => InstancePath & PartID,                TimingData      => TD_DQM0_CLK,                XOn             => XOn,                MsgOn           => MsgOn,                Violation       => Tviol_DQM0_CLK );            VitalSetupHoldCheck (                TestSignal      => DQM1In,                TestSignalName  => "DQM1",                RefSignal       => CLKIn,                RefSignalName   => "CLK",                SetupHigh       => tsetup_DQ0_CLK,                SetupLow        => tsetup_DQ0_CLK,                HoldHigh        => thold_DQ0_CLK,                HoldLow         => thold_DQ0_CLK,                CheckEnabled    => chip_en,                RefTransition   => '/',                HeaderMsg       => InstancePath & PartID,                TimingData      => TD_DQM1_CLK,                XOn             => XOn,                MsgOn           => MsgOn,                Violation       => Tviol_DQM1_CLK );            VitalSetupHoldCheck (                TestSignal      => DQM2In,                TestSignalName  => "DQM2",                RefSignal       => CLKIn,                RefSignalName   => "CLK",                SetupHigh       => tsetup_DQ0_CLK,                SetupLow        => tsetup_DQ0_CLK,                HoldHigh        => thold_DQ0_CLK,                HoldLow         => thold_DQ0_CLK,                CheckEnabled    => chip_en,                RefTransition   => '/',                HeaderMsg       => InstancePath & PartID,                TimingData      => TD_DQM2_CLK,                XOn             => XOn,                MsgOn           => MsgOn,                Violation       => Tviol_DQM2_CLK );

⌨️ 快捷键说明

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