三层电梯控制电路(word文档良心出品)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

三层电梯控制电路设计
一. 设计要求
1. 每层电梯入口处设有上下请求开关,电梯内设有顾客到达层次的停站请求开关。

2. 设有电梯入口处位置指示装置及电梯运行模式(上升或下降)指示装置。

3. 电梯每秒升(降)一层楼。

4. 电梯到达有停站请求的楼层,经过1秒电梯门打开,开门指示灯亮,开门4秒后,电梯门关闭(开门指示灯灭),电梯继续进行,直至执行完最后一个请求信号后停留在当前层。

5. 能记忆电梯内外所有请求,并按照电梯运行规则按顺序响应,每个请求信号保留至执行后消除。

6. 电梯运行规则一当电梯处于上升模式时,只响应比电梯所在位置高的上楼请求信号,由下而上逐个执行,直到最后一个上楼请求执行完毕;如果高层有下楼请求,则相反。

7. 电梯初始状态为一层开门状态。

二. 设计目的
电梯控制器是控制电梯按顾客要求自动上下的装置。

本文采用VHDL语言来设计实用三层电梯控制器,其代码具有良好的可读性和易理解性, 通过对三层电梯控制器的设计,可以发现本设计有一定的扩展性,而且可以作为更多层电梯控制器实现的基础。

三. 控制器的设计方案.
控制器的功能模块如图1所示,包括主控制器、分控制器、楼层选择器、状态显示器、译码器和楼层显示器。

乘客在电梯中选择所要到达的楼层,通过主控制器的处理,电梯开始运行,状态显示器显示电梯的运行状态,电梯所在楼层数通过译码器译码从而在楼层显示器中显示。

分控制器把有效的请求传给主控制器进行处理,同时显示电梯的运行状态和电梯所在楼层数。

由于分控制器相对简单很多,所以主控制器是核心部分。

图1. 电梯控制器原理图
四. 三层电梯控制器的结构体设计
首先说明一下状态。

状态机设置了lO个状态,分别是电梯停留在l层(stoponl)、开门(dooropen)、关门(doorclose)、开门等待第1秒(doorwaitl)、开门等
待第2秒(doorwait2)、开门等待第3秒(doorwait3)、开门等待第4秒(doorwait4)、
上升(up)、下降(down)和停止(stop)。

在实体说明定义完端口之后,在结构体architecture和begin之间需要有如下的定义语句,来定义状态机。

在结构体中,设计了俩个进程互相配合,一个是状态机进程作为主要进程,
另外一个是信号灯控制进程作为辅助进程。

状态机进程中的很多判断条件是以信
号灯进程产生的信号灯信号为依据的,而信号灯进程中信号灯的熄灭又是由状态
机进程中传出的clearup和cleardn信号来控制。

在状态机进程中,在电梯的上升状态中,通过对信号灯的判断,决定下一个
状态是继续上升还是停止;在电梯下降状态中,也是通过对信号灯的判断,决定
下一个状态是继续下降还是停止;在电梯停止状态中,判断是最复杂的,通过对
信号的判断,决定电梯是上升、下降还是停止。

本设计需要完成的任务是编写VHDL代码来模拟现实中的三层电梯工作。


点阵上显示电梯所在的楼层,当其它楼层有上或下的请求信号时,表示该楼层上
或下的绿色或黄色指示灯亮,电梯开始上或下运行,当到达该楼层时,表示该楼
层上或下的绿色或黄色指示灯灭,表示到达该楼层的红色指示灯亮,点阵显示楼
层数,红色指示灯灭。

