?? portcout.vhd
字號:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY portcout IS
PORT(
RESET : IN std_logic;
CLK : IN std_logic;
DIN : IN std_logic_vector (7 DOWNTO 0);
PCIN : IN std_logic_vector (7 DOWNTO 0);
ControlReg : IN std_logic_vector (7 DOWNTO 0);
PortARead : IN std_logic;
PortBRead : IN std_logic;
PortAWrite : IN std_logic;
PortBWrite : IN std_logic;
PortCOverride : IN std_logic;
PortCOutLd : IN std_logic_vector (7 DOWNTO 0);
PortCStatus : OUT std_logic_vector (7 DOWNTO 0);
PCOUT : OUT std_logic_vector (7 DOWNTO 0)
);
END portcout;
ARCHITECTURE rtl OF portcout IS
SIGNAL PortCOutRegD : std_logic_vector(7 DOWNTO 0);
SIGNAL PortCOutRegQ : std_logic_vector(7 DOWNTO 0);
SIGNAL ModeA : std_logic_vector (1 DOWNTO 0);
SIGNAL ModeB : std_logic;
SIGNAL PortA_IO : std_logic;
SIGNAL PortB_IO : std_logic;
SIGNAL RisePortAWriteQ : std_logic;
SIGNAL RisePortBWriteQ : std_logic;
SIGNAL RisePortAReadQ : std_logic;
SIGNAL RisePortBReadQ : std_logic;
SIGNAL RisePCIN6Q : std_logic;
SIGNAL RisePCIN4Q : std_logic;
SIGNAL RisePCIN2Q : std_logic;
SIGNAL RisePortAWrite : std_logic;
SIGNAL RisePortBWrite : std_logic;
SIGNAL RisePortARead : std_logic;
SIGNAL RisePortBRead : std_logic;
SIGNAL RisePCIN6 : std_logic;
SIGNAL RisePCIN4 : std_logic;
SIGNAL RisePCIN2 : std_logic;
BEGIN
PCOUT <= PortCOutRegQ;
ModeA <= ControlReg (6 DOWNTO 5);
ModeB <= ControlReg (2);
PortA_IO <= ControlReg (4);
PortB_IO <= ControlReg (1);
PortCStatusProc: PROCESS ( ModeA, ModeB, PortA_IO, PCIN, PortCOutRegQ )
BEGIN
PortCStatus(7) <= PCIN(7);
IF (ModeA = "01" AND PortA_IO = '0') THEN -- Mode 1
PortCStatus(6) <= PortCoutRegQ(6);
ELSIF (ModeA(1) = '1') THEN -- Mode 2
PortCStatus(6) <= PortCoutRegQ(6);
ELSE
PortCStatus(6) <= PCIN(6);
END IF;
PortCStatus(5) <= PCIN(5);
IF (ModeA = "01" AND PortA_IO = '1') THEN -- Mode 1
PortCStatus(4) <= PortCoutRegQ(4);
ELSIF (ModeA(1) = '1') THEN -- Mode 2
PortCStatus(4) <= PortCoutRegQ(4);
ELSE
PortCStatus(4) <= PCIN(4);
END IF;
PortCStatus(3) <= PCIN(3);
IF (ModeB = '1') THEN -- Mode 1
PortCStatus(2) <= PortCoutRegQ(2);
ELSE
PortCStatus(2) <= PCIN(2);
END IF;
PortCStatus(1) <= PCIN(1);
PortCStatus(0) <= PCIN(0);
END PROCESS;
PortCDataProc: PROCESS ( ModeA, PortA_IO, PortB_IO, ModeB, PortCOverride,
PortAWrite, PortBWrite, PortARead, PortBRead,
RisePortAWrite, RisePortBWrite, RisePortARead, RisePortBRead,
PortCOutLd, PortCOutRegQ, DIN,
PCIN, RisePCIN2, RisePCIN4, RisePCIN6 )
BEGIN
IF (ModeB = '0') THEN -- Mode 0
IF (PortCOutLd (0) = '0') THEN -- Load from bus and bit set/reset
PortCOutRegD (0) <= DIN(0);
ELSE
PortCOutRegD (0) <= PortCOutRegQ (0);
END IF;
ELSIF (ModeB = '1') THEN -- Mode 1
IF ( PortCOutLd (0) = '0' AND PortCOverride = '1') THEN -- Load for the set/reset command
PortCOutRegD (0) <= DIN(0); -- Mode 1 Output
ELSIF (PortB_IO = '0') THEN
IF (PortBWrite = '0') THEN -- Reset INTRB on write strobe
PortCOutRegD (0) <= '0';
ELSIF (PortBWrite = '1' AND RisePCIN2 = '1' -- Set INTRB on rising edge of ACKB
AND PortCOutRegQ (1) = '1') THEN
PortCOutRegD (0) <= PortCOutRegQ (2);
ELSE
PortCOutRegD (0) <= PortCOutRegQ (0);
END IF;
ELSE -- Mode 1 Input
IF (PortBRead = '0' AND PortCOutRegQ(1) = '1') THEN -- Reset INTRB on read strobe
PortCOutRegD (0) <= '0';
ELSIF (RisePCIN2 = '1' AND PortCOutRegQ (1) = '1') THEN -- Set INTRB on rising edge of STBB
PortCOutRegD (0) <= PortCOutRegQ (2);
ELSE
PortCOutRegD (0) <= PortCOutRegQ (0);
END IF;
END IF;
ELSE
PortCOutRegD (0) <= PortCOutRegQ (0);
END IF;
IF (ModeB = '0') THEN -- Mode 0
IF (PortCOutLd (1) = '0') THEN
IF ( PortCOverride = '1') THEN
PortCOutRegD (1) <= DIN(0); -- Load from bit set/reset
ELSE
PortCOutRegD (1) <= DIN(1); -- Load from bus
END IF;
ELSE
PortCOutRegD (1) <= PortCOutRegQ (1);
END IF;
ELSIF (ModeB = '1') THEN -- Mode 1
IF ( PortCOutLd (1) = '0' AND PortCOverride = '1') THEN -- Load from bit set/reset
PortCOutRegD (1) <= DIN(0);
ELSIF (PortB_IO = '0') THEN -- Mode 1 Output
IF (RisePortBWrite = '1') THEN -- Reset OBFB on rising edge of write strobe
PortCOutRegD (1) <= '0';
ELSIF (PCIN(2) = '0') THEN -- Set OBFB when ACKB goes low
PortCOutRegD (1) <= '1';
ELSE
PortCOutRegD (1) <= PortCOutRegQ (1);
END IF;
ELSE -- Mode 1 Input
IF (RisePortBRead = '1' AND PortCOutRegQ(0) = '0') THEN -- Reset IBFB on rising edge of read strobe
PortCOutRegD (1) <= '0';
ELSIF (PCIN(2) = '0') THEN -- Set IBFB when STBB goes low
PortCOutRegD (1) <= '1';
ELSE
PortCOutRegD (1) <= PortCOutRegQ (1);
END IF;
END IF;
ELSE
PortCOutRegD (1) <= PortCOutRegQ (1);
END IF;
IF (PortCOutLd (2) = '0') THEN -- All Modes
IF ( PortCOverride = '1') THEN
PortCOutRegD (2) <= DIN(0); -- Load INTEB from bit set/reset
ELSE
PortCOutRegD (2) <= DIN(2); -- Load INTEB from bus
END IF;
ELSE
PortCOutRegD (2) <= PortCOutRegQ (2);
END IF;
IF (ModeA = "00") THEN -- Mode 0
IF (PortCOutLd (3) = '0') THEN
IF ( PortCOverride = '1') THEN
PortCOutRegD (3) <= DIN(0); -- Load from bit set/reset
ELSE
PortCOutRegD (3) <= DIN(3); -- Load from bus
END IF;
ELSE
PortCOutRegD (3) <= PortCOutRegQ (3);
END IF;
ELSIF (ModeA = "01") THEN -- Mode 1
IF ( PortCOutLd (3) = '0' AND PortCOverride = '1') THEN
PortCOutRegD (3) <= DIN(0); -- Load from bit set/reset
ELSIF (PortA_IO = '0') THEN -- Mode 1 Output
IF (PortAWrite = '0') THEN
PortCOutRegD (3) <= '0'; -- Reset INTRA on write strobe
ELSIF (PortAWrite = '1' AND RisePCIN6 = '1' -- Set INTRA on rising edge of ACKA
AND PortCOutRegQ (7) = '1') THEN
PortCOutRegD (3) <= PortCOutRegQ (6);
ELSE
PortCOutRegD (3) <= PortCOutRegQ (3);
END IF;
ELSE -- Mode 1 Input
IF (PortARead = '0' AND PortCOutRegQ(5) = '1') THEN
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -