--RAM module
|
--RAM module
|
--4096*8 bit file
|
--4096*8 bit file
|
--simultaneous write/read support
|
--simultaneous write/read support
|
--16 bit or 8 bit data bus
|
--16 bit or 8 bit data bus
|
--16 bit address bus
|
--16 bit address bus
|
--On Reset, will load a "default" RAM image
|
--On Reset, will load a "default" RAM image
|
|
|
library IEEE;
|
library IEEE;
|
use IEEE.STD_LOGIC_1164.ALL;
|
use IEEE.STD_LOGIC_1164.ALL;
|
use ieee.std_logic_arith.all;
|
use ieee.std_logic_arith.all;
|
use IEEE.NUMERIC_STD.ALL;
|
use IEEE.NUMERIC_STD.ALL;
|
use ieee.std_logic_unsigned.all;
|
use ieee.std_logic_unsigned.all;
|
|
|
|
--if WriteEnable(0) = '1' then
|
|
-- di0 <= DataIn(7 downto 0);
|
|
-- else
|
|
--di0 := RAM(conv_integer(Address))(7 downto 0);
|
|
-- di0 <= do(7 downto 0);
|
|
--end if;
|
|
--if WriteEnable(1) = '1' then
|
|
-- di1 <= DataIn(15 downto 8);
|
|
--else
|
|
--di1 <= RAM(conv_integer(Address))(15 downto 8);
|
|
-- di1 <= do(15 downto 8);
|
|
--end if;
|
|
|
entity blockram is
|
entity blockram is
|
port(
|
port(
|
Address: in std_logic_vector(11 downto 0); --memory address
|
Address: in std_logic_vector(7 downto 0); --memory address
|
WriteEnable: in std_logic_vector(1 downto 0); --write 1 byte at a time option
|
WriteEnable: in std_logic_vector(1 downto 0); --write 1 byte at a time option
|
Enable: in std_logic;
|
Enable: in std_logic;
|
Clock: in std_logic;
|
Clock: in std_logic;
|
DataIn: in std_logic_vector(15 downto 0);
|
DataIn: in std_logic_vector(15 downto 0);
|
DataOut: out std_logic_vector(15 downto 0)
|
DataOut: out std_logic_vector(15 downto 0)
|
);
|
);
|
end blockram;
|
end blockram;
|
|
|
architecture Behavioral of blockram is
|
architecture Behavioral of blockram is
|
type ram_type is array (4095 downto 0) of std_logic_vector (15 downto 0);
|
type ram_type is array (255 downto 0) of std_logic_vector (15 downto 0);
|
signal RAM: ram_type;
|
signal RAM: ram_type;
|
signal di0, di1, do0, do1: std_logic_vector(7 downto 0); --data inputs and outputs for byte-enable
|
signal di0, di1: std_logic_vector(7 downto 0);
|
begin
|
signal do : std_logic_vector(15 downto 0);
|
process (WriteEnable,DataIn)
|
|
begin
|
begin
|
if WriteEnable(0) = '1' then
|
di0 <= DataIn(7 downto 0) when WriteEnable(0)='1' else do(7 downto 0);
|
di0 <= DataIn(7 downto 0);
|
di1 <= DataIn(15 downto 8) when WriteEnable(1)='1' else do(15 downto 8);
|
else
|
|
di0 <= RAM(conv_integer(Address))(7 downto 0);
|
|
do0 <= RAM(conv_integer(Address))(7 downto 0);
|
|
end if;
|
|
if WriteEnable(1)= '1' then
|
|
di1 <= DataIn(15 downto 8);
|
|
else
|
|
di1 <= RAM(conv_integer(Address))(15 downto 8);
|
|
do1 <= RAM(conv_integer(Address))(15 downto 8);
|
|
end if;
|
|
end process;
|
|
process (Clock)
|
process (Clock)
|
begin
|
begin
|
if rising_edge(Clock) then
|
if rising_edge(Clock) then
|
if Enable = '1' then
|
if Enable = '1' then
|
DataOut <= do1 & do0;
|
if WriteEnable(0)='1' or WriteEnable(1)='1' then
|
RAM(conv_integer(Address)) <= di1 & di0;
|
RAM(conv_integer(Address)) <= di1 & di0;
|
|
else
|
|
do <= RAM(conv_integer(Address)) ;
|
|
end if;
|
end if;
|
end if;
|
end if;
|
end if;
|
end process;
|
end process;
|
|
DataOut <= do;
|
end Behavioral;
|
end Behavioral;
|
No newline at end of file
|
No newline at end of file
|