三层电梯控制系统的设计.docx
- 文档编号:14571312
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:26
- 大小:1.14MB
三层电梯控制系统的设计.docx
《三层电梯控制系统的设计.docx》由会员分享,可在线阅读,更多相关《三层电梯控制系统的设计.docx(26页珍藏版)》请在冰点文库上搜索。
三层电梯控制系统的设计
三层电梯控制系统的实验设计
指导老师:
***
学生:
马小娟
班级:
电科092
学号:
*********
三层电梯控制系统的设计
第一节设计要求
要求用FPGA设计实现一个3层电梯的控制系统。
系统的要求如下:
(1)电梯运行规则:
当电梯处在上升模式时,只响应比电梯所在位置高的上楼请求,由下向上逐个执行,直到最后一个上楼请求执行完毕。
如果高层有下楼请求,直接升到有下楼请求的最高楼层,然后进入下降模式。
电梯处在下降模式时,工作方式与上升模式相反。
设电梯共有3层,每秒上升或下降一层。
(2)电梯初始状态为一层,处在开门状态,开门指示灯亮。
(3)每层电梯入口处均设有上下请求开关,电梯内部设有乘客到达楼层的停站请求开关及其显示。
(4)设置电梯所处位置的指示及电梯上升或下降的指示。
(5)电梯到达有停站请求的楼层后,电梯门打开,开门指示灯亮。
开门4妙后,电梯门关闭,开门指示灯灭,电梯继续运行,直至执行完最后一个请求信号后停在当前层。
(6)电梯控制系统能记忆电梯内外的请求信号,并按照电梯运行规则工作,每个请求信号执行完毕后清除。
第二节三层电梯控制系统的功能模块及流程图
电梯控制器的功能模块如图2.1所示,包括主控制器、分控制器、楼层选择器、状态显示器、译码器和楼层显示器。
乘客在电梯中选择所要到达的楼层,通过主控制器的处理,电梯开始运行,状态显示器显示电梯的运行状态,电梯所在楼层数通过译码器译码从而在楼层显示器中显示。
分控制器把有效的请求传给主控制器进行处理,同时显示电梯的运行状态和电梯所在楼层数。
由于分控制器相对简单很多,所以主控制器是核心部分。
图2.1电梯控制器原理图
第三节三层电梯控制器的具体设计
本设计尝试用硬件描述语言VHDL来实现对三层电梯的控制,源程序经A1tera公司的MAX+plusII软件仿真,保证了设计的正确性。
使用VHDL进行电梯控制器的设计,主要就是对电梯软件部分的设计,使用VHDL中的逻辑关系建立电梯的升降模式,开门,关门达到动作,而外部器件的硬件设备基本上保持不变。
使用VHDL硬件描述语言设计电梯控制器可以为电梯实现智能控制奠定基础。
一三层电梯控制器实现的功能及运行规则
电梯一层入口处设有上升请求开关,二层入口处设有上、下请求开关,三层入口处设有下降请求开关,电梯内部设有顾客到达楼层的停站请求开关。
每层电梯入口处设有位置指示装置及电梯运行模式(上升或下降)指示装置。
电梯初始状态为一层开门状态。
电梯每秒上升(下降)一层楼。
电梯到达需要停止的楼层,经过1秒电梯门打开,开门指示灯亮,开门4秒后,电梯门关闭(开门指示灯灭),电梯继续运行,直至执行完最后一个请求信号后停留在当前层。
电梯需要寄存器来记忆电梯内外所有请求,并按照电梯运行规则按顺序响应,每个请求信号保留至执行后消除。
电梯的运行规则:
当电梯处于上升模式时,只响应比电梯所在位置高的上楼请求信号和停站请求信号,由下而上逐个执行,直到最后一个上楼请求执行完毕;如果高层有下楼请求,则直接上升到有下楼请求的最高层,然后进入下降模式。
当电梯处于下降模式时则与上升模式相反。
二三层电梯控制器的综合设计
1三层电梯控制器的设计思路
电梯控制器设计两个进程相互配合,状态机进程作为主要进程,信号灯控制进程作为辅助进程。
根据电梯的实际工作情况,可以为状态机设置十个状态,它们分别是“电梯停在一层”“开门”“关门”“开门等待第一秒”“开门等待第二秒”“开门等待第三秒”“开门等待第四秒”“上升”“下降”和“停止”。
由于电梯每秒上升或下降一层,则可以用周期为1s的信号来作为电梯状态转换的触发时钟。
状态机进程中的很多判断条件是以信号灯控制进程产生的信号灯信号为依据,而信号灯控制进程中信号灯的熄灭又是由状态机进程中传出的信号来控制。
三层电梯控制器的设计主要是对实体和结构体的设计,它的VHDL描述模块流程如图3.1所示:
2实体设计
实体设计即是对端口名、端口模式及数据类型的说明。
首先考虑输入端口,一个异步复位端口“reset”,用于当电梯出现非正常情况时回到初始状态;在电梯外部,一层入口处设有上升请求端,二层入口处设有上升和下降请求端,三层入口处设有下降请求端;在电梯内部,应设有各层停站请求端口;一个电梯时钟输入端口,它提供周期为1s的时钟信号,用作电梯状态转换的触发时钟;还有一个频率很高的按键时钟输入端口。
其次考虑输出端口,当有各层上升或下降请求时,各层入口处应该有端口显示请求是否被响应,有请求时端口输出逻辑‘1’,被执行后则恢复成逻辑‘0’;同样的,电梯内部也应有各层停站请求是否被响应的指示端口;一个开关门指示端口,当门开着时,它为逻辑‘1’,门关着时,则为逻辑‘0’;还需要端口来显示电梯所处的位置和模式(上升或下降)。
3结构体设计
在结构体中,首先说明了状态机设置的十个状态,分别是:
电梯停在1层(stopon1)、开门(dooropen)、关门(doorclose)、开门等待第1秒(doorwait1)、开门等待第2秒(doorwait2)、开门等待第3秒(doorwait3)、开门等待第4秒(doorwait4)、上升(up)、下降(down)和停止(stop)。
在结构体最前端用如下的定义语句,来定义状态机。
typelift_stateis
(stopon1,dooropen,doorclose,doorwait1,doorwait2,doorwait3,doorwait4,up,down,stop);
接着描述电梯内部功能实现,在结构体中设计了两个进程,一个状态机进程(ctrlift),它是以reset和liftclk作为敏感信号,控制电梯的状态转移;另外一个是信号灯控制进程(ctrlight),它是以reset和buttonclk作为敏感信号,控制寄存信号的逻辑值。
在状态机进程中,电梯关门后根据信号灯的情况,来决定下一个状态是上升、下降还是停止;在信号灯控制进程中,由于使用了专门的频率较高的按键时钟,所以使得按键的灵敏度大,但是时钟频率不能过高,否则容易使按键过于灵敏,而信号灯的熄灭是由状态机进程中传出clearup和cleardn信号来控制。
4VHDL源代码语法的简单说明
本程序设计调用了ieee库,ieee库是VHDL设计中最为常用的库,它包含有ieee标准的程序包和其他一些支持工业标准的程序包。
本设计采用std-logic-1164、std-logic-unsigned、std-logic-arith程序包。
以关键词entity引导,endentitythreelift结尾的部分是程序的实体部分。
VHDL的实体描述了电路器件的外部情况,本设计定义了关于三层电梯控制器用到的各类时钟、异步复位按键、信号灯指示端口、电梯的请求端口。
它描述了端口模式主要有in、buffer、out,以及各端口信号的数据类型主要有std-logic、std-logic-vector、integer。
(3)以关键词architecture引导,endarchitectureone结尾的语句部分是结构体部分,结构体描述电路器件的内部逻辑功能。
5VHDL源代码
根据主模块中3个进程的工作原理和状态机设计流程编写的主模块VHDL程序如下:
libraryieee;--库的说明
useieee.std_logic_1164.all;--程序包的说明
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitythreeliftis--实体
port(buttonclk:
instd_logic;--按键时钟信号
liftclk:
instd_logic;--电梯时钟信号
reset:
instd_logic;--异步复位端口
f1upbutton:
instd_logic;--一层上升请求端口
f2upbutton:
instd_logic;--二层上升请求端口
f2dnbutton:
instd_logic;--二层下降请求端口
f3dnbutton:
instd_logic;--三层下降请求端口
stop1button:
instd_logic;--一层停站请求端口
stop2button:
instd_logic;--二层停站请求端口
stop3button:
instd_logic;--三层停站请求端口
position:
bufferintegerrange1to3;--电梯位置信号
udsig:
bufferstd_logic;--电梯模式(上升或下降)信号
fuplight,fdnlight,stoplight:
bufferstd_logic_vector(3downto1);
--上升、下降、停站请求寄存信号
doorlight:
outstd_logic;--开关门信号
dout1:
outstd_logic_vector(3downto0));
endentitythreelift;
architectureoneofthreeliftis--结构体
typelift_stateis--定义十个状态
(stopon1,dooropen,doorclose,doorwait1,doorwait2,doorwait3,doorwait4,up,down,stop);
signalmylift:
lift_state;
signalclearup:
std_logic;--上升和停站请求清除信号
signalcleardn:
std_logic;--下降和停站请求清除信号
begin
ctrlift:
process(reset,liftclk)--状态机进程
variablepos:
integerrange3downto1;
begin
ifreset='1'then--异步复位,电梯的初始状态为一层开门状态
mylift<=stopon1;
clearup<='0';
cleardn<='0';
else
ifliftclk'eventandliftclk='1'then
casemyliftis
whenstopon1=>
doorlight<='1';
position<=1;
pos:
=1;
mylift<=doorwait1;--电梯等待4s
whendoorwait1=>
mylift<=doorwait2;
whendoorwait2=>
clearup<='0';
cleardn<='0';
mylift<=doorwait3;
whendoorwait3=>
mylift<=doorwait4;
whendoorwait4=>
mylift<=doorclose;
whendoorclose=>--关门,判定电梯下一个运行方式
doorlight<='0';
ifudsig='1'then--电梯处在上升模式
ifposition=3then
iffuplight="000"andfdnlight="000"andstoplight="000"then--没有请求信号时,电梯停在当前层
udsig<='0';
mylift<=doorclose;
elsiffdnlight(3)='1'orstoplight(3)='1'then
--本层有请求信号是,电梯开门
udsig<='0';
mylift<=dooropen;
else--否则下降
udsig<='0';
mylift<=down;
endif;
elsifposition=2then
iffuplight="000"andfdnlight="000"andstoplight="000"then
udsig<='1';
mylift<=doorclose;
elsiffuplight
(2)='1'orstoplight
(2)='1'then
--本层有上升或停站请求时时,电梯开门
udsig<='1';
mylift<=dooropen;
elsiffuplight="000"andstoplight="000"andfdnlight="010"then--只有二层有下降请求时,电梯开门
udsig<='0';
mylift<=dooropen;
elsifstoplight(3)='1'orfdnlight(3)='1'then
--三层有停站请求或下降请求,则上升
udsig<='1';
mylift<=up;
else
udsig<='0';
mylift<=down;
endif;
elsifposition=1then
iffuplight="000"andfdnlight="000"andstoplight="000"then
udsig<='1';
mylift<=doorclose;
elsifstoplight
(1)='1'orfuplight
(1)='1'then
udsig<='1';
mylift<=dooropen;
else
udsig<='1';
mylift<=up;
endif;
endif;
elsifudsig='0'then--电梯处在下降模式
ifposition=3then
iffuplight="000"andfdnlight="000"andstoplight="000"then
udsig<='0';
mylift<=doorclose;
elsiffdnlight(3)='1'orstoplight(3)='1'then
udsig<='0';
mylift<=dooropen;
else
udsig<='0';
mylift<=down;
endif;
elsifposition=2then
iffuplight="000"andfdnlight="000"andstoplight="000"then
udsig<='0';
mylift<=doorclose;
elsiffdnlight
(2)='1'orstoplight
(2)='1'then
udsig<='0';
mylift<=dooropen;
elsiffdnlight="000"andstoplight="000"andfuplight="010"then
udsig<='1';
mylift<=dooropen;
elsiffuplight
(1)='1'orstoplight
(1)='1'then
--一层有停站请求或上升请求,则下降
udsig<='0';
mylift<=down;
else
udsig<='1';
mylift<=up;
endif;
elsifposition=1then
iffuplight="000"andfdnlight="000"andstoplight="000"then
udsig<='1';
mylift<=doorclose;
elsifstoplight
(1)='1'orfuplight
(1)='1'then
udsig<='1';
mylift<=dooropen;
else
udsig<='1';
mylift<=up;
endif;
endif;
endif;
whenup=>--电梯处于上升状态
position<=position+1;--电梯楼层数加一
pos:
=pos+1;
ifpos<3and(stoplight(pos)='1'orfuplight(pos)='1')then
mylift<=stop;
--电梯在一层或二层,本层有停站或上升请求时,则停止
elsifpos=3and(stoplight(pos)='1'orfdnlight(pos)='1')then
mylift<=stop;
--电梯处在三层,并且有三层停站或下降请求,则停止
else
mylift<=doorclose;
endif;
whendown=>--电梯处在下降状态
position<=position-1;--电梯楼层数减一
pos:
=pos-1;
ifpos>1and(stoplight(pos)='1'andfdnlight(pos)='1')then
mylift<=stop;
elsifpos=1and(stoplight(pos)='1'orfuplight(pos)='1')then
mylift<=stop;
else
mylift<=doorclose;
endif;
whenstop=>
mylift<=dooropen;
whendooropen=>
doorlight<='1';
ifudsig='1'then
ifposition<3and(fuplight(pos)='1'orstoplight(pos)='1')then
clearup<='1';--清除当前层上升和停站请求
else
clearup<='1';
cleardn<='1';
endif;
elsifudsig='0'then
ifposition>1and(fdnlight(pos)='1'orstoplight(pos)='1')then
cleardn<='1';--清除当前层下降和停站请求
else
clearup<='1';
cleardn<='1';
endif;
endif;
mylift<=doorwait1;
endcase;
endif;
endif;
endprocessctrlift;
ctrlight:
process(reset,buttonclk)--信号灯控制进程
begin
ifreset='1'then--复位,寄存信号清零
fuplight<="000";
fdnlight<="000";
stoplight<="000";
else
ifbuttonclk'eventandbuttonclk='1'then
ifclearup='1'then--上升和停站请求清零
fuplight(position)<='0';
stoplight(position)<='0';
else
iff1upbutton='1'then--记忆各层上升请求
fuplight
(1)<='1';
elsiff2upbutton='1'then
fuplight
(2)<='1';
endif;
endif;
ifcleardn='1'then--下降和停站请求清零
fdnlight(position)<='0';
stoplight(position)<='0';
else
iff2dnbutton='1'then--记忆各层下降请求
fdnlight
(2)<='1';
elsiff3dnbutton='1'then
fdnlight(3)<='1';
endif;
endif;
ifstop1button='1'then--记忆各层停站请求
stoplight
(1)<='1';
elsifstop2button='1'then
stoplight
(2)<='1';
elsifstop3button='1'then
stoplight(3)<='1';
endif;
endif;
endif;
endprocessctrlight;
process(position)--楼层显示进程
begin
ifposition=1then
dout1<="0001";
elsifposition=2then
dout1<="0010";
elsifposition=3then
dout1<="0011";
endif;
endprocess;
endarchitectureone;
小结
本设计运用有限状态机的方法,在结构体最前端首先定义了十个状态;然后在结构体中设计了两个进程,状态机进程作为主要进程,信号灯控制进程作辅助进程。
在状态机进程中,电梯关门后根据信号灯的情况,来决定下一个状态是上升、下降还是停止;在信号灯控制进程中,而信号灯的熄灭是由状态机进程中传出clearup和cleardn信号来控制。
第四节三层电梯控制器的调试及仿真
一、程序的调试
在程序编写完成并保存于工程文件夹后,可以把它置顶进行编译,看是否出现错误。
在第一次编译时出现了问题,其中由于没有注意到文件名必须与实体名相同,并且后缀是.vhd,还有粗心所造成的端口名书写错误,以及有的if语句结束时忘了写endif。
在波形仿真中,发现一个错误,在状态进程中,在当前状态为doorclose,讨论次态的过程中,忽略了对本层请求的考虑,即当电梯停在某层时,当前层入口处有上升或下降请求时,无法响应。
经过思考,添加了本层请求响应语句,最终实现了三层电梯控制器的功能。
在编程下载过程中,目标芯片的选错,导致引脚锁定的错误及硬件添加设备为NOHardware。
在硬件验证设计电路过程中,对于源程序的理解不够,造成验证困难,经反复调试与引脚整理改变,能正确验证设计电路,三层电梯控制设计得以实现。
本次实验设计中,原定题目为四层电梯设计,但因VHDL源程序始终有一error无法改正,此行语句“signalstate:
lift_state;”。
二、波形仿真
在波形仿真中,根据实际,我们有必要做一些假设,即是:
外部请求上升的乘客,进入电梯后一定是按更高层的停站按钮;
外部请求下降的乘客,进入电梯后一定是按更低层的停站按钮;
如果有乘客进入电梯,则一定有停站请求;
同一时刻有很多人按键的概率很小,所以我们认为请求信号都有一定的先后顺序。
设定仿真时间长度为60s,liftclk信号为周期1s的时钟信号,buttonclk信号为周期0.1s的时钟信号。
doorlight信号逻辑‘1’表示开门,逻辑‘0’表示关门。
udsig信号为逻辑‘1’表示电梯处在上升模式,逻辑‘0’表示处在下降模式。
fuplight,fdnlight,stoplight是三位二进制向量,波形图中的1代表“001”,表示一层有请求,2代表“010”,表示二层有请求,4代表“10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 三层 电梯 控制系统 设计