45 lines
1.4 KiB
VHDL
45 lines
1.4 KiB
VHDL
|
USE std.textio.all;
|
||
|
|
||
|
ARCHITECTURE Spartan3E OF blockRAM IS
|
||
|
|
||
|
subtype registerType is std_ulogic_vector(dataBitNb-1 downto 0);
|
||
|
type memoryType is array (0 to 2**addressBitNb-1) of registerType;
|
||
|
|
||
|
-- Define function to create initvalue signal
|
||
|
impure function ReadRamContentFromFile(ramContentFileSpec : in string) return memoryType is
|
||
|
FILE ramContentFile : text open read_mode is ramContentFileSpec;
|
||
|
variable ramContentFileLine : line;
|
||
|
variable ramContent : memoryType;
|
||
|
variable ramCurrentWord : bit_vector(registerType'range);
|
||
|
variable index : natural := 0; --241;
|
||
|
begin
|
||
|
for index in ramContent'range loop
|
||
|
-- while not endfile(ramContentFile) loop
|
||
|
readline(ramContentFile, ramContentFileLine);
|
||
|
read(ramContentFileLine, ramCurrentWord);
|
||
|
ramContent(index) := std_ulogic_vector(to_stdlogicvector(ramCurrentWord));
|
||
|
-- index := index + 1;
|
||
|
end loop;
|
||
|
return ramContent;
|
||
|
end function;
|
||
|
|
||
|
shared variable memoryArray: memoryType := ReadRamContentFromFile(initFileSpec);
|
||
|
|
||
|
BEGIN
|
||
|
|
||
|
portA: process(clock)
|
||
|
begin
|
||
|
if rising_edge(clock) then
|
||
|
if (en = '1') then
|
||
|
if (write = '1') then
|
||
|
memoryArray(to_integer(addr)) := dataIn;
|
||
|
dataOut <= dataIn;
|
||
|
else
|
||
|
dataOut <= memoryArray(to_integer(addr));
|
||
|
end if;
|
||
|
end if;
|
||
|
end if;
|
||
|
end process portA;
|
||
|
|
||
|
END ARCHITECTURE Spartan3E;
|