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

📄 lift3.vhd

📁 本程序是三层电梯程序
💻 VHD
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity lift3 is 
port ( clk : in std_logic;          --时钟信号(频率为2Hz)
       reset:in std_logic ;         --复位信号
       deng,quick : in std_logic;         --超载、关门中断、提前关门清除报警信号
       c_u1,c_u2: in std_logic;    --电梯外人的上升请求信号
       c_d2,c_d3: in std_logic;   --电梯外人的下降请求信号
       d1,d2,d3: in std_logic;          --电梯内人的请求信号
       g1,g2,g3: in std_logic;          --到达楼层信号
       door : out std_logic_vector(1 downto 0);    --电梯门控制信号
       led : out std_logic_vector(3 downto 0);     --电梯所在楼层显示
	   ud: out std_logic;                 --电梯运动方向显示,超载警告信号
       up,down : out std_logic );                --电机控制信号和电梯运动
end lift3;

architecture behav of lift3 is
signal d11,d22,d33:std_logic;         --电梯内人请求信号寄存信号
signal c_u11,c_u22,c_u33:std_logic;   --电梯外人上升请求信号寄存信号
signal c_d22,c_d33:std_logic;   --电梯外人下降请求信号寄存信号
                  
signal q1:integer range 0 to 6;                   --关门延时计数器  

signal dd,cc_u,cc_d,dd_cc:std_logic_vector(2 downto 0); --电梯内外请求信号寄存器
signal opendoor:std_logic;                      --开门使能信号
signal updown:std_logic;                       --电梯运动方向信号寄存器
signal en_up,en_dw:std_logic;                   --预备上升、预备下降预操作使能信号
begin
com:process(clk,reset)
begin 
if clk'event and clk='1' then 
    if reset='1' then q1<=0;
    if q1>=3 then door<="10";        --10为开门 
      else door<="00";               --00为关门
      end if;               
        if opendoor='1' then door<="10";q1<=0;up<='0';down<='0';      --开门操作
        elsif en_up='1' then                                            --上升预操作  
          if deng='1' then door<="10";q1<=0;                  --关门中断
          elsif quick='1' then q1<=3;                                    --提前关门
          elsif q1=6 then door<="00";updown<='1';up<='1'; --关门完毕,电梯进入上升状态
          elsif q1>=3 then door<="01";q1<=q1+1;                  --电梯进入关门状态
          else q1<=q1+1;door<="00";                            --电梯进入等待状态
          end if;
        elsif en_dw='1' then                                          --下降预操作
          if deng='1' then door<="10";q1<=0; 
          elsif quick='1' then q1<=3;                       
          elsif q1=6 then door<="00";updown<='0';down<='1';   
          elsif q1>=3 then door<="01";q1<=q1+1;           
          else q1<=q1+1;door<="00";                   
          end if;
        end if;            
        if g1='1' then led<="0001";                    --电梯到达1楼,数码管显示1  
          if d11='1' or c_u11='1' then d11<='0'; c_u11<='0';opendoor<='1';
--有当前层的请求,则电梯进入开门状态                    
          elsif dd_cc>"001" then en_up<='1'; opendoor<='0'; 
--有上升请求,则电梯进入预备上升状态
          elsif dd_cc="000" then opendoor<='0';  --无请求时,电梯停在1楼待机                                               
          end if;   
        elsif g2='1' then led<="0010";                --电梯到达2楼,数码管显示2
          if updown='1' then                              --电梯前一运动状态位上升 
            if d22='1' or c_u22='1' then d22<='0'; c_u22<='0'; opendoor<='1'; 
                                            --有当前层的请求,则电梯进入开门状态          
            elsif dd_cc>"011" then en_up<='1'; opendoor<='0';    
                                            --有上升请求,则电梯进入预备上升状态       
            elsif dd_cc<"010" then en_dw<='1';  opendoor<='0'; 
--有下降请求,则电梯进入预备下降状态        
            end if; 
          --电梯前一运动状态为下降                       
          elsif d22='1' or c_d22='1' then d22<='0'; c_d22<='0';opendoor<='1';  
                                            --有当前层的请求,则电梯进入开门状态
          elsif dd_cc<"010" then en_dw<='1';  opendoor<='0'; 
--有下降请求,则电梯进入预备下降状态         
          elsif dd_cc>"011" then en_up<='1';   opendoor<='0'; 
--有上升请求,则电梯进入预备上升状态         
          end if;
        elsif g3='1' then led<="0011";                 --电梯到达3楼,数码管显示3                  
          if updown='1' then                 
          if d33='1' or c_d33='1' then d33<='0'; c_d33<='0';   opendoor<='1';     
          elsif dd_cc<"100" then en_dw<='1';  opendoor<='0';                   
          end if;
          end if;
    else en_up<='0';en_dw<='0';           --电梯进入上升或下降状态
        
      end if;
                     --清除超载报警
      if d1='1' then d11<=d1;                 --对电梯内人请求信号进行检测和寄存           
      elsif d2='1' then d22<=d2;
      elsif d3='1' then d33<=d3;
      end if;
      if c_u1='1' then c_u11<=c_u1;           --对电梯外人上升请求信号进行检测和寄存
      elsif c_u2='1' then c_u22<=c_u2;
      end if; 
      if c_d2='1' then c_d22<=c_d2;           --对电梯外人下降请求信号进行检测和寄存
      elsif c_d3='1' then c_d33<=c_d3;

end if; 
      dd<=d33&d22&d11;              --电梯内人请求信号并置     
      cc_u<='0'&c_u22&c_u11;    --电梯外人上升请求信号并置 
      cc_d<=d33&c_d22&'0';    --电梯外人下降请求信号并置   
      dd_cc<=dd or cc_u or cc_d;                      --电梯内、外人请求信号进行综合
    end if; 
    ud<=updown;                                    --电梯运动状态显示         
                                    --电梯外人下降请求信号显示
end if; 

end process;                                 
end behav;

⌨️ 快捷键说明

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