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 + -
显示快捷键?