Вот пример ОЗУ на VHDL
Запись входных данных производится по положительному (нарастающему) фронту сигнала синхронизации при наличии выскокого логического уровня на входе разрешения записи. При отсутствии фронта тактового сигнала и выскоком логическом уровне на входе разрешения записи данные из ячейки, номер которой определяется состоянием сигналов на адресных входах, передаются на выходы ОЗУ. Операция чтения данных из ОЗУ выполняется также при наличии низкого логического уровня на входе разрешения записи независимо от поведения сигнала синхронизации. Первый порт предназначен только для чтения информации, хранящейся в ОЗУ. Второй порт позволяет выполнять как операции чтения, так и записи входных данных.
Описание портов:
clk − вход тактовой частоты.
we − одноразрядный вход разрешения записи;
a − 17 разрядный адресный вход первого порта;
dpra – 17 разрядный адресный вход второго порта;
di − 16 разрядный вход данных;
spo – информационный 16 разрядный выход первого порта;
dpo – информационный 16 разрядный выход второго порта;
Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ram1024_16 is
Port ( clk : in std_logic;
we : in std_logic;
a : in std_logic_vector(16 downto 0);
dpra : in std_logic_vector(16 downto 0);
di : in std_logic_vector(15 downto 0);
spo : out std_logic_vector(15 downto 0);
dpo : out std_logic_vector(15 downto 0));
end ram1024_16;
architecture behavioral of ram1024_16 is
type ram_type is array (1023 downto 0) of std_logic_vector (15 downto 0);
signal RAM: ram_type;
signal read_a: std_logic_vector(16 downto 0);
signal read_dpra: std_logic_vector(16 downto 0);
begin
process (clk)
begin
if (clk'event and clk = '1') then
if (we = '1') then
RAM(conv_integer(a)) <= di;
end if;
read_a <= a;
read_dpra <=dpra;
end if;
end process;
spo <= RAM(conv_integer(read_a));
dpo <= RAM(conv_integer(read_dpra));
end behavioral;
Есть Language Templates в Xilinx ISE там есть примеры всех синтезируемых конструкций (тригеры, счетчики, мультиплексоры и т.д.)