1、1数字系统课程设计设计题目:电梯控制系统设计者:04009235 沙俊04009225 王桂存 04009204 吴影日期:2011 年 9 月 62日目录一、 课题设计要求分析3二、 程序设计思想3三、 电梯流程图5四、 状态转换规则7五、 VHDL 源代码说明9六、 程序调试(仿真波形解释及图形)27七、 课程总结303一课题设计要求分析选择题目:a) 电梯控制系统要求简介:大楼为 3 层,2 部电梯,每部电梯内部都有如下按键:13 楼的按键选择键,开门键,关门键,报警键。每部电梯的每层楼外面都有上楼键和下楼键(1楼只有上楼键,三楼只有下楼键) 。电梯的设计参照日常生活中电梯实际运行规律设
2、计。 两部电梯之间互相联动,即同时按下任何一部电梯的外部向上或向下键之后,两部电梯同时接受此指令,然后由系统判断,与该请求所在楼层最近并且运行方向相同的电梯执行指令,另一部电梯不执行该指令。本课题要求设计一个电梯控制系统,传统的电梯控制系统仅仅要求实现对一栋电梯的控制,而本题要求设计一个实现两栋电梯联动的基于 VHDL 的电梯控制系统。我们设计的电梯控制器是控制电梯按顾客要求自动上下的装置。本文采用 VHDL 语言来设计实现两栋电梯联动的四层电梯控制器,代码具有良好的可读性和以理解性,源程序使用 Quartus 软件仿真,本课题的设计具有一定的扩展性,而且可以作为更多层电梯控制器实现的基础。二
3、程序设计思想电梯控制器设计两个进程相互配合,状态机进程作为主要进程,信号灯控制进程作为辅助进程。根据电梯的实际工作情况,可以为状态机设置八个状态,它们分别是电梯的 “开门”“关门”“开门等待第一秒”“开门等待第二秒”“开门等待第三秒” “上升”“下降”和“停止”。由于电梯每秒上升或下降一层,则可以用周期为 1s 的信号来作为电梯状态转换的触发时钟。状态机进程中的很多判断条件是以信号灯控制进程产生的信号灯信号为依据,而信号灯控制进程中信号灯的熄灭又是由状态机进程中传出的信号来控制。三层电梯控制器的设计主要是对实体和结构体的设计,它的 VHDL 描述模块流程如图所示:1.4元件库的说明定义实体结构
4、体端口状态机进程信号灯控制进程结束按键信号灯1.实体设计:实体设计即是对端口名、端口模式及数据类型的说明。首先考虑输入端口,一个异步复位端口“reset”,用于当电梯出现非正常情况时回到初始状态;在电梯外部,一层入口处设有上升请求端,二层入口处设有上升和下降请求端,三层入口处设有下降请求端;在电梯内部,应设有各层停站请求端口;一个电梯时钟输入端口,它提供周期为 1s 的时钟信号,用作电梯状态转换的触发时钟;还有一个频率很高的按键时钟输入端口。其次考虑输出端口,当有各层上升或下降请求时,各层入口处应该有端口显示请求是否被响应,有请求时端口输出逻辑1 ,被执行后则恢复成逻辑0 ;同样的,电梯内部也
5、应有各层停站请求是否被响应的指示端口;一个开关门指示端口,当门开着时,它为逻辑1,门关着时,则为逻辑0 ;还需要端口来显示电梯所处的位置和模式(上升或下降) 。buttonclk:in std_logic; -按键时钟信号liftclk:in std_logic; -电梯时钟信号reset:in std_logic; -异步复位端口f1upbutton:in std_logic; -电梯外部 -一层上升请求端口f2upbutton:in std_logic; -二层上升请求端口f2dnbutton:in std_logic; -二层下降请求端口f3dnbutton:in std_logic;
6、-三层下降请求端口l1stop1button:in std_logic; -第一部电梯内一层停站请求端口l1stop2button:in std_logic; -二层停站请求端口5l1stop3button:in std_logic; -三层停站请求端口 l2stop1button:in std_logic; -第二部电梯内一层停站请求端口l2stop2button:in std_logic; -二层停站请求端口l2stop3button:in std_logic; -三层停站请求端口l1warn:in std_logic; -第一部电梯的报警信号l2warn:in std_logic; -第
7、二部电梯的报警信号position1:buffer integer range 1 to 3; -电梯位置信号position2:buffer integer range 1 to 3; -电梯位置信号2.结构体设计:在结构体中,首先说明了状态机设置的八个状态,分别是:开门(dooropen)、关门(doorclose)、开门等待第 1 秒 (doorwait1)、开门等待第 2 秒 (doorwait2)、开门等待第 3 秒(doorwait3)、上升(up)、下降(down)和停止(stop)。在结构体最前端用如下的定义语句来定义状态机:architecture one of threel
8、ift is -结构体type lift_state1 is -定义八个状态(dooropen,doorclose,doorwait1,doorwait2,doorwait3,up,down,stop);type lift_state2 is -定义八个状态(dooropen,doorclose,doorwait1,doorwait2,doorwait3,up,down,stop);接着描述电梯内部功能实现,在结构体中设计了两个进程,一个状态机进程(ctrlift) ,它是以 reset 和 liftclk 作为敏感信号,控制电梯的状态转移;另外一个是信号灯控制进程(ctrlight) ,它是
9、以 reset 和 buttonclk 作为敏感信号,控制寄存信号的逻辑值。在状态机进程中,电梯关门后根据信号灯的情况,来决定下一个状态是上升、下降还是停止;在信号灯控制进程中,由于使用了专门的频率较高的按键时钟,所以使得按键的灵敏度大,但是时钟频率不能过高,否则容易使按键过于灵敏,而信号灯的熄灭是由状态机进程中传出clearup 和 cleardn 信号来控制。三电梯流程图电梯程序设计流程图如下:6CLOCK 触发外输入信号触发动作核心算法控制信号输出观察显示具体流程如如下:下面分模块进行说明: 面是输入模块的处理流程图:Clk 一个时钟周期复位报警关门,开门停电梯扫描进入控制程序7下面是核
10、心控制的流程图:扫描信号需要电梯的人所在楼层检测当前电梯状态检测电梯所在楼层 号判断流程图见下图扫描 扫描人所在楼层人所按按钮是上楼/下楼信息送入处理号流程判断见下图检测电梯当前状态扫描向上运行向下运行停止不动WARN报警模式信息处理8 核心算法描述:一号电梯运动情况二号电梯运动情况采集信号输入进行分别讨论,各个电梯在各种状态下的响应两个电梯联动实现四状态转换规则三层电梯的具体状态转换如下:两部电梯的初始状态分别为:电梯一为一层关门状态,电梯二为三层关门状态。 1当有人按键发出上下楼请求,通过内部判断由哪部电梯执行此命令。 2电梯需要寄存器来记忆电梯内外所有请求,并按照电梯运行规则按顺序响应。
11、 3电梯每秒上升(下降)一层楼。 4电梯到达需要停止的楼层,经过 1 秒电梯门打开,开门指示灯亮,开门 3 秒后,电 5梯门关闭( 开门指示灯灭),电梯继续运行,直至执行完最后一个请求信号后停留在当前层。每个请求信号保留至执行后立刻消除。 6电梯的运行规则:当电梯处于上升模式时,只响应比电梯所在位置高的上楼请求信 7号和停站请求信号,由下而上逐个执行,直到最后一个上楼请求执行完毕;如果高层有下楼请求,则直接上升到有下楼请求的最高层,然后进入下降模式。当电梯处于下降模式时则与上升模式相反。9五VHDL 源代码说明本程序设计调用了 ieee 库,ieee 库是 VHDL 设计中最为常用的库,它包含
12、有 ieee 标准的程序包和其他一些支持工业标准的程序包。本设计采用 std-logic-1164、std-logic-unsigned、std-logic-arith 程序包。以关键词 entity 引导,end entity threelift 结尾的部分是程序的实体部分。VHDL 的实体描述了电路器件的外部情况,本设计定义了关于三层电梯控制器用到的各类时钟、异步复位按键、信号灯指示端口、电梯的请求端口。它描述了端口模式主要有 in、buffer、out,以及各端口信号的数据类型主要有 std-logic、std-logic-vector、integer。以关键词 architecture
13、 引导,end architecture one 结尾的语句部分是结构体部分,结构体描述电路器件的内部逻辑功能。源代码共分为五个部分:库的说明、实体结构体定义、状态机进程、信号控制进程和楼层显示进程。(1 ) 库的说明:library ieee; -库的说明use ieee.std_logic_1164.all; -程序包的说明10use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;(2)实体、结构体定义entity threelift is -实体port( buttonclk:in std_logic; -按键时钟信号l
14、iftclk:in std_logic; -电梯时钟信号reset:in std_logic; -异步复位端口f1upbutton:in std_logic; -一层上升请求端口f2upbutton:in std_logic; -二层上升请求端口f2dnbutton:in std_logic; -二层下降请求端口f3dnbutton:in std_logic; -三层下降请求端口l1stop1button:in std_logic; -一层停站请求端口l1stop2button:in std_logic; -二层停站请求端口l1stop3button:in std_logic; -三层停站请求
15、端口 l2stop1button:in std_logic; -一层停站请求端口l2stop2button:in std_logic; -二层停站请求端口l2stop3button:in std_logic; -三层停站请求端口 position1:buffer integer range 1 to 3; -电梯位置信号position2:buffer integer range 1 to 3; -电梯位置信号udsig1:buffer std_logic; -电梯模式(上升或下降)信号udsig2:buffer std_logic; -电梯模式(上升或下降)信号fupreg,fdnreg,l
16、1stopreg,l2stopreg:buffer std_logic_vector(3 downto 1); -上升、下降、停站请求寄存信号doorlight1:out std_logic; -开关门信号doorlight2:out std_logic; -开关门信号posout1:out std_logic_vector(3 downto 0); posout2:out std_logic_vector(3 downto 0); end entity threelift;11architecture one of threelift is -结构体type lift_state1 is -
17、定义八个状态(dooropen,doorclose,doorwait1,doorwait2,doorwait3,up,down,stop);type lift_state2 is -定义八个状态(dooropen,doorclose,doorwait1,doorwait2,doorwait3,up,down,stop);signal mylift1state:lift_state1;signal mylift2state:lift_state2;signal l1clearup:std_logic; -上升和停站请求清除信号signal l1cleardn:std_logic; -下降和停站请
18、求清除信号signal l1clearstop:std_logic; -下降和停站请求清除信号signal cleardn3:std_logic;signal clearup1:std_logic;signal cleardn2:std_logic;signal clearup2:std_logic;signal l2clearup:std_logic; -上升和停站请求清除信号signal l2cleardn:std_logic; signal l2clearstop:std_logic; -下降和停站请求清除信号(3)状态机进程beginctrlift:process(reset,lift
19、clk) -状态机进程variable pos1:integer range 3 downto 1;variable pos2:integer range 3 downto 1;beginif reset=1 then -异步复位,电梯的初始状态为一层开门状态12mylift1statemylift1statel1clearupmylift1state -关门,判定电梯下一个运行方式doorlight1 -电梯处于上升状态position1 -电梯处在下降状态position11 and (l1stopreg(pos1)=1 and fdnreg(pos1)=1) thenmylift1sta
20、te mylift1statedoorlight11 and (fdnreg(pos1)=1 or l1stopreg(pos1)=1) thenl1cleardnmylift2statel2clearupmylift2state -关门,判定电梯下一个运行方式doorlight2 -电梯处于上升状态position2 -电梯处在下降状态position21 and (l2stopreg(pos2)=1 and fdnreg(pos2)=1) thenmylift2state mylift2statedoorlight21 and (fdnreg(pos2)=1 or l2stopreg(po
21、s2)=1) thenl2cleardn=1; -清除当前层下降和停站请?l2clearstop=1;elsel2clearup=1;l2cleardn=1;l2clearstop=1;end if;end if;mylift2state=doorwait1;end case;end if;end if;end process ctrlift;(4)信号控制进程ctrlight:process(reset,buttonclk) -信号控制进程beginif reset=1 then -复位,寄存信号清零fupreg=“000“;fdnreg=“000“;l1stopreg=“000“;24l2
22、stopreg=“000“;elseif buttonclkevent and buttonclk=1 thenif clearup1=1 then fupreg(1)=0;end if;if cleardn3=1 then fdnreg(3)=0;end if;if clearup1=1 then fupreg(1)=0;end if;if cleardn2=1 then fdnreg(2)=0;end if;if l1clearup=1 then -上升和停站请求清零fupreg(position1)=0;end if;if l1cleardn=1 then fdnreg(position
23、1)=0;end if;if l1clearstop=1 then l1stopreg(position1)=0;end if ;if l2clearup=1 then -上升和停站请求清零fupreg(position2)=0;end if;25if l2cleardn=1 then fdnreg(position2)=0;end if;if l2clearstop=1 then l2stopreg(position2)=0;end if ;if f1upbutton=1 then -记忆各层上升请求fupreg(1)=1;elsif f2upbutton=1 thenfupreg(2)=1
24、;end if;if f2dnbutton=1 then -记忆各层下降请求fdnreg(2)=1;elsif f3dnbutton=1 thenfdnreg(3)=1;end if;if l1stop1button=1 then -记忆各层停站请求l1stopreg(1)=1;elsif l1stop2button=1 thenl1stopreg(2)=1;elsif l1stop3button=1 thenl1stopreg(3)=1;end if;26if l2stop1button=1 then -记忆各层停站请求l2stopreg(1)=1;elsif l2stop2button=1
25、 thenl2stopreg(2)=1;elsif l2stop3button=1 thenl2stopreg(3)=1;end if;end if;end if;end process ctrlight;(5)楼层显示进程process(position1,position2) -楼层显示进程beginif position1=1 thenposout1=“0001“;elsif position1=2 thenposout1=“0010“;elsif position1=3 thenposout1=“0011“;end if;if position2=1 thenposout2=“0001
26、“;elsif position2=2 thenposout2=“0010“;elsif position2=3 thenposout2=“0011“;end if;27六程序调试(仿真波形解释及图形)实现功能:1. 警报系统,使电梯停在当前状态,停止工作2. 开门关门延时:可以延长电梯门开门和关门时间3. 可以实现两部电梯的连续联动仿真仿真波形如下:1 警报系统对两步电梯按下 11warn,12warn 键,11warnout,12warnout 输出高电平,电梯停在当前状态不再工作,电梯位置不再改变。2 开门延时28在电梯开门过程中按下开门键 11open 键之后,发现电梯在开门的时间延长
27、,从 posout2 键可以第二部电梯在 5.37 秒左右关门,而由延时信号的则延长到 8.51 秒才将门关上。3提前关门在电梯关门过程中按下关门键 11close 键之后,发现电梯在关门的时间提前,从 posout2 可29以看出在关门时间要长于 posout1,第一部电梯提前关门。4 两组输入信号我们分别置 f1upbutton,f3dnbutton,11stop31button,12stop1button 为 1,即在 1 楼按下上楼键去三楼,3 楼按下下楼键去 1 楼。两部电梯联动运行,可以看出电梯 posout1 为 1 到 2 到3;电梯二 posout2 为 3 到 2 到 1;
28、5 连续输入信号连续输入 4 组信号,先 1 楼按上楼,3 楼按下楼,1 楼再按上楼,2 楼按上楼。进行连30续联动仿真,从 posout 输出结果看,第一部电梯响应了第 1,4 次信号,分别从 1-2-3-2-3 楼;第二部电梯响应第 2,3 次信号,分别从 3-2-1-2-3 楼。七课程总结在短学期三周左右的时间里,我们经过自己的努力编写了 VHDL 电梯控制系统,学习了 VHDL 语言的基本语法,熟悉了 Quartus 的 VHDL 文本设计流程全过程,掌握了三层电梯控制器的设计方法,及它的仿真和硬件测试。当然也总结了很多的经验和教训。因为是初学 VHDL 硬件描述语言,因此我们在做的过
29、程中,尽量以简单的思维方法去实现。过去我们主要学习的 C+等顺序执行的语言,但是面对硬件描述语言,一方面,我们希望借助过去学习过的 c 语言的一些思想对我们 VHDL 程序设计进行帮助,另一方面,我们又希望能够掌握并行控制的状态机的编写。因此我们没有进行分模块的设计,而是采用,一个主模块实现整体的硬件功能描述。在程序编写的过程中,我们遇到很多困难,但是我们没有放弃,经过多次改进,本设计实现了三层电梯的基本功能,电梯的的运行情况完全符合它的运行规则,电梯的位置变化合情合理。本次三层电梯控制器的设计采用 VHDL 语言,源程序经 Quartus 软件仿真。本设计代码具有良好的可读性和可移植性,运用了有限状态机的设计方法,使得它灵活、简单、运算速度快、可靠性高,并且此设计具有良好的扩展性。我们总结,首先要学会使用图书馆等网络资源,当我们编写程序遇到一些无法理解得错误时,我们最终都可以从网络上找到前人的经验和教训。因此不能闭门造车,要多学习别人的经验和教训。其次是在编写程序之前要有一个清晰的框架,自己要实现哪些功能,以及要实现哪些功能得需要哪些方法来实现,只有在自己脑子里有一个很清晰的框架之后,然后再进行编写,编写一个完整的程序是需要一定的时间去思考调试的。只要努力花时间,静下心来找出程序的错误,改进不足之处,最后一定能够编写出一个满意的程序。