altera/MainController/RAM9X8.vhd

116 lines
3.2 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 (we, oe, ce, address)
variable addr : integer range 0 to 511 := 0;
begin
if (ce = '0') then -- Если микросхема выбрана
if (oe = '0') then -- Если сигнал чтения активен
addr := conv_integer(address);
case addr is
when 0 => data <= x"AA";
when 1 => data <= x"BB";
when 2 => data <= x"CC";
when 3 => data <= x"DD";
when 4 => data <= x"EE";
when 5 => data <= x"FF";
when 6 => data <= x"01";
when 7 => data <= x"23";
when 8 => data <= x"45";
when 9 => data <= x"67";
when others => data <= (others => 'Z'); -- Для остальных адресов разрешить чтение
end case;
elsif (we = '0') then -- Если сигнал записи активен
addr := conv_integer(address);
memory(addr) <= data;
else
data <= (others => 'Z'); -- Запретить запись на шину
end if;
else
data <= (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;