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