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

📄 mt46v16m16.vhd

📁 free hardware ip core about sparcv8,a soc cpu in vhdl
💻 VHD
📖 第 1 页 / 共 4 页
字号:
---------------------------------------------------------------------------------------------     File Name: MT46V16M16.VHD--       Version: 3.1--          Date: January 14th, 2002--         Model: Behavioral--     Simulator: NCDesktop      - http://www.cadence.com--                ModelSim PE    - http://www.model.com----  Dependencies: None----         Email: modelsupport@micron.com--       Company: Micron Technology, Inc.--   Part Number: MT46V16M16 (4 Mb x 16 x 4 Banks)----   Description: Micron 256 Mb SDRAM DDR (Double Data Rate)----    Limitation: Doesn't model internal refresh counter----          Note: ----    Disclaimer: THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY --                WHATSOEVER AND MICRON SPECIFICALLY DISCLAIMS ANY --                IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR--                A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT.----                Copyright (c) 1998 Micron Semiconductor Products, Inc.--                All rights researved----  Rev  Author                        Date        Changes--  ---  ----------------------------  ----------  ---------------------------------------  2.1  SH                            01/14/2002  - Fix Burst_counter--       Micron Technology, Inc.----  2.0  SH                            11/08/2001  - Second release--       Micron Technology, Inc.                   - Rewrote and remove SHARED VARIABLE--  3.1  Craig Hanson    cahanson      05/28/2003  - update all models to release version 3.1--                       @micron.com                 (no changes to this model)-----------------------------------------------------------------------------------------LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.NUMERIC_STD.ALL;LIBRARY WORK;    USE WORK.MTI_PKG.ALL;    use std.textio.all;library grlib;use grlib.stdlib.all;library gaisler;use gaisler.sim.all;ENTITY MT46V16M16 IS    GENERIC (                                   -- Timing for -75Z CL2        tCK       : TIME    :=  7.500 ns;        tCH       : TIME    :=  3.375 ns;       -- 0.45*tCK        tCL       : TIME    :=  3.375 ns;       -- 0.45*tCK        tDH       : TIME    :=  0.500 ns;        tDS       : TIME    :=  0.500 ns;        tIH       : TIME    :=  0.900 ns;        tIS       : TIME    :=  0.900 ns;        tMRD      : TIME    := 15.000 ns;        tRAS      : TIME    := 40.000 ns;        tRAP      : TIME    := 20.000 ns;        tRC       : TIME    := 65.000 ns;        tRFC      : TIME    := 75.000 ns;        tRCD      : TIME    := 20.000 ns;        tRP       : TIME    := 20.000 ns;        tRRD      : TIME    := 15.000 ns;        tWR       : TIME    := 15.000 ns;        addr_bits : INTEGER := 13;        data_bits : INTEGER := 16;        cols_bits : INTEGER :=  9;        index     : INTEGER :=  0;	fname     : string := "sdram.srec";	-- File to read from        bbits     : INTEGER :=  16    );    PORT (        Dq    : INOUT STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => 'Z');        Dqs   : INOUT STD_LOGIC_VECTOR (1 DOWNTO 0) := "ZZ";        Addr  : IN    STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);        Ba    : IN    STD_LOGIC_VECTOR (1 DOWNTO 0);        Clk   : IN    STD_LOGIC;        Clk_n : IN    STD_LOGIC;        Cke   : IN    STD_LOGIC;        Cs_n  : IN    STD_LOGIC;        Ras_n : IN    STD_LOGIC;        Cas_n : IN    STD_LOGIC;        We_n  : IN    STD_LOGIC;        Dm    : IN    STD_LOGIC_VECTOR (1 DOWNTO 0)    );END MT46V16M16;ARCHITECTURE behave OF MT46V16M16 IS    -- Array for Read pipeline    TYPE Array_Read_cmnd IS ARRAY (8 DOWNTO 0) OF STD_LOGIC;    TYPE Array_Read_bank IS ARRAY (8 DOWNTO 0) OF STD_LOGIC_VECTOR (1 DOWNTO 0);    TYPE Array_Read_cols IS ARRAY (8 DOWNTO 0) OF STD_LOGIC_VECTOR (cols_bits - 1 DOWNTO 0);    -- Array for Write pipeline    TYPE Array_Write_cmnd IS ARRAY (2 DOWNTO 0) OF STD_LOGIC;    TYPE Array_Write_bank IS ARRAY (2 DOWNTO 0) OF STD_LOGIC_VECTOR (1 DOWNTO 0);    TYPE Array_Write_cols IS ARRAY (2 DOWNTO 0) OF STD_LOGIC_VECTOR (cols_bits - 1 DOWNTO 0);    -- Array for Auto Precharge    TYPE Array_Read_precharge  IS ARRAY (3 DOWNTO 0) OF STD_LOGIC;    TYPE Array_Write_precharge IS ARRAY (3 DOWNTO 0) OF STD_LOGIC;    TYPE Array_Count_precharge IS ARRAY (3 DOWNTO 0) OF INTEGER;    -- Array for Manual Precharge    TYPE Array_A10_precharge  IS ARRAY (8 DOWNTO 0) OF STD_LOGIC;    TYPE Array_Bank_precharge IS ARRAY (8 DOWNTO 0) OF STD_LOGIC_VECTOR (1 DOWNTO 0);    TYPE Array_Cmnd_precharge IS ARRAY (8 DOWNTO 0) OF STD_LOGIC;        -- Array for Burst Terminate    TYPE Array_Cmnd_bst IS ARRAY (8 DOWNTO 0) OF STD_LOGIC;    -- Array for Memory Access    TYPE Array_ram_type IS ARRAY (2**cols_bits - 1 DOWNTO 0) OF STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0);    TYPE Array_ram_pntr IS ACCESS Array_ram_type;    TYPE Array_ram_stor IS ARRAY (2**addr_bits - 1 DOWNTO 0) OF Array_ram_pntr;    -- Data pair    SIGNAL Dq_pair : STD_LOGIC_VECTOR (2 * data_bits - 1 DOWNTO 0);    SIGNAL Dm_pair : STD_LOGIC_VECTOR (3 DOWNTO 0);    -- Mode Register    SIGNAL Mode_reg : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0');        -- Command Decode Variables    SIGNAL Active_enable, Aref_enable, Burst_term, Ext_mode_enable : STD_LOGIC := '0';    SIGNAL Mode_reg_enable, Prech_enable, Read_enable, Write_enable : STD_LOGIC := '0';        -- Burst Length Decode Variables    SIGNAL Burst_length_2, Burst_length_4, Burst_length_8, Burst_length_f : STD_LOGIC := '0';        -- Cas Latency Decode Variables    SIGNAL Cas_latency_15, Cas_latency_2, Cas_latency_25, Cas_latency_3, Cas_latency_4 : STD_LOGIC := '0';    -- Internal Control Signals    SIGNAL Cs_in, Ras_in, Cas_in, We_in : STD_LOGIC := '0';    -- System Clock    SIGNAL Sys_clk : STD_LOGIC := '0';    -- Dqs buffer    SIGNAL Dqs_out : STD_LOGIC_VECTOR (1 DOWNTO 0) := "ZZ";BEGIN    -- Strip the strength    Cs_in  <= To_X01 (Cs_n);    Ras_in <= To_X01 (Ras_n);    Cas_in <= To_X01 (Cas_n);    We_in  <= To_X01 (We_n);        -- Commands Decode    Active_enable   <= NOT(Cs_in) AND NOT(Ras_in) AND     Cas_in  AND     We_in;    Aref_enable     <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND     We_in;    Burst_term      <= NOT(Cs_in) AND     Ras_in  AND     Cas_in  AND NOT(We_in);    Ext_mode_enable <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND NOT(We_in) AND     Ba(0)  AND NOT(Ba(1));    Mode_reg_enable <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND NOT(We_in) AND NOT(Ba(0)) AND NOT(Ba(1));    Prech_enable    <= NOT(Cs_in) AND NOT(Ras_in) AND     Cas_in  AND NOT(We_in);    Read_enable     <= NOT(Cs_in) AND     Ras_in  AND NOT(Cas_in) AND     We_in;    Write_enable    <= NOT(Cs_in) AND     Ras_in  AND NOT(Cas_in) AND NOT(We_in);    -- Burst Length Decode    Burst_length_2  <= NOT(Mode_reg(2)) AND NOT(Mode_reg(1)) AND     Mode_reg(0);    Burst_length_4  <= NOT(Mode_reg(2)) AND     Mode_reg(1)  AND NOT(Mode_reg(0));    Burst_length_8  <= NOT(Mode_reg(2)) AND     Mode_reg(1)  AND     Mode_reg(0);    Burst_length_f  <=    (Mode_reg(2)) AND     Mode_reg(1)  AND     Mode_reg(0);    -- CAS Latency Decode    Cas_latency_15  <=     Mode_reg(6)  AND NOT(Mode_reg(5)) AND    (Mode_reg(4));    Cas_latency_2   <= NOT(Mode_reg(6)) AND     Mode_reg(5)  AND NOT(Mode_reg(4));    Cas_latency_25  <=     Mode_reg(6)  AND     Mode_reg(5)  AND NOT(Mode_reg(4));    Cas_latency_3   <= NOT(Mode_reg(6)) AND     Mode_reg(5)  AND     Mode_reg(4);    Cas_latency_4   <=    (Mode_reg(6)) AND NOT(Mode_reg(5)) AND NOT(Mode_reg(4));    -- Dqs buffer    Dqs <= Dqs_out;    --    -- System Clock    --    int_clk : PROCESS (Clk, Clk_n)        VARIABLE ClkZ, CkeZ : STD_LOGIC := '0';    begin        IF Clk = '1' AND Clk_n = '0' THEN            ClkZ := '1';            CkeZ := Cke;        ELSIF Clk = '0' AND Clk_n = '1' THEN            ClkZ := '0';        END IF;        Sys_clk <= CkeZ AND ClkZ;    END PROCESS;    --    -- Main Process    --    state_register : PROCESS        -- Precharge Variables        VARIABLE Pc_b0, Pc_b1, Pc_b2, Pc_b3 : STD_LOGIC := '0';        -- Activate Variables        VARIABLE Act_b0, Act_b1, Act_b2, Act_b3 : STD_LOGIC := '1';        -- Data IO variables        VARIABLE Data_in_enable, Data_out_enable : STD_LOGIC := '0';        -- Internal address mux variables        VARIABLE Cols_brst : STD_LOGIC_VECTOR (2 DOWNTO 0);        VARIABLE Prev_bank : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00";        VARIABLE Bank_addr : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00";        VARIABLE Cols_addr : STD_LOGIC_VECTOR (cols_bits - 1 DOWNTO 0);        VARIABLE Rows_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);        VARIABLE B0_row_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);        VARIABLE B1_row_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);        VARIABLE B2_row_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);        VARIABLE B3_row_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);        -- DLL Reset variables        VARIABLE DLL_enable : STD_LOGIC := '0';        VARIABLE DLL_reset : STD_LOGIC := '0';        VARIABLE DLL_done : STD_LOGIC := '0';        VARIABLE DLL_count : INTEGER := 0;                -- Timing Check        VARIABLE MRD_chk : TIME := 0 ns;        VARIABLE RFC_chk : TIME := 0 ns;        VARIABLE RRD_chk : TIME := 0 ns;        VARIABLE RAS_chk0, RAS_chk1, RAS_chk2, RAS_chk3 : TIME := 0 ns;        VARIABLE RAP_chk0, RAP_chk1, RAP_chk2, RAP_chk3 : TIME := 0 ns;        VARIABLE RC_chk0, RC_chk1, RC_chk2, RC_chk3 : TIME := 0 ns;        VARIABLE RCD_chk0, RCD_chk1, RCD_chk2, RCD_chk3 : TIME := 0 ns;        VARIABLE RP_chk0, RP_chk1, RP_chk2, RP_chk3 : TIME := 0 ns;        VARIABLE WR_chk0, WR_chk1, WR_chk2, WR_chk3 : TIME := 0 ns;        -- Read pipeline variables        VARIABLE Read_cmnd : Array_Read_cmnd;        VARIABLE Read_bank : Array_Read_bank;        VARIABLE Read_cols : Array_Read_cols;        -- Write pipeline variables        VARIABLE Write_cmnd : Array_Write_cmnd;        VARIABLE Write_bank : Array_Write_bank;        VARIABLE Write_cols : Array_Write_cols;        -- Auto Precharge variables        VARIABLE Read_precharge  : Array_Read_precharge  := ('0' & '0' & '0' & '0');        VARIABLE Write_precharge : Array_Write_precharge := ('0' & '0' & '0' & '0');        VARIABLE Count_precharge : Array_Count_precharge := ( 0  &  0  &  0  &  0 );        -- Manual Precharge variables        VARIABLE A10_precharge  : Array_A10_precharge;        VARIABLE Bank_precharge : Array_Bank_precharge;        VARIABLE Cmnd_precharge : Array_Cmnd_precharge;        -- Burst Terminate variable        VARIABLE Cmnd_bst : Array_Cmnd_bst;        -- Memory Banks        VARIABLE Bank0 : Array_ram_stor;        VARIABLE Bank1 : Array_ram_stor;        VARIABLE Bank2 : Array_ram_stor;        VARIABLE Bank3 : Array_ram_stor;        -- Burst Counter        VARIABLE Burst_counter : STD_LOGIC_VECTOR (cols_bits - 1 DOWNTO 0);        -- Internal Dqs initialize        VARIABLE Dqs_int : STD_LOGIC := '0';        -- Data buffer for DM Mask        VARIABLE Data_buf : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => 'Z');        -- Load and Dumb variables        FILE     file_load : TEXT open read_mode is fname;   -- Data load        FILE     file_dump : TEXT open write_mode is "dumpdata.txt";   -- Data dump        VARIABLE Bank_Load : std_logic_vector ( 1 DOWNTO 0);        VARIABLE rows_load : std_logic_vector (12 DOWNTO 0);        VARIABLE cols_load : std_logic_vector ( 8 DOWNTO 0);        VARIABLE data_load : std_logic_vector (15 DOWNTO 0);        VARIABLE i, j      : INTEGER;        VARIABLE good_load : BOOLEAN;        VARIABLE l         : LINE;	variable file_loaded : boolean := false;	variable dump : std_logic := '0';	variable ch   : character;	variable rectype : std_logic_vector(3 downto 0);	variable recaddr : std_logic_vector(31 downto 0);	variable reclen : std_logic_vector(7 downto 0);	variable recdata : std_logic_vector(0 to 16*8-1);        --        -- Initialize empty rows        --        PROCEDURE Init_mem (Bank : STD_LOGIC_VECTOR; Row_index : INTEGER) IS            VARIABLE i, j : INTEGER := 0;        BEGIN            IF Bank = "00" THEN                IF Bank0 (Row_index) = NULL THEN                        -- Check to see if row empty                    Bank0 (Row_index) := NEW Array_ram_type;            -- Open new row for access                    FOR i IN (2**cols_bits - 1) DOWNTO 0 LOOP           -- Filled row with zeros                        FOR j IN (data_bits - 1) DOWNTO 0 LOOP                            Bank0 (Row_index) (i) (j) := '0';                        END LOOP;                    END LOOP;                END IF;            ELSIF Bank = "01" THEN                IF Bank1 (Row_index) = NULL THEN                    Bank1 (Row_index) := NEW Array_ram_type;                    FOR i IN (2**cols_bits - 1) DOWNTO 0 LOOP                        FOR j IN (data_bits - 1) DOWNTO 0 LOOP                            Bank1 (Row_index) (i) (j) := '0';                        END LOOP;                    END LOOP;                END IF;            ELSIF Bank = "10" THEN                IF Bank2 (Row_index) = NULL THEN                    Bank2 (Row_index) := NEW Array_ram_type;                    FOR i IN (2**cols_bits - 1) DOWNTO 0 LOOP                        FOR j IN (data_bits - 1) DOWNTO 0 LOOP                            Bank2 (Row_index) (i) (j) := '0';                        END LOOP;                    END LOOP;                END IF;            ELSIF Bank = "11" THEN                IF Bank3 (Row_index) = NULL THEN                    Bank3 (Row_index) := NEW Array_ram_type;                    FOR i IN (2**cols_bits - 1) DOWNTO 0 LOOP                        FOR j IN (data_bits - 1) DOWNTO 0 LOOP                            Bank3 (Row_index) (i) (j) := '0';                        END LOOP;                    END LOOP;                END IF;            END IF;        END;        --        -- Burst Counter        --        PROCEDURE Burst_decode IS            VARIABLE Cols_temp : STD_LOGIC_VECTOR (cols_bits - 1 DOWNTO 0) := (OTHERS => '0');        BEGIN            -- Advance burst counter            Burst_counter := Burst_counter + 1;            -- Burst Type            IF Mode_reg (3) = '0' THEN                Cols_temp := Cols_addr + 1;            ELSIF Mode_reg (3) = '1' THEN                Cols_temp (2) := Burst_counter (2) XOR Cols_brst (2);                Cols_temp (1) := Burst_counter (1) XOR Cols_brst (1);                Cols_temp (0) := Burst_counter (0) XOR Cols_brst (0);            END IF;            -- Burst Length            IF Burst_length_2 = '1' THEN                Cols_addr (0) := Cols_temp (0);            ELSIF Burst_length_4 = '1' THEN                Cols_addr (1 DOWNTO 0) := Cols_temp (1 DOWNTO 0);            ELSIF Burst_length_8 = '1' THEN                Cols_addr (2 DOWNTO 0) := Cols_temp (2 DOWNTO 0);            ELSE                Cols_addr := Cols_temp;

⌨️ 快捷键说明

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