diff --git a/Hardware/components/SRAM.vhd b/Hardware/components/SRAM.vhd new file mode 100644 index 0000000000000000000000000000000000000000..6be44b5a902134ada761a98a0fe6e6ab4a159fb5 --- /dev/null +++ b/Hardware/components/SRAM.vhd @@ -0,0 +1,118 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_textio.all; +use ieee.numeric_std.all; + +use std.textio.all; +use work.pkgProcessor.all; + +entity SRAM is + generic ( + -- The memory cell width in bits. + cellWd : integer range 1 to 64; + -- The number of cells a memory word is + -- composed of. + wordWd : integer range 1 to 16; + -- The memory address width in bits. + addrWd : integer range 1 to 64; + -- The name of the file which represents + -- the content of the memory. + fileId : string + ); + port ( + opCoSRAM : in tyOpCoSRAM; + nCS : in std_logic; + nWE : in std_logic; + nOE : in std_logic; + addr : in std_logic_vector(addrWd-1 downto 0); + data : inout std_logic_vector(cellWd*wordWd-1 downto 0) + ); +end entity SRAM; + +architecture arcSRAM of SRAM is +begin + procSRAM: process (nCS, nWE, nOE, addr, data, opCoSRAM) is + constant addrSpace : natural := (2**addrWd)-1; + constant dataWd : natural := cellWd*wordWd; + + subtype eleTySRAM is std_logic_vector(dataWd-1 downto 0); + type memTySRAM is array (0 to addrSpace) of eleTySRAM; + + variable memSRAM : memTySRAM; + + file fileIO : text; + variable statIO : file_open_status; + variable lineIO : line; + variable rdStat : boolean; + variable addrIO : std_logic_vector(addrWd-1 downto 0); + variable dataIO : std_logic_vector(dataWd-1 downto 0); + + variable i : integer := 0; + begin + if opCoSRAM'event then + if opCoSRAM = store then + file_open(statIO, fileIO, fileId, write_mode); + assert statIO = open_ok + report "SRAM - store: error opening data file" + severity error; + while i <= addrSpace loop + write(lineIO, std_logic_vector(to_unsigned(i, addrWd))); + write(lineIO, ' '); + write(lineIO, std_logic_vector(memSRAM(i))); + writeline(fileIO, lineIO); + i := i + wordWd; + end loop; + file_close(fileIO); + elsif opCoSRAM = load then + file_open(statIO, fileIO, fileId, read_mode); + assert statIO = open_ok + report "SRAM - load: error opening data file" + severity error; + while not endfile(fileIO) loop + readline(fileIO, lineIO); + read(lineIO, addrIO, rdStat); + if rdStat then + read(lineIO, dataIO, rdStat); + end if; + if rdStat then + memSRAM(to_integer(unsigned(addrIO))) := dataIO; + else + report "SRAM - load: format error in data file" + severity error; + end if; + end loop; + file_close(fileIO); + end if; + end if; + + if nCS'event then assert not Is_X(nCS) + report "SRAM: nCS - X value" + severity warning; + end if; + + if nWE'event then assert not Is_X(nWE) + report "SRAM: nWE - X value" + severity warning; + end if; + + if nOE'event then assert not Is_X(nOE) + report "SRAM: nOE - X value" + severity warning; + end if; + + if addr'event then assert not Is_X(addr) + report "SRAM: addr - X value" + severity warning; + end if; + + data <= (others => 'Z'); + + if nCS = '0' then + if nWE = '0' then + memSRAM(to_integer(unsigned(addr))) := data; + elsif nWE = '1' and nOE ='0' then + data <= memSRAM(to_integer(unsigned(addr))); + end if; + end if; + end process procSRAM; +end architecture arcSRAM;