altera/MainController/RAM9X8_Loader.vhd

118 lines
3.3 KiB
VHDL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity RAM9X8_Loader is
generic(
REG_ADDR_LOADER_UPPER_BYTE : integer := 42;
REG_ADDR_LOADER_LOWER_BYTE : integer := 43;
DATA_BUS_WIDTH : integer := 8;
ADDRESS_BUS_WIDTH : integer := 9
);
port(
clk : in std_logic;
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;
addrDevice : out std_logic_vector(3 downto 0) := (others => '0');
clkLoader : out std_logic := '0';
rwLoader : out std_logic := '0';
resetLoader : out std_logic := '0';
dataOutLoader : out std_logic := '0';
loadMode : out std_logic := '0';
dataInLoader : in std_logic;
error : in std_logic;
hwpclk : in std_logic;
hwpdata : in std_logic;
pbclk : in std_logic
);
end entity;
architecture behavorial of RAM9X8_Loader is
signal loaderBuf : std_logic_vector(15 downto 0) := (others => '1');
signal sel : std_logic := '0';
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 (addr = REG_ADDR_LOADER_UPPER_BYTE or addr = REG_ADDR_LOADER_LOWER_BYTE) then
if (oe = '0' and we = '1') then -- Если сигнал чтения активен, а записи нет
case addr is
when REG_ADDR_LOADER_UPPER_BYTE =>
data(7) <= dataInLoader;
data(6 downto 0) <= loaderBuf(14 downto 8);
when REG_ADDR_LOADER_LOWER_BYTE =>
data <= loaderBuf(7 downto 0);
when others =>
data <= (others => 'Z'); -- Запретить запись на шину
end case;
elsif (oe = '1' and we = '0') then -- Если сигнал записи активен, а чтения нет
case addr is
when REG_ADDR_LOADER_UPPER_BYTE =>
loaderBuf(15 downto 8) <= data;
when REG_ADDR_LOADER_LOWER_BYTE =>
loaderBuf(7 downto 0) <= data;
when others =>
data <= (others => 'Z'); -- Запретить запись на шину
end case;
else
data <= (others => 'Z'); -- Запретить запись на шину
end if;
else
data <= (others => 'Z'); -- Запретить запись на шину
end if;
else
data <= (others => 'Z'); -- Запретить запись на шину
end if;
end process;
process(clk) is
begin
if rising_edge(clk) then
loadMode <= loaderBuf(0);
if loaderBuf(4) = '1' and loaderBuf(0) = '1' then
sel <= '0';
else
sel <= '1';
end if;
end if;
end process;
process(clk) is
begin
if rising_edge(clk) then
case sel is
when '0' =>
addrDevice(3) <= pbclk;
addrDevice(2) <= '1';
addrDevice(1) <= '1';
addrDevice(0) <= hwpdata;
clkLoader <= hwpclk;
dataOutLoader <= error;
rwLoader <= '1';
resetLoader <= '1';
when '1' =>
addrDevice <= loaderBuf(14 downto 11);
clkLoader <= not loaderBuf(9);
dataOutLoader <= not loaderBuf(7);
rwLoader <= loaderBuf(4);
resetLoader <= loaderBuf(1);
when others =>
end case;
end if;
end process;
end behavorial;