资源描述
EDA技术综合课程
设 计
课 程: EDA技术综合课程设计
题 目: 电梯控制器
所属院系:电气工程学院 专业班级:自控1304班
姓 名: 王军 学 号:1317014092
指导老师: 张立众
完成地点: 陕西理工学院
目录
1.设计任务………………………………………………………………… 2
2.可选器材………………………………………………………………… 2
3.设计框图………………………………………………………………… 2
4. 设计思路………………………………………………………………… 4
5. 引脚分配………………………………………………………………… 5
6程序清单………………………………………………………………… 9
7.主控模块仿真………………………………………………………… 16
8.问题及改进…………………………………………………………… 17
9.总结及感受…………………………………………………………… 18
10.参考文献…………………………………………………………… 19
一.[设计任务]
1、 设计一个三层的电梯控制器。
2、 用数码管显示电梯所在的楼层号,电梯初始化后状态在第一层楼。
3、 每层电梯外都有上下楼请求开关,电梯内部有到各楼层的请求开关及紧急故障开关;用数码管显示上行或下行状态,用发光二极管显示是否有紧急情况。
4、 电梯每秒升(降)一层,电梯到达有停站请求的楼层后,经1秒电梯开门,开门指示灯亮,开门4秒后指示灯灭,关门,电梯继续运行。
5、 当电梯被锁定或发生紧急情况后,电梯停止运行,直到解除锁定或紧急故障后才可以从停止时的状态继续运行。
6、 当电梯处于上升状态时,只响应比电梯所在位置高的上楼请求信号,直到最后一个上楼请求执行完毕,再进入下降模式;同理,电梯处于下降状态时,只响应比电梯所在位置低的下楼请求信号,直到最后一个下楼请求执行完毕,再进入上升模式。
二.[可选器件]
1. 计算机组成/ISP实验箱一台(含电源)
2. 电源线一根
FPGA/CPLD下载板一块(或多块,可选)(其中下载版选择以下型号Cyclone EP1C6Q240C8)
3. 并行口下载电缆一根
4. 电压表棒一付
5. 实验指导书一份
6. 配套集成电路芯片若干
三.[设计框图]
系统主要分为:
主控制模块control,包含状态机,控制电梯的运行及状态转换;
消抖模块unshake,消除开关电路的抖动现象,确保逻辑的正确性;
显示模块display,内含译码功能,配合控制器显示电梯的工作状态。
模块框图见图1,总体框图详见图2。
图1 各模块框图
图2 系统总体框图
四.[设计思路]
1.对于电梯控制逻辑的实现,主要是控制模块control,故下面主要介绍控制模块control的设计思想。
控制模块control有一个进程k1,其中又设置了一个计数变量cnt,范围为1~2000000。计数变量cnt其实是起到分频器的作用,产生了一个1Hz的时钟,在cnt计数2000000次的时间内(即1s),运行控制电梯升降、停留的程序,这些部分相当于以1Hz的时钟触发;
而系统主频时钟2MHz作为触发时钟不断检测用户是否有请求输入,或者电梯是否有异常情况。对于一、二、三层信号,分别由flag1、flag2、flag3和clear1、clear2、clear3两套标志为来控制输入请求是否有效,是否应该对标志位清零。
2.主要规则是:
当一层(upone、one)、二层(uptwo、downtwo、two)或三层(downthree、three)的输入信号有效时,相应标志位flag1、flag2、flag3置‘1’,表明该层有请求。
当一层(upone、one)、二层(uptwo、downtwo、two)或三层(downthree、three)的输入信号无效时,相应标志位clear1、clear2、clear3置‘1’,表明相应得到达楼层请求已经在上一个时钟沿完成;同时对应的标志位flag1、flag2、flag3置‘1’,表明相应楼层无请求。
updown信号值为 ‘1’时表明电梯处于上升状态,为‘0’时处于下降状态。
程序有两个信号表示电梯的状态:一是位置状态,二是运行状态。position表明电梯的位置状态,是一个取值1~3的整数 ,分别表示电梯处于第一、二、三层;state表示电梯的运行状态,使枚举数据类型,共10个值,分别是:
--states为电梯所处的各个状态
--up1表示电梯正在从第1层上升
--up2表示电梯正在从第2层上升
--down1表示电梯正在向第1层下降
--down2表示电梯正在向第2层下降
--stop表示电梯停止在某一层上
--dw1表示电梯开门的第一秒
--dw2表示电梯开门的第二秒
--dw3表示电梯开门的第三秒
--dw4表示电梯开门的第四秒,判断电梯的下一个状态
--dw5表示当电梯处于上升或下降状态时,如果没有相应的上升或下降请求信号,则转入
dw5状态,使其不再在上升或下降状态停留,而响应其它信号
程序利用case语句实现这10个状态间的相互转移。
五.[引脚分配]
详见下图
[状态流程图]
1、顶层流程图解
超载报警
是
是
否
否
故障报警
从二层上行状态
停止状态
从一层上行状态
向一层下降状态
判断当前楼层和运动状态
初始化,电梯停在一楼
清除故障警报
是
否
是否存在故障
清除故障
是否超载
综合所有指令,判断下一运动状态具体判断条件见下面每层楼框图。
开锁
向二层下降状态
开门前3秒
(空闲状态)
开门第4秒
(判断状态)
空闲响应状态
2、以下是较具体的状态转化图
一楼
当前层请求
进入停止状态
上行请求
无
有
继续等待
从一层上升状态
有
无
进入停止状态
向一层下降状态
从二层上升状态
二楼
当前层请求
下行请求
无
有
继续等待
有
无
前一状态为上升
前一状态为下降
上行请求
有
停止状态
当前层请求
从二层上升状态
无
有
上行请求
有
无
向一层下降状态
有
下行请求
无
当前层门外上行请求
当前层门外下行请求
有
有
无
无
三楼
当前层请求
进入停止状态
下行请求
无
有
继续等待
向二层下降状态
有
无
六.[程序清单]
消抖模块(程序分两栏排版)
20
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity unshake is
port(clk :in std_logic; --时钟,10HZ;
key :in std_logic; --开关信号;
keyout :out std_logic); --消抖之后的开关信号
end;
architecture a of unshake is
signal cp :std_logic;
signal jsp:integer range 0 to 3;
begin
process(clk)
begin
if(clk'event and clk='1')then
if key='1' then
if jsp=3 then
jsp<=jsp;
else
jsp<=jsp+1;
end if;
if jsp=1 then
cp<='1';
else
cp<='0';
end if; else
jsp<=0;
end if;
end if;
keyout<=cp;
end process;
end;
显示模块(程序分两栏排版)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity display is
port(clk : in std_logic;
light : in integer range 1 to 3;
serout : out std_logic_vector(6 downto 0));
end;
architecture a of display is
signal disp : std_logic_vector(6 downto 0);
begin
process(clk)
begin
if(clk'event and clk='1')then
if light =1 then
disp<="1001111";
elsif light=2 then
disp<="0010010";
elsif light=3 then
disp<="0000110";
end if;
end if;
end process;
serout<=disp;
end;
主控模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
--*****************************************************************************
entity control is
port(upone,uptwo,downtwo,downthree : in std_logic;--电梯外乘客的请求信号
one,two,three : in std_logic;--电梯内乘客的请求上或下至几层楼的信号
reset : in std_logic; --复位初始化开关
over,emergency,lock:in std_logic;--超重、紧急停运和上锁信号
clk : in std_logic; --时钟信2MHz
alarm,ovelight,locklight : out std_logic;--故障、超重及锁定提示灯
p : out integer range 1 to 3; --电梯当前位置
lightup,lightdown : out std_logic_vector(6 downto 0);
--lightup显示'u'则电梯在上升模式,
--lightdown显示'd'则电梯在下降模式;
arrive : out std_logic); --arrive为'1'时表明电梯到达楼层,并在开门状态
end;
--*****************************************************************************
architecture behave of control is
type states is (up1,up2,down1,down2,stop,dw1,dw2,dw3,dw4,dw5);
--states为电梯所处的各个状态
--up1表示电梯正在从第1层上升
--up2表示电梯正在从第2层上升
--down1表示电梯正在向第1层下降
--down2表示电梯正在向第2层下降
--stop表示电梯停止在某一层上
--dw1表示电梯开门的第一秒
--dw2表示电梯开门的第二秒
--dw3表示电梯开门的第三秒
--dw4表示电梯开门的第四秒,判断电梯的下一个状态
--dw5表示当电梯处于上升或下降状态时,如果没有相应的上升或下降请求信号,则转入
--此dw5状态,使其不再在上升或下降状态停留,而响应其它信号
signal state: states;
signal clear1,clear2,clear3,flag1,flag2,flag3,fl1,fl2,fl3: std_logic;
--这些都是标志位,控制电梯的状态转换
--flag1、flag2、flag3代表各层相应的请求信号
--clear1、clear2、clear3代表相应层的请求已经完成,可以接收新的任务
signal position : integer range 1 to 3; --电梯的当前停留位置
signal lup,ldown: std_logic_vector(6 downto 0);--与lightup和lightdown功能相同
signal arr : std_logic; --与arrive功能相同
signal ala,ov,loc : std_logic; --与alarm,ovlight,locklight功能相同
begin
k1:
process(clk)
variable cnt: integer range 1 to 2000000;
variable updown : std_logic; --此变量表明电梯处于上升或下降状态
begin
if(clk'event and clk ='1')then
if(upone='1' or one='1')then --一层有上楼请求
flag1<='1';
elsif clear1='1' then --一层的请求已完成
flag1<='0'; --当没有新请求信号则清零
end if;
if (uptwo='1' or downtwo = '1' or two = '1') then --二层有请求
flag2<='1';
elsif clear2 = '1' then --二层的请求已完成
flag2<='0'; --当没有新请求信号则二层清零
end if;
if (downthree= '1' or three = '1')then --三层有请求
flag3<='1';
elsif clear3 = '1' then --三层的请求已完成
flag3<='0'; --当没有新请求信号则三层清零
end if;
if(emergency='1') then
ala<='1';
elsif(over='1') then
ov<='1';
elsif(lock='1') then
loc<='1';
end if;
if cnt<2000000 then--通过计数2000000获得1s的时钟信号
cnt:=cnt+1; --计数信号小于20000000则加1
else
if reset = '1' then --复位时,电梯初值设置在一层,状态为stop
position<=1;
state<=stop;
ovelight<='0';--各状态指示灯均灭
locklight<='0';
alarm<='0';
lup<="1111111";
ldown<="1111111";
else
fl1<=flag1;
fl2<=flag2;
fl3<=flag3;
--fl1、fl2、fl3置'1'表示相应楼层有请求信号,并把相应的任务完成信号clear
--置'0',表示有新的任务等待完成
if(fl1='1')then
clear1<='0';
end if;
if(fl2='1')then
clear2<='0';
end if;
if(fl3='1')then
clear3<='0';
end if;
case state is --状态机描述
when up1 =>-------------up1:正在从一层上升
if fl2='0' then --若上升期间二层期间无请求,则直接上三层
clear1<='0';
clear3<='0';
state<=up2;
position<=2;
else
state<=stop;
position<=2;
fl2<='0'; --完成了对二层请求的响应;
clear2<='1';
end if;
when up2 =>--------------up2:正在从二层上升
clear1<='0';
clear2<='0';
state<=stop;
position<=3;
if position =2 then --如果电梯在第二层
position<=3; --那么下一个位置在第三层
fl3<='0'; --完成了对第三层请求的相应
clear3<='1';
elsif position =1 then --如果电梯在第一层
position<=2; --那么下一个位置在第二层
fl2<='0'; --二层的请求已经完成
clear2<='1';
end if;
when down1 => --正在向第一层下降
clear2<='0';
clear3<='0';
state<=stop; --下一状态是stop
if position=2 then --如果电梯在第二层
position<=1; --那么下一个位置在第一层
fl1<='0'; --一层的请求已经完成
clear1<='1';
elsif position =3 then
position<=2;
fl2<='0';
clear2<='1';
end if;
when down2 => --正在向第二层下降
--如果在下降期间,二层没有请求,就直接下到一层
if fl2 ='0' then
clear1<='0';
clear3<='0';
--下一状态转至down1,电梯将会再下降一层
state<=down1;
position<=2; --电梯的下一个位置在第二层
else
state<=stop; --若下降期间二层有请求,则在二层停下
position<=2; --位置转至二层
fl2<='0'; --完成了对二层请求的响应
clear2<='1';
end if;
when stop => --在停止状态
if(emergency='1' or over='1') then
state<=stop;
else
state<=dw1;--下一状态转至dw1,电梯会进入开门状态
arr<='1'; --arr置'1',表明电梯到达并开门
lup<="1111111"; --上升指示灯灭
ldown<="1111111";--下降指示灯灭
end if;
when dw1 => --在dw1状态时,等待1s
state<=dw2;--下一状态转至dw2
when dw2 =>
state<=dw3;
when dw3 =>
state<=dw4;
when dw4 =>
arr<='0'; --开门灯灭
if position=1 then --如果电梯在第一层
updown :='1'; --则进入上升模式
fl1<='0'; --一层的任务完成
clear1<='1';
if fl2='1' then --如果二层有请求
state<=up1; --先响应二层的请求,再响应上升一层的请求
arr<='0'; --维持灯熄灭状态
lup<="1000001"; --上升灯亮,显示字母’U’
elsif fl3='1' then --若三层有请求
state <=up1;
--响应完二层请求信号后,再响应第三层的请求
arr<='0';--开门灯维持熄灭状态
lup<="1000001";--上升灯亮, 显示字母’U’
end if;
elsif position=3 then
updown :='0';--进入下降状态
fl3<='0'; --到达三层的任务已完成
clear3<='1';
if fl2='1' then --若二层有请求
state<=down2;
--先响应二层请求,再转入下降一层的状态
arr<='0';
ldown<="1000010";--下降灯亮,显示’d’
elsif fl1='1' then
state<=down2;
--响应完二层请求信号后再响应一层的请求
arr<='0';
ldown<="1000010";
end if;
elsif position =2 then
fl2<='0'; --到达二层的任务已经完成
clear2<='1';
if updown ='1' then
--当电梯处于上升状态,不响应一层的请求
if fl3='1' then
state<=up2;
arr<='0';
lup<="1000001";
else
state<=dw5;
--若三层无请求,就转至dw5状态
end if;
end if;
if updown = '0' then
--当处于下降状态,不响应三层的请求
if fl1='1' then
state<=down1;
arr<='0';
ldown<="1000010";--下降灯亮,显示’d’
else
state<=dw5;
--若一层无请求,就转至dw5状态
end if;
end if;
end if;
when dw5 =>
--只要到了dw5的状态,无论原来处于上升或下降状态,对三层和一层的信号都可相响应
if fl3='1' then
state<=up2;
arr<='0';
lup<="1000001";--上升灯亮, 显示字母’U’
elsif fl1='1' then
state<=down1;
arr<='0';
ldown<="1000010";--下降灯亮,显示’d’
end if;
end case;
cnt:=1;--进程完成一次全部的状态、条件判断并执行相应操作后,计数信号重置1
end if;
alarm<=ala;
ovelight<=ov;
locklight<=loc;
end if;
end if;
end process;
p<=position;--给输出信号赋值
lightup<=lup;
lightdown<=ldown;
arrive<=arr;
end;
七.[主控模块仿真]
1.由于显示和消抖模块为通用模块,在此不再赘述仿真结果,主要给出主控模块的仿真分析
2.为便于仿真,将主控模块control单列为一个工程,并把计数变量cnt的值由2000000改为2。
说明:用数码管显示上升和下降状态时分别显示的是字母‘U’和‘d’。由于是共阳极数码管,所以低电平亮。
显示‘U’时,数码管编码为“1000001”,即十进制65;
显示‘d’时,数码管编码为“1000010”,即十进制66;
数码管熄灭时,编码为“1111111”,即十进制127;
对照以上仿真图形可以检验上行、下行状态灯的正确运行。
八.[问题及改进]
以下将讨论一下本次实验中遇到的一些问题,已经改进的部分和尚未完善的部分。
1、 开始设计时由于未经老师指导,所以设置了过多的繁琐状态,共计10个,包括dw1、dw2和dw3这几个空闲状态,它们唯一的作用就是占用1秒钟的时间来作为电梯到站开门的等待状态。事实上,若用开门、上行、下行、停止等较精简的几个状态也可以完成设计任务,而且对于以后扩展更多的楼层也是很有利的。而自己目前的设计只能用于三层电梯,一旦要求扩展层数,便会遇到很大困难。我会在之后的学习中自行学习思考如何用老师所建议的状态设置方法来实现4层电梯控制器。
2、 在老师帮助修改代码的过程中,发现了一些不必要的冗余代码,如:
fl1<=flag1;
fl2<=flag2;
fl3<=flag3;
事实上,这种重复赋值是由于后来改进方案而忘记处理之前的程序造成的。具体如下:
开始设计时,我采用了分频器,将主频2MHz的时钟进行2000000分频分出一个1Hz的信号。两个时钟(主频2Mhz和1Hz)分别以其上升沿控制两个进程k1和k2的运行。其中k1由2MHz时钟触发,控制各输入请求信号和改变状态机的信号,使电梯无论什么时候都快速响应各种操作。k2由1Hz时钟出发,控制电梯的升降及停留。
之后经老师建议,我将分频器模块去掉,也就是说全部系统只有一个主频时钟2MHz来触发。而内部需要控制的升降、停留、开门等待的时间,就由一个计数变量cnt来控制,
cnt每计数2000000次,则时间经过1s。这样,原来的两个进程就压缩为一个,进程k2就被略去了,而原来的flag信号是在进程k1中被赋值,进程k2中分别又赋值给了相应的fl信号,所以删除进程k2后就多出了下面的这些语句,
fl1<=flag1;
fl2<=flag2;
fl3<=flag3;
虽然不妨碍程序的正确运行,但是给代码的可读性打了折扣,这是在以后的编程中应当力图避免的。
3、 同样是因为删除了k2进程,之后没有再改变以前的代码顺序,使得reset,即复位功能被写在了时序代码的部分,和紧急故障及超重状态的判断变成了并行关系。也就是说reset功能的优先级降低了,reset功能应当是异步的,一旦有效,系统立刻停止运行,并所存当前状态。而现在,reset功能在没有紧急故障(或故障消除)或无超重状态时才会有效,而且为使系统能够响应,信号必须至少维持1s的时间。
4、 在开始的程序设计中犯了一个小错误,就是电梯如果从一层直接上升到三层(即二楼无请求)时,到达二楼是不会停站开门的,而我忘记了这一点,设计成了每到一层都会有4s的开门等待时间。在之后的修改过程中及时发现了这个问题,并把状态机的转换过程进行了相应的修改,顺利修正了这个错误。
5、 从仿真波形来看,复位功能键是有效的,即复位之后电梯会停止在一层,但是在实际电路的运行中,所有功能都可以很完善地实现,唯独复位键无效。在更换了另一套实验箱之后,发现reset功能可以实现,但是复位之后系统便无法相应其他的请求了,这都是和仿真结果相悖的。事实上,可能存在以下问题:
① 在代码编译的过程中,没有报告错误,即Error;但是会有很多警告,即Warning。
很多情况下,Warning会给出类似这样的指示
Warning: Output pins are stuck at VCC or GND
Warning: Design contains 1 input pin(s) that do not drive logic
Warning: Following 7 pins have nothing, GND, or VCC driving datain port -- changes to this connectivity may change fitting results
Info: Pin alarm has VCC driving its datain port
Info: Pin ovelight has VCC driving its datain port
Info: Pin locklight has VCC driving its datain port
Info: Pin lightup[0] has VCC driving its datain port
Info: Pin lightup[6] has VCC driving its datain port
Info: Pin lightdown[1] has VCC driving its datain port
Info: Pin lightdown[6] has VCC driving its datain port
说明实际电路并非都能很好很完善地执行所有的逻辑表达,特别是在高频和态转换的特殊条件下,对逻辑电路有特殊的要求。一旦实际的物理电路无法完全满足程序代码所叙述的逻辑,那么很可能出现实际电路运行和仿真结果不同的现象。
② 另外,后来发现状态机的描述中缺少了when others的语句,即对其他未知状态的描述。这样,程序很可能由于实际电路中的干扰而运行到正常状态循环体之外的无效状态中,并且无法预知是否再能回到正常状态,即所谓的程序“跑飞”。
以上所述的问题都是需要不断积累经验、不断摸索才能解决的,但是给我以后的学习带来
了更加深刻和全面的认识。
[总结及感受]
通过这次课程设计,让我在学习EDA理论知识的基础上,增强了的实践动手能力。在参
考了许多相关资料后,充分理解了三层电梯的设计要求基本上完成了设计的功能要求,但
本代码中可能仍存在一些不能解决的实际问题,许多工程实际问题不能完全用理论知识去
解决,需要不断吸取现场经验,寻找解决问题方法虽然能完成设计的基本功能,但仍有可
拓展的空间,比如超载报警、多层电梯等,都是可以继续研究以满足更多的功能要求,但
以我现在对 EDA 知识的了解可能不太容易完成,希望以后有机会再深入地学习EDA,设计
出更符合实际功能需求的代码。
[参考资料]
1、《VHDL数字电路及系统设计》
江思敏 编著 --------机械工业出版社
2、《CPLD/FPGA可编程逻辑器件实用教程》
马彧 王丹利 王丽英 编著--------机械工业出版社
参考文献:
[1]陈清华,唐友喜,周佳晶等著.大频偏扩频信号载波同步算法及实现. 2006年恒润科技用户大会论文集,2006年10月。
[2]詹亚锋,曹志刚,马正新,直接扩频序列信号的参数估计,系统工程与电子技术,2004年9月第26卷第9期P1176-1179.
[3]张天骐,林孝康,周正中,一种直扩信号伪码周期及序列的盲估计方法,电波科学学报,2005年6月,第20卷第3期P400-405
[4] 邓振淼,刘 渝,王志忠,正弦波频率估计的修正Rife算法. 数据采集与处理,2006年12月第21卷第4期 P473-477。
展开阅读全文