LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; LIBRARY WORK; USE WORK.mem_pack_con.ALL; USE WORK.synthesis_utilities.ALL; USE WORK.global_environment.ALL; USE WORK.PackCon.ALL; LIBRARY STD; USE STD.textio.ALL; ENTITY ram IS GENERIC ( file_name : STRING (1 TO 11) := "LOOPING.RAM" ); PORT ( read : IN std_logic := '1'; write : IN std_logic := '0'; dump : IN std_logic := '0' ); TYPE byte_ptr_vec IS ARRAY (NATURAL RANGE <>) OF byte_node_ptr; CONSTANT max : INTEGER := (2**12)-1; END ram; ARCHITECTURE mem_con OF ram IS BEGIN PROCESS (read, write, dump) VARIABLE memory : byte_ptr_vec (0 TO max) := (OTHERS => NULL); VARIABLE temp, temp2 : byte_node_ptr := NULL; VARIABLE first_access : BOOLEAN :=TRUE; FILE f : TEXT; VARIABLE l : LINE; VARIABLE status : FILE_OPEN_STATUS := NAME_ERROR; BEGIN IF dump='1' THEN FILE_OPEN(f, file_name, WRITE_MODE); FOR i IN 0 TO max LOOP write_mem_con(l,memory(i)); writeline(f, l); END LOOP; FILE_CLOSE(F); ELSE IF first_access THEN FILE_OPEN(status,f, file_name, READ_MODE); FOR i IN 0 TO max LOOP readline(f, l); read_mem_con(l, memory(i)); DEALLOCATE(l); END LOOP; FILE_CLOSE(F); first_access := FALSE; END IF; IF (read ='1') THEN --********** just a pointer assignment databus := memory(std_logic2int(adbus.val)); ELSIF (write ='1') THEN -- first free DeAlloc(memory(std_logic2int(adbus.val))); -- allocate Equate(databus, memory(std_logic2int(adbus.val))); END IF; END IF; END PROCESS; END mem_con;