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;