数字系统设计
电梯控制系统
小组成员:
设计日期:
目 录
一、设计要求分析………………………………………………3
二、设计思想方法………………………………………………3
三、小组分工情况………………………………………………4
四、信号变量解释………………………………………………4
五、流程状态设计………………………………………………5
六、程序源代码…………………………………………………6
七、波形仿真……………………………………………………25
八、课题设计小结………………………………………………29
一、设计要求分析:
题目:
电梯控制系统
要求简介:大楼为 3 层,2 部电梯,每部电梯内部都有如下按键:1‐3 楼
的按键选择键,开门键,关门键,报警键。每部电梯的每层楼外面都有上楼键和
下楼键(1 楼只有上楼键,三楼只有下楼键)。电梯的设计参照日常生活中电梯
实际运行规律设计。 两部电梯之间互相联动,即同时按下任何一部电梯的外部
向上或向下键之后,两部电梯同时接受此指令,然后由系统判断,与该请求所在
楼层最近并且运行方向相同的电梯执行指令,另一部电梯不执行该指令。
分析:
如题所述,课题所需要做的是一个简化了的实际电梯控制系统,麻雀虽小,
五脏俱全,该控制器需要参照实际运行规律设计,且两部电梯之间相互联动。经
过组内分析,我们决定采用 quartus 软件用 VHDL 语言进行描述编写。
二、设计思想方法:
由于电梯的运行状态不多,能使状态发生变化的关键信号也不多,所以我们
决定采用状态机的编写方法,即将电梯设为有限的几个状态,然后在信号的改变
下进行响应,使得电梯可以正常工作;电梯联动则由控制器进行判断,将相应的
信号传给电梯状态机;将报警信号的优先级设为最高,使之可以及时响应,其次
为其他信号,如关门信号,开门信号(运行状态不予响应)等;将电梯的楼层显
示设为与主进程并行的辅进程,及时更新楼层显示。
三、小组分工情况:
四、 信号变量解释:
liftclk:电梯时钟信号,上升沿触发。
reset:重置信号,将所有信号设为初始状态。
awarn,bwarn:a 电梯和 b 电梯的报警按钮。
aopen,bopen:a 电梯和 b 电梯的开门按钮。
aclose,bclose:a 电梯和 b 电梯的关门按钮
arequest,brequest:a 电梯和 b 电梯的请求信号(0001 为一楼上楼请求,0010
为二楼下楼请求,0100 为二楼上楼请求,1000 为三楼下楼请求)
astop1,astop2,astop3,bstop1,bstop2,bstop3:a 电梯和 b 电梯的停站按钮
aposition,bposition:a 电梯和 b 电梯的位置信号(01 表示一楼,10 表示二楼,
11 表示三楼)
amode,bmode:a 电梯和 b 电梯的运行状态(00 表示向上运行,01 表示向下
运行,10 表示停止,11 表示报警)
adoor,bdoor:a 电梯和 b 电梯的门状态(1 表示开门状态,0 表示关门状态)
aupinfo,adninfo,astopinfo,bupinfo,bdninfo,bstopinfo 系统内部的请求信号(
upinfo 中,“000”左数第一位表示三楼有上升请求,第二位表示二楼有上楼
请求,以此类推。
dninfo 中,“000”左数第一位表示三楼有下楼请求,以此类推。
stopinfo 中,“000”左数第一位表示三楼有停站请求,以此类推。)
aout,bout :a 电梯和 b 电梯的显示输出。
f1,f2,f3,warn,opening,waiting:电梯内部状态(f1 表示一楼,f2 表示二楼,f3
表示三楼,warn 表示报警状态,opening 表示打开状态,waiting 表示处于上升或
下降状态。)
alift,blift:a 电梯和 b 电梯的运行状态表示。
awarn1,bwarn1 :a 电梯和 b 电梯的内部报警信号。
pos,pos2:a 电梯和 b 电梯的内部楼层变量。
atemp,btemp:a 电梯和 b 电梯的内部运行状态变量。
doorwait,liftwait:分别为开门延时和升降延时计数。
五、状态流程设计:
程序流程如下图所示:
如图所示,有两个进程,一个主进程,负责电梯的运行调度,一个辅进程,
负责电梯的显示输出:主进程以 liftclk 为敏感信号,首先采集外部输入信号,然
后进行判断哪部电梯进行响应,并送入状态机循环,这样依次执行,直到电梯停
止运行。
程序状态图如下:
如图所示,我们定义了六个状态,分别是 f1,f2,f3,opening,waiting,warn,意义
已经在前面的变量信号解释中予以说明,这里不再赘述,我们把 warn 状态单独
列出来,以方便实际情况中进行特殊处理。
六、程序源代码:
library ieee; --库文件声明
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity slift is------实体定义
port(liftclk,reset,awarn,bwarn,aopen,bopen,aclose,bclose:in std_logic;
arequest,brequest:in std_logic_vector(4 downto 1);
astop1,astop2,astop3,bstop1,bstop2,bstop3:in std_logic;
---输入信号
aposition,bposition:buffer std_logic_vector(1 downto 0);
amode,bmode:buffer std_logic_vector(1 downto 0);
adoor,bdoor:buffer std_logic;
aupinfo,adninfo,astopinfo,bupinfo,bdninfo,bstopinfo:buffer
std_logic_vector(3 downto 1);
---缓存信号
aout,bout:out std_logic_vector(1 downto 0));
----输出信号
end entity slift;
architecture center of slift is
type lift_state is
(f1,f2,f3,warn,opening,waiting);-----定义电梯状态
signal alift,blift:lift_state;
signal awarn1,bwarn1:std_logic;
begin
----以 reset 和电梯时钟为敏感信号
aplift:process(reset,liftclk)
variable pos,pos2:integer range 3 downto 1;-----定义变量
variable atemp,btemp:lift_state;
variable doorwait,liftwait:integer:=0;
begin
--reset 及报警,开关门信号处理:(设为初始状态)
if (liftclk'event and liftclk='1') then
if reset='1' then
alift<=f1;
atemp:=f1;
awarn1<='0';
aposition<="01";
amode<="10";
aupinfo<="000";
adninfo<="000";
astopinfo<="000";
adoor<='0';
blift<=f1;
atemp:=f1;
bwarn1<='0';
bposition<="01";
bmode<="10";
bupinfo<="000";
bdninfo<="000";
bstopinfo<="000";
bdoor<='0';
else
if awarn='1' or bwarn='1' then
if awarn='1' then
awarn1<='1';
end if;
if bwarn='1' then
bwarn1<='1';
end if;
else
if aclose='1' then
adoor<='0';
end if;
if bclose='1' then
bdoor<='0';
end if;
if aopen='1' then