TU-VHDL/18_RAM_Example/design.vhd
2025-02-10 20:28:13 +01:00

47 lines
980 B
VHDL

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity single_port_ram is
port
(
data : in std_logic_vector(7 downto 0);
addr : in std_logic_vector(15 downto 0);
we : in std_logic;
clk : in std_logic;
q : out std_logic_vector(7 downto 0)
);
end entity;
architecture rtl of single_port_ram is
-- Build a 2-D array type for the RAM
subtype word_t is std_logic_vector(7 downto 0);
type memory_t is array(2**7-1 downto 0) of word_t; -- 2**7 = 128
signal ram : memory_t;
-- Register to hold the address
signal addr_reg : std_logic_vector(15 downto 0);
begin
process(clk)
begin
if(rising_edge(clk)) then
if(we = '1') then
ram(to_integer(unsigned(addr))) <= data;
end if;
-- Register the address for reading (synchron)
addr_reg <= addr;
end if;
end process;
-- asynchron data output (but attention: addr_reg changes synchronously)
q <= ram(to_integer(unsigned(addr_reg)));
end rtl;