altera/MainController/RAM.vhd

45 lines
1.2 KiB
VHDL
Raw Normal View History

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
Откорректировал блок памяти RAM для возможной работы с двумя устройствами одновременно. Одно из них - внешний контроллер. Вторым будет блок сбора информации для обновления данных. Сейчас в блоке памяти нет взаимной блокировки для двух независимых процессов и, существует возможность записать в одну и ту же ячейку памяти в один и тот же момент времени разные значения. В нашем проекте поскольку дальше будет введено ограничение, которое обяжет писать служебные и критические (напрямую участвующие в алгоритмах работы преобразователем частоты) данные только в определенные заранее известные регистры, такое невозможно. Память на уровне использования программистом будет поделена две области. Ту, в которую можно писать и считать записанное значение и ту, из которой можно будет только считать значения. Со стороны устройства будут использованы для записи только те ячейки, которые процессор будет только читать. Со стороны процессора будут использованы для записи только те ячейки, которые блоки внутри устройства будут только читать.
2024-03-04 18:16:35 +03:00
entity RAM is
generic(
DATA_BUS_WIDTH : integer := 8;
ADDRESS_BUS_WIDTH : integer := 9
);
port(
data : inout std_logic_vector(DATA_BUS_WIDTH - 1 downto 0);
address : in std_logic_vector(ADDRESS_BUS_WIDTH - 1 downto 0);
we : in std_logic;
oe : in std_logic;
ce : in std_logic
);
end entity;
architecture behavorial of RAM is
type mem is array (2**ADDRESS_BUS_WIDTH - 1 downto 0) of std_logic_vector(DATA_BUS_WIDTH - 1 downto 0);
signal memory : mem;
begin
process (we, oe, ce)
variable addr : integer range 0 to 2**ADDRESS_BUS_WIDTH - 1 := 0;
begin
if (ce = '0') then -- Если микросхема выбрана
addr := conv_integer(address);
if (oe = '0' and we = '1') then -- Если сигнал чтения активен, а записи нет
data <= memory(addr);
elsif (oe = '1' and we = '0') then -- Если сигнал записи активен, а чтения нет
memory(addr) <= data;
else
data <= (others => 'Z'); -- Запретить запись на шину
end if;
else
data <= (others => 'Z'); -- Запретить запись на шину
end if;
end process;
end behavorial;