⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flift.vhd

📁 实现简易4层电梯控制核心模块
💻 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 + -