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

📄 mt48lc16m16a2.vhd

📁 用VHDL语言实现的ARM处理器的标准内核的源代码程序
💻 VHD
📖 第 1 页 / 共 5 页
字号:
                    Row := B1_row_addr;                ELSIF Bank_addr (0) = "10" THEN                    Row := B2_row_addr;                ELSE                    Row := B3_row_addr;                END IF;                Burst_counter := 0;                Data_in_enable := '1';                Data_out_enable := '0';            END IF;            -- DQ (Driver / Receiver)            Row_index := TO_INTEGER (Row);            Col_index := TO_INTEGER (Col);            IF Data_in_enable = '1' THEN                IF Dqm /= "11" THEN                    Init_mem (Bank, Row_index);                    IF Bank = "00" THEN                        Dq_temp := Bank0 (Row_index) (Col_index);                        IF Dqm = "01" THEN                            Dq_temp (15 DOWNTO 8) := TO_BITVECTOR (Dq (15 DOWNTO 8));                        ELSIF Dqm = "10" THEN                            Dq_temp (7 DOWNTO 0) := TO_BITVECTOR (Dq (7 DOWNTO 0));                        ELSE                            Dq_temp (15 DOWNTO 0) := TO_BITVECTOR (Dq (15 DOWNTO 0));                        END IF;                        Bank0 (Row_index) (Col_index) := ('1' & Dq_temp(data_bits - 1 DOWNTO 0));                    ELSIF Bank = "01" THEN                        Dq_temp := Bank1 (Row_index) (Col_index);                        IF Dqm = "01" THEN                            Dq_temp (15 DOWNTO 8) := TO_BITVECTOR (Dq (15 DOWNTO 8));                        ELSIF Dqm = "10" THEN                            Dq_temp (7 DOWNTO 0) := TO_BITVECTOR (Dq (7 DOWNTO 0));                        ELSE                            Dq_temp (15 DOWNTO 0) := TO_BITVECTOR (Dq (15 DOWNTO 0));                        END IF;                        Bank1 (Row_index) (Col_index) := ('1' & Dq_temp(data_bits - 1 DOWNTO 0));                    ELSIF Bank = "10" THEN                        Dq_temp := Bank2 (Row_index) (Col_index);                        IF Dqm = "01" THEN                            Dq_temp (15 DOWNTO 8) := TO_BITVECTOR (Dq (15 DOWNTO 8));                        ELSIF Dqm = "10" THEN                            Dq_temp (7 DOWNTO 0) := TO_BITVECTOR (Dq (7 DOWNTO 0));                        ELSE                            Dq_temp (15 DOWNTO 0) := TO_BITVECTOR (Dq (15 DOWNTO 0));                        END IF;                        Bank2 (Row_index) (Col_index) := ('1' & Dq_temp(data_bits - 1 DOWNTO 0));                    ELSIF Bank = "11" THEN                        Dq_temp := Bank3 (Row_index) (Col_index);                        IF Dqm = "01" THEN                            Dq_temp (15 DOWNTO 8) := TO_BITVECTOR (Dq (15 DOWNTO 8));                        ELSIF Dqm = "10" THEN                            Dq_temp (7 DOWNTO 0) := TO_BITVECTOR (Dq (7 DOWNTO 0));                        ELSE                            Dq_temp (15 DOWNTO 0) := TO_BITVECTOR (Dq (15 DOWNTO 0));                        END IF;                        Bank3 (Row_index) (Col_index) := ('1' & Dq_temp(data_bits - 1 DOWNTO 0));                    END IF;                    WR_chkp(TO_INTEGER(Bank)) := NOW;                    WR_counter(TO_INTEGER(Bank)) := 0;                END IF;                Burst_decode;            ELSIF Data_out_enable = '1' THEN                IF Dqm_reg0 /= "11" THEN                    Init_mem (Bank, Row_index);                    IF Bank = "00" THEN                        Dq_temp := Bank0 (Row_index) (Col_index);                        IF Dqm_reg0 = "00" THEN                            Dq (15 DOWNTO 0) <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (15 DOWNTO 0)) AFTER tAC;                        ELSIF Dqm_reg0 = "01" THEN                            Dq (15 DOWNTO 8)  <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (15 DOWNTO 8)) AFTER tAC;                            Dq (7 DOWNTO 0)  <= TRANSPORT (OTHERS => 'Z') AFTER tAC;                        ELSIF Dqm_reg0 = "10" THEN                            Dq (15 DOWNTO 8)  <= TRANSPORT (OTHERS => 'Z') AFTER tAC;                            Dq (7 DOWNTO 0) <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (7 DOWNTO 0)) AFTER tAC;                        END IF;                    ELSIF Bank = "01" THEN                        Dq_temp := Bank1 (Row_index) (Col_index);                        IF Dqm_reg0 = "00" THEN                            Dq (15 DOWNTO 0) <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (15 DOWNTO 0)) AFTER tAC;                        ELSIF Dqm_reg0 = "01" THEN                            Dq (15 DOWNTO 8)  <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (15 DOWNTO 8)) AFTER tAC;                            Dq (7 DOWNTO 0)  <= TRANSPORT (OTHERS => 'Z') AFTER tAC;                        ELSIF Dqm_reg0 = "10" THEN                            Dq (15 DOWNTO 8)  <= TRANSPORT (OTHERS => 'Z') AFTER tAC;                            Dq (7 DOWNTO 0) <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (7 DOWNTO 0)) AFTER tAC;                        END IF;                    ELSIF Bank = "10" THEN                        Dq_temp := Bank2 (Row_index) (Col_index);                        IF Dqm_reg0 = "00" THEN                            Dq (15 DOWNTO 0) <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (15 DOWNTO 0)) AFTER tAC;                        ELSIF Dqm_reg0 = "01" THEN                            Dq (15 DOWNTO 8)  <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (15 DOWNTO 8)) AFTER tAC;                            Dq (7 DOWNTO 0)  <= TRANSPORT (OTHERS => 'Z') AFTER tAC;                        ELSIF Dqm_reg0 = "10" THEN                            Dq (15 DOWNTO 8)  <= TRANSPORT (OTHERS => 'Z') AFTER tAC;                            Dq (7 DOWNTO 0) <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (7 DOWNTO 0)) AFTER tAC;                        END IF;                    ELSIF Bank = "11" THEN                        Dq_temp := Bank3 (Row_index) (Col_index);                        IF Dqm_reg0 = "00" THEN                            Dq (15 DOWNTO 0) <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (15 DOWNTO 0)) AFTER tAC;                        ELSIF Dqm_reg0 = "01" THEN                            Dq (15 DOWNTO 8)  <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (15 DOWNTO 8)) AFTER tAC;                            Dq (7 DOWNTO 0)  <= TRANSPORT (OTHERS => 'Z') AFTER tAC;                        ELSIF Dqm_reg0 = "10" THEN                            Dq (15 DOWNTO 8)  <= TRANSPORT (OTHERS => 'Z') AFTER tAC;                            Dq (7 DOWNTO 0) <= TRANSPORT TO_STDLOGICVECTOR (Dq_temp (7 DOWNTO 0)) AFTER tAC;                        END IF;                    END IF;                ELSE                      Dq <= TRANSPORT (OTHERS => 'Z') AFTER tHZ;                END IF;                Burst_decode;            END IF;        ELSIF Sys_clk'event AND Sys_clk = '1' AND Load = '1' AND Dump = '0' THEN 		--'            Operation <= LOAD_FILE;	    load := '0';--            ASSERT (FALSE) REPORT "Reading memory array from file.  This operation may take several minutes.  Please wait..."--                SEVERITY NOTE;            WHILE NOT endfile(file_load) LOOP                readline(file_load, l);                read(l, ch);                if (ch /= 'S') or (ch /= 's') then                  hread(l, rectype);                  hread(l, reclen);		  if rectype = "0011" then                    hread(l, recaddr);                    hread(l, recdata);		    recaddr(31 downto 24) := (others => '0');		    Bank_Load := recaddr(25 downto 24);		    Rows_Load := recaddr(23 downto 11);		    Cols_Load := recaddr(10 downto 2);                    Init_Mem (Bank_Load, To_Integer(Rows_Load));                    IF Bank_Load = "00" THEN		      for i in 0 to 3 loop                        Bank0 (To_Integer(Rows_Load)) (To_Integer(Cols_Load)+i) := ('1' & recdata(i*32+index to i*32+index+15));		      end loop;                    ELSIF Bank_Load = "01" THEN		      for i in 0 to 3 loop                        Bank1 (To_Integer(Rows_Load)) (To_Integer(Cols_Load)+i) := ('1' & recdata(i*32+index to i*32+index+15));		      end loop;                    ELSIF Bank_Load = "10" THEN		      for i in 0 to 3 loop                        Bank2 (To_Integer(Rows_Load)) (To_Integer(Cols_Load)+i) := ('1' & recdata(i*32+index to i*32+index+15));		      end loop;                    ELSIF Bank_Load = "11" THEN		      for i in 0 to 3 loop                        Bank3 (To_Integer(Rows_Load)) (To_Integer(Cols_Load)+i) := ('1' & recdata(i*32+index to i*32+index+15));		      end loop;                    END IF;                  END IF;                END IF;            END LOOP;        ELSIF Sys_clk'event AND Sys_clk = '1' AND Load = '0' AND Dump = '1' THEN 		--'            Operation <= DUMP_FILE;            ASSERT (FALSE) REPORT "Writing memory array to file.  This operation may take several minutes.  Please wait..."                SEVERITY NOTE;            WRITE (l, string'("# Micron Technology, Inc. (FILE DUMP / MEMORY DUMP)")); 		--'            WRITELINE (file_dump, l);            WRITE (l, string'("# BA ROWS          COLS      DQ")); 		--'            WRITELINE (file_dump, l);            WRITE (l, string'("# -- ------------- --------- ----------------")); 		--'            WRITELINE (file_dump, l);            -- Dumping Bank 0            FOR i IN 0 TO 2**addr_bits -1 LOOP                -- Check if ROW is NULL                IF Bank0 (i) /= NULL THEN                    For j IN 0 TO 2**col_bits - 1 LOOP                        -- Check if COL is NULL                        NEXT WHEN Bank0 (i) (j) (data_bits) = '0';                        WRITE (l, string'("00"), right, 4); 		--'                        WRITE (l, To_BitVector(Conv_Std_Logic_Vector(i, addr_bits)), right, addr_bits+1);                        WRITE (l, To_BitVector(Conv_std_Logic_Vector(j, col_bits)), right, col_bits+1);                        WRITE (l, Bank0 (i) (j) (data_bits -1 DOWNTO 0), right, data_bits+1);                        WRITELINE (file_dump, l);                    END LOOP;                END IF;            END LOOP;            -- Dumping Bank 1            FOR i IN 0 TO 2**addr_bits -1 LOOP                -- Check if ROW is NULL                IF Bank1 (i) /= NULL THEN                    For j IN 0 TO 2**col_bits - 1 LOOP                        -- Check if COL is NULL                        NEXT WHEN Bank1 (i) (j) (data_bits) = '0';                        WRITE (l, string'("01"), right, 4); 		--'                        WRITE (l, To_BitVector(Conv_Std_Logic_Vector(i, addr_bits)), right, addr_bits+1);                        WRITE (l, To_BitVector(Conv_std_Logic_Vector(j, col_bits)), right, col_bits+1);                        WRITE (l, Bank1 (i) (j) (data_bits -1 DOWNTO 0), right, data_bits+1);                        WRITELINE (file_dump, l);                    END LOOP;                END IF;            END LOOP;            -- Dumping Bank 2            FOR i IN 0 TO 2**addr_bits -1 LOOP                -- Check if ROW is NULL                IF Bank2 (i) /= NULL THEN                    For j IN 0 TO 2**col_bits - 1 LOOP                        -- Check if COL is NULL                        NEXT WHEN Bank2 (i) (j) (data_bits) = '0';                        WRITE (l, string'("10"), right, 4); 		--'                        WRITE (l, To_BitVector(Conv_Std_Logic_Vector(i, addr_bits)), right, addr_bits+1);                        WRITE (l, To_BitVector(Conv_std_Logic_Vector(j, col_bits)), right, col_bits+1);                        WRITE (l, Bank2 (i) (j) (data_bits -1 DOWNTO 0), right, data_bits+1);                        WRITELINE (file_dump, l);                    END LOOP;                END IF;            END LOOP;            -- Dumping Bank 3            FOR i IN 0 TO 2**addr_bits -1 LOOP                -- Check if ROW is NULL                IF Bank3 (i) /= NULL THEN                    For j IN 0 TO 2**col_bits - 1 LOOP                        -- Check if COL is NULL                        NEXT WHEN Bank3 (i) (j) (data_bits) = '0';                        WRITE (l, string'("11"), right, 4); 		--'                        WRITE (l, To_BitVector(Conv_Std_Logic_Vector(i, addr_bits)), right, addr_bits+1);                        WRITE (l, To_BitVector(Conv_std_Logic_Vector(j, col_bits)), right, col_bits+1);                        WRITE (l, Bank3 (i) (j) (data_bits -1 DOWNTO 0), right, data_bits+1);                        WRITELINE (file_dump, l);                    END LOOP;                END IF;            END LOOP;        END IF;        -- Write with AutoPrecharge Calculation        --      The device start internal precharge when:        --          1.  tWR cycles after command        --      and 2.  Meet tRAS requirement        --       or 3.  Interrupt by a Read or Write (with or without Auto Precharge)        IF ((Auto_precharge(0) = '1') AND (Write_precharge(0) = '1')) THEN            IF (((NOW - RAS_chk0 >= tRAS) AND               (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(0) >= 1 AND NOW - Count_time(0) >= tWRa)  OR                 (Burst_length_2 = '1'                             AND Count_precharge(0) >= 2 AND NOW - Count_time(0) >= tWRa)  OR                 (Burst_length_4 = '1'                             AND Count_precharge(0) >= 4 AND NOW - Count_time(0) >= tWRa)  OR                 (Burst_length_8 = '1'                             AND Count_precharge(0) >= 8 AND NOW - Count_time(0) >= tWRa))) OR                 (RW_interrupt_write(0) = '1' AND WR_counter(0) >= 1 AND NOW - WR_time(0) >= tWRa)) THEN                Auto_precharge(0) := '0';                Write_precharge(0) := '0';                RW_interrupt_write(0) := '0';                Pc_b0 := '1';                Act_b0 := '0';                RP_chk0 := NOW;                ASSERT FALSE REPORT "Start Internal Precharge Bank 0" SEVERITY NOTE;            END IF;        END IF;        IF ((Auto_precharge(1) = '1') AND (Write_precharge(1) = '1')) THEN            IF (((NOW - RAS_chk1 >= tRAS) AND               (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(1) >= 1 AND NOW - Count_time(1) >= tWRa)  OR                 (Burst_length_2 = '1'                             AND Count_precharge(1) >= 2 AND NOW - Count_time(1) >= tWRa)  OR                 (Burst_length_4 = '1'                             AND Count_precharge(1) >= 4 AND NOW - Count_time(1) >= tWRa)  OR                 (Burst_length_8 = '1'                             AND Count_precharge(1) >= 8 AND NOW - Count_time(1) >= tWRa))) OR                 (RW_interrupt_write(1) = '1' AND WR_counter(1) >= 1 AND NOW - WR_time(1) >= tWRa)) THEN                Auto_precharge(1) := '0';                Write_precharge(1) := '0';                RW_interrupt_write(1) := '0';                Pc_b1 := '1';                Act_b1 := '0';                RP_chk1 := NOW;            END IF;        END IF;        IF ((Auto_precharge(2) = '1') AND (Write_precharge(2) = '1')) THEN            IF (((NOW - RAS_chk2 >= tRAS) AND               (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(2) >= 1 AND NOW - Count_time(2) >= tWRa)  OR                 (Burst_length_2 = '1'                             AND Count_precharge(2) >= 2 AND NOW - Count_time(2) >= tWRa)  OR                 (Burst_length_4 = '1'                             AND Count_precharge(2) >= 4 AND NOW - Count_time(2) >= tWRa)  OR                 (Burst_length_8 = '1'                             AND Count_precharge(2) >= 8 AND NOW - Count_time(2) >= tWRa))) OR                 (RW_interrupt_write(2) = '1' AND WR_counter(2) >= 1 AND NOW - WR_time(2) >= tWRa)) THEN                Auto_precharge(2) := '0';                Write_precharge(2) := '0';                RW_interrupt_write(2) := '0';                Pc_b2 := '1';                Act_b2 := '0';                RP_chk2 := NOW;            END IF;        END IF;        IF ((Auto_precharge(3) = '1') AND (Write_precharge(3) = '1')) THEN            IF (((NOW - RAS_chk3 >= tRAS) AND               (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(3) >= 1 AND NOW - Count_time(3) >= tWRa)  OR                 (Burst_length_2 = '1'                             AND Count_precharge(3) >= 2 AND NOW - Count_time(3) >= tWRa)  OR                 (Burst_length_4 = '1'                             AND Count_precharge(3) >= 4 AND NOW - Count_time(3) >= tWRa)  OR                 (Burst_length_8 = '1'                             AND Count_precharge(3) >= 8 AND NOW - Count_time(3) >= tWRa))) OR                 (RW_interrupt_write(0) = '1' AND WR_counter(0) >= 1 AND NOW - WR_time(3) >= tWRa)) THEN                Auto_precharge(3) := '0';                Write_precharge(3) := '0';                RW_interrupt_write(3) := '0';                Pc_b3 := '1';                Act_b3 := '0';                RP_chk3 := NOW;            END IF;

⌨️ 快捷键说明

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