z20040092_3.vhd

来自「设计一个6层电梯控制器。电梯控制器是按照乘客的要求自动上、下的装置。 1、每层」· VHDL 代码 · 共 218 行

VHD
218
字号
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_arith.ALL;
USE IEEE.std_logic_unsigned.ALL;

ENTITY z20040092_3 IS
	PORT (	BUTTONCLK:	IN STD_LOGIC;		--按键时钟
			LIFTCLK:	IN STD_LOGIC;		--电梯时钟
			RESET:		IN STD_LOGIC;		--异步置位按键
			F1UP:		IN STD_LOGIC;		--1层上升请求按键
			F2DN:		IN STD_LOGIC;		--2层下降请求按键
			F2UP:		IN STD_LOGIC;
			F3DN:		IN STD_LOGIC;
			F3UP:		IN STD_LOGIC;
			F4DN:		IN STD_LOGIC;
			F4UP:		IN STD_LOGIC;
			F5DN:		IN STD_LOGIC;
			F5UP:		IN STD_LOGIC;
			F6DN:		IN STD_LOGIC;
			FUPLIGHT:	BUFFER STD_LOGIC_VECTOR (6 DOWNTO 1);--电梯外部上升请求指示灯
			FDNLIGHT:	BUFFER STD_LOGIC_VECTOR (6 DOWNTO 1);--电梯外部下降请求指示灯
			ST1,ST2,ST3,ST4,ST5,ST6: IN STD_LOGIC;			--电梯内部各层请求按键
			STLIGHT:	BUFFER STD_LOGIC_VECTOR (6 DOWNTO 1);--电梯内部各层请求指示灯
			POSITION:	BUFFER INTEGER RANGE 1 TO 6;		--电梯位置指示
			DOORLIGHT:	OUT STD_LOGIC;						--电梯门开关指示灯
			UDSIG:		BUFFER STD_LOGIC					--电梯升降指示
	);
END z20040092_3;
	
ARCHITECTURE SIXFLIFT OF z20040092_3 IS
TYPE LIFT_STATE IS
(STOPON1,DOOROPEN,DOORCLOSE,DOORWAIT1,DOORWAIT2,DOORWAIT3,DOORWAIT4,UP,DOWN,STOP);
SIGNAL MYLIFT: LIFT_STATE;
SIGNAL CLEARUP: STD_LOGIC;	--用于清除上升请求指示灯的信号
SIGNAL CLEARDN: STD_LOGIC; 	--用于清除下降请求指示灯的信号
SIGNAL ONE:		STD_LOGIC_VECTOR (6 DOWNTO 1);

BEGIN
	
