altera/MainController/RAM9X8.vhd

105 lines
3.0 KiB
VHDL

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity RAM9X8 is
port(
clk : in std_logic;
data : inout std_logic_vector(7 downto 0);
address : in std_logic_vector(8 downto 0);
we : in std_logic;
oe : in std_logic;
ce : in std_logic
);
end entity;
architecture behavorial of RAM9X8 is
type mem is array (511 downto 0) of std_logic_vector(7 downto 0);
signal memory : mem;
signal cePrev : std_logic := '0';
type MemoryMachine is (Waiting, ReadingAddress, WritingData, ReadingData);
signal stateMM : MemoryMachine := Waiting;
begin
-- process (CLK_FPGA, nCS, nOE, bWE, A)
-- begin
-- -- Фильтрация и синхронизация сигналов от процессора
-- if rising_edge(CLK_FPGA) then
-- -- Пример фильтрации сигналов nCS, nOE и bWE
-- filtered_we <= we;
-- filtered_oe <= oe;
-- filtered_ce <= ce;
--
-- -- Пример фильтрации и синхронизации сигнала адреса A
-- --filtered_A <= A;
-- end if;
-- end process;
--
-- process (filtered_nCS, filtered_nOE, filtered_bWE, filtered_A)
-- begin
-- if (filtered_nCS = '0') then -- Если микросхема выбрана
-- if (filtered_nOE = '0') then -- Если сигнал чтения активен
-- D <= (others => 'Z'); -- Запретить запись на шину
-- elsif (filtered_bWE = '1') then -- Если сигнал записи активен
-- case filtered_A is
-- when "00000000" => D <= (others => '0'); -- Адрес 0x00, запись нулей
-- when "00000001" => D <= (others => '1'); -- Адрес 0x01, запись единиц
-- when others => D <= (others => 'Z'); -- Для остальных адресов разрешить чтение
-- end case;
-- else
-- D <= (others => 'Z'); -- Запретить запись на шину
-- end if;
-- else
-- D <= (others => 'Z'); -- Запретить запись на шину
-- end if;
-- end process;
process(clk)
variable addr : integer range 0 to 511 := 0;
begin
if rising_edge(clk) then
case stateMM is
when Waiting =>
if ce = '0' and cePrev = '1' then
stateMM <= ReadingAddress;
end if;
data <= (others => 'Z');
when ReadingAddress =>
addr := conv_integer(address);
if oe = '0' then
stateMM <= ReadingData;
data <= (others => '0');
elsif we = '0' then
stateMM <= WritingData;
elsif ce = '1' then
stateMM <= Waiting;
end if;
when ReadingData =>
data <= memory(addr);
if ce = '1' then
stateMM <= Waiting;
end if;
when WritingData =>
memory(addr) <= data;
stateMM <= Waiting;
when others =>
end case;
memory(0) <= x"AA";
memory(1) <= x"BB";
memory(2) <= x"CC";
memory(3) <= x"DD";
memory(4) <= x"EE";
memory(5) <= x"FF";
memory(6) <= x"01";
memory(7) <= x"23";
memory(8) <= x"45";
memory(9) <= memory(9) + 1;
end if;
end process;
end behavorial;