Proposal to restructure all the files and folders to keep things organized and similar to other cores.
126 lines
3.5 KiB
VHDL
126 lines
3.5 KiB
VHDL
--
|
|
-- Interrupt.vhd
|
|
--
|
|
-- Z80 Daisy-Chain Interrupt Logic for FPGA
|
|
--
|
|
-- Nibbles Lab. 2013-2014
|
|
--
|
|
|
|
library IEEE;
|
|
use IEEE.STD_LOGIC_1164.ALL;
|
|
use IEEE.STD_LOGIC_ARITH.ALL;
|
|
use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
|
|
|
entity Interrupt is
|
|
Port (
|
|
-- System Signal
|
|
RESET : in std_logic;
|
|
-- CPU Signals
|
|
DI : in std_logic_vector(7 downto 0);
|
|
IORQ_n : in std_logic; -- same as Z80
|
|
RD_n : in std_logic; -- same as Z80
|
|
M1_n : in std_logic; -- same as Z80
|
|
IEI : in std_logic; -- same as Z80
|
|
IEO : out std_logic; -- same as Z80
|
|
INTO_n : out std_logic;
|
|
-- Control Signals
|
|
VECTEN : out std_logic;
|
|
INTI : in std_logic;
|
|
INTEN : in std_logic
|
|
);
|
|
end Interrupt;
|
|
|
|
architecture Behavioral of Interrupt is
|
|
|
|
-----------------------------------------------------------------------------------
|
|
-- Signals
|
|
-----------------------------------------------------------------------------------
|
|
|
|
signal IREQ : std_logic;
|
|
signal IRES : std_logic;
|
|
signal INTR : std_logic;
|
|
signal IAUTH : std_logic;
|
|
signal AUTHRES : std_logic;
|
|
signal IED1 : std_logic;
|
|
signal IED2 : std_logic;
|
|
signal ICB : std_logic;
|
|
signal I4D : std_logic;
|
|
signal FETCH : std_logic;
|
|
signal INTA : std_logic;
|
|
signal IENB : std_logic;
|
|
signal iINT : std_logic;
|
|
signal iIEO : std_logic;
|
|
|
|
begin
|
|
|
|
--
|
|
-- External signals
|
|
--
|
|
INTO_n <= iINT;
|
|
IEO <= iIEO;
|
|
|
|
--
|
|
-- Internal signals
|
|
--
|
|
iINT <= '0' when IEI='1' and IREQ='1' and IAUTH='0' else '1';
|
|
iIEO <= not (((not IED1) and IREQ) or IAUTH or (not IEI));
|
|
INTA <= ((not M1_n) and (not IORQ_n) and IEI);
|
|
AUTHRES <= RESET or (IEI and IED2 and I4D);
|
|
FETCH <= M1_n or RD_n;
|
|
IRES <= RESET or INTA;
|
|
INTR <= M1_n and (INTI and INTEN);
|
|
VECTEN <= '1' when INTA='1' and IEI='1' and IAUTH='1' else '0';
|
|
|
|
--
|
|
-- Keep Interrupt Request
|
|
--
|
|
process( IRES, INTR ) begin
|
|
if IRES='1' then
|
|
IREQ <= '0';
|
|
elsif INTR'event and INTR='1' then
|
|
IREQ <= '1';
|
|
end if;
|
|
end process;
|
|
|
|
--
|
|
-- Interrupt Authentication
|
|
--
|
|
process( AUTHRES, INTA ) begin
|
|
if AUTHRES='1' then
|
|
IAUTH <= '0';
|
|
elsif INTA'event and INTA='1' then
|
|
IAUTH <= IREQ;
|
|
end if;
|
|
end process;
|
|
|
|
--
|
|
-- Fetch 'RETI'
|
|
--
|
|
process( RESET, FETCH ) begin
|
|
if RESET='1' then
|
|
IED1 <= '0';
|
|
IED2 <= '0';
|
|
ICB <= '0';
|
|
I4D <= '0';
|
|
elsif FETCH'event and FETCH='1' then
|
|
IED2 <= IED1;
|
|
if DI=X"ED" and ICB='0' then
|
|
IED1 <= '1';
|
|
else
|
|
IED1 <= '0';
|
|
end if;
|
|
if DI=X"CB" then
|
|
ICB <= '1';
|
|
else
|
|
ICB <= '0';
|
|
end if;
|
|
if DI=X"4D" then
|
|
I4D <= IEI;
|
|
else
|
|
I4D <= '0';
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
end Behavioral;
|