EDA课程设计(电梯)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计(综合实验)报告( 2010 -- 2011 年度第 1 学期)
名称:EDA课程设计
题目:电梯控制的实现
院系:
班级:
学号:
学生姓名:
指导教师:
设计周数:1周
成绩:
日期:年月日
一、课程设计的目的与要求
用Mealy有限状态机设计二个楼层电梯控制程序。
用VHDL语言写出Mealy有限状态机控制模块。
Mealy有限状态机的输出受控于当前的状态和信号输入的变化,一旦这敏感信号被测,输出的信号就依赖于它们得到确定。
电梯控制器的工作原理:
当电梯空闲时,其状态等待着其他楼层的请求,一旦有请求输入信号,电梯移动到该请求信号的楼层,这时引起电梯门被关闭。
引起电梯门关闭的条件有如下二个:①必须在地面楼层状态StateGround;②首层有请求输入信号ReqFirst。
电梯开始移动到请求层,在移动过程中State从Ground转变为GoingFirst。
当到达请求层后,电梯门被打开并且请求灯熄灭,此状态转换为First状态。
这时如有其他楼层请求信号输入将引起电梯门的关闭(如地面层有楼层请求信号ReqGround)。
当电梯门正在做关闭动作时,同时又要做重新打开电梯门的动作,其条件必须有当前楼层请求信号ReqFirst输入(其他请求信号均被忽略)。
电梯门关闭以后,电梯可再次响应其他楼层请求,即这时电梯State状态为First状态,并且又从地面层来一个请求信号ReqGround,将会引起电梯State状态从First状态改变为GoingGround状态,电梯开始往下运行。
在未到达目的地之前,其他请求信号均被忽略。
二、设计正文
本设计是基于VHDL语言开发的两层电梯控制器。
以Quartus Ⅱ为开发环境,最终在EDA实验箱上实现其演示的基本功能。
其功能包括:显示电梯当前所在楼层,显示有请求发生的楼层,响应楼层请求,关门延时设置,电梯开关门显示。
具体描述为:
1、电梯外部有请求开关,一楼一个,二楼一个;电梯内部有乘客到达层次的请求开关。
2、设有电梯所处位置指示装置和电梯运行模式(上升或下降)指示装置。
3、电梯到达请求楼层后,电梯门开启(电梯门指示灯亮),开门四秒后,电梯门关闭(电梯门
指示灯灭),电梯继续响应请求或回到初始状态。
4、电梯初始状态为停在1楼,关门。
5、电梯上升或下降时,终止其他操作。
6、当电梯关门时,同层有请求,先响应同层请求(开门),再响应其他请求(上升或下降)。
具体程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY dianti IS
PORT(clk,reset,up1,down2,stop1,stop2:IN STD_LOGIC;
--按键共有4个,其中电梯内部2个:stop1,stop2,电梯外部一楼一个up1,二楼一个down2 stoplight:buffer STD_LOGIC_VECTOR(2 DOWNTO 1);
--stoplight对应stop按键
uplight,downlight:buffer STD_LOGIC;
--uplight,downlight分别对应up1,down2按键
udsig:BUFFER STD_LOGIC;
--电梯的状态,0代表(预)上升,1代表(预)下
POSITION:BUFFER INTEGER RANGE 1 TO 2;
--电梯的位置
doorlight:buffer STD_LOGIC);
--门灯,开门灯亮,关门灯灭
END dianti;
ARCHITECTURE behav OF dianti IS
TYPE state_type is(stopon1,dooropen,doorclose,wait1,wait2,wait3,wait4,up,down, stop);
--十个状态,初始,开门,关门,延时1~4,上升,下降,停
SIGNAL state:state_type:=stopon1;
SIGNAL clearup,cleardn,anjianclk,dianticlk:STD_LOGIC;
--上升清零,下降清零,按键时钟,电梯时钟
SIGNAL q:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(clk) --设定按键时钟和电梯时钟,外部时钟周期设为50ms
BEGIN
IF(reset='1') THEN
q<="0000";
ELSIF RISING_EDGE(clk) then
q<=q+1;
END IF;
anjianclk<=q(0); --二分频
dianticlk<=q(3); --十六分频
END PROCESS;
cont:PROCESS(reset,dianticlk)
V ARIABLE POS:INTEGER RANGE 3 DOWNTO 1;
BEGIN
IF reset='1' then
state<=stopon1;
clearup<='0';
cleardn<='0'; --复位
elsif rising_edge(dianticlk) THEN
CASE state IS --设定状态机的各个状态
WHEN stopon1=>doorlight<='1'; position<=1;pos:=1; state<=wait1;
WHEN wait1=>state<=wait2; --延时
WHEN wait2=>clearup<='0'; cleardn<='0'; state<=wait3;
WHEN wait3=>state<=wait4;
WHEN wait4=>state<=doorclose;
WHEN doorclose =>doorlight<='0'; --从开门到关门经历5个电梯时钟周期IF udsig='0' THEN --(预)上升状态时
IF position=2 THEN--电梯在二楼时
IF stoplight="00" and uplight='0' and downlight='0' THEN
udsig<='1'; state<=doorclose;
ELSIF stoplight="10" THEN state<=dooropen;
ELSIF downlight='1' THEN state<=dooropen;
ELSE
udsig<='1'; state<=down;
END IF;
ELSIF position=1 THEN --电梯在一楼时
IF stoplight="00" and uplight='0' and downlight='0' THEN
udsig<='0'; state<=doorclose;
ELSIF stoplight="01" THEN state<=dooropen;
ELSIF uplight='1' THEN state<=dooropen;
ELSE
udsig<='0'; state<=up;
END IF;
END IF;
ELSIF udsig='1' THEN --(预)下降状态时
IF position=1 THEN --电梯在一楼
IF stoplight="00" and uplight='0' and downlight='0' THEN
udsig<='0'; state<=doorclose;
ELSIF stoplight="01" THEN state<=dooropen;
ELSIF uplight='1' THEN state<=dooropen;
ELSE
udsig<='0'; state<=up;
END IF;
ELSIF position=2 THEN--电梯在二楼时
IF stoplight="00" and uplight='0' and downlight='0' THEN
udsig<='1'; state<=doorclose;
ELSIF stoplight="10" THEN state<=dooropen;
ELSIF downlight='1' THEN state<=dooropen;
ELSE
udsig<='1'; state<=down;
END IF;
END IF;
END IF;
WHEN up=>position<=position+1; pos:=pos+1;
IF (pos=2) THEN
state<=stop;
END IF;
WHEN down=>position<=position-1; pos:=pos-1;
IF (POS=1) THEN
state<=stop;
END IF;
WHEN stop=>state<=dooropen;
WHEN dooropen=>doorlight<='1'; clearup<='1'; cleardn<='1'; state<=wait1;
when others=>state<=stopon1;
end case;
end if;
end process cont;
butt:PROCESS(reset,anjianclk)--设定按键
BEGIN
if reset='1' then
stoplight<="00"; uplight<='0'; downlight<='0';
elsif rising_edge(anjianclk) then
if clearup='1' then
stoplight(position)<='0'; uplight<='0';
else
if up1='1' then uplight<='1';
END IF;
END IF;
if cleardn='1' then
stoplight(position)<='0'; downlight<='0';
else
if down2='1'then downlight<='1';
end if;
end if;
if stop1='1' then stoplight(1)<='1'; end if;
if stop2='1' then stoplight(2)<='1'; end if;
END IF;
END PROCESS butt;
END behav;
功能分析:此程序一共有三个进程(process):时钟设定,状态机设定,按键设定。
状态机进程的运行基于电梯时钟dianticlk,此时钟为外部时钟的周期是外部时钟周期的十六倍;按键设定进程基于按键时钟anjianclk,此时钟的周期为外部时钟周期的两倍。
按键时钟周期比电梯时钟周期短,这就意味着按键设定进程比状态机进程快,这就保证了每一次按键都能扫描并保留而不会被状态机进程中的清零程序消除。
一共有7个灯显示电梯的状况:stoplight1~2、uplight,downlight、udsig、POSITION1~2、doorlight。
电梯的初始状态是停在一楼,门关。
复位键reset可实现电梯的初始功能。
电梯在一楼时,position1=1,其灯亮,并且电梯一直保持预上升状态,udsig=1,其灯亮。
当接到一楼外部请求信号(up1)时,uplight亮,电梯门打开,doorlight亮。
四秒后,电梯门关,doorlight灭。
这时,只有收到去二楼的请求(stop2)时,才会上二楼,此时stoplight2亮,直到门开为止。
若门关时接收到的是stop1的请求,则电梯不上二楼,门开,四秒后门再关闭。
当电梯停在二楼是,情况类似。
仿真结果如下图:
电梯在一楼,乘客在外部按up1请求进入,进入电梯后按stop2请求上二楼电梯在一楼,乘客在外部按up1请求进入,进入电梯后按stop1请求出电梯
电梯在二楼,乘客在外部按down2请求进入,进入电梯后按stop1请求下一楼
三、课程设计总结
本设计是基于VHDL语言开发的两层电梯控制器。
以Quartus Ⅱ为开发环境,最终在EDA实验箱上实现其演示的基本功能。
其功能包括:显示电梯当前所在楼层,显示有请求发生的楼层,响应楼层请求,关门延时设置,电梯开关门显示。
这个课程设计还有很多不足之处:
1、电梯各个进程依赖于3个不同的时钟,这样做虽然比较精确但是显得有些多余,经老师的指导后发现其实除了开关门过程时需要时钟以外其他地方不用时钟也没有关系。
2、没有考虑到消抖问题。
3、电梯控制程序只实现了两层楼电梯的控制,这种电梯在现实生活中应用很少,而且此程序不方便向更多层电梯控制器程序扩展。
本课程设计遇到了不少困难,主要原因是由于平时学习没有特别系统认真,所以对VHDL语言没有熟练掌握,很多语句的具体含义和应用都不是很了解,编程时遇到一定的困难。
我是第一次接触这种EDA实验箱,第一次设计一个完整的程序然后连线运行,这个过程让我感受到了动手做实验的乐趣。
很感谢老师的悉心教导和同学的热心帮助,让我比较顺利的做出了这个课程设计。
通过这次课程设计,我深刻了解到光学会课本上的知识没有用,还要运用到实践中,考试100分不代表就能熟练掌握这项技术。
四、参考文献
侯伯亨,刘凯,顾新. VHDL硬件描述语言与数字逻辑电路设计(第三版). 西安电子科技大学出版社. 2009
曾繁泰,陈美金. VHDL数字系统设计. 清华大学出版社. 2001
曾繁泰,陈美金. VHDL程序设计. 清华大学出版社. 2001。