📄 mt48lc16m16a2.vhd
字号:
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 + -