基于VHDL的三层电梯控制器的设计.docx
- 文档编号:23211318
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:20
- 大小:266.67KB
基于VHDL的三层电梯控制器的设计.docx
《基于VHDL的三层电梯控制器的设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL的三层电梯控制器的设计.docx(20页珍藏版)》请在冰豆网上搜索。
基于VHDL的三层电梯控制器的设计
基于VHDL的三层电梯控制器的设计
姓名:
学号:
班级:
一.设计课题的任务要求:
简易电梯控制器:
模拟真实电梯的运行情况,设计制作一个简易电梯控制器控制二层电梯的运行。
基本要求:
1、电梯设有一层、二层外部呼叫按钮和内部一层、二层指定按钮(BTN)。
2、利用数码管显示电梯所在楼层,用LED显示电梯运行状态如上行、下行、开门、关门等。
提高要求:
1、点阵显示楼层;
2、用点阵显示楼层的上下滚动移出移入表示电梯的上行或下行运行方向
3、增加为三层电梯控制器
二.系统设计:
电梯控制器的功能模块如图所示,包括主控制器、分控制器、楼层选择器、状态显示器、译码器和楼层显示器。
乘客选择所要到达的楼层,通过主控制器的处理之后,电梯开始运行,状态显示器显示当前电梯的上升下降运行状态,电梯所在楼层数通过译码器译码在数码管上显示。
分控制器把有效的请求传给主控制器进行处理,同时显示电梯的运行状态和电梯所在层数。
电梯控制器原理图如下:
根据电梯的实际工作情况,可以为状态机设置八个状态,它们分别是“电梯停在一层”“电梯停在二层”“电梯停在三层”“开门”“关门”“上升”“下降”和“停止”。
由于电梯每秒上升或下降一层,则可以用周期为1s的信号来作为电梯状态转换的触发时钟。
VHDL描述模块流程如下图所示:
电梯控制器流程图:
三.仿真波形及波形分析:
设定仿真时间长度为60s,liftclk信号为周期1s的时钟信号,buttonclk信号为周期0.1s的时钟信号。
doorlight信号‘1’表示开门,‘0’表示关门。
udsig信号‘1’表示电梯处在上升模式,‘0’表示处在下降模式。
fuplight,fdnlight,stoplight是三位二进制向量,波形图中的1代表“001”,表示一层有请求,2代表“010”,表示二层有请求,4代表“100”,表示三层有请求。
图3.1所示的波形是在一层有上升请求的仿真波形,在reset信号产生一个脉冲时,电梯回复初始状态,即stopon1状态,然后等待,关门检测没有请求信号,电梯停在一层。
当电梯时钟上升沿检测到一层上升请求信号fuplight
(1)为‘1’时,电梯开门,fuplight
(1)清零,等待4s,关门检测到二层停站请求,电梯上升到二层停止,开门stoplight
(2)清零,position信号由1变为2,电梯最终停在二层。
图3.1有上升请求的仿真波形
图3.2所示的波形是三层有下降请求的波形,当电梯在一层关门后,检测到fdnlight为“100”,则上升到三层,开门等待4s,关门检测到stoplight为‘1’,电梯下降到一层,最终停在一层。
图3.2有下降请求的仿真波形
图3.3所示的波形是二层和三层都有下降请求的仿真波形,当电梯在一层关门后,检测到fdnlight为“110”,则直接上升到三层,开门后fdnlight(3)清零,等待4s后,关门下降到二层停止,开门后fdnlight
(2)和stoplight
(2)清零,再下降到一层。
图3.3有多个下降请求的仿真波形
图3.4所示的波形为有多个停站请求的仿真波形,电梯在一层关门后,检测到stoplight为“110”,则上升至二层停止开门,stoplight
(2)清零,等待4s后关门,继续上升至三层,开门后stoplight(3)清零,乘客下站后电梯最终停在三层。
图3.4有多个停站请求的仿真波形
图3.5所示,当只有二层有下降请求时,电梯上升至二层,然后下降。
图3.5只有二层有下降请求时的仿真波形
图3.6所示,二层同时有上升和下降请求,电梯上升至二层,门打开等待4s,关门后检测到stoplight(3)和fdnlight
(2)都为‘1’,它会先上升至三层,再下降至二层,待有下降请求的乘客上电梯后,最后下降至一层。
3.6同时有上升和下降请求的仿真波形
从仿真波形来看,电梯的的运行情况符合它的运行规则,电梯的位置变化合理。
四.源程序:
电梯主控程序源代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.all;
USEIEEE.STD_LOGIC_UNSIGNED.all;
ENTITYelevatorIS
PORT(cCLK:
INSTD_LOGIC;
reset:
INSTD_LOGIC;
Button:
INSTD_LOGIC_VECTOR(3DOWNTO0);--button(0)为一层外上升请求,button
(1)为二层外上升请求,
--button
(2)为二楼外下降请求,Button(3)为三层外下降请求;
floor:
INSTD_LOGIC_VECTOR(2DOWNTO0);--floor(0)为电梯内一层请求按钮,floor
(1)为电梯内二层请求按钮,
--floor
(2)为电梯内三层请求按钮;
position:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
--position表示电梯当前位置信息;
led:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
door:
OUTSTD_LOGIC;--'1'为开门,'0'为关门;
up_down:
OUTSTD_LOGIC--'1'为上楼,'0'为下楼;
);
ENDelevator;
ARCHITECTUREBehavOFelevatorIS
TYPEStateIS(S0,S1U,S1D,S2);
--S1U为二楼上状态,S1D为二楼下状态;
SIGNALcurrent_state:
State;--中间变量:
当前状态
SIGNALnext_state:
State;--中间变量:
下一状态
SIGNALup:
STD_LOGIC;--中间变量:
上升下降状态
SIGNALdor:
STD_LOGIC;--中间变量:
开门关门状态
SIGNALbutclk:
STD_LOGIC;
SIGNALclk:
STD_LOGIC;
signalq:
std_logic_vector(23downto0);
begin
process(cclk)
begin
ifrising_edge(cclk)then
q<=q+1;
endif;
butclk<=q
(1);
clk<=q(23);
endprocess;
P1:
PROCESS(CLK)--状态转换进程;
BEGIN
IFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿
current_state<=next_state;
ENDIF;
ENDPROCESS;
P2:
PROCESS(reset,clk,butclk,current_state,up,button,floor)
VARIABLEbutton_var:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEfloor_var:
STD_LOGIC_VECTOR(2DOWNTO0);
VARIABLEcat:
STD_LOGIC;
VARIABLEca_time:
STD_LOGIC_VECTOR(10DOWNTO0);
BEGIN
IFreset='1'THEN--复位处理,初始状态为一层
next_state<=S0;
position<="0001";
led<="01100000";
cat:
='0';
ca_time:
="00000000000";
up<='0';
dor<='0';
button_var(3DOWNTO0):
="0000";
floor_var(2DOWNTO0):
="000";
ELSIFbutclk'eventandbutclk='1'THEN
--若无复位信号,则将外部按钮信号存储到7个变量之中;
IFbutton(0)='1'THENbutton_var(0):
='1';ELSENULL;ENDIF;
IFbutton
(1)='1'THENbutton_var
(1):
='1';ELSENULL;ENDIF;
IFbutton
(2)='1'THENbutton_var
(2):
='1';ELSENULL;ENDIF;
IFbutton(3)='1'THENbutton_var(3):
='1';ELSENULL;ENDIF;
IFfloor(0)='1'THENfloor_var(0):
='1';ELSENULL;ENDIF;
IFfloor
(1)='1'THENfloor_var
(1):
='1';ELSENULL;ENDIF;
IFfloor
(2)='1'THENfloor_var
(2):
='1';ELSENULL;ENDIF;
IFcat='0'THENca_time:
=ca_time+1;ENDIF;--开门,关门计时;
CASEcurrent_stateIS
WHENS0=>--一楼状态处理;
position<="0001";
led<="01100000";
cat:
='0';
IF(button_var(0)orfloor_var(0))='1'THEN
CASEca_timeIS
WHEN"00110000000"=>dor<='1';
WHEN"11111111111"=>dor<='0';
button_var(0):
='0';
floor_var(0):
='0';
IF(floor_var
(1)orfloor_var
(2))='1'THEN
next_state<=S1U;
ca_time:
="00000000000";
up<='1';
ELSE
next_state<=S0;
ca_time:
="00000000000";
ENDIF;
WHENothers=>NULL;
ENDCASE;
ELSIF(button_var
(1)ORbutton_var
(2)orbutton_var(3)orfloor_var
(2)orfloor_var
(1))='1'THEN
next_state<=S1U;
ca_time:
="00000000000";
up<='1';
ELSE
next_state<=S0;
ca_time:
="00000000000";
ENDIF;
WHENS1U=>--二楼上状态处理;
position<="0010";
led<="11011010";
cat:
='0';
IFfloor_var
(1)='1'THEN--二楼内上升请求;
CASEca_timeIS
WHEN"00110000000"=>dor<='1';
WHEN"11111111111"=>dor<='0';
floor_var
(1):
='0';
IF(button_var
(1)orbutton_var(3)orfloor_var
(2))='1'THEN
next_state<=S2;
ca_time:
="00000000000";
button_var
(1):
='0';
ELSIF(button_var(0)orbutton_var
(2)orfloor_var(0))='1'THEN
next_state<=s0;
ca_time:
="00000000000";
button_var
(2):
='0';
ELSE
next_state<=S1U;
ca_time:
="00000000000";
ENDIF;
WHENothers=>NULL;
ENDCASE;
ELSE
IFbutton_var
(1)='1'THEN--二楼外上升请求;
CASEca_timeIS
WHEN"00110000000"=>dor<='1';
WHEN"11111111111"=>dor<='0';
button_var
(1):
='0';
IF(floor_var
(2)orbutton_var(3))='1'THEN
next_state<=S2;
ca_time:
="00000000000";
ELSIF(button_var(0)orfloor_var(0)orbutton_var
(2))='1'THEN
next_state<=s0;
ca_time:
="00000000000";
up<='0';
ELSEnext_state<=S1U;
button_var
(1):
='0';
ENDIF;
WHENothers=>NULL;
ENDCASE;
ELSE
IF(button_var(3)orfloor_var
(2))='1'THEN
--二楼无上楼,开门请求,但三层有下楼或开门请求;
next_state<=S2;
ca_time:
="00000000000";
ELSIFbutton_var
(2)='1'THEN
--二楼无上楼,开门请求,三层也无下楼或开门请求,此
--时二楼有下楼请求;
CASEca_timeIS
WHEN"00110000000"=>dor<='1';
WHEN"11111111111"=>dor<='0';
button_var
(2):
='0';
IF(floor_var(0)orbutton_var(0))='1'THEN
next_state<=s0;
ca_time:
="00000000000";
up<='0';
ELSEnext_state<=S1U;
ca_time:
="00000000000";
ENDIF;
WHENothers=>NULL;
ENDCASE;
ELSIF(button_var(0)orfloor_var(0))='1'THEN
--电梯处于二楼上状态,仅有一楼信号要处理
next_state<=s0;
ca_time:
="00000000000";
up<='0';
ELSE
next_state<=S1U;--无任何信号,保持当前状态不变;
ca_time:
="00000000000";
ENDIF;
ENDIF;
ENDIF;
WHENS1D=>--up='0'时的情况;
position<="0010";
led<="11011010";
cat:
='0';
IFfloor_var
(1)='1'THEN
CASEca_timeIS
WHEN"00110000000"=>dor<='1';
WHEN"11111111111"=>dor<='0';
floor_var
(1):
='0';
IF(button_var
(2)orbutton_var(0)orfloor_var(0))='1'THEN
next_state<=s0;
ca_time:
="00000000000";
button_var
(2):
='0';
ELSIF(button_var
(1)orbutton_var(3)orfloor_var
(2))='1'THEN
next_state<=S2;
ca_time:
="00000000000";
button_var
(1):
='0';
ELSE
next_state<=S1D;
ca_time:
="00000000000";
ENDIF;
WHENothers=>NULL;
ENDCASE;
ELSE
IFbutton_var
(2)='1'THEN
CASEca_timeIS
WHEN"00110000000"=>dor<='1';
WHEN"11111111111"=>dor<='0';
button_var
(2):
='0';
IF(floor_var(0)orbutton_var(0))='1'
THEN
next_state<=s0;
ca_time:
="00000000000";
ELSIF(button_var
(1)orfloor_var
(2)orbutton_var(3))='1'THEN
next_state<=S2;
ca_time:
="00000000000";
up<='1';
ELSE
next_state<=S1D;
ca_time:
="00000000000";
ENDIF;
WHENothers=>NULL;
ENDCASE;
ELSE
IF(button_var(0)orfloor_var(0))='1'THEN
next_state<=s0;
ca_time:
="00000000000";
ELSIFbutton_var
(1)='1'THEN
CASEca_timeIS
WHEN"00110000000"=>dor<='1';
WHEN"11111111111"=>dor<='0';
button_var
(1):
='0';
IF(floor_var
(2)orbutton_var(3))='1'
THEN
next_state<=S2;
ca_time:
="00000000000";
up<='1';
ELSE
next_state<=S1D;
ca_time:
="00000000000";
ENDIF;
WHENothers=>NULL;
ENDCASE;
ELSIF(button_var(3)orfloor_var
(2))='1'THEN
next_state<=S2;
ca_time:
="00000000000";
up<='1';
ELSE
next_state<=S1D;
ca_time:
="00000000000";
ENDIF;
ENDIF;
ENDIF;
WHENS2=>--电梯三楼状态处理;
position<="0011";
led<="11110010";
cat:
='0';
IF(button_var(3)orfloor_var
(2))='1'THEN
CASEca_timeIS
WHEN"00110000000"=>dor<='1';
WHEN"11111111111"=>dor<='0';
button_var(3):
='0';
floor_var
(2):
='0';
IF(floor_var(0)orfloor_var
(1))='1'THEN
next_state<=S1D;
ca_time:
="00000000000";
up<='0';
ELSE
next_state<=S2;
ca_time:
="00000000000";
ENDIF;
WHENothers=>NULL;
ENDCASE;
ELSIF(button_var(0)ORbutton_var
(1)ORbutton_var
(2)orfloor_var(0)orfloor_var
(1))='1'THEN
next_state<=S1D;
ca_time:
="00000000000";
up<='0';
ELSE
next_state<=S2;
ca_time:
="00000000000";
ENDIF;
ENDCASE;
ENDIF;
ENDPROCESS;
P3:
PROCESS(up,dor)--电梯上下,开关门显示;
BEGIN
up_down<=up;
door<=dor;
ENDPROCESS;
ENDBehav;
五.功能说明:
电梯一层设有上升请求开关,二层设有上、下请求开关,三层设有下降请求开关,内部设有一二三层停站请求开关。
每层电梯入口设有指示装置及电梯运行状态(上升或下降)指示装置。
电梯初始状态为一层开门状态。
电梯每秒上升(下降)一层楼。
电梯到达目标楼层,经1秒电梯门打开,开门指示灯亮,开门4秒后,电梯门关闭(开门指示灯灭),电梯继续运行,直至执行完最后一个请求信号后停留在当前层。
电梯需要寄存器来记忆电梯内外所有请求,并按照电梯运行规则按顺序响应,每个请求信号保留至执行后消除。
六.元器件清单及资源利用情况:
使用器件:
8x8点阵,数码管,ledX3,按键开关,MAXII芯片一块。
七.故障及问题分析:
程序调制完成后,由于分频器设置问题,电梯运行的太快,在各个楼层停止时间太短,不符合设计原理,经过共同讨论之后得以改正。
将程序下载以后,发现点阵无法正确显示想要的图形,检查代码后发现是点阵设计问题,纠正后重新下载,经过调试之后能正确显示。
在仿真波形过程中,遇到一点困难,想要的结果不能在波形上得到正确的显示,经过检查发现时时钟设置不合理,经过和同学讨论后加以改正,最后得到正确的仿真结果。
在程序调制成功后,在封装管脚下载程序工程中,由于管脚设置的问题,导致实验板无法显示正确的结果;后来经过仔细检查发现设置有疏漏,经过改正以后可以成功运行。
八.实验总结:
通过这次课程设计,让我明白了理论和实际操作之间差距,而且也让我很明确得意识到自己在数电上有很多的知识漏洞,以后应该多钻研一下。
在这次实课程设计中,我虽然碰到了很多困难和问题,到最后还是靠自己的努力与坚持完成了任务。
当遇到了自己无法解决的困难与问题的时候,还请教老师和同学给予指导和帮助。
这次设计给我最深的印象就是扩大自己的知识面,了解更多与本专业有关的科技信息,觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VHDL 三层 电梯 控制器 设计