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( LD_BASE_ADDRESS : integer := 46; 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 LD_LOADER_LOWER : integer := LD_BASE_ADDRESS; signal LD_LOADER_UPPER : integer := LD_BASE_ADDRESS + 1; 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 = LD_LOADER_UPPER or addr = LD_LOADER_LOWER) then if (oe = '0' and we = '1') then -- Если сигнал чтения активен, а записи нет case addr is when LD_LOADER_UPPER => data(7) <= dataInLoader; data(6 downto 0) <= loaderBuf(14 downto 8); when LD_LOADER_LOWER => data <= loaderBuf(7 downto 0); when others => data <= (others => 'Z'); -- Запретить запись на шину end case; elsif (oe = '1' and we = '0') then -- Если сигнал записи активен, а чтения нет case addr is when LD_LOADER_UPPER => loaderBuf(15 downto 8) <= data; when LD_LOADER_LOWER => 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;