mt48lc4m16.vhd

来自「VHDL的ram和fifo model code 包含众多的厂家」· VHDL 代码 · 共 1,475 行 · 第 1/5 页

VHD
1,475
字号
                    written := true;                ELSIF (cur_bank = bank) OR (command = mrs) THEN                    ASSERT false                        REPORT InstancePath & partID & BankString &                               ": Illegal command "                               & "received in active state."                        SEVERITY SeverityMode;                END IF;            WHEN write =>                IF (command = bst) THEN                    IF rising_edge(CLKIn) THEN                        ASSERT false                            REPORT InstancePath & partID & BankString &                               ": Illegal command "                               & "received in write state."                            SEVERITY SeverityMode;                    END IF;                ELSIF (command = read) THEN                    IF cur_bank = bank THEN                        FixColumnAddress(bank);                        ReadFromMem(bank);                        Burst_Cnt(bank) := 1;                        IF (AddressIn(10) = '0') THEN                            statebank(bank) <= read;                        ELSIF (AddressIn(10) = '1') THEN                            statebank(bank) <= read_auto_pre;                        END IF;                    ELSE                        statebank(bank) <= bank_act;                    END IF;                ELSIF (command = writ) THEN                    IF (Burst_Cnt(bank) = Burst_Length) THEN                        statebank(bank) <= bank_act;                        Burst_Cnt(bank) := 0;                        ras_in(bank) <= '1';                        Burst_Inc(bank) := 0;                    ELSE                        IF cur_bank = bank THEN                            FixColumnAddress(bank);                            ASSERT ((AddressIn(10) = '0') OR                                    (AddressIn(10) = '1'))                                REPORT InstancePath & partID & BankString &                                  ": AddressIn(10) = X"                                  & " during write command. Next state unknown."                                SEVERITY SeverityMode;                            IF (AddressIn(10) = '0') THEN                                statebank(bank) <= write;                            ELSIF (AddressIn(10) = '1') THEN                                statebank(bank) <= write_auto_pre;                            END IF;                            WriteToMem(bank);                            Burst_Cnt(bank) := 1;                            written := true;                        ELSE                            statebank(bank)<=bank_act;                        END IF;                    END IF;                ELSIF (command = pre) AND ((cur_bank = bank) OR                            (AddressIn(10) = '1')) THEN                    ASSERT ras_out(bank) = '1'                        REPORT InstancePath & partID & BankString &                               ": precharge command"                               & " does not meet tRAS time."                        SEVERITY SeverityMode;                   ASSERT (DQML_nwv = '1' and DQMH_nwv = '1')                       REPORT InstancePath & partID & BankString &                          ": DQM should be"                          & " held high, data is lost."                       SEVERITY SeverityMode;                   statebank(bank) <= precharge, idle AFTER tdevice_TRP;                ELSIF (command = nop) OR (cur_bank /= bank) THEN                    IF (Burst_Cnt(bank) = Burst_Length OR WB = single) THEN                         statebank(bank) <= bank_act;                         Burst_Cnt(bank) := 0;                         ras_in(bank) <= '1';                         Burst_Inc(bank) := 0;                    ELSE                         statebank(bank) <= write;                         BurstCtrl(bank);                         WriteToMem(bank);                    END IF;                ELSIF cur_bank = bank THEN                    ASSERT false                        REPORT InstancePath & partID & ": Illegal command"                               & " received in write state."                        SEVERITY SeverityMode;                END IF;            WHEN read =>                IF (command = bst) THEN                    statebank(bank) <= bank_act;                    Burst_Cnt(bank) := 0;                    Burst_Inc(bank) := 0;                ELSIF (command = read) THEN                    IF cur_bank = bank THEN                        FixColumnAddress(bank);                        ReadFromMem(bank);                        Burst_Cnt(bank) := 1;                        IF (AddressIn(10) = '0') THEN                            statebank(bank) <= read;                        ELSIF (AddressIn(10) = '1') THEN                            statebank(bank) <= read_auto_pre;                        END IF;                    ELSE                        statebank(bank) <= bank_act;                    END IF;                ELSIF (command = writ) THEN                    IF cur_bank = bank THEN                        IF (Burst_Cnt(bank) = Burst_Length) THEN                            statebank(bank) <= bank_act;                            Burst_Cnt(bank) := 0;                            ras_in(bank) <= '1';                            Burst_Inc(bank) := 0;                        ELSE                            FixColumnAddress(bank);                            WriteToMem(bank);                            ASSERT ((AddressIn(10) = '0') OR                                    (AddressIn(10) = '1'))                                REPORT InstancePath & partID & BankString &                                    ": AddressIn(10) = X"                                & " during write command. Next state unknown."                                SEVERITY SeverityMode;                            IF (AddressIn(10) = '0') THEN                                statebank(bank) <= write;                            ELSIF (AddressIn(10) = '1') THEN                                statebank(bank) <= write_auto_pre;                            END IF;                            Burst_Cnt(bank) := 1;                            written := true;                        END IF;                    ELSE                        statebank(bank)<=bank_act;                    END IF;                ELSIF (command = pre) AND ((cur_bank = bank) OR                       (AddressIn(10) = '1')) THEN                    statebank(bank) <= precharge, idle AFTER tdevice_TRP;                    ASSERT ras_out(bank) = '1'                        REPORT InstancePath & partID & BankString &                           ": precharge command"                               & " does not meet tRAS time."                        SEVERITY SeverityMode;                ELSIF (command = nop) OR (cur_bank /= bank) THEN                    IF (Burst_Cnt(bank) = Burst_Length) THEN                        statebank(bank) <= bank_act;                        Burst_Cnt(bank) := 0;                        ras_in(bank) <= '1';                        Burst_Inc(bank) := 0;                    ELSE                        statebank(bank) <= read;                        BurstCtrl(bank);                        ReadFromMem(bank);                    END IF;                ELSIF cur_bank = bank THEN                    ASSERT false                        REPORT InstancePath & partID & BankString &                               ": Illegal command"                               & " received in read state."                        SEVERITY SeverityMode;                END IF;            WHEN write_auto_pre =>                IF (command = nop) OR (cur_bank /= bank) THEN                    IF (Burst_Cnt(bank) = Burst_Length OR WB = single) THEN                        statebank(bank) <= precharge, idle AFTER tdevice_TRP;                        Burst_Cnt(bank) := 0;                        ras_in(bank) <= '1';                        Burst_Inc(bank) := 0;                    ELSE                        statebank(bank)<=write_auto_pre;                        BurstCtrl(bank);                        WriteToMem(bank);                    END IF;               ELSE                    ASSERT false                        REPORT InstancePath & partID & BankString &                               ": Illegal command"                               & " received in write state."                        SEVERITY SeverityMode;                END IF;            WHEN read_auto_pre =>                IF (command = nop) OR (cur_bank /= bank) THEN                    IF (Burst_Cnt(bank) = Burst_Length) THEN                        statebank(bank) <= precharge, idle AFTER tdevice_TRP;                        Burst_Cnt(bank) := 0;                        ras_in(bank) <= '1';                        Burst_Inc(bank) := 0;                    ELSE                        statebank(bank) <=read_auto_pre;                        BurstCtrl(bank);                        ReadFromMem(bank);                    END IF;                ELSIF (command = read) AND (cur_bank /= bank) THEN                    statebank(bank) <= precharge, idle AFTER tdevice_TRP;                ELSE                    ASSERT false                        REPORT InstancePath & partID & BankString &                               ": Illegal command"                               & " received in read state."                        SEVERITY SeverityMode;                END IF;            WHEN others => null;        END CASE;        END LOOP banks;    -- Check Refresh Status        IF (written = true) THEN            ASSERT Ref_Cnt > 0                REPORT InstancePath & partID &                       ": memory not refreshed (by ref_cnt)"                SEVERITY SeverityMode;        END IF;    END IF;    --------------------------------------------------------------------    -- Output Section    --------------------------------------------------------------------    IF rising_edge(CLKIn) THEN        DQML_reg2 := DQML_reg1;        DQML_reg1 := DQMLIn;        DQMH_reg2 := DQMH_reg1;        DQMH_reg1 := DQMHIn;        IF (CAS_Lat = 2) THEN            DataDriveOutL := DataDrive2L;            DataDriveOutH := DataDrive2H;        ELSE            DataDriveOutL := DataDrive3L;            DataDriveOutH := DataDrive3H;        END IF;        IF DQML_reg2 = '1' THEN            D_zd(7 downto 0) <= (OTHERS => 'Z');        ELSE            D_zd(7 downto 0) <= DataDriveOutL;        END IF;        IF DQMH_reg2 = '1' THEN            D_zd(15 downto 8) <= (OTHERS => 'Z');        ELSE            D_zd(15 downto 8) <= DataDriveOutH;        END IF;        IF  CKEreg = '1' THEN            DataDrive3L := DataDrive2L;            DataDrive2L := DataDrive1L;            DataDrive1L := DataDriveL;            DataDrive3H := DataDrive2H;            DataDrive2H := DataDrive1H;            DataDrive1H := DataDriveH;        END IF;    END IF;   -- The Powering-down State Machine    IF (rising_edge(CLKIn) AND CKEreg = '1' AND CKEIn = '0') THEN        ASSERT (not(Is_X(CSNegIn)))            REPORT InstancePath & partID & ": Unusable value for CSNeg"            SEVERITY SeverityMode;        IF (CSNegIn = '1') THEN            command := nop;        END IF;        CASE statebank(cur_bank) IS            WHEN idle =>                IF (command = nop) THEN      

⌨️ 快捷键说明

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