-- 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;