LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY DIANTI IS
PORT(CLK,RST:IN STD_LOGIC;
INNER_F1,INNER_F2,INNER_F3,INNER_F4,INNER_F5,INNER_F6:IN STD_LOGIC;
OUTER_U1,OUTER_U2,OUTER_U3,OUTER_U4,OUTER_U5:IN STD_LOGIC;
OUTER_D2,OUTER_D3,OUTER_D4,OUTER_D5,OUTER_D6:IN STD_LOGIC;
F1,F2,F3,F4,F5,F6:IN STD_LOGIC;
UP_REQ:BUFFER STD_LOGIC_VECTOR(6 DOWNTO 1);
DOWN_REQ:BUFFER STD_LOGIC_VECTOR(6 DOWNTO 1);
DELAY:IN STD_LOGIC;
CLOSE:IN STD_LOGIC;
OVER:IN STD_LOGIC;
DOOR:BUFFER STD_LOGIC_VECTOR(1 DOWNTO 0);
ALUM:BUFFER STD_LOGIC;
RUN:BUFFER STD_LOGIC);
END DIANTI;
ARCHITECTURE BEHAV OF DIANTI IS
SIGNAL STATE:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL FLOOR:STD_LOGIC_VECTOR(6 DOWNTO 1);
SIGNAL CURRENT_FLOOR:INTEGER RANGE 6 DOWNTO 0;
SIGNAL DOOR_TIME:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL INNER_REQ:STD_LOGIC_VECTOR(6 DOWNTO 1);
BEGIN
FLOOR<=F6&F5&F4&F3&F2&F1;
ALUM<=OVER;
PROCESS(RST,CLK)
BEGIN
IF(RST='1')THEN
UP_REQ<="000000";
DOWN_REQ<="000000";
INNER_REQ<="000000";
ELSIF(CLK'EVENT AND CLK='1')THEN
IF(OUTER_U5='1')THEN
UP_REQ(5)<='1';
ELSIF(CURRENT_FLOOR=5 AND RUN='0')THEN UP_REQ(5)<='0';
ELSIF(CURRENT_FLOOR=5 AND RUN='1' AND STATE(1 DOWNTO 0)="10" AND DOWN_REQ(4 DOWNTO 1)="0000")THEN UP_REQ(5)<='0';
END IF;
IF(OUTER_U4='1')THEN
UP_REQ(4)<='1';
ELSIF(CURRENT_FLOOR=4 AND RUN='0')THEN UP_REQ(4)<='0';
ELSIF(CURRENT_FLOOR=4 AND RUN='1' AND STATE(1 DOWNTO 0)="10" AND DOWN_REQ(3 DOWNTO 1)="000")THEN UP_REQ(4)<='0';
END IF;
IF(OUTER_U3='1')THEN
UP_REQ(3)<='1';
ELSIF(CURRENT_FLOOR=3 AND RUN='0')THEN
UP_REQ(3)<='0';
ELSIF(CURRENT_FLOOR=3 AND RUN='1' AND STATE(1 DOWNTO 0)="10" AND DOWN_REQ(2 DOWNTO 1)="00")THEN UP_REQ(3)<='0';
END IF;
IF(OUTER_U2='1')THEN
UP_REQ(2)<='1';
ELSIF(CURRENT_FLOOR=2 AND RUN='0')THEN
UP_REQ(2)<='0';
ELSIF(CURRENT_FLOOR=2 AND RUN='1' AND STATE(1 DOWNTO 0)="10" AND DOWN_REQ(1)='0')THEN UP_REQ(2)<='0';
END IF;
IF(OUTER_U1='1')THEN
UP_REQ(1)<='1';
ELSIF(CURRENT_FLOOR=1 AND RUN='0')THEN
UP_REQ(1)<='0';
END IF;
IF(OUTER_D6='1')THEN
DOWN_REQ(6)<='1';
ELSIF(CURRENT_FLOOR=6 AND RUN='0')THEN DOWN_REQ(6)<='0';
END IF;
IF(OUTER_D5='1')THEN
DOWN_REQ(5)<='1';
ELSIF(CURRENT_FLOOR=5 AND RUN='0')THEN DOWN_REQ(5)<='0';
ELSIF(CURRENT_FLOOR=5 AND RUN='1' AND STATE(1 DOWNTO 0)="01" AND DOWN_REQ(6)='0')THEN DOWN_REQ(5)<='0';
END IF;
IF(OUTER_D4='1')THEN
DOWN_REQ(4)<='1';
ELSIF(CURRENT_FLOOR=4 AND RUN='0')THEN DOWN_REQ(4)<='0';
ELSIF(CURRENT_FLOOR=4 AND RUN='1' AND STATE(1 DOWNTO 0)="01" AND DOWN_REQ(6 DOWNTO 5)="00")THEN DOWN_REQ(4)<='0';
END IF;
IF(OUTER_D3='1')THEN
DOWN_REQ(3)<='1';
ELSIF(CURRENT_FLOOR=3 AND RUN='0')THEN DOWN_REQ(3)<='0';
ELSIF(CURRENT_FLOOR=3 AND RUN='1' AND STATE(1 DOWNTO 0)="01" AND DOWN_REQ(6 DOWNTO 4)="000")THEN DOWN_REQ(3)<='0';
END IF;
IF(OUTER_D2='1')THEN
DOWN_REQ(2)<='1';
ELSIF(CURRENT_FLOOR=2 AND RUN='0')THEN DOWN_REQ(2)<='0';
ELSIF(CURRENT_FLOOR=2 AND RUN='1' AND STATE(1 DOWNTO 0)="01" AND DOWN_REQ(6 DOWNTO 3)="0000")THEN DOWN_REQ(2)<='0';
END IF;
IF(INNER_F1='1')THEN
INNER_REQ(1)<='1';
ELSIF(CURRENT_FLOOR=1 AND RUN='0')THEN INNER_REQ(1)<='0';
END IF;
IF(INNER_F2='1')THEN
INNER_REQ(2)<='1';
ELSIF(CURRENT_FLOOR=2 AND RUN='0')THEN INNER_REQ(2)<='0';
END IF;
IF(INNER_F3='1')THEN
INNER_REQ(3)<='1';
ELSIF(CURRENT_FLOOR=3 AND RUN='0')THEN INNER_REQ(3)<='0';
END IF;
IF(INNER_F4='1')THEN
INNER_REQ(4)<='1';
ELSIF(CURRENT_FLOOR=4 AND RUN='0')THEN INNER_REQ(4)<='0';
END IF;
IF(INNER_F5='1')THEN
INNER_REQ(5)<='1';
ELSIF(CURRENT_FLOOR=5 AND RUN='0')THEN INNER_REQ(5)<='0';
END IF;
IF(INNER_F6='1')THEN
INNER_REQ(6)<='1';
ELSIF(CURRENT_FLOOR=6 AND RUN='0')THEN INNER_REQ(6)<='0';
END IF;
END IF;
END PROCESS;
PROCESS(RST,CLK)
BEGIN
IF(RST='1')THEN CURRENT_FLOOR<=1;
ELSIF(CLK'EVENT AND CLK='1')THEN
CASE FLOOR IS
WHEN "000001"=>CURRENT_FLOOR<=1;
WHEN "000010"=>CURRENT_FLOOR<=2;
WHEN "000100"=>CURRENT_FLOOR<=3;
WHEN "001000"=>CURRENT_FLOOR<=4;
WHEN "010000"=>CURRENT_FLOOR<=5;
WHEN "100000"=>CURRENT_FLOOR<=6;
WHEN OTHERS=>CURRENT_FLOOR<=CURRENT_FLOOR;
END CASE;
END IF;
END PROCESS;
PROCESS(RST,CLK)
BEGIN
IF(RST='1')THEN DOOR<="00";DOOR_TIME<="000";
ELSIF(CLK'EVENT AND CLK='1')THEN
IF(STATE(2)='0')THEN
IF(OVER='0')THEN
IF(DELAY='1')THEN
DOOR_TIME<="011";
ELSIF(CLOSE='1')THEN DOOR_TIME<="101";
ELSE DOOR_TIME<=DOOR_TIME+1;
END IF;
CASE DOOR_TIME IS
WHEN "001"=>DOOR<="11";
WHEN "010"=>DOOR<="11";
WHEN "101"=>DOOR<="10";
WHEN "110"=>DOOR<="10";
WHEN OTHERS=>DOOR<="00";
END CASE;
ELSE DOOR<="00";
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(RST,CLK,CURRENT_FLOOR)
BEGIN
IF(RST='1')THEN
RUN<='0';
STATE(2 DOWNTO 0)<="100";
ELSIF(CLK'EVENT AND CLK='1')THEN
CASE CURRENT_FLOOR IS
WHEN 1=>IF(STATE(2)='0')THEN
RUN<='0';
IF(DOOR_TIME="111")THEN
STATE(2)<='1';
END IF;
ELSE
IF(RUN='0')THEN
IF(UP_REQ(1)='1')THEN STATE(2)<='0';
ELSIF(INNER_REQ(6 DOWNTO 2)>"00000" OR UP_REQ(5 DOWNTO 2)>"0000")THEN
RUN<='1';
STATE(1 DOWNTO 0)<="11";
ELSIF(DOWN_REQ(6 DOWNTO 2)>"00000")THEN
RUN<='1';
STATE(1 DOWNTO 0)<="01";
END IF;
ELSE
IF(STATE(0)='0' AND (INNER_REQ(1)='1' OR UP_REQ(1)='1'))THEN
RUN<='0';
STATE(2)<='0';
END IF;
END IF;
END IF;
WHEN 2=>IF(STATE(2)='0')THEN
RUN<='0';
IF(DOOR_TIME="111")THEN
STATE(2)<='1';
END IF;
ELSE
IF(RUN='0')THEN
IF(UP_REQ(2)='1')THEN STATE(2)<='0';
ELSIF(INNER_REQ(6 DOWNTO 3)>"0000" OR UP_REQ(5 DOWNTO 3)>"000")THEN
RUN<='1';
STATE(1 DOWNTO 0)<="11";
ELSIF(UP_REQ(1)>'0')THEN
RUN<='1';
STATE(1 DOWNTO 0)<="10";
ELSIF(DOWN_REQ(2)='1')THEN
STATE(2)<='0';
ELSIF(INNER_REQ(1)>'0')THEN
RUN<='1';
STATE(1 DOWNTO 0)<="00";
ELSIF(DOWN_REQ(6 DOWNTO 3)>"0000")THEN
RUN<='1';
STATE(1 DOWNTO 0)<="01";
END IF;
ELSE
IF(STATE(0)='1' AND (INNER_REQ(2)='1' OR UP_REQ(2)='1'))THEN
RUN<='0';
STATE(2)<='0';
ELSIF(STATE(1 DOWNTO 0)="01" AND (INNER_REQ(2)='1' OR DOWN_REQ(2)='1'))THEN
IF(DOWN_REQ(6 DOWNTO 3)="0000")THEN
RUN<='0';
STATE(2)<='0';
END IF;
ELSIF(STATE(0)='0' AND (INNER_REQ(2)='1' OR DOWN_REQ(2)='1'))THEN
RUN<='0';
STATE(2)<='0';
ELSIF(STATE(1 DOWNTO 0)="10" AND (INNER_REQ(2)='1' OR UP_REQ(2)='1'))THEN
IF(UP_REQ(1)='0')THEN
RUN<='0';
STATE(2)<='0';
END IF;