📄 elevator.vhd
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity elevator is
port ( clk :in std_logic;-------时钟信号(频率为2Hz)
full:in std_logic;-------超载
stop:in std_logic;-------关门中断
close:in std_logic;------提前关门
clr:in std_logic; -------清除报警信号
up1,up2,up3,up4,up5:in std_logic; ------电梯外人的上升请求信号
down2,down3,down4,down5,down6:in std_logic; -----电梯外人的下降请求信号
k1,k2,k3,k4,k5,k6:in std_logic; ------------电梯内人的请求信号
g1,g2,g3,g4,g5,g6:in std_logic; ------------到达楼层信号
door:out std_logic_vector(1 downto 0);------电梯门控制信号
led:out std_logic_vector(6 downto 0); ------电梯所在楼层显示
ud:out std_logic;---------电梯运动方向显示
alarm:out std_logic;------超载警告信号
up,down:out std_logic);---电机控制信号(上升或者下降)
end ;
architecture one of elevator is
signal clk1hz:std_logic;
signal k11,k22,k33,k44,k55,k66:std_logic; --------电梯内人请求信号寄存信号
signal up11,up22,up33,up44,up55:std_logic;--------电梯外人上升请求信号寄存信号
signal down22,down33,down44,down55,down66:std_logic;----电梯外人下降请求信号寄存信号
signal q1:integer range 0 to 6; -----------------------关门延时计数器
signal kk,uu,dd,uu_dd:std_logic_vector(5 downto 0);-----电梯内外请求信号寄存器
signal opendoor:std_logic;-----------开门使能信号
signal updown:std_logic;-------------电梯运动方向信号寄存器
signal en_up,en_down:std_logic;------预备上升、预备下降预操作使能信号
begin
kk<=k66 & k55 & k44 & k33 & k22 & k11;---------电梯内人请求信号并置
uu<='0'& up55 & up44 & up33 & up22 & up1; -----电梯外人上升请求信号并置
dd<=down66 & down55 & down44 & down33 & down22 &'0'; -----电梯外人下降请求信号并置
uu_dd<=kk or uu or dd; ------------------电梯内、外人请求信号进行综合
ud<=updown; -----------电梯运动状态显示
process(clk)
begin
if clk'event and clk='1' then
if k1='1' then
k11<=k1; ------------------对电梯内人请求信号进行检测和寄存
elsif k2='1' then
k22<=k2;
elsif k3='1' then
k33<=k3;
elsif k4='1' then
k44<=k4;
elsif k5='1' then
k55<=k5;
elsif k6='1' then
k66<=k6;
end if;
if up1='1' then ------------对电梯外人上升请求信号进行检测和寄存
up11<=up1;
elsif up2='1' then
up22<=up2;
elsif up3='1' then
up33<=up3;
elsif up4='1' then
up44<=up4;
elsif up5='1' then
up55<=up5;
end if;
if down2='1' then -------------对电梯外人下降请求信号进行检测和寄存
down22<=down2;
elsif down3='1' then
down33<=down3;
elsif down4='1' then
down44<=down4;
elsif down5='1' then
down55<=down5;
elsif down6='1' then
down66<=down6;
end if;
---------------------------------------------------------------
if clr='1' then q1<=0;alarm<='0'; ------------清除报警
elsif full='1' then ------超载报警
alarm<='1';
q1<=0;
door<="10";
else alarm<='0';
if opendoor='1' then ---------开门操作
door<="10";
q1<=0;
up<='0';
down<='0';
elsif en_up='1' then --------------------------------上升预操作
if stop='1' then -------关门中断
door<="10";
q1<=0;
elsif close='1' then --------------提前关门
q1<=3;
elsif q1=6 then ----关门完毕,电梯进入上升状态
door<="00";
updown<='1';
up<='1';
down<='0';
elsif q1>=3 then -----------电梯进入关门状态
door<="01";
q1<=q1+1;
else q1<=q1+1;door<="10"; -------电梯进入等待状态
end if;
elsif en_down='1' then ------------------------------下降预操作
if stop='1' then
door<="10";
q1<=0;
elsif close='1' then
q1<=3;
elsif q1=6 then
door<="00";
updown<='0';
down<='1';
up<='0';
elsif q1>=3 then
door<="01";
q1<=q1+1;
else q1<=q1+1;door<="10";
end if;
end if;
---------------------------------------------------
if g1='1' then led<="1001111";------电梯到达1楼,数码管显示1
if k11='1' or up11='1' then ----有当前层的请求,则电梯进入开门状态
k11<='0';
up11<='0';
opendoor<='1';
elsif uu_dd>"000001" then ----有上升请求,则电梯进入预备上升状态
en_up<='1';
opendoor<='0';
elsif uu_dd="000000" then ----无请求时,电梯停在1楼待机
opendoor<='0';
end if;
elsif g2='1' then led<="0010010"; ------------电梯到达2楼,数码管显示2
if updown='1' then ------------电梯前一运动状态位上升
if k22='1' or up22='1' then ----有当前层的请求,则电梯进入开门状态
k22<='0';
up22<='0';
opendoor<='1';
elsif uu_dd>"000011" then ----有上升请求,则电梯进入预备上升状态
en_up<='1';
opendoor<='0';
elsif uu_dd<"000010" then ---有下降请求,则电梯进入预备下降状态
en_down<='1';
opendoor<='0';
end if;
else -----------------电梯前一运动状态为下降
if k22='1' or down22='1' then ----有当前层的请求,则电梯进入开门状态
k22<='0';
down22<='0';
opendoor<='1';
elsif uu_dd<"000010" then ----有下降请求,则电梯进入预备下降状态
en_down<='1';
opendoor<='0';
elsif uu_dd>"000011" then ----有上升请求,则电梯进入预备上升状态
en_up<='1';
opendoor<='0';
end if;
end if;
elsif g3='1' then led<="0000110"; --------电梯到达3楼,数码管显示3
if updown='1' then
if k33='1' or up33='1' then
k33<='0';
up33<='0';
opendoor<='1';
elsif uu_dd>"000111" then
en_up<='1';
opendoor<='0';
elsif uu_dd<"000100" then
en_down<='1';
opendoor<='0';
end if;
else
if k33='1' or down33='1' then
k33<='0';
down33<='0';
opendoor<='1';
elsif uu_dd<"000100" then
en_down<='1';
opendoor<='0';
elsif uu_dd>"000111" then
en_up<='1';
opendoor<='0';
end if;
end if;
elsif g4='1' then led<="1001100";---------电梯到达4楼,数码管显示4
if updown='1' then
if k44='1' or up44='1' then
k44<='0';
up44<='0';
opendoor<='1';
elsif uu_dd>"001111" then
en_up<='1';
opendoor<='0';
elsif uu_dd<"001000" then
en_down<='1';
opendoor<='0';
end if;
else
if k44='1' or down44='1' then
k44<='0';
down44<='0';
opendoor<='1';
elsif uu_dd<"001000" then
en_down<='1';
opendoor<='0';
elsif uu_dd>"001111" then
en_up<='1';
opendoor<='0';
end if;
end if;
elsif g5='1' then led<="0100100"; -----------电梯到达5楼,数码管显示5
if updown='1' then
if k55='1' or up55='1' then
k55<='0';
up55<='0';
opendoor<='1';
elsif uu_dd>"011111" then
en_up<='1';
opendoor<='0';
elsif uu_dd<"010000" then
en_down<='1';
opendoor<='0';
end if;
else
if k55='1' or down55='1' then
k55<='0';
down55<='0';
opendoor<='1';
elsif uu_dd<"010000" then
en_down<='1';
opendoor<='0';
elsif uu_dd>"011111" then
en_up<='1';
opendoor<='0';
end if;
end if;
elsif g6='1' then led<="0100000"; ---------电梯到达6楼,数码管显示6
if k66='1' or down66='1' then
k66<='0';
down66<='0';
opendoor<='1';
elsif uu_dd<"100000" then
en_down<='1';
opendoor<='0';
end if;
else en_up<='0';en_down<='0'; --------电梯进入上升或下降状态
end if;
end if;
end if;
end process;
end ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -