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

📄 mt48lc16m16a2.vhd

📁 free hardware ip core about sparcv8,a soc cpu in vhdl
💻 VHD
📖 第 1 页 / 共 5 页
字号:
    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 open read_mode is fname;   -- Data load        FILE     file_dump : TEXT open write_mode is "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                IF Burst_counter >= 1 THEN                    IF Data_in_enable = '1' THEN                        Data_in_enable := '0';                    ELSIF Data_out_enable = '1' THEN                        Data_out_enable := '0';                    END IF;                END IF;            ELSIF Burst_length_2 = '1' THEN                IF Burst_counter >= 2 THEN                    IF Data_in_enable = '1' THEN                        Data_in_enable := '0';                    ELSIF Data_out_enable = '1' THEN                        Data_out_enable := '0';                    END IF;                END IF;            ELSIF Burst_length_4 = '1' THEN                IF Burst_counter >= 4 THEN                    IF Data_in_enable = '1' THEN                        Data_in_enable := '0';                    ELSIF Data_out_enable = '1' THEN                        Data_out_enable := '0';                    END IF;                END IF;            ELSIF Burst_length_8 = '1' THEN                IF Burst_counter >= 8 THEN                    IF Data_in_enable = '1' THEN                        Data_in_enable := '0';                    ELSIF Data_out_enable = '1' THEN                        Data_out_enable := '0';                    END IF;                END IF;            END IF;        END;    BEGIN        WAIT ON Sys_clk, RAS_clk;        IF Sys_clk'event AND Sys_clk = '1' AND Load = '0' AND Dump = '0' THEN 		--'            -- Internal Command Pipeline            Command(0) := Command(1);            Command(1) := Command(2);            Command(2) := Command(3);            Command(3) := NOP;                        Col_addr(0) := Col_addr(1);            Col_addr(1) := Col_addr(2);            Col_addr(2) := Col_addr(3);            Col_addr(3) := (OTHERS => '0');                        Bank_addr(0) := Bank_addr(1);            Bank_addr(1) := Bank_addr(2);            Bank_addr(2) := Bank_addr(3);            Bank_addr(3) := "00";            Bank_precharge(0) := Bank_precharge(1);            Bank_precharge(1) := Bank_precharge(2);            Bank_precharge(2) := Bank_precharge(3);            Bank_precharge(3) := "00";            A10_precharge(0) := A10_precharge(1);            A10_precharge(1) := A10_precharge(2);            A10_precharge(2) := A10_precharge(3);            A10_precharge(3) := '0';                        -- Operation Decode (Optional for showing current command on posedge clock / debug feature)            IF Active_enable = '1' THEN                Operation <= ACT;            ELSIF Aref_enable = '1' THEN                Operation <= A_REF;            ELSIF Burst_term = '1' THEN                Operation <= BST;            ELSIF Mode_reg_enable = '1' THEN                Operation <= LMR;            ELSIF Prech_enable = '1' THEN                Operation <= PRECH;            ELSIF Read_enable = '1' THEN                IF Addr(10) = '0' THEN                    Operation <= READ;                ELSE                    Operation <= READ_A;                END IF;            ELSIF Write_enable = '1' THEN                IF Addr(10) = '0' THEN                    Operation <= WRITE;                ELSE                    Operation <= WRITE_A;                END IF;            ELSE                Operation <= NOP;            END IF;                        -- Dqm pipeline for Read            Dqm_reg0 := Dqm_reg1;            Dqm_reg1 := TO_BITVECTOR(Dqm);

⌨️ 快捷键说明

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