Project

General

Profile

-- Generic dual-port RAM implementation -
-- will hopefully work for both Altera and Xilinx parts

library ieee;
USE ieee.std_logic_1164.all;
use ieee.numeric_std.all;


ENTITY DualPortRAM IS
GENERIC
(
addrbits : integer := 9;
databits : integer := 7
);
PORT
(
address_a : IN STD_LOGIC_VECTOR (addrbits-1 downto 0);
address_b : IN STD_LOGIC_VECTOR (addrbits-1 downto 0);
clock : IN STD_LOGIC := '1';
data_a : IN STD_LOGIC_VECTOR (databits-1 downto 0);
data_b : IN STD_LOGIC_VECTOR (databits-1 downto 0);
wren_a : IN STD_LOGIC := '0';
wren_b : IN STD_LOGIC := '0';
q_a : OUT STD_LOGIC_VECTOR (databits-1 downto 0);
q_b : OUT STD_LOGIC_VECTOR (databits-1 downto 0)
);
END DualPortRAM;

architecture arch of DualPortRAM is

type ram_type is array(natural range ((2**addrbits)-1) downto 0) of std_logic_vector(databits-1 downto 0);
shared variable ram : ram_type;

begin

-- Port A
process (clock)
begin
if (clock'event and clock = '1') then
if wren_a='1' then
ram(to_integer(unsigned(address_a))) := data_a;
q_a <= data_a;
else
q_a <= ram(to_integer(unsigned(address_a)));
end if;
end if;
end process;

-- Port B
process (clock)
begin
if (clock'event and clock = '1') then
if wren_b='1' then
ram(to_integer(unsigned(address_b))) := data_b;
q_b <= data_b;
else
q_b <= ram(to_integer(unsigned(address_b)));
end if;
end if;
end process;


end architecture;
(1-1/60)