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

📄 mt48lc16m16a2.vhd

📁 用VHDL语言实现的ARM处理器的标准内核的源代码程序
💻 VHD
📖 第 1 页 / 共 5 页
字号:
                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);            -- Read or Write with Auto Precharge Counter            IF Auto_precharge (0) = '1' THEN                Count_precharge (0) := Count_precharge (0) + 1;            END IF;            IF Auto_precharge (1) = '1' THEN                Count_precharge (1) := Count_precharge (1) + 1;            END IF;            IF Auto_precharge (2) = '1' THEN                Count_precharge (2) := Count_precharge (2) + 1;            END IF;            IF Auto_precharge (3) = '1' THEN                Count_precharge (3) := Count_precharge (3) + 1;            END IF;                        -- Auto Precharge Timer for tWR            if (Burst_length_1 = '1' OR Write_burst_mode = '1') then                if (Count_precharge(0) = 1) then                    Count_time(0) := NOW;                end if;                if (Count_precharge(1) = 1) then                    Count_time(1) := NOW;                end if;                if (Count_precharge(2) = 1) then                    Count_time(2) := NOW;                end if;                if (Count_precharge(3) = 1) then                    Count_time(3) := NOW;                end if;            elsif (Burst_length_2 = '1') then                if (Count_precharge(0) = 2) then                    Count_time(0) := NOW;                end if;                if (Count_precharge(1) = 2) then                    Count_time(1) := NOW;                end if;                if (Count_precharge(2) = 2) then                    Count_time(2) := NOW;                end if;                if (Count_precharge(3) = 2) then                    Count_time(3) := NOW;                end if;            elsif (Burst_length_4 = '1') then                if (Count_precharge(0) = 4) then                    Count_time(0) := NOW;                end if;                if (Count_precharge(1) = 4) then                    Count_time(1) := NOW;                end if;                if (Count_precharge(2) = 4) then                    Count_time(2) := NOW;                end if;                if (Count_precharge(3) = 4) then                    Count_time(3) := NOW;                end if;            elsif (Burst_length_8 = '1') then                if (Count_precharge(0) = 8) then                    Count_time(0) := NOW;                end if;                if (Count_precharge(1) = 8) then                    Count_time(1) := NOW;                end if;                if (Count_precharge(2) = 8) then                    Count_time(2) := NOW;                end if;                if (Count_precharge(3) = 8) then                    Count_time(3) := NOW;                end if;            end if;            -- tMRD Counter            MRD_chk := MRD_chk + 1;            -- tWR Counter            WR_counter(0) := WR_counter(0) + 1;            WR_counter(1) := WR_counter(1) + 1;            WR_counter(2) := WR_counter(2) + 1;            WR_counter(3) := WR_counter(3) + 1;            -- Auto Refresh            IF Aref_enable = '1' THEN                -- Auto Refresh to Auto Refresh                ASSERT (NOW - RC_chk >= tRC)                    REPORT "tRC violation during Auto Refresh"                    SEVERITY WARNING;                -- Precharge to Auto Refresh                ASSERT (NOW - RP_chk0 >= tRP OR NOW - RP_chk1 >= tRP OR NOW - RP_chk2 >= tRP OR NOW - RP_chk3 >= tRP)                    REPORT "tRP violation during Auto Refresh"                    SEVERITY WARNING;                -- All banks must be idle before refresh                IF (Pc_b3 ='0' OR Pc_b2 = '0' OR Pc_b1 ='0' OR Pc_b0 = '0') THEN                    ASSERT (FALSE)                        REPORT "All banks must be Precharge before Auto Refresh"                        SEVERITY WARNING;                END IF;                -- Record current tRC time                RC_chk := NOW;            END IF;                        -- Load Mode Register            IF Mode_reg_enable = '1' THEN                Mode_reg <= TO_BITVECTOR (Addr);                IF (Pc_b3 ='0' OR Pc_b2 = '0' OR Pc_b1 ='0' OR Pc_b0 = '0') THEN                    ASSERT (FALSE)                        REPORT "All bank must be Precharge before Load Mode Register"                        SEVERITY WARNING;                END IF;                -- REF to LMR                ASSERT (NOW - RC_chk >= tRC)                    REPORT "tRC violation during Load Mode Register"                    SEVERITY WARNING;                -- LMR to LMR                ASSERT (MRD_chk >= tMRD)                    REPORT "tMRD violation during Load Mode Register"                    SEVERITY WARNING;                -- Record current tMRD time                MRD_chk := 0;            END IF;                        -- Active Block (latch Bank and Row Address)            IF Active_enable = '1' THEN                IF Ba = "00" AND Pc_b0 = '1' THEN                    Act_b0 := '1';                    Pc_b0 := '0';                    B0_row_addr := TO_BITVECTOR (Addr);                    RCD_chk0 := NOW;                    RAS_chk0 := NOW;                    -- Precharge to Active Bank 0                    ASSERT (NOW - RP_chk0 >= tRP)                        REPORT "tRP violation during Activate Bank 0"                        SEVERITY WARNING;                ELSIF Ba = "01" AND Pc_b1 = '1' THEN                    Act_b1 := '1';                    Pc_b1 := '0';                    B1_row_addr := TO_BITVECTOR (Addr);                    RCD_chk1 := NOW;                    RAS_chk1 := NOW;                    -- Precharge to Active Bank 1                    ASSERT (NOW - RP_chk1 >= tRP)                        REPORT "tRP violation during Activate Bank 1"                        SEVERITY WARNING;                ELSIF Ba = "10" AND Pc_b2 = '1' THEN                    Act_b2 := '1';                    Pc_b2 := '0';                    B2_row_addr := TO_BITVECTOR (Addr);                    RCD_chk2 := NOW;                    RAS_chk2 := NOW;                    -- Precharge to Active Bank 2                    ASSERT (NOW - RP_chk2 >= tRP)                        REPORT "tRP violation during Activate Bank 2"                        SEVERITY WARNING;                ELSIF Ba = "11" AND Pc_b3 = '1' THEN                    Act_b3 := '1';                    Pc_b3 := '0';                    B3_row_addr := TO_BITVECTOR (Addr);                    RCD_chk3 := NOW;                    RAS_chk3 := NOW;                    -- Precharge to Active Bank 3                    ASSERT (NOW - RP_chk3 >= tRP)                        REPORT "tRP violation during Activate Bank 3"                        SEVERITY WARNING;                ELSIF Ba = "00" AND Pc_b0 = '0' THEN                    ASSERT (FALSE)                        REPORT "Bank 0 is not Precharged"                        SEVERITY WARNING;                ELSIF Ba = "01" AND Pc_b1 = '0' THEN                    ASSERT (FALSE)                        REPORT "Bank 1 is not Precharged"                        SEVERITY WARNING;                ELSIF Ba = "10" AND Pc_b2 = '0' THEN                    ASSERT (FALSE)                        REPORT "Bank 2 is not Precharged"                        SEVERITY WARNING;                ELSIF Ba = "11" AND Pc_b3 = '0' THEN                    ASSERT (FALSE)                        REPORT "Bank 3 is not Precharged"                        SEVERITY WARNING;                END IF;                -- Active Bank A to Active Bank B                IF ((Previous_bank /= TO_BITVECTOR (Ba)) AND (NOW - RRD_chk < tRRD)) THEN                    ASSERT (FALSE)                        REPORT "tRRD violation during Activate"                        SEVERITY WARNING;                END IF;                -- LMR to ACT                ASSERT (MRD_chk >= tMRD)                    REPORT "tMRD violation during Activate"                    SEVERITY WARNING;                -- AutoRefresh to Activate                ASSERT (NOW - RC_chk >= tRC)                    REPORT "tRC violation during Activate"                    SEVERITY WARNING;                -- Record variable for checking violation                RRD_chk := NOW;                Previous_bank := TO_BITVECTOR (Ba);            END IF;                        -- Precharge Block            IF Prech_enable = '1' THEN                IF Addr(10) = '1' THEN                    Pc_b0 := '1'; 

⌨️ 快捷键说明

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