📄 threeflift.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY THREEFLIFT IS
PORT(BUTTONCLK:IN STD_LOGIC;
LIFTCLK:IN STD_LOGIC;
RESET:IN STD_LOGIC;
F1UPBUTTON,F2UPBUTTON,F2DNBUTTON,F3DNBUTTON:IN STD_LOGIC;
STOP1BUTTON,STOP2BUTTON,STOP3BUTTON:IN STD_LOGIC;
POSITION:BUFFER INTEGER RANGE 1 TO 3;
DOUT1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
DOORLIGHT:OUT STD_LOGIC;
UDSIG:BUFFER STD_LOGIC);
END;
ARCHITECTURE A OF THREEFLIFT IS
TYPE LIFT_STATE IS
(STOPON1,DOOROPEN,DOORCLOSE,DOORWAIT1,DOORWAIT2,
DOORWAIT3,DOORWAIT4,UP,DOWN,STOP);
SIGNAL FUPLIGHT,FDNLIGHT,STOPLIGHT:STD_LOGIC_VECTOR(3 DOWNTO 1);
SIGNAL MYLIFT:LIFT_STATE;
SIGNAL CLEARUP:STD_LOGIC;
SIGNAL CLEARDN:STD_LOGIC;
BEGIN
CTRLIFT:PROCESS(RESET,LIFTCLK)
VARIABLE POS:INTEGER RANGE 3 DOWNTO 1;
BEGIN
IF RESET='1' THEN
MYLIFT<=STOPON1;--复位键按下,电梯状态为停在一楼
CLEARUP<='0';
CLEARDN<='0';
ELSE
IF LIFTCLK'EVENT AND LIFTCLK='1' THEN
CASE MYLIFT IS
WHEN STOPON1=> --电梯当前状态是STOPON1(停在一楼)的话执行如下四句
DOORLIGHT<='1'; --指示灯显示当前电梯处于一楼
POSITION<=1;POS:=1;
MYLIFT<=DOORWAIT1; --电梯状态变为DOORWAIT1(在一楼等待)
WHEN DOORWAIT1=>
MYLIFT<=DOORWAIT2;
WHEN DOORWAIT2=>
MYLIFT<=DOORWAIT3;
CLEARUP<='0';
CLEARDN<='0';
WHEN DOORWAIT3=>
MYLIFT<=DOORWAIT4;
WHEN DOORWAIT4=>
MYLIFT<=DOORCLOSE;
WHEN DOORCLOSE=>
DOORLIGHT<='0';
IF UDSIG='0' THEN
IF POSITION=3 THEN
IF
STOPLIGHT="000"AND FUPLIGHT="000"AND FDNLIGHT="000" THEN
UDSIG<='1';
MYLIFT<=DOORCLOSE;
elsif STOPLIGHT(2)='1'OR(STOPLIGHT(2)='0'AND FDNLIGHT(2)='1')THEN
UDSIG<='1';
MYLIFT<=doorclose;
elsif STOPLIGHT(2)='1'OR(STOPLIGHT(2)='0'AND FupLIGHT(2)='1')THEN
UDSIG<='0';
MYLIFT<=UP;
ELSE UDSIG<='1';MYLIFT<=DOWN;
END IF;
ELSIF POSITION=2 THEN
IF
STOPLIGHT="000"AND FUPLIGHT="000"AND FDNLIGHT="000" THEN
UDSIG<='0';
MYLIFT<=DOORCLOSE;
ELSIF FDNLIGHT(2)='1' THEN
UDSIG<='1';
MYLIFT<=DOORCLOSE;
ELSIF
STOPLIGHT(3)='1'OR(STOPLIGHT(3)='0'AND FDNLIGHT(3)='1')THEN
UDSIG<='0';
MYLIFT<=UP;
ELSIF
STOPLIGHT(1)='1'OR(STOPLIGHT(1)='0'AND FDNLIGHT(2)='1')THEN
UDSIG<='1';
MYLIFT<=DOORCLOSE;
ELSE UDSIG<='1';MYLIFT<=DOWN;
END IF;
ELSIF POSITION=1 THEN
IF
STOPLIGHT="000"AND FUPLIGHT="000"AND FDNLIGHT="000" THEN
UDSIG<='0';
MYLIFT<=DOORCLOSE;
ELSIF
STOPLIGHT(3)='1'OR(STOPLIGHT(3)='0'AND FDNLIGHT(3)='1')THEN
UDSIG<='0';
MYLIFT<=UP;
ELSIF
STOPLIGHT(1)='1'OR(STOPLIGHT(1)='0'AND FDNLIGHT(2)='1')THEN
UDSIG<='1';
MYLIFT<=DOORCLOSE;
ELSE UDSIG<='0';
MYLIFT<=UP;
END IF;
END IF;
ELSIF UDSIG='1' THEN
IF POSITION=1 THEN
IF
STOPLIGHT="000"AND FUPLIGHT="000"AND FDNLIGHT="000" THEN
UDSIG<='0';
MYLIFT<=DOORCLOSE;
ELSIF STOPLIGHT(1)='1'OR(STOPLIGHT(1)='0'AND FUPLIGHT(1)='1')THEN
UDSIG<='1';
MYLIFT<=DOORCLOSE;
ELSE UDSIG<='0';MYLIFT<=UP;
END IF;
ELSIF POSITION=2 THEN
IF
STOPLIGHT="000"AND FUPLIGHT="000"AND FDNLIGHT="000" THEN
UDSIG<='1';
MYLIFT<=DOORCLOSE;
ELSIF FUPLIGHT(2)='1' THEN
UDSIG<='0';
MYLIFT<=DOORCLOSE;
ELSIF
STOPLIGHT(1)='1'OR(STOPLIGHT(1)='0'AND FUPLIGHT(1)='1')THEN
UDSIG<='1';
MYLIFT<=DOWN;
ELSE UDSIG<='0';MYLIFT<=UP;
END IF;
ELSIF POSITION=3 THEN
IF
STOPLIGHT="000"AND FUPLIGHT="000"AND FDNLIGHT="000" THEN
UDSIG<='1';
MYLIFT<=DOORCLOSE;
ELSE UDSIG<='1';
MYLIFT<=DOWN;
END IF;
END IF;
END IF;
WHEN UP=>
POSITION<=POSITION+1;
POS:=POS+1;
IF POS<3
AND(STOPLIGHT(POS)='1'OR FDNLIGHT(POS)='1') THEN
MYLIFT<=STOP;
ELSIF POS<3 AND(STOPLIGHT(POS)='1'OR FUPLIGHT(POS)='1') THEN
MYLIFT<=STOP;
ELSIF POS=3 AND (STOPLIGHT(POS)='1'OR FDNLIGHT(POS)='1')THEN
MYLIFT<=STOP;
ELSE MYLIFT<=DOORCLOSE;
END IF;
WHEN DOWN=>
POSITION<=POSITION-1;
POS:=POS-1;
IF POS>1 AND (STOPLIGHT(POS)='1'OR FDNLIGHT(POS)='1')THEN MYLIFT<=STOP;
ELSIF POS=1 AND (STOPLIGHT(POS)='1'OR FUPLIGHT(POS)='1')THEN
MYLIFT<=STOP;
ELSE MYLIFT<=DOORCLOSE;
END IF;
WHEN STOP=>
MYLIFT<=DOOROPEN;
WHEN DOOROPEN=>
DOORLIGHT<='1';
IF UDSIG='0'THEN
IF POSITION<=2 AND (STOPLIGHT(POS)='1'OR FUPLIGHT(POS)='1')THEN
CLEARUP<='1';
ELSE CLEARUP<='1';
CLEARDN<='1';
END IF;
ELSIF UDSIG='1' THEN
IF POSITION>=2 AND (STOPLIGHT(POS)='1'OR FDNLIGHT(POS)='1')THEN
CLEARDN<='1';
ELSE CLEARUP<='1';
CLEARDN<='1';
END IF;
END IF;
MYLIFT<=DOORWAIT1;
END CASE;
END IF;
END IF;
END PROCESS CTRLIFT;
CTRLIGHT:PROCESS(RESET,BUTTONCLK)
BEGIN
IF RESET='1' THEN
STOPLIGHT<="000";
FUPLIGHT<="000";
FDNLIGHT<="000";
ELSE
IF BUTTONCLK'EVENT AND BUTTONCLK='1' THEN
IF CLEARUP='1' THEN
STOPLIGHT(POSITION)<='0';FUPLIGHT(POSITION)<='0';
ELSE
IF F1UPBUTTON='1' THEN FUPLIGHT(1)<='1';
ELSIF F2UPBUTTON='1' THEN FUPLIGHT(2)<='1';
END IF;
END IF;
IF CLEARDN='1' THEN
STOPLIGHT(POSITION)<='0';
FDNLIGHT(POSITION)<='0';
ELSE
IF F2DNBUTTON='1' THEN FDNLIGHT(2)<='1';
ELSIF F3DNBUTTON='1' THEN FDNLIGHT(3)<='1';
END IF;
END IF;
IF STOP1BUTTON='1' THEN STOPLIGHT(1)<='1';
ELSIF STOP2BUTTON='1' THEN STOPLIGHT(2)<='1';
ELSIF STOP3BUTTON='1' THEN STOPLIGHT(3)<='1';
END IF;
END IF;
END IF;
END PROCESS;
process(POSITION)
begin
if POSITION=1 then dout1<="0001";
END IF;
if POSITION=2 then dout1<="0010";
END IF;
if POSITION=3 then dout1<="0011";
END IF;
end process;
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -