Example 6–12. VHDL Single-Clock Synchronous RAM Without Read-Through-Write Behavior
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY ram IS
PORT (
clock: IN STD_LOGIC;
data: IN STD_LOGIC_VECTOR (2 DOWNTO 0);
write_address: IN INTEGER RANGE 0 to 31;
read_address: IN INTEGER RANGE 0 to 31;
we: IN STD_LOGIC;
q: OUT STD_LOGIC_VECTOR (2 DOWNTO 0)
);
END ram;
ARCHITECTURE rtl OF ram IS
TYPE MEM IS ARRAY(0 TO 31) OF STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL ram_block: MEM;
BEGIN
PROCESS (clock)
BEGIN
IF (clock'event AND clock = '1') THEN
IF (we = '1') THEN
ram_block(write_address) <= data;
END IF;
q <= ram_block(read_address);
-- VHDL semantics imply that q doesn't get data
-- in this clock cycle
END IF;
END PROCESS;
END rtl;
------------------------------------
Example 6–18. VHDL Single-Clock Synchronous RAM with Asynchronous Read Address
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY ram IS
GENERIC (
ADDRESS_WIDTH: integer := 4;
DATA_WIDTH: integer := 8
);
PORT (
clock: IN std_logic;
data: IN STD_LOGIC_VECTOR(DATA_WIDTH - 1 DOWNTO 0);
write_address IN STD_LOGIC_VECTOR (ADDRESS_WIDTH - 1 DOWNTO 0);
read_address IN STD_LOGIC_VECTOR(ADDRESS_WIDTH - 1 DOWNTO 0);
we: IN STD_LOGIC;
q: OUT STD_LOGIC_VECTOR(DATA_WIDTH - 1 DOWNTO 0)
);
END ram;
ARCHITECTURE rtl OF ram IS
TYPE RAM IS ARRAY(0 TO 2 ** ADDRESS_WIDTH - 1) OF std_logic_vector(DATA_WIDTH - 1
DOWNTO 0);
SIGNAL ram_block: RAM;
BEGIN
PROCESS (clock)
BEGIN
IF (clock'event AND clock = '1') THEN
IF (we = '1') THEN
ram_block(TO_INTEGER(UNSIGNED(write_address))) <= data;
END IF;
q <= ram_block(TO_INTEGER(UNSIGNED(read_address)));
END IF;
END PROCESS;
END rtl;