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

📄 mt48lc16m16a2.vhd

📁 用VHDL语言实现的ARM处理器的标准内核的源代码程序
💻 VHD
📖 第 1 页 / 共 5 页
字号:
LIBRARY WORK;    USE WORK.MTI_PKG.ALL;    use std.textio.all;use work.macro.all;ENTITY mt48lc16m16a2 IS    GENERIC (        -- Timing Parameters for -75 (PC133) and CAS Latency = 2        tAC       : TIME    :=  6.0 ns;        tHZ       : TIME    :=  7.0 ns;        tOH       : TIME    :=  2.7 ns;        tMRD      : INTEGER :=  2;          -- 2 Clk Cycles        tRAS      : TIME    := 44.0 ns;        tRC       : TIME    := 66.0 ns;        tRCD      : TIME    := 20.0 ns;        tRP       : TIME    := 20.0 ns;        tRRD      : TIME    := 15.0 ns;        tWRa      : TIME    :=  7.5 ns;     -- A2 Version - Auto precharge mode only (1 Clk + 7.5 ns)        tWRp      : TIME    := 15.0 ns;     -- A2 Version - Precharge mode only (15 ns)        tAH       : TIME    :=  0.8 ns;        tAS       : TIME    :=  1.5 ns;        tCH       : TIME    :=  2.5 ns;        tCL       : TIME    :=  2.5 ns;        tCK       : TIME    := 10.0 ns;        tDH       : TIME    :=  0.8 ns;        tDS       : TIME    :=  1.5 ns;        tCKH      : TIME    :=  0.8 ns;        tCKS      : TIME    :=  1.5 ns;        tCMH      : TIME    :=  0.8 ns;        tCMS      : TIME    :=  1.5 ns;        addr_bits : INTEGER := 13;        data_bits : INTEGER := 16;        col_bits  : INTEGER :=  9;        index     : INTEGER :=  0;	fname     : string := "tsource/sdram.rec"	-- File to read from    );    PORT (        Dq    : INOUT STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => 'Z');        Addr  : IN    STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0');        Ba    : IN    STD_LOGIC_VECTOR := "00";        Clk   : IN    STD_LOGIC := '0';        Cke   : IN    STD_LOGIC := '1';        Cs_n  : IN    STD_LOGIC := '1';        Ras_n : IN    STD_LOGIC := '1';        Cas_n : IN    STD_LOGIC := '1';        We_n  : IN    STD_LOGIC := '1';        Dqm   : IN    STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"    );END mt48lc16m16a2;ARCHITECTURE behave OF mt48lc16m16a2 IS    TYPE   State       IS (ACT, A_REF, BST, LMR, NOP, PRECH, READ, READ_A, WRITE, WRITE_A, LOAD_FILE, DUMP_FILE);    TYPE   Array4xI    IS ARRAY (3 DOWNTO 0) OF INTEGER;    TYPE   Array4xT    IS ARRAY (3 DOWNTO 0) OF TIME;    TYPE   Array4xB    IS ARRAY (3 DOWNTO 0) OF BIT;    TYPE   Array4x2BV  IS ARRAY (3 DOWNTO 0) OF BIT_VECTOR (1 DOWNTO 0);    TYPE   Array4xCBV  IS ARRAY (4 DOWNTO 0) OF BIT_VECTOR (Col_bits - 1 DOWNTO 0);    TYPE   Array_state IS ARRAY (4 DOWNTO 0) OF State;    SIGNAL Operation : State := NOP;    SIGNAL Mode_reg : BIT_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0');    SIGNAL Active_enable, Aref_enable, Burst_term : BIT := '0';    SIGNAL Mode_reg_enable, Prech_enable, Read_enable, Write_enable : BIT := '0';    SIGNAL Burst_length_1, Burst_length_2, Burst_length_4, Burst_length_8 : BIT := '0';    SIGNAL Cas_latency_2, Cas_latency_3 : BIT := '0';    SIGNAL Ras_in, Cas_in, We_in : BIT := '0';    SIGNAL Write_burst_mode : BIT := '0';    SIGNAL RAS_clk, Sys_clk, CkeZ : BIT := '0';    -- Checking internal wires    SIGNAL Pre_chk : BIT_VECTOR (3 DOWNTO 0) := "0000";    SIGNAL Act_chk : BIT_VECTOR (3 DOWNTO 0) := "0000";    SIGNAL Dq_in_chk, Dq_out_chk : BIT := '0';    SIGNAL Bank_chk : BIT_VECTOR (1 DOWNTO 0) := "00";    SIGNAL Row_chk : BIT_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0');    SIGNAL Col_chk : BIT_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0');BEGIN    -- CS# Decode    WITH Cs_n SELECT        Cas_in <= TO_BIT (Cas_n, '1') WHEN '0',                  '1' WHEN '1',                  '1' WHEN OTHERS;    WITH Cs_n SELECT        Ras_in <= TO_BIT (Ras_n, '1') WHEN '0',                  '1' WHEN '1',                  '1' WHEN OTHERS;    WITH Cs_n SELECT        We_in  <= TO_BIT (We_n,  '1') WHEN '0',                  '1' WHEN '1',                  '1' WHEN OTHERS;        -- Commands Decode    Active_enable   <= NOT(Ras_in) AND     Cas_in  AND     We_in;    Aref_enable     <= NOT(Ras_in) AND NOT(Cas_in) AND     We_in;    Burst_term      <=     Ras_in  AND     Cas_in  AND NOT(We_in);    Mode_reg_enable <= NOT(Ras_in) AND NOT(Cas_in) AND NOT(We_in);    Prech_enable    <= NOT(Ras_in) AND     Cas_in  AND NOT(We_in);    Read_enable     <=     Ras_in  AND NOT(Cas_in) AND     We_in;    Write_enable    <=     Ras_in  AND NOT(Cas_in) AND NOT(We_in);    -- Burst Length Decode    Burst_length_1  <= NOT(Mode_reg(2)) AND NOT(Mode_reg(1)) AND NOT(Mode_reg(0));    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);    -- CAS Latency Decode    Cas_latency_2   <= NOT(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);    -- Write Burst Mode    Write_burst_mode <= Mode_reg(9);    -- RAS Clock for checking tWR and tRP    PROCESS        variable Clk0, Clk1 : integer := 0;    begin        RAS_clk <= '1';        wait for 0.5 ns;        RAS_clk <= '0';        wait for 0.5 ns;        if Clk0 > 100 or Clk1 > 100 then            wait;        else            if Clk = '1' and Cke = '1' then                Clk0 := 0;                Clk1 := Clk1 + 1;            elsif Clk = '0' and Cke = '1' then                Clk0 := Clk0 + 1;                Clk1 := 0;            end if;        end if;    END PROCESS;    -- System Clock    int_clk : PROCESS (Clk)        begin            IF Clk'LAST_VALUE = '0' AND Clk = '1' THEN 		--'                CkeZ <= TO_BIT(Cke, '1');            END IF;            Sys_clk <= CkeZ AND TO_BIT(Clk, '0');    END PROCESS;    state_register : PROCESS        -- NOTE: The extra bits in RAM_TYPE is for checking memory access.  A logic 1 means        --       the location is in use.  This will be checked when doing memory DUMP.        TYPE ram_type IS ARRAY (2**col_bits - 1 DOWNTO 0) OF BIT_VECTOR (data_bits DOWNTO 0);        TYPE ram_pntr IS ACCESS ram_type;        TYPE ram_stor IS ARRAY (2**addr_bits - 1 DOWNTO 0) OF ram_pntr;        VARIABLE Bank0 : ram_stor;        VARIABLE Bank1 : ram_stor;        VARIABLE Bank2 : ram_stor;        VARIABLE Bank3 : ram_stor;        VARIABLE Row_index, Col_index : INTEGER := 0;        VARIABLE Dq_temp : BIT_VECTOR (data_bits DOWNTO 0) := (OTHERS => '0');        VARIABLE Col_addr : Array4xCBV;        VARIABLE Bank_addr : Array4x2BV;        VARIABLE Dqm_reg0, Dqm_reg1 : BIT_VECTOR (1 DOWNTO 0) := "00";        VARIABLE Bank, Previous_bank : BIT_VECTOR (1 DOWNTO 0) := "00";        VARIABLE B0_row_addr, B1_row_addr, B2_row_addr, B3_row_addr : BIT_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0');        VARIABLE Col_brst : BIT_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0');        VARIABLE Row : BIT_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0');        VARIABLE Col : BIT_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0');        VARIABLE Burst_counter : INTEGER := 0;        VARIABLE Command : Array_state;        VARIABLE Bank_precharge : Array4x2BV;        VARIABLE A10_precharge : Array4xB := ('0' & '0' & '0' & '0');        VARIABLE Auto_precharge : Array4xB := ('0' & '0' & '0' & '0');        VARIABLE Read_precharge : Array4xB := ('0' & '0' & '0' & '0');        VARIABLE Write_precharge : Array4xB := ('0' & '0' & '0' & '0');        VARIABLE RW_interrupt_read : Array4xB := ('0' & '0' & '0' & '0');        VARIABLE RW_interrupt_write : Array4xB := ('0' & '0' & '0' & '0');        VARIABLE RW_interrupt_bank : BIT_VECTOR (1 DOWNTO 0) := "00";        VARIABLE Count_time : Array4xT := (0 ns & 0 ns & 0 ns & 0 ns);        VARIABLE Count_precharge : Array4xI := (0 & 0 & 0 & 0);        VARIABLE Data_in_enable, Data_out_enable : BIT := '0';        VARIABLE Pc_b0, Pc_b1, Pc_b2, Pc_b3 : BIT := '0';        VARIABLE Act_b0, Act_b1, Act_b2, Act_b3 : BIT := '0';        -- Timing Check        VARIABLE MRD_chk : INTEGER := 0;        VARIABLE WR_counter : Array4xI := (0 & 0 & 0 & 0);        VARIABLE WR_time : Array4xT := (0 ns & 0 ns & 0 ns & 0 ns);        VARIABLE WR_chkp : Array4xT := (0 ns & 0 ns & 0 ns & 0 ns);        VARIABLE RC_chk, RRD_chk : TIME := 0 ns;        VARIABLE RAS_chk0, RAS_chk1, RAS_chk2, RAS_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;        -- Load and Dumb variables        FILE     file_load : TEXT IS IN  fname;   -- Data load        FILE     file_dump : TEXT IS OUT "dumpdata.txt";   -- Data dump        VARIABLE bank_load : bit_vector ( 1 DOWNTO 0);        VARIABLE rows_load : BIT_VECTOR (12 DOWNTO 0);        VARIABLE cols_load : BIT_VECTOR ( 8 DOWNTO 0);        VARIABLE data_load : BIT_VECTOR (15 DOWNTO 0);        VARIABLE i, j      : INTEGER;        VARIABLE good_load : BOOLEAN;        VARIABLE l         : LINE;	variable load : std_logic := '1';	variable dump : std_logic := '0';	variable ch   : character;	variable rectype : bit_vector(3 downto 0);	variable recaddr : bit_vector(31 downto 0);	variable reclen : bit_vector(7 downto 0);	variable recdata : bit_vector(0 to 16*8-1);        -- Initialize empty rows        PROCEDURE Init_mem (Bank : bit_vector (1 DOWNTO 0); 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 ram_type;                  -- Open new row for access                    FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP            -- Filled row with zeros                        FOR j IN (data_bits) 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 ram_type;                    FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP                        FOR j IN (data_bits) 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 ram_type;                    FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP                        FOR j IN (data_bits) 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 ram_type;                    FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP                        FOR j IN (data_bits) 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 Col_int : INTEGER := 0;            VARIABLE Col_vec, Col_temp : BIT_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0');        BEGIN            -- Advance Burst Counter            Burst_counter := Burst_counter + 1;            -- Burst Type            IF Mode_reg (3) = '0' THEN                Col_int := TO_INTEGER(Col);                Col_int := Col_int + 1;                TO_BITVECTOR (Col_int, Col_temp);            ELSIF Mode_reg (3) = '1' THEN                TO_BITVECTOR (Burst_counter, Col_vec);                Col_temp (2) :=  Col_vec (2) XOR Col_brst (2);                Col_temp (1) :=  Col_vec (1) XOR Col_brst (1);                Col_temp (0) :=  Col_vec (0) XOR Col_brst (0);            END IF;            -- Burst Length            IF Burst_length_2 = '1' THEN                Col (0) := Col_temp (0);            ELSIF Burst_length_4 = '1' THEN                Col (1 DOWNTO 0) := Col_temp (1 DOWNTO 0);            ELSIF Burst_length_8 = '1' THEN                Col (2 DOWNTO 0) := Col_temp (2 DOWNTO 0);            ELSE                Col := Col_temp;            END IF;            -- Burst Read Single Write            IF Write_burst_mode = '1' AND Data_in_enable = '1' THEN                Data_in_enable := '0';            END IF;            -- Data counter            IF Burst_length_1 = '1' THEN

⌨️ 快捷键说明

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