单电梯微控制器.docx
《单电梯微控制器.docx》由会员分享,可在线阅读,更多相关《单电梯微控制器.docx(27页珍藏版)》请在冰豆网上搜索。

单电梯微控制器
HUBEINORMALUNIVERSITY
Verilog课程设计
VerilogCurriculumDesign
所在院系
教育信息与技术学院
专业名称
信息工程
班级
1202
题目
单电梯微控制器设计
指导教师
梁赫西
成员
完成时间
2014年5月27日——2014年6月12日
一、设计任务及要求:
设计任务:
单电梯微控制器
要求:
(1)用S0和S1作为手动上下开关
(2)数码管指示当前所在楼层
(3)用led灯表示电梯当前状态(上/下/停)
(4)利用modelsim和QuartusII仿真综综合
指导教师签名:
2014年6月12日
二、指导教师评语:
指导教师签名:
2014年6月12日
三、成绩
验收盖章
2014年6月12日
单电梯微控制器的设计
1设计目的
采用VerilogHDL,源程序经Multisim软件仿真。
在电梯时钟的触发下,通过当前状态和信号灯信号来判定下一状态。
设计要求:
(1)用S0和S1作为手动上下开关
(2)数码管指示当前所在楼层
(3)用led灯表示电梯当前状态(上/下/停)
(4)利用modelsim和QuartusII仿真综综合
2设计思路
将电梯运行定义为6个状态,具体的状态定义如下:
S1:
floor1,表示在楼层1;
S2:
floor2,表示在楼层2;
S3:
floor3,表示在楼层3;
S4:
floor4,表示在楼层4;
S5:
direction==2'b11,表示电梯向上运动;
S6:
direction==2'b00,表示电梯向下运动;
S7:
direction==2'b10,表示电梯在等待状态;
状态转换图:
表一电梯控制器状态转换条件
现态
次态
转换条件
S1
S5
r_up1==f1|r_up2==f2|r_up3==f3|r_down2==f2|r_down3==f3|r_down4==f4|r_inter2==f2|r_inter3==f3|r_inter4==f4
S2
S5
direction==2'b11的情况下(r_up2==f2|r_up3==f3|r_down4==f4|r_down3==f3|r_inter3==f3|r_inter4==f4)或direction==2'b00的情况下(r_up2==f2|r_up3==f3|r_down4==f4|r_down3==f3|r_inter3==f3|r_inter4==f4)
S2
S6
direction==2'b11的情况下(r_up1==f1|r_down2==f2|r_inter1==f1)或direction==2'b00的情况下(r_up1==f1|r_down2==f2|r_inter1==f1)
S2
S7
S2的下一状态不为S5/S6
S3
S5
direction==2'b11的情况下(r_inter4==f4|r_up3==f3|r_down4==f4)或direction==2'b00的情况下(r_up3==f3|r_down4==f4|r_inter4==f4)
S3
S6
direction==2'b11的情况下(r_inter1==f1|r_inter2==f2)或(r_down2==f2|r_up2==f2)或(r_up1==f1)或direction==2'b00的情况下(r_up1==f1|r_up2==f2|r_down2==f2|r_down3==f3|r_inter1==f1|r_inter2==f2)
S3
S7
S3的下一状态不为S5/S6
S4
S6
r_up1==f1|r_up2==f2|r_up3==f3|r_down2==f2|r_down3==f3|r_down4==f4|r_inter1==f1|r_inter2==f2|r_inter3==f3
S7
S7
没有任何信号请求
3设计过程
系统描述:
1、这是一个4层电梯控制系统
2、在电梯的内部有一个控制面板,它负责按下请求到的楼层,并且显示当前尚未完成的目的地请求,当到达该楼层以后自动撤销本楼层的请求,即将面板灯熄灭.
3、除1层和4层分别只有上/下按钮外,每个楼层(电梯门口旁)的召唤面板都有两个按钮,分别指示上楼和下楼请求.
4、电梯的外部面板会显示电梯当前所在的楼层,及上行还是下行(暂停显示刚才运行时的状态).当电梯在运行时,对应的楼层灯间固定显示一段时间进入下一楼层.
5、电梯向一个方向运行时,只对本方向前方的请求进行应答,直到本方向前方无请求时,才对反方向的请求进行应答。
当前内部控制面板上有的请求,只要经过所在楼层均会立即响应.
设计图:
3.1方案论证
1方案的选择
1、当电梯开始启动的时候,将当前所处的楼层置为第一层,电梯为暂停状态,方向向上,然后等待控制器的调度.
2、等待过程当中(FLOOR保持在该楼层),判断当前楼层(第I层)以上的楼层是否发出召唤或者已经有人已经发请求,若有则向上运行;否则以同样的方法判断是否向下运行;若不向下运行则重复等待状态.
3、若已经判明要向上运行,则首先使运行/暂停触发器置为运行,且标志向上运行,控制LED在该楼层亮后将所在楼层加1,接着判断当前楼层是否发出向上召唤或者已经有人已经发出目的地为第i+1层的请求,若有则在第i+1层停靠;否则判断第i+1层以上的楼层是否发出召唤或者已经有人已经发出目的地为第i+1层以上的请求,若有则向上运行.若不在当前的第i+1层停靠,就使灯闪烁,继续3中开始的操作.如果停靠就修改运行状态为停止,撤销所在楼层的召唤请求和目的地任务,接受用户的目的地请求,然后为等待状态.
3.2模块设计
3.1电梯门控模块设计:
该模块用于控制电梯门的开关
模块定义如下:
moduledoor(
door,//电梯门状态
close_door,//关门信号
open_door,//开门信号
cnt_time,//开门时间计数
status,//电梯运行状态
floor,//到达楼层信号
);
I/O管脚描述
(二)
名称
方向
位宽
功能
clk
input
1
时钟脉冲
rst
input
1
复位信号(高电平有效)
close_door
input
1
关门信号
open_door
input
1
开门信号
door
output
1
电梯门状态
3.2楼层显示模块设计:
该模块用于译码器显示当前所在楼层。
模块定义如下:
modulestorey(
floor,//到达楼层信号
direction,//电梯运行方向
status,//电梯运行状态
cnt,//电梯楼层计数
number,//电梯楼层数
);
I/O管脚描述
(一)
名称
方向
位宽
功能
clk
input
1
时钟脉冲
rst
input
1
复位信号(高电平有效)
floor
input
1
所到楼层信号(高电平有效)
number
output
1
电梯楼层数
3.3电梯控制模块设计:
该模块控制电梯的运行方向,运行状态,并设置指示灯。
模块定义:
modulecontrol(
up1toup3,//电梯外部上升请求
down2todown4,//电梯外部下降请求
inter_button1tointer_button4,//电梯内部靠站请求
led_up1toled_up3,//电梯上升指示灯
led-down2toled_down4,//电梯下降指示灯
status,//电梯运行状态
direction,//电梯运行方向
r_up1tor_up3,
r_down2tor_down4,
r_inter1tor_inter4,
cnt,//楼层计数
floor,//所到楼层信号
);
I/O管脚描述(三)
名称
方向
位宽
功能
clk
input
1
时钟脉冲
rst
input
1
复位信号(高电平有效)
up1toup3
input
1
电梯外部上升请求
down2todown4
input
1
电梯外部下降请求
inter_button1tointer_button4
input
1
电梯内部停站请求
led_up1toled_up3
output
1
电梯上升指示灯
led-down2toled_down4
output
1
电梯下降指示灯
r_up1tor_up3
output
2
电梯上升寄存信号
r_down2tor_down4
output
2
电梯下降寄存信号
r_inter1tor_inter4
output
2
电梯内部请求寄存信号
status
output
1
电梯运行状态
direction
output
1
电梯运行方向
4仿真测试:
在波形仿真中,根据实际,我们有必要做一些假设,即是:
a、外部请求上升的乘客,进入电梯后一定是按更高层的停站按钮;
b、外部请求下降的乘客,进入电梯后一定是按更低层的停站按钮;
c、如果有乘客进入电梯,则一定有停站请求;
d、同一时刻有很多人按键的概率很小,所以我们认为请求信号都有一定的先后顺序。
1、给定测试的总过程是:
开始电梯停在一楼,二楼有人按了向上的请求,电梯未到达二楼前,有人按了三楼停靠请求,紧接着二楼又有人按了向下的请求,然后有人按了一楼的停靠请求,电梯到达三楼后,一楼有人按了向上的请求。
图一仿真结果示意总图
2、这是电梯从一楼运动到三楼的波形,由于电梯向一个方向运行时,只对本方向前方的请求进行应答,直到本方向前方无请求时,才对反方向的请求进行应答。
所以该电梯只回应了从一楼向上的请求。
图二电梯上升过程
3、这时电梯从三楼到一楼的仿真波形,原因同上,当电梯响应完向上的请求后,才处理反方向的信号器2的时钟输入。
图三电梯下降过程
5结论:
在本学期做课程设计的过程中,我学习了VHDL语言的基本语法,也学到了很多东西,本课题在选题及研究过程中遇到了很多难题,让我深刻的意识到课外拓展及自学的重要性。
同时感谢那些给予帮助的同学们,在他们的帮助下,我才能顺利完成设计,另外,在以后的课程设计中,一定要敢于克服难题,多动脑,这样才会有所收获。
参考文献
[1]夏宇闻.《verilog数字系统设计教程》第二版.北京航空航天大学出版社.2006.01
附件
完整程序
modulelift2(clk,//1KHz
reset,//resetsignal,low(0)active
up1,//1stfloor,requestforup,highactive
up2,//2ndfloor,requestforup,highactive
up3,//3rdfloor,requestforup,highactive
down2,//2thfloor,requestfordown,highactive
down3,//3thfloor,requestfordown,highactive
down4,//4thfloor,requestfordown,highactive
inter_button1,//insideofthelift,requestfor1stfloor,highactive
inter_button2,//insideofthelift,requestfor2ndfloor,highactive
inter_button3,//insideofthelift,requestfor3rdfloor,highactive
inter_button4,//insideofthelift,requestfor4thfloor,highactive
close_door,//thesignalforclosethelift'door,highactive
open_door,//thesignalforopenthelift'door,highactive
floor,//thesignalfortheliftarrivingatthefloor,highactive
led_up1,//output
led_up2,//output
led_up3,//output
led_down2,//output
led_down3,//output
led_down4,//output
inter1,//output
inter2,//output
inter3,//output
inter4,//output
status,//output1--operate0--stop
door,//output0--close,1--open
number,//output
r_up1,r_up2,r_up3,r_down2,r_down3,r_down4,
r_inter1,r_inter2,r_inter3,r_inter4
);
inputclk,reset/*,maintain*/;
inputup1,up2,up3,down2,down3,down4;
inputinter_button1,inter_button2,inter_button3,inter_button4;
inputclose_door,open_door;
inputfloor;
outputled_up1,led_up2,led_up3;
outputled_down2,led_down3,led_down4;
outputinter1,inter2,inter3,inter4;
outputdoor;//0--close,1--open
output[1:
0]number;
outputstatus;
output[1:
0]r_up1,r_up2,r_up3,r_down2,r_down3,r_down4,r_inter1,r_inter2,r_inter3,r_inter4;
regled_up1,led_up2,led_up3;
regled_down2,led_down3,led_down4;
reginter1,inter2,inter3,inter4;
regdoor;
reg[1:
0]direction;//11--up,00--down
reg[1:
0]cnt;//countforthefloor
reg[2:
0]cnt_time;//countthetimeforthedoor
regstatus;//operate--1,stop--0
reg[1:
0]r_up1,r_up2,r_up3,r_down2,r_down3,r_down4;
reg[1:
0]r_inter1,r_inter2,r_inter3,r_inter4;
parameterf1=2'd0,//1stfloor
f2=2'd1,//2ndfloor
f3=2'd2,//3rdfloor
f4=2'd3;//4thfloor
parameters1=2'd0,//1stfloor
s2=2'd1,//2ndfloor
s3=2'd2,//3rdfloor
s4=2'd3;//4thfloor
wiret1=(r_up1!
=f1|r_inter1!
=f1);
//-----------------judgethelift'sstorey----------------//
always@(posedgeclkornegedgereset)
begin
if(!
reset)
cnt<=f1;
elseif(status==0)
cnt<=cnt;
elseif(status==1'b1&&floor==1'b1)
begin
if(direction==2'b11)
cnt<=cnt+1;
elseif(direction==0)
cnt<=cnt-1;
elsecnt<=cnt;
end
elsecnt<=cnt;
end
assignnumber=cnt;
//-----------------thelift'sdoor------------------------//
always@(posedgeclkornegedgereset)
begin
if(!
reset)
door<=1'b0;
elseif(status==1'b1)//theliftisoperating.
door<=1'b0;
elseif(close_door&&(status==0&&floor==1))
door<=1'b0;
elseif(cnt_time==3'd5&&(status==0&&floor==1))
door<=1'b0;
elseif(cnt==f1&&s1==0)
door<=1'b0;
elseif(status==0&&floor==1/*&&cnt_time==3'd0*/)//theliftisstopping.
door<=1'b1;
elseif(open_door&&(status==1'b0&&floor==1'b1))
door<=1'b1;
elsedoor<=door;
end
always@(posedgeclkornegedgereset/*orposedgedoor*/)
begin
if(!
reset)
cnt_time<=3'd0;
elseif(door==1'b1)
cnt_time<=cnt_time+1;
elsecnt_time<=3'd0;
end
//------------------theliftcontrol---------------------//
always@(posedgeclkornegedgereset)//thelift'srequest----the1stfloor
begin
if(!
reset)
begin
led_up1<=1'b0;
r_up1<=2'b11;
end
elseif(up1)
begin
r_up1<=f1;
led_up1<=1'b1;
end
elseif(cnt==s1)
begin
led_up1<=1'b0;
r_up1<=2'b11;
end
end
always@(posedgeclkornegedgereset)//thelift'srequest----the2ndfloor
begin
if(!
reset)
begin
led_up2<=1'b0;
r_up2<=2'b00;
end
elseif(up2)
begin
r_up2<=f2;
led_up2<=1'b1;
end
elseif(cnt==s2)
begin
led_up2<=1'b0;
r_up2<=2'b00;
end
end
always@(posedgeclkornegedgereset)//thelift'srequest
begin
if(!
reset)
begin
led_up3<=1'b0;
r_up3<=2'b00;
end
elseif(up3)
begin
r_up3<=f3;
led_up3<=1'b1;
end
elseif(cnt==s3)
begin
led_up3<=1'b0;
r_up3<=2'b00;
end
end
always@(posedgeclkornegedgereset)//thelift'srequest
begin
if(!
reset)
begin
led_down2<=1'b0;
r_down2<=2'b00;
end
elseif(down2)
begin
r_down2<=f2;
led_down2<=1'b1;
end
elseif(cnt==s2)
begin
led_down2<=1'b0;
r_down2<=2'b00;
end
end
always@(posedgeclkornegedgereset)//thelift'srequest
begin
if(!
reset)
begin
led_down3<=1'b0;
r_down3<=2'b00;
end
elseif(down3)
begin
r_down3<=f3;
led_down3<=1'b1;
end
elseif(cnt==s3)
begin
led_down3<=1'b0;
r_down3<=2'b00;
end
end
always@(posedgeclkornegedgereset)//thelift'srequest
begin
if(!
reset)
begin
led_down4<=1'b0;
r_down4<=2'b00;
end
elseif(down4)
begin
r_down4<=f4;
led_down4<=1'b1;
end
elseif(cnt==s4)
begin
led_down4<=1'b0;
r_down4<=2'b00;
end