📄 flift.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY FLIFT IS
PORT(CLK,RST,UP1,UP2,UP3,
DOWN2,DOWN3,DOWN4,
STOP1,STOP2,STOP3,STOP4: IN STD_LOGIC;
UPLIGHT,DOWNLIGHT: BUFFER STD_LOGIC_VECTOR(4 DOWNTO 1);--外部上升、下降请求指示灯
STOPLIGHT: BUFFER STD_LOGIC_VECTOR(4 DOWNTO 1);--内部到达楼层停战请求指示灯
UDSIG: BUFFER STD_LOGIC; --电梯运行模式指示,1代表下降,0代表上升
POSITION: BUFFER INTEGER RANGE 4 downto 1;--表示电梯在对应楼层
DOORLIGHT: OUT STD_LOGIC ); --电梯门状态指示灯,1表示开门
END FLIFT;
ARCHITECTURE BEHAV OF FLIFT IS
TYPE STATE_TYPE IS (STOPON1,DOOROPEN,DOORCLOSE,WAIT1,WAIT2,WAIT3,WAIT4,UP,DOWN,STOP);
--10个工作状态:STOPON1停一层、DOOROPEN开门状态、DOORCLOSE关门状态、WAIT1开门等待1秒、
--WAIT2开门等待2秒、WAIT3开门等待3秒、WAIT4开门等待4秒、UP上升、DOWN下降、DOWN停止
SIGNAL STATE: STATE_TYPE :=STOPON1;
SIGNAL CLEARUP,CLEARDN,BUTTCLK,FLICLK:STD_LOGIC;
SIGNAL Q:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(CLK) --分频进程
BEGIN
IF RST='1' THEN
Q<="0000";
ELSIF clk'event and clk = '1' THEN
Q<=Q+1;
END IF;
BUTTCLK<=Q(0); --电梯控制时钟FLIFTCLK对CLK的2分频
FLICLK<=Q(3); --按键控制时钟BUFFCLK对CLK的16分频
END PROCESS;
CONT:PROCESS (RST,FLICLK) --电梯上下层进程
VARIABLE POS:INTEGER RANGE 4 DOWNTO 1;
BEGIN
IF RST='1' THEN
STATE<=STOPON1;
CLEARUP<='0';
CLEARDN<='0';
ELSIF FLICLK'event and FLICLK='1' THEN
CASE STATE IS
WHEN STOPON1 =>DOORLIGHT<='1'; --电梯门打开
POSITION<=1; --电梯在1层
POS:=1;
STATE<=WAIT1;
WHEN WAIT1 =>STATE<=WAIT2;
WHEN WAIT2 =>CLEARUP<='0'; --清除标志置零,不清除
CLEARDN<='0'; --
STATE<=WAIT3;
WHEN WAIT3 =>STATE<=WAIT4;
WHEN WAIT4 =>STATE<=DOORCLOSE; --开门等待4秒
WHEN DOORCLOSE =>DOORLIGHT<='0'; --指示灯指示门关闭
IF UDSIG='0' THEN --上升情况
IF POSITION=4 THEN --电梯在4层
IF STOPLIGHT="0000" AND UPLIGHT="0000" AND DOWNLIGHT="0000" THEN --无任何响应
UDSIG<='1';STATE<=DOORCLOSE;--电梯到最高层改变运行方向
ELSE UDSIG<='1';STATE<=DOWN;--有响应时同样改变运行方向,进入下降状态
END IF;
ELSIF POSITION=3 THEN --电梯在3层
IF STOPLIGHT="0000" AND UPLIGHT="0000" AND DOWNLIGHT="0000" THEN
UDSIG<='0';STATE<=DOORCLOSE;
ELSIF STOPLIGHT(4)='1' OR DOWNLIGHT(4)='1' THEN --有人要在4层进或出
UDSIG<='0';STATE<=UP;
ELSE UDSIG<='1';STATE<=DOWN; --在低层有请求,则下降
END IF;
ELSIF POSITION=2 THEN --电梯在2层
IF STOPLIGHT="0000" AND UPLIGHT="0000" AND DOWNLIGHT="0000" THEN
UDSIG<='0';STATE<=DOORCLOSE;
ELSIF STOPLIGHT(3)='1' OR DOWNLIGHT(3)='1' OR UPLIGHT(3)='1' OR
STOPLIGHT(4)='1' OR DOWNLIGHT(4)='1' THEN
UDSIG<='0';STATE<=UP;
ELSE UDSIG<='1';STATE<=DOWN; --在低层有请求,则下降
END IF;
ELSIF POSITION=1 THEN --电梯在1层
IF STOPLIGHT="0000" AND UPLIGHT="0000" AND DOWNLIGHT="0000" THEN
UDSIG<='0';STATE<=DOORCLOSE;
ELSE UDSIG<='0';STATE<=UP;--有响应时同样改变运行方向,进入上升状态
END IF;
END IF;
ELSIF UDSIG='1' THEN --下降情况
IF POSITION=1 THEN --电梯在1层
IF STOPLIGHT="0000" AND UPLIGHT="0000" AND DOWNLIGHT="0000" THEN
UDSIG<='0';STATE<=DOORCLOSE;
ELSE UDSIG<='0';STATE<=UP;
END IF;
ELSIF POSITION=2 THEN --电梯在2层
IF STOPLIGHT="0000" AND UPLIGHT="0000" AND DOWNLIGHT="0000" THEN
UDSIG<='1';STATE<=DOORCLOSE;
ELSIF STOPLIGHT(1)='1' OR UPLIGHT(1)='1' THEN
UDSIG<='1';STATE<=DOWN;
ELSE UDSIG<='0';STATE<=UP;
END IF;
ELSIF POSITION=3 THEN --电梯在3层
IF STOPLIGHT="0000" AND UPLIGHT="0000" AND DOWNLIGHT="0000" THEN
UDSIG<='1';STATE<=DOORCLOSE;
ELSIF STOPLIGHT(2)='1' OR UPLIGHT(2)='1' OR DOWNLIGHT(2)='1' OR
STOPLIGHT(1)='1' OR UPLIGHT(1)='1'THEN
UDSIG<='1';STATE<=DOWN;
ELSE UDSIG<='0';STATE<=UP;
END IF;
ELSIF POSITION=4 THEN --电梯在4层
IF STOPLIGHT="0000" AND UPLIGHT="0000" AND DOWNLIGHT="0000" THEN
UDSIG<='1';STATE<=DOORCLOSE;
ELSE UDSIG<='1';STATE<=DOWN;
END IF;
END IF;
END IF;
WHEN UP=> POSITION<=POSITION+1;POS:=POS+1; --电梯上一层
IF (POS=2 AND(STOPLIGHT(3)='1' OR DOWNLIGHT(3)='1' OR UPLIGHT(3)='1'OR STOPLIGHT(4)='1' OR DOWNLIGHT(4)='1'))
OR
(POS=3 AND (STOPLIGHT(4)='1' OR DOWNLIGHT(4)='1'))
THEN
STATE<=UP; --在高层有请求则继续保持上升状态
ELSE STATE<=STOP; --高层无请求或到达第4层则进入停止状态
END IF;
WHEN DOWN=> POSITION<=POSITION-1;POS:=POS-1; --电梯下一层
IF (POS=2 AND (STOPLIGHT(1)='1' OR UPLIGHT(1)='1'))
OR
(POS=3 AND (STOPLIGHT(2)='1' OR UPLIGHT(2)='1' OR DOWNLIGHT(2)='1' OR STOPLIGHT(1)='1' OR UPLIGHT(1)='1'))
THEN
STATE<=DOWN; --在低层有请求则继续保持下降状态
ELSE STATE<=STOP;
END IF;
WHEN STOP=> STATE<=DOOROPEN; --电梯停止,门打开
WHEN DOOROPEN=> DOORLIGHT<='1';
CLEARUP<='1'; --停止后清除请求上升信号
CLEARDN<='1'; --停止后清除请求下降信号
STATE<=WAIT1; --电梯开门
WHEN others=> STATE<=STOPON1;
END CASE;
END IF;
END PROCESS CONT;
BUTT:PROCESS (RST,BUTTCLK) --读按键、控制指示灯进程
BEGIN
IF RST='1' THEN
STOPLIGHT<="0000";UPLIGHT<="0000";DOWNLIGHT<="0000";
ELSE
IF BUTTCLK'event and BUTTCLK='1' THEN
IF CLEARUP='1' THEN
STOPLIGHT(POSITION)<='0';UPLIGHT(POSITION)<='0';
ELSE
IF UP1='1' THEN UPLIGHT(1)<='1';
ELSIF UP2='1' THEN UPLIGHT(2)<='1';
ELSIF UP3='1' THEN UPLIGHT(3)<='1';
END IF;
END IF;
IF CLEARDN='1' THEN
STOPLIGHT(POSITION)<='0';DOWNLIGHT(POSITION)<='0';
ELSE
IF DOWN2='1' THEN DOWNLIGHT(2)<='1';
ELSIF DOWN3='1' THEN DOWNLIGHT(3)<='1';
ELSIF DOWN4='1' THEN DOWNLIGHT(4)<='1';
END IF;
END IF;
IF STOP1='1' THEN STOPLIGHT(1)<='1';
ELSIF STOP2='1' THEN STOPLIGHT(2)<='1';
ELSIF STOP3='1' THEN STOPLIGHT(3)<='1';
ELSIF STOP4='1' THEN STOPLIGHT(4)<='1';
END IF;
END IF;
END IF;
END PROCESS BUTT;
END BEHAV;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -