LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; USE IEEE.STD_LOGIC_SIGNED.ALL ; USE IEEE.STD_LOGIC_ARITH.ALL ; USE IEEE.STD_LOGIC_TEXTIO.ALL ; USE STD.TEXTIO.ALL; ENTITY Memoire IS GENERIC ( TMem : TIME ; NbBits : INTEGER ; Log2NbMots : INTEGER ; Fichier : STRING ); PORT ( cs : IN Std_Logic ; rw : IN Std_Logic ; adresses : IN Std_Logic_Vector (Log2NbMots - 1 DOWNTO 0) ; donnees : INOUT Std_Logic_Vector(NbBits-1 DOWNTO 0) ); END Memoire ; ARCHITECTURE comportementale OF Memoire IS BEGIN ProcessMemoire : PROCESS (cs, adresses, rw, donnees) TYPE TableauEntier IS ARRAY (NATURAL RANGE <>) OF INTEGER ; VARIABLE mem : TableauEntier(0 TO 2**Log2NbMots-1) := (OTHERS => 0); VARIABLE indice : INTEGER; VARIABLE PremiereFois : BOOLEAN := true; FILE fich : TEXT IS IN Fichier; VARIABLE chaine : LINE; VARIABLE valeur : Std_Logic_Vector(NbBits-1 DOWNTO 0) ; BEGIN IF PremiereFois THEN indice := 0; WHILE (NOT ENDFILE(fich)) LOOP READLINE(fich, chaine); READ(chaine, valeur); mem(indice) := CONV_INTEGER(valeur); indice := indice + 1; END LOOP; PremiereFois := false; END IF; indice := CONV_INTEGER (adresses) ; IF cs = '1' THEN IF rw = '1' THEN donnees <= CONV_STD_LOGIC_VECTOR(mem(indice), NbBits) AFTER TMem; ELSE mem(indice) := CONV_INTEGER(donnees) ; END IF ; ELSE donnees <= (OTHERS => 'Z') ; END IF ; END PROCESS ProcessMemoire ; END comportementale ;