CTRLIFT: PROCESS(RESET,LIFTCLK)		--控制电梯状态的进程
VARIABLE POS: INTEGER RANGE 6 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 => DOORLIGHT <= '1';	--开门指示灯亮
							POSITION <= 1;
							POS := 1;
							MYLIFT <= DOORWAIT1;
			WHEN DOORWAIT1 => MYLIFT <= DOORWAIT2;
			WHEN DOORWAIT2 => CLEARUP <= '0';
							  CLEARDN <= '0';
							  MYLIFT <= DOORWAIT3;	
			WHEN DOORWAIT3 => MYLIFT <= DOORWAIT4;				
			WHEN DOORWAIT4 => MYLIFT <= DOORCLOSE;	
			WHEN DOORCLOSE => 
				DOORLIGHT <= '0';
				
				IF UDSIG = '0' THEN			--UDSIG = '0'表示上升模式
					IF POSITION = 6 THEN
						IF (STLIGHT = "000000" AND FUPLIGHT = "000000" AND FDNLIGHT = "000000") THEN
							UDSIG <= '1';
							MYLIFT <= DOORCLOSE;
						ELSE UDSIG <= '1';
							 MYLIFT <= DOWN;
						END IF;
					ELSIF POSITION = 1 THEN
						IF (STLIGHT = "000000" AND FUPLIGHT = "000000" AND FDNLIGHT = "000000") THEN
							UDSIG <= '0';
							MYLIFT <= DOORCLOSE;
						ELSE UDSIG <= '0';
							 MYLIFT <= UP;	
						END IF;	
					ELSE
						IF (STLIGHT = "000000" AND FUPLIGHT = "000000" AND FDNLIGHT = "000000") THEN
							MYLIFT <= DOORCLOSE;
						ELSIF (STLIGHT > ONE OR FUPLIGHT > ONE OR FDNLIGHT > ONE)	THEN
							UDSIG <= '0';
							MYLIFT <= UP;
						ELSE UDSIG <= '1';
							 MYLIFT <= DOWN;
						END IF;		
					END IF;
					
				ELSIF UDSIG = '1' THEN			--UDSIG = '1'表示下降模式
					IF POSITION = 1 THEN
						IF (STLIGHT = "000000" AND FUPLIGHT = "000000" AND FDNLIGHT = "000000") THEN
							UDSIG <= '0';
							MYLIFT <= DOORCLOSE;
						ELSE UDSIG <= '0';
							 MYLIFT <= UP;
						END IF;
					ELSIF POSITION = 6 THEN
						IF (STLIGHT = "000000" AND FUPLIGHT = "000000" AND FDNLIGHT = "000000") THEN
							UDSIG <= '1';
							MYLIFT <= DOORCLOSE;	
						ELSE UDSIG <= '1';
							 MYLIFT <= DOWN;
						END IF;
					ELSE
						IF (STLIGHT = "000000" AND FUPLIGHT = "000000" AND FDNLIGHT = "000000") THEN
							MYLIFT <= DOORCLOSE;
						ELSIF (STLIGHT < ONE OR FUPLIGHT < ONE OR FDNLIGHT < ONE)	THEN
							UDSIG <= '1';
							MYLIFT <= DOWN;
						ELSE UDSIG <= '0';
							 MYLIFT <= UP;
						END IF;	
					END IF;
				END IF;				
			WHEN UP =>	POSITION <= POSITION + 1;
						POS := POS + 1;
						IF POS < 6 AND (STLIGHT(POS) = '1' OR FUPLIGHT(POS) = '1')
							THEN MYLIFT <= STOP;
						ELSIF POS = 6 AND (STLIGHT(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 (STLIGHT(POS) = '1' OR FDNLIGHT(POS) = '1')
							THEN MYLIFT <= STOP;
						ELSIF POS = 1 AND (STLIGHT(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 <= 5 AND (STLIGHT(POSITION) = '1' OR FUPLIGHT(POSITION) = '1') THEN
						CLEARUP <= '1';
					ELSE CLEARUP <= '1';
						 CLEARDN <= '1';
					END IF;
				ELSIF UDSIG = '1' THEN
					IF POSITION >= 2 AND (STLIGHT(POSITION) = '1' OR FDNLIGHT(POSITION) = '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
	STLIGHT <= "000000";
	FUPLIGHT <= "000000";
	FDNLIGHT <= "000000";
ELSE 
	IF BUTTONCLK 'EVENT AND BUTTONCLK = '1' THEN
		IF CLEARUP = '1' THEN
			STLIGHT(POSITION) <= '0';
			FUPLIGHT(POSITION) <= '0';
		ELSE
			IF F1UP = '1' THEN FUPLIGHT(1) <= '1';
			ELSIF F2UP = '1' THEN FUPLIGHT(2) <= '1';
			ELSIF F3UP = '1' THEN FUPLIGHT(3) <= '1';	
			ELSIF F4UP = '1' THEN FUPLIGHT(4) <= '1';
			ELSIF F5UP = '1' THEN FUPLIGHT(5) <= '1';
			END IF;
		END IF;
		IF CLEARDN = '1' THEN
			STLIGHT(POSITION) <= '0';
			FDNLIGHT(POSITION) <= '0';
		ELSE
			IF F6DN = '1' THEN FDNLIGHT(6) <= '1';
			ELSIF F2DN = '1' THEN FDNLIGHT(2) <= '1';
			ELSIF F3DN = '1' THEN FDNLIGHT(3) <= '1';	
			ELSIF F4DN = '1' THEN FDNLIGHT(4) <= '1';
			ELSIF F5DN = '1' THEN FDNLIGHT(5) <= '1';
			END IF;
		END IF;					
		IF ST1 = '1' THEN STLIGHT(1) <= '1';
		ELSIF ST2 = '1' THEN STLIGHT(2) <= '1';
		ELSIF ST3 = '1' THEN STLIGHT(3) <= '1';
		ELSIF ST4 = '1' THEN STLIGHT(4) <= '1';
		ELSIF ST5 = '1' THEN STLIGHT(5) <= '1';
		ELSIF ST6 = '1' THEN STLIGHT(6) <= '1';
		END IF;
	END IF;
END IF;
END PROCESS CTRLIGHT;		
		
CTRONE:PROCESS(BUTTONCLK,POSITION)
BEGIN
IF BUTTONCLK 'EVENT AND BUTTONCLK = '1' THEN
CASE POSITION IS
	WHEN 1 => ONE <= "000000";
	WHEN 2 => ONE <= "000001";
	WHEN 3 => ONE <= "000011";
	WHEN 4 => ONE <= "000111";
	WHEN 5 => ONE <= "001111";
	WHEN 6 => ONE <= "011111";
END CASE;
END IF;
END PROCESS CTRONE;	



END SIXFLIFT;						
						
						
						
						
												

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?