大连理工大学本科实验报告题目:三层电梯控制器课程名称:数字电路与系统设计学院(系):电子信息与电气工程学部专业:班级:学生姓名:学号:完成日期:2012-7-5成绩:2012 年7 月05 日题目:三层电梯控制器1 设计要求随着科技的发展,电梯的使用越来越普遍,在商业大厦、宾馆酒店、办公场所、居民住宅中广泛使用。
并且随着生活水平的提高,人们对电梯功能的要求也不断提高,相应地其控制方式也在不停地方生变化。
对于电梯的控制,传统的方法是使用继电器——接触器控制系统进行控制技术的不断发展,微型计算机在电梯控制上的应用日益广泛,现在已进入全微机化控制的时代。
电梯的微机化控制主要由以下几种形式:1.PLC控制;2.单板机控制;3.单片机控制;4.单微机控制;5.多微机控制;6.人工智能控制。
目前FPGA已广泛应用与电子设计与控制的各个方面。
本设计就是使用一片FPGA来实现对三层电梯的控制。
电梯控制器是控制电梯按顾客的要求自动上下的装置。
三层电梯控制器的功能如下:(1)每层电梯入口处设有上下请求开关,电梯内设有乘客到达层次的停站请求开关。
(2)设有电梯所处位置指示装置及电梯运行模式(上升或下降)指示装置。
(3)电梯每秒升(降)一层楼。
(4)电梯到达有停站请求的楼层后,经过1秒电梯门打开,开门指示灯亮,开门4秒后,电梯门关闭(开门指示灯灭),电梯继续运行,直至执行完最后一个请求信号后停在当前层。
(5)能记忆电梯内外的所有请求信号,并按照电梯运行规则按顺序响应,每个请求信号保留至执行后消除。
(6)电梯运行规则:当电梯处于上升模式时,只响应比电梯所在位置高的上楼请求信号,由下而上逐个执行,直到最后一个上楼请求执行完毕;如更高层有下楼请求,则直接升到有下楼请求的最高层接客,然后便进入下降模式。
当电梯处于下降模式时与上升模式相反。
(7)电梯初始状态为一层开门。
(8)当收到报警信号时,电梯停止工作,电梯维持当前状态不动。
报警信号解除时,电梯继续工作。
(9)电梯到达指定楼层时有声音提示。
2 设计分析及系统方案设计电梯控制器的设计方法有很多,本文采用状态机来描述,其优点是思路清晰。
可以将电梯等待的每秒钟以及开门、关门都看成一个独立的状态。
由于电梯又是每秒上升或下降一层,所以就可以通过一个以秒为周期的时钟来触发状态机。
根据电梯的实际工作情况可以把状态机设置为10个状态,分别是“电梯停留在一层”、“开门”、“关门”、“开门等待第1秒”、“开门等待第2秒”、“开门等待第3秒”、“开门等待第4秒”、“上升”、“下降”和“停止”状态。
各个状态之间的转换条件可由设计要求所决定。
控制器的功能模块如图1所示,包括主控制器、分控制器、楼层选择器、状态显示器、译码器和楼层显示器。
乘客在电梯中选择所要到达的楼层,通过主控制器的处理,电梯开始运行,状态显示器显示电梯的运行状态,电梯所在楼层数通过译码器译码从而在楼层显示器中显示。
分控制器把有效的请求传给主控制器进行处理,同时显示电梯的运行状态和电梯所在楼层数。
由于分控制器相对简单很多,所以主控制器是核心部分。
三层电梯控制器的实体设计首先考虑输入端口,一个异步复位端口reset,用于在系统不正常时回到初始状态;在电梯外部,必须有升降请求端口,一层是最低层,不需要有下降请求,三层是最高层,不需要有上升请求,二层则上升、下降请求端口都有;在电梯的内部,应该设有各层停留的请求端口:一个电梯时钟输入端口,该输入时钟以1秒为周期,用于驱动电梯的升降及开门关门等动作;另有一个按键时钟输入端口,时钟频率比电梯时钟高。
其次是输出端口,有升降请求信号以后,就得有一个输出端口来指示请求是否被响应,有请求信号以后,该输出端口输出逻辑‘1’。
被响应以后则恢复逻辑‘O’;同样,在电梯内部也应该有这样的输出端口来显示各层停留是否被响应;在电梯外部,需要一个端口来指示电梯现在所处的位置;电梯开门关门的状态也能用一个输出端口来指示;为了观察电梯的运行是否正确,可以设置一个输出端口来指示电梯的升降状态。
三层电梯控制器的结构体设计首先说明一下状态。
状态机设置了lO个状态,分别是电梯停留在l层(stopon1)、开门(dooropen)、关门(doorclose)、开门等待第1秒(waitl)、开门等待第2秒(wait2)、开门等待第3秒(wait3)、开门等待第4秒(wait4)、上升(up)、下降(down)和停止(stop)。
在实体说明定义完端口之后,在结构体architecture和begin之间需要有如下的定义语句,来定义状态机。
type state_type is(stopon1,dooropen,doorclose,waitl,wait2,wait3,wait4,up,down,stop);signal state_type:state;在结构体中,设计了俩个进程互相配合,一个是状态机进程作为主要进程,另外一个是信号灯控制进程作为辅助进程。
状态机进程中的很多判断条件是以信号灯进程产生的信号灯信号为依据的,而信号灯进程中信号灯的熄灭又是由状态机进程中传出的clearup和cleardn信号来控制。
在状态机进程中,在电梯的上升状态中,通过对信号灯的判断,决定下一个状态是继续上升还是停止;在电梯下降状态中,也是通过对信号灯的判断,决定下一个状态是继续下降还是停止;在电梯停止状态中,判断是最复杂的,通过对信号的判断,决定电梯是上升、下降还是停止。
在信号灯控制进程中,由于使用了专门的频率较高的按键时钟,所以使得按键的灵敏度增大,但是时钟频率不能过高,否则容易使按键过于灵敏。
按键后产生的点亮的信号灯(逻辑值为‘1’)用于作为状态机进程中的判断条件,而clearup和cleardn信号为逻辑‘1’使得相应的信号灯熄灭。
3系统以及模块硬件电路设计系统电路如图2所示。
4 系统的VHDL设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity flift isport(clk: in std_logic; --系统时钟reset: in std_logic; --异步复位按键caution: in std_logic; --报警按键up1: in std_logic; --第一层上升请求按钮up2: in std_logic; --第二层上升请求按钮down2: in std_logic; --第二层下降请求按钮down3: in std_logic; --第三层下降请求按钮stop1,stop2,stop3: in std_logic;--电梯内部请求按钮uplight: buffer std_logic_vector(3 downto 1); --电梯外部上升请求指示灯downlight: buffer std_logic_vector(3 downto 1); --电梯外部下降请求指示灯stoplight: buffer std_logic_vector(3 downto 1);--电梯内部各层请求指示灯position:buffer integer range 1 to 3; --电梯位置指示location:out std_logic_vector(6 downto 0); --电梯位置数码管显示udsig:buffer std_logic; --电梯升降指示doorlight:buffer std_logic; --电梯门开关指示灯dlight1,dlight2,dlight3:out std_logic_vector(6 downto 0);--电梯门开关数码管显示udlight1,udlight2:out std_logic_vector(6 downto 0)); --电梯升降数码管指示end flift;architecture behav of flift istype state_type is(stopon1,dooropen,doorclose,waitl,wait1,wait2,wait3,wait4,up,down,stop);signal state:state_type:=stopon1;signal clearup:std_logic; --用于清除上升请求指示灯信号signal cleardn:std_logic; --用于清除下降请求指示灯信号signal buttonclk,fliclk:std_logic; --按键时钟与电梯时钟signal count: integer range 0 to 49999999;--计数器signal clk1: std_logic; --计数器时钟beginprocess(clk) --1秒时钟进程beginif reset='1' thencount<=0;clk1<='0';elsif rising_edge(clk) thenif count=49999999 thencount<=0;clk1<='1';else count<=count+1;clk1<='0';end if;end if;buttonclk<=clk;fliclk<=clk1;end process;process(reset,fliclk) --控制电梯状态进程variable pos:integer range 3 downto 1;beginif reset='1' thenstate<=stopon1;clearup<='0';cleardn<='0';elsif rising_edge (fliclk)and caution/='1' thencase state is --状态转移when stopon1=>doorlight<='1';position<=1;pos:=1;state<=wait1;when waitl=>state<=wait2;when wait2=>clearup<='0';cleardn<='0';state<=wait3;when wait3=>state<=wait4;when wait4=>state<=doorclose;when doorclose=>doorlight<='0';if udsig='0' and caution/='1' then --上升情况if position=3 then --电梯在三楼if stoplight="000"and uplight="000"and downlight="000" thenudsig<='1';state<=doorclose;elsif stoplight="100" or uplight="100" or downlight="100" thenudsig<='1';state<=dooropen;elseudsig<='1';state<=down;end if;elsif position=2 then --电梯在二楼if stoplight="000"and uplight="000"and downlight="000" thenudsig<='0';state<=doorclose;elsif state=doorclose and stoplight="010" thenstate<=dooropen;elsif state=doorclose and uplight="010" thenudsig<='0';state<=dooropen;elsif state=doorclose and downlight="010" thenudsig<='1';state<=dooropen;elsif stoplight(3)='1' or downlight(3)='1' thenudsig<='0';state<=up;elseudsig<='1';state<=down;end if;elsif position=1 then --电梯在一楼if stoplight="000"and uplight="000"and downlight="000" then udsig<='0';state<=doorclose;elsif stoplight="001" or uplight="001" or downlight="001" then udsig<='0';state<=dooropen;elseudsig<='0';state<=up;end if;end if;end if;if udsig='1' and caution/='1' then --下降情况if position=1 then --电梯在一楼if stoplight="000"and uplight="000"and downlight="000" then udsig<='0';state<=doorclose;elsif stoplight="001" or uplight="001" or downlight="001" then udsig<='0';state<=dooropen;elseudsig<='0';state<=up;end if;elsif position=2 then --电梯在二楼if stoplight="000"and uplight="000"and downlight="000" then udsig<='1';state<=doorclose;elsif state=doorclose and stoplight="010" thenstate<=dooropen;elsif state=doorclose and uplight="010" thenudsig<='0';state<=dooropen;elsif state=doorclose and downlight="010" thenudsig<='1';state<=dooropen;elsif stoplight(1)='1'or uplight(1)='1' thenudsig<='1';state<=down;elseudsig<='0';state<=up;end if;elsif position=3 then --电梯在三楼if stoplight="000"and uplight="000"and downlight="000" then udsig<='1';state<=doorclose;elsif stoplight="100" or uplight="100" or downlight="100" then udsig<='1';state<=dooropen;elseudsig<='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') then state<=up;elsestate<=stop;end if;when down=>position<=position-1;pos:=pos-1;if pos=2 and(stoplight(1)='1'or uplight(1)='1') then state<=down;elsestate<=stop;end if;when stop=>state<=dooropen;when dooropen=>doorlight<='1';clearup<='1';cleardn<='1';state<=waitl;when others=>state<=doorclose;end case;end if;end process;process(clk) --控制按键指示灯进程beginif reset='1' thenstoplight<="000";uplight<="000";downlight<="000";elsif rising_edge(buttonclk) and caution/='1' thenif clearup='1' thenstoplight(position)<='0';uplight(position)<='0';elseif up1='1'then uplight(1)<='1';end if;if up2='1'then uplight(2)<='1';end if;end if;if cleardn='1' thenstoplight(position)<='0';downlight(position)<='0';elseif down2='1'then downlight(2)<='1';end if;if down3='1'then downlight(3)<='1';end if;end if;if stop1='1' then stoplight(1)<='1';end if;if stop2='1' then stoplight(2)<='1';end if;if stop3='1' then stoplight(3)<='1';end if;end if;end process;process(position) --楼层数码管显示进程begincase position iswhen 1=>location<="1111001";when 2=>location<="0100100";when 3=>location<="0110000";end case;end process;process(doorlight) --电梯门数码管显示进程begincase doorlight iswhen '1'=>dlight1<="1001000";dlight2<="1000000";dlight3<="1111111";when '0'=>dlight1<="0001110";dlight2<="0001110";dlight3<="1000000";end case;end process;process(udsig) --电梯升降显示进程begincase udsig iswhen '0'=>udlight1<="0001100";udlight2<="1000001";when '1'=>udlight1<="0101011";udlight2<="0100001";end case;end process;end behav;5 结论以及结果说明调试环境:软件:Altera’s Quartus II硬件:Altera DE2 Board参数:clk为50MHz信号。