VHDL电梯实验报告.docx
- 文档编号:29524245
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:14
- 大小:42.02KB
VHDL电梯实验报告.docx
《VHDL电梯实验报告.docx》由会员分享,可在线阅读,更多相关《VHDL电梯实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
VHDL电梯实验报告
三层电梯
实验报告
一、设计课题的任务要求
题目三简易二层电梯控制器
模拟真实电梯的运行情况,设计制作一个简易电梯控制器控制二层电梯的运行。
基本要求:
1、电梯设有一层、二层外部呼叫按钮和内部一层、二层指定按钮(BTN)。
2、利用数码管显示电梯所在楼层,用LED显示电梯运行状态如上行、下行、开门、关门等。
提高要求:
1、点阵显示楼层;
2、用点阵显示楼层的上下滚动移出移入表示电梯的上行或下行运行方向
3、增加为三层电梯控制器
二、系统设计(包括设计思路、总体框图、分块设计)
设计思路:
直接做三层的电梯,用点阵显示楼层。
运用有限状态机,按电梯所在的状态进行讨论。
状态有:
stopon1(电梯停在1层)、dooropen(开门),doorclose(关门),doorwait1(开门等待第1秒),doorwait2(开门等待第2秒),up(上升),down(下降),stop(停止)
总体框图:
分块设计:
没有用分块设计,只是用了多个进程。
三、波形分析:
起初有个三楼内部停楼请求,电梯开始上升,uplight亮,停在三楼,uplight灭,doorlight亮,保持开门3秒后关门,doorlight灭。
接着先后收到一个二楼外部上升请求和一个一楼外部上升请求,电梯开始下降,downlight亮,但电梯没有停在二楼而是直接下到一楼,downlight灭,doorlight亮,保持开门3秒后关门,doorlight灭,接着再开始上升,uplight亮,上升到二楼,uplight灭,doorlight亮,保持开门3秒后关门。
这完全符合现实中电梯运行的方式。
四、源程序(要有注释)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdiantiIS
PORT(clk:
INSTD_LOGIC;--50M时钟信号
reset:
INSTD_LOGIC;--重置
f1upbutton:
INSTD_LOGIC;--一楼外部上升请求
f2upbutton:
INSTD_LOGIC;--二楼外部上升请求
f2dnbutton:
INSTD_LOGIC;--二楼外部下降请求
f3dnbutton:
INSTD_LOGIC;--三楼外部下降请求
stop1button,stop2button,stop3button:
INSTD_LOGIC;--内部停站请求
uplight:
OUTSTD_LOGIC;--向上运行指示灯
downlight:
OUTSTD_LOGIC;--向下运行指示灯
doorlight:
OUTSTD_LOGIC;--开门关门指示灯灯亮表示开门灯灭表示关门
row:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--点阵行
col:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));--点阵列
ENDdianti;
ARCHITECTUREaOFdiantiIS
TYPElift_stateIS
(stopon1,dooropen,doorclose,doorwait1,doorwait2,up,down,stop);--有限状态机
SIGNALnowlift,nextlift:
lift_state:
=stopon1;
SIGNALliftclk:
STD_LOGIC;--1S电梯时钟信号
SIGNALtmp:
INTEGERRANGE0TO49999999:
=0;
SIGNALposition:
INTEGERRANGE1TO3:
=1;--电梯位置
SIGNALfuplight:
STD_LOGIC_VECTOR(3DOWNTO1):
="000";--外部上升请求按键指示灯
SIGNALfdnlight:
STD_LOGIC_VECTOR(3DOWNTO1):
="000";--外部下降请求按键指示灯
SIGNALstoplight:
STD_LOGIC_VECTOR(3DOWNTO1):
="000";--停站请求指示灯
SIGNALudsig:
STD_LOGIC:
='0';--0表示上升过程,1表示下降过程
SIGNALcnt:
INTEGERRANGE1TO5:
=1;
SIGNALtmp2:
INTEGERRANGE0TO6:
=1;
SIGNALpo:
INTEGERRANGE1TO3:
=1;
BEGIN
fenpin:
PROCESS(clk,reset)
BEGIN
IFclk'EVENTANDclk='1'THEN
IFtmp=49999999THENtmp<=0;
ELSEtmp<=tmp+1;ENDIF;
IFtmp<25000000THENliftclk<='0';
ELSFliftclk<='1';ENDIF;ENDIF;
ENDPROCESSfenpin;
p1:
PROCESS(reset,liftclk)
BEGIN
IFreset='1'THEN
nowlift<=stopon1;po<=1;
ElSIFliftclk'EVENTANDliftclk='1'THEN
IFnowlift=upTHEN
IFposition=1THENpo<=2;
ELSIFposition=2THENpo<=3;ENDIF;
ELSIFnowlift=downTHEN
IFposition=2THENpo<=1;
ELSIFposition=3THENpo<=2;
ENDIF;ENDIF;nowlift<=nextlift;
ENDIF;
ENDPROCESSp1;
p2:
PROCESS(clk,reset,nowlift,position,f1upbutton,f2dnbutton,f2upbutton,f3dnbutton,stop1button,stop2button,stop3button,fdnlight,fuplight,stoplight)
BEGIN
IFclk'EVENTANDclk='1'THEN
IFf1upbutton='1'THENfuplight
(1)<='1';ENDIF;
IFf2upbutton='1'THENfuplight
(2)<='1';ENDIF;
IFf2dnbutton='1'THENfdnlight
(2)<='1';ENDIF;
IFf3dnbutton='1'THENfdnlight(3)<='1';ENDIF;
IFstop1button='1'THENstoplight
(1)<='1';ENDIF;
IFstop2button='1'THENstoplight
(2)<='1';ENDIF;
IFstop3button='1'THENstoplight(3)<='1';ENDIF;
CASEnowliftIS
WHENstopon1=>
fuplight<="000";fdnlight<="000";stoplight<="000";
doorlight<='0';uplight<='0';downlight<='0';
udsig<='0';position<=1;tmp2<=1;
nextlift<=doorclose;
WHENdoorwait1=>nextlift<=doorwait2;
WHENdoorwait2=>nextlift<=doorclose;
WHENdoorclose=>doorlight<='0';
IFudsig='0'THEN
IFposition=3THEN
IFstoplight="000"ANDfuplight="000"ANDfdnlight="000"THENnextlift<=doorclose;
ELSIFstoplight(3)='1'ORfdnlight(3)='1'THENnextlift<=stop;
ELSEnextlift<=down;
ENDIF;tmp2<=3;ENDIF;
IFposition=2THEN
IFstoplight="000"ANDfuplight="000"ANDfdnlight="000"THENnextlift<=doorclose;
ELSIFstoplight
(2)='1'ORfuplight
(2)='1'THENnextlift<=stop;
ELSIFstoplight(3)='1'ORfdnlight(3)='1'THENnextlift<=up;
ELSIFfdnlight
(2)='1'THENnextlift<=stop;
ELSIFstoplight
(1)='1'ORfuplight
(1)='1'THENnextlift<=down;
ENDIF;tmp2<=2;ENDIF;
IFposition=1THEN
IFstoplight="000"ANDfuplight="000"ANDfdnlight="000"THENnextlift<=doorclose;
ELSIFstoplight
(1)='1'ORfuplight
(1)='1'THENnextlift<=stop;
ELSEnextlift<=up;ENDIF;tmp2<=1;ENDIF;ENDIF;
IFudsig='1'THEN
IFposition=3THEN
IFstoplight="000"ANDfuplight="000"ANDfdnlight="000"THENnextlift<=doorclose;
ELSIFstoplight(3)='1'ORfdnlight(3)='1'THENnextlift<=stop;
ELSEnextlift<=down;ENDIF;tmp2<=3;ENDIF;
IFposition=2THEN
IFstoplight="000"ANDfuplight="000"ANDfdnlight="000"THENnextlift<=doorclose;
ELSIFstoplight
(2)='1'ORfdnlight
(2)='1'THENnextlift<=stop;
ELSIFstoplight
(1)='1'ORfuplight
(1)='1'THENnextlift<=down;
ELSIFfuplight
(2)='1'THENnextlift<=stop;
ELSIFstoplight(3)='1'ORfdnlight(3)='1'THENnextlift<=up;
ENDIF;tmp2<=2;ENDIF;
IFposition=1THEN
IFstoplight="000"ANDfuplight="000"ANDfdnlight="000"THENnextlift<=doorclose;
ELSIFstoplight
(1)='1'ORfuplight
(1)='1'THENnextlift<=stop;
ELSEnextlift<=up;
ENDIF;tmp2<=1;ENDIF;ENDIF;
WHENup=>udsig<='0';uplight<='1';position<=po;
IFposition=1THEN
IF(stoplight
(2)='1'ORfuplight
(2)='1')THENnextlift<=stop;
ELSIF(stoplight(3)='1'ORfdnlight(3)='1')THENnextlift<=up;
ELSIFfdnlight
(2)='1'THENnextlift<=stop;
ELSIF(stoplight
(1)='1'ORfuplight
(1)='1')THENnextlift<=down;
ENDIF;tmp2<=4;ENDIF;
IFposition=2THEN
IF(stoplight(3)='1'ORfdnlight(3)='1')THENnextlift<=stop;
ELSEnextlift<=down;
ENDIF;tmp2<=6;ENDIF;
WHENdown=>udsig<='1';downlight<='1';position<=po;
IFposition=3THEN
IF(stoplight
(2)='1'ORfdnlight
(2)='1')THENnextlift<=stop;
ELSIF(stoplight
(1)='1'ORfuplight
(1)='1')THENnextlift<=down;
ELSIF(fuplight
(2)='1')THENnextlift<=stop;
ELSIF(stoplight(3)='1'ORfdnlight(3)='1')THEN
nextlift<=up;ENDIF;tmp2<=0;ENDIF;
IFposition=2THEN
IF(stoplight
(1)='1'ORfuplight
(1)='1')THENnextlift<=stop;
ELSEnextlift<=up;
ENDIF;tmp2<=5;ENDIF;
WHENstop=>uplight<='0';downlight<='0';nextlift<=dooropen;
position<=po;
IFposition=1THENtmp2<=1;ENDIF;
IFposition=2THENtmp2<=2;ENDIF;
IFposition=3THENtmp2<=3;ENDIF;
WHENdooropen=>
IFudsig='0'THEN
IFposition=1THENfuplight
(1)<='0';stoplight
(1)<='0';
ELSIFposition=3THEN
stoplight(3)<='0';fdnlight(3)<='0';
ELSIFposition=2THEN
IFstoplight(3)='0'ANDfdnlight(3)='0'ANDfuplight
(2)='0'THENfdnlight
(2)<='0';
ENDIF;fuplight
(2)<='0';stoplight
(2)<='0';ENDIF;
ELSIFudsig='1'THEN
IFposition=1THENfuplight
(1)<='0';stoplight
(1)<='0'
ELSIFposition=3THEN
stoplight(3)<='0';fdnlight(3)<='0';
ELSIFposition=2THEN
IFstoplight
(1)='0'ANDfuplight
(1)='0'ANDfdnlight
(2)='0'THEN
fuplight
(2)<='0';ENDIF;
fdnlight
(2)<='0';stoplight
(2)<='0';
ENDIF;ENDIF;
doorlight<='1';nextlift<=doorwait1;
ENDCASE;
ENDIF;
ENDPROCESSp2;
P5:
PROCESS(tmp,clk)--控制点阵的进程
BEGIN
IFclk'EVENTANDclk='1'THEN--上升沿有效
IFcnt=5THENcnt<=1;
ELSEcnt<=cnt+1;ENDIF;
CASETMP2IS
WHEN1=>CASEcntIS
WHEN1=>ROW<="01111111";COL<="10000000";
WHEN2=>ROW<="10111111”;COL<="10000000";
WHEN3=>ROW<="11011111";COL<="10000000";
WHEN4=>ROW<="11101111";COL<="10000000";
WHEN5=>ROW<="11110111"COL<="10000000";
--1
ENDCASE;
WHEN2=>CASEcntIS
WHEN1=>ROW<="01111111";COL<="11100000";
WHEN2=>ROW<="10111111";COL<="10000000";
WHEN3=>ROW<="11011111";COL<="11100000";
WHEN4=>ROW<="11101111";COL<="00100000";
WHEN5=>ROW<="11110111";COL<="11100000";
--2
ENDCASE;
WHEN3=>CASEcntIS
WHEN1=>ROW<="01111111";COL<="11100000";
WHEN2=>ROW<="10111111";COL<="10000000";
WHEN3=>ROW<="11011111";COL<="11100000";
WHEN4=>ROW<="11101111";COL<="10000000";
WHEN5=>ROW<="11110111";COL<="11100000";
--3
ENDCASE;
WHEN4=>CASEcntIS
WHEN1=>ROW<="01111111";COL<="10001100";
WHEN2=>ROW<="10111111";COL<="10001100";
WHEN3=>ROW<="11011111";COL<="10000100";
WHEN4=>ROW<="11101111";COL<="10000100";
WHEN5=>ROW<="11110111";COL<="10000100";
--shang1
ENDCASE;
WHEN5=>CASEcntIS
WHEN1=>ROW<="01111111";COL<="11100100";
WHEN2=>ROW<="10111111";COL<="10000100";
WHEN3=>ROW<="11011111";COL<="11100110";
WHEN4=>ROW<="11101111";COL<="00100110";
WHEN5=>ROW<="11110111";COL<="11100100";
--xia2
ENDCASE;
WHEN6=>CASEcntIS
WHEN1=>ROW<="01111111";COL<="11101100";
WHEN2=>ROW<="10111111";COL<="10001100";
WHEN3=>ROW<="11011111";COL<="11100100";
WHEN4=>ROW<="11101111";COL<="00100100";
WHEN5=>ROW<="11110111";COL<="11100100";
--shang2
ENDCASE;
WHEN0=>CASEcntIS
WHEN1=>ROW<="01111111";COL<="11100100";
WHEN2=>ROW<="10111111";COL<="10000100";
WHEN3=>ROW<="11011111";COL<="11100110";
WHEN4=>ROW<="11101111";COL<="10000110";
WHEN5=>ROW<="11110111";COL<="11100100";
--xia3
ENDCASE;
ENDCASE;
ENDIF;
ENDPROCESS;
ENDa;
五、功能说明
该电梯系统实现的是三层点阵显示电梯系统。
可以同时响应多个请求,并符合现实电梯升降过程。
点阵显示所在楼层和上升下降过程。
LED灯显示开门、关门和上升下降。
因是三层电梯,所以外部请求按键有一楼上升、二楼上升、二楼下降、三楼下降,内部停楼请求按键有一楼,二楼,三楼。
每个状态保持1秒,门开后将保持2秒。
基本实现电梯的各种功能。
六、元器件清单及资源利用情况
doorlightLED5
downlightLED6
uplightLED7
f1upbuttonBTN7
f2dnbuttonBTN6
f2upbuttonBTN5
f3dnbuttonBTN4
stop1buttonBTN3
stop2buttonBTN2
stop3buttonBTN1
resetBTN0
Totallogicelements187/1270(15%)
Totalpins28/116(24%)
七、故障及问题分析
1、编译常出现Can'tresolvemultipleconstantdrivers,这叫“重赋用”,是由于在两个进程里都存在对一个变量赋值,自己写代码认为它们不会同时起作用,但在编译时会考虑所有情况,导致报错。
2、点阵显示不出自己所设计的图形,总有几个点不亮。
是由于分频系数设置不当,在人眼看来有些点没有亮。
八、总结和结论
因为是从上个学期开始接触VHDL,并且只是做了一些基础的实验,在加上漫长的暑假后,导致这学期一开始,自己把VHDL的知识都快忘光了,在自己又重新看了几遍书之后,才记起VHDL的知识。
尽管如此,在初期面对自己所选题目时,还是一片茫然,代码的编写还是挫折重重,屡屡犯错。
这次的数电实验让我收获颇多。
由于三层电梯情况较为复杂,不同于以前所遇到的输出仅与输入有关,需要运用有限状态机的方法,才能把所有情况都考虑到,不会漏掉哪种情况。
为了完成电梯代码的编写,自己去图书馆借了几本相关书看,也上过网搜资料,请假过同学。
这是一个艰辛的代码编写过程,但我收获的不仅是完成数电实验的题目,还从中学到了许多VHDL的相关知识和加深了自己本掌握知识的印象。
我也觉得这次数电实验自己完成的不是很理想。
虽然有点阵显示楼层,但未考虑到现
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 电梯 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)