1------------------------------------------------------------------------------- 2-- 3-- walter d. gallegos 4-- www.waltergallegos.com 5-- Programmable Logic Consulting 6-- 7-- Este archivo y documentacion son propiedad intelectual de Walter D. Gallegos 8-- 9------------------------------------------------------------------------------- 10 11LIBRARY IEEE; 12USE IEEE.STD_LOGIC_1164.ALL, IEEE.NUMERIC_STD.ALL; 13USE STD.TextIO.ALL; 14 15ENTITY LRAM IS 16GENERIC ( size : INTEGER := 14; fName : STRING := "IntDemo.mem"; startAdr : INTEGER := 0); 17 PORT ( 18 CLOCK : IN STD_LOGIC; 19 WR : IN STD_LOGIC; 20 BEA : IN STD_LOGIC_VECTOR (3 DOWNTO 0); 21 DIA : IN STD_LOGIC_VECTOR (31 DOWNTO 0); 22 DOA : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); 23 ADRA : IN STD_LOGIC_VECTOR (size-1 DOWNTO 0); 24 DOB : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); 25 ADRB : IN STD_LOGIC_VECTOR (size-1 DOWNTO 0) 26 ); 27END LRAM; 28 29ARCHITECTURE WDG0 OF LRAM IS 30 31 CONSTANT depth : INTEGER := (2**size)-1; 32 TYPE LocalRAMDesc IS ARRAY (0 TO depth) OF STD_LOGIC_VECTOR(31 DOWNTO 0); 33 34 IMPURE FUNCTION Init (fName : STRING) RETURN LocalRAMDesc IS 35 FILE f : TEXT OPEN READ_MODE IS fName; 36 VARIABLE l : LINE; 37 VARIABLE b : STD_LOGIC_VECTOR(31 DOWNTO 0); 38 VARIABLE m : LocalRAMDesc := (OTHERS => (OTHERS => '0')); 39 BEGIN 40 FOR i IN startAdr TO depth LOOP 41 EXIT WHEN endfile(f); 42 IF (i = depth) THEN 43 REPORT "LRAM : Error memory full " SEVERITY FAILURE; 44 END IF; 45 readline(f, l); hread(l, b); 46 m(i) := STD_LOGIC_VECTOR(RESIZE(UNSIGNED(b), 32)); 47 END LOOP; 48 REPORT ("LRAM : loaded from " & fName & LF) SEVERITY NOTE; 49 RETURN m; 50 END FUNCTION; 51 52 SIGNAL LocalRAM : LocalRAMDesc := Init(fName); 53 SIGNAL data, code : STD_LOGIC_VECTOR(31 DOWNTO 0); 54 55 -- XILINX ATTRIBUTE 56 ATTRIBUTE ram_style : STRING; 57 ATTRIBUTE ram_style OF LocalRAM : SIGNAL IS "block"; 58 -- XILINX END ATTRIBUTE 59 60BEGIN 61 62 CodeDataMemory : PROCESS(CLOCK) 63 BEGIN 64 IF rising_edge(CLOCK) THEN 65 FOR i IN DIA'RANGE LOOP 66 IF (BEA(i/8) AND WR)= '1' THEN 67 LocalRAM(TO_INTEGER(UNSIGNED(ADRA)))(i) <= DIA(i); 68 END IF; 69 END LOOP; 70 data <= LocalRAM(TO_INTEGER(UNSIGNED(ADRA))); 71 code <= LocalRAM(TO_INTEGER(UNSIGNED(ADRB))); 72 END IF; 73 END PROCESS CodeDataMemory; 74 75 DOA <= data; 76 DOB <= code; 77 78END WDG0; 79