五. vhdl源程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--------------------------------------------------------------------
entity elevator is
port( clk : in std_logic; --Clock Signal
k1,k2u,k2d,k3 : in std_logic; --Push button
d1,d2u,d2d,d3 : out std_logic; --Led of
every floor
door1,door2,door3 : buffer std_logic; --door
led
r0,r1,r2,r3,r4,r5,r6,r7 : out std_logic; --7 segment driver
sa,sb,sc : out std_logic); --Display Select
end elevator;
-------------------------------------------------------------------- architecture behave of elevator is
signal state1,state3 : std_logic;
signal state2u,state2d : std_logic;
signal doorflag : std_logic;
signal udflag,runflag : std_logic; --up and down flag,run flag signal dcount : std_logic_vector(2 downto 0); --display counter
signal display : std_logic_vector(7 downto 0);
signal location : std_logic_vector(1 downto 0);
signal wcount : std_logic_vector(10 downto 0); --wait counter
signal doorcount : std_logic_vector(9 downto 0); --door counter
signal col1,col2,col3,col4,col5,col6 : std_logic_vector(7 downto 0);
begin
process(clk) -- judge the key is or is not been pushed
begin
if(clk'event and clk='1') then
if(k1='0' and door1='0') then
state1<='1';
d1<='1';
elsif(location=0 and wcount=0) then
d1<='0';
if(doorcount=1020) then
state1<='0';
end if;
end if;
if(k2u='0' and door2='0') then
state2u<='1';
d2u<='1';
elsif(location=1 and udflag='1' and wcount=0) then
d2u<='0';
if(doorcount=1020) then
state2u<='0';
end if;
end if;
if(k2d='0' and door2='0') then
state2d<='1';
d2d<='1';
elsif(location=1 and udflag='0' and wcount=0) then
d2d<='0';
if(doorcount=1020) then
state2d<='0';
end if;
end if;
if(k3='0' and door3='0') then
state3<='1';
d3<='1';
elsif(location=2 and wcount=0) then d3<='0';
if(doorcount=1020) then
state3<='0';
end if;
end if;
end if;
end process;
process(clk)
begin
if(clk'event and clk='1') then
if(location=0) then --display 1 col1<="00000001";
col2<="00100001";
col3<="01111111";
col4<="11111111";
col5<="00000001";
col6<="00000001";
elsif(location=1) then --display 2 col1<="01100011";
col2<="11100111";
col3<="10001101";
col4<="10011001";
col5<="11110011";
col6<="01100111";
elsif(location=2) then --display 3 col1<="01000010";
col2<="11011011";
col3<="10011001";
col4<="10011001";
col5<="11111111";
col6<="01100110";
end if;
end if;
end process;
process(clk) --accumulate dcount
begin
if(clk'event and clk='1') then
dcount<=dcount+1;
end if;
end process;
process(clk)
begin
if(clk'event and clk='1') then
sa<=dcount(0);
sb<=dcount(1);
sc<=dcount(2);
case dcount is
when "111"=>display<="00000000";
……
when others=>display<="00000000";
end case;
end if;
end process;
process(clk) --In this process, a,b,c,d,e,f,g and dot will output begin
if(clk'event and clk='1') then
r0<=display(7);
……
r7<=display(0);
end if;
end process;
end behave;
注释:
1.本程序设计调用了IEEE库,IEEE库是VHDL设计中最为常用的库,它包含有IEEE标准的程序包和其他一些支持工业标准的程序包。

本设计采用了STD_LOGIC_1164、STD_LOGIC_ARITH、STD_LOGIC_UNSIGNED程序包。

图2. 三层电梯控制器的vhdl描述
2.以关键词ENTITY引导,END ENTITY threeflift结尾的语句部分,称为实体。

VHDL的实体描述了电路器件的外部情况及各信号端口的基本性质。

本设计定义了关于三层电梯控制器用到的各类时钟、异步复位按键、信号灯指示、电梯的请求。

端口模式主要就是IN、BUFFER、OUT端口。

及定义了各端口信号的数据类型,主要是STD_LOGIC(标准逻辑位数据类型)、INTEGER(整数类型)、STD_LOGIC_VECTOR(标准逻辑矢量数据类型)。

这些都满足上面调用的IEEE 库中的程序包。

3.以关键词ARCHITECTURE引导,END ARCHITECTUREa结尾的语句部分,称为结构体。

结构体负责描述电路器件的内部逻辑功能或电路结构。

本设计定义了lO个状态。

描述了在三层电梯中出现的各种可能的情况作为控制电梯的主要进程。

信号灯控制作为辅助进程。

六. 三层电梯控制器模块原理图
图3. 三层电梯控制器模块原理图
七. 三层电梯控制器的仿真模块
1. 下图所示仿真的是在第二层电梯外部有上升请求,也就是f2upbuttton信号的一个脉冲,可以看到电梯从一层上升到二层,position信号由1变到2,doorlight信号‘1’表示开门,‘0’表示关门。

当乘客进入电梯以后,在电梯内部要求上升到第三层,也就是stop3button产生一个脉冲,电梯上升到第3层,开门4秒以后关门,停留在第三层,position最后的值为3。

在仿真图中看不到buttonclk,只显示为一条黑色的线,是因为采用了频率较大的时钟。

再看fuplight信号灯,当二层有上升请求的时候,它的值由0变到2。

(注意fuplight和fdnlight是3位的二进制向量,这里的2代表“010”,表示二层有请求;“100”也就是4,表示三层有请求)。

当电梯停留到第二层以后,表明该请求被响应,所以它的值变为0,由于没有下降请求信号,所以fdnlight信号灯的值一盲都为O。

图4. 有上升请求的仿真波形.
2. 是有下降请求的情况,它是图4的继续,当电梯停留在第三层的时候,在电梯外第二层有下降请求,这时候fdnlight信号灯由0变为2,说明第二层有下降请求。

电梯下降到第二层,响应了下降请求,所以fdnlight信号灯清0。

这时候,在电梯内部没有停留在哪层的请求,所以电梯就停留在第二层,position 信号的值保持在2。

图5.有下降请求的仿真波形
3. 同时有上升和下降请求信号时,电梯的运行情况如图6所示。

图6仿真的情况是,原先电梯停留在第一层,这时候电梯外第三层有下降请求,电梯上升到第三层,乘客进入电梯以后要求下降到一层,与此同时,在电梯外第二层有上升请求,电梯首先要响应下降请求然后再响应这个上升请求,所以电梯得先下降到一层,然后再上升到第二层来,这是符合常理的。

从仿真的波形看,电梯的位置变化和想象是一致的。

电梯的运行情况完全正确。

最后乘客在电梯内部要求上升到三层,所以电梯最后的停留位置为三层。

图6. 有上升和下降请求信号时的仿真波形
4.图7所示的仿真,原先电梯停留在第一层,电梯外第三层有下降请求,电梯上升到三层,乘客进入电梯以后要求下降到一层,此时,二层有下降请求,接着又有上升请求,电梯首先在二层停留。

然后下降到一层。

随后要响应二层上升请求,上升到二层,乘客进入电梯以后要求上升到三层,所以电梯最后的停留位置在三层。

图7. 复杂情况下请求信号的仿真波形
八. 设计的扩展性
在本设计中,因为考虑了扩展性,所以在信号定义的时候就使用了二进制的向量,而不是整数。

在设计方法上也做了特殊的设计,所以使得扩展性较好。

如果要实现n层电梯的控制,首先在端口的地方就要加入所有的按键,而指示灯只要把向量中的3改成n就可以了。

同时需要在按键控制进程里加入其他按键触发指示灯的语句。

在电梯的升降状态将3改成n,在电梯的开门状态中将2改成n一1,在关门状态,将position=3改成position=n,关键是修改position=2的部
分,如果按照每层罗列,将十分烦琐,所以得寻求各层判断条件的共性,解决方法之一就是,新建一个全局向量one为std—logic—veoter(n downto 3)应改写成0,然后和stoplight与fuplight向量比较,如果有更高层次的请求,那么stoplight或fuplight向量,如果stoplight和fuplight向量都小于one向量,表示没有更高层次的内部上升请求,此时将fdnlight向量和one向量比较,如果大于,则表示高层有下降要求,电梯得上升。

如果没有任何请求信号,则电梯停止,否则电梯下降。

如此就可以大大简化程序,但是要注意的是one向量必须实时更新,以作为判断依据,可以另外写一个进程,用buttonclk来触发。

九.总结
经过这次设计,基本上实现了预期目的,但是也存在一些不足,有待改进,但总体上还是成功的。

它不仅巩固了我们所学习的课本知识,还提高了我们的动手能力。

在这次设计过程中发现了很多问题,同时也发现了自身的不足,感谢老师和同学对我们的帮助,我会努力克服何在正自己的弱点,希望以后做的更好。

相关文档
最新文档