智能电梯控制器设计报告.docx
《智能电梯控制器设计报告.docx》由会员分享,可在线阅读,更多相关《智能电梯控制器设计报告.docx(31页珍藏版)》请在冰豆网上搜索。
![智能电梯控制器设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/26/b98bbb5c-9e08-464d-bd85-6df99f5fb3f1/b98bbb5c-9e08-464d-bd85-6df99f5fb3f11.gif)
智能电梯控制器设计报告
(封面)
XXXXXXX学院
智能电梯控制器设计报告
题目:
院(系):
专业班级:
学生姓名:
指导老师:
时间:
年月日
一、设计要求与思路
1.1设计要求
①楼层的高度大于等于6,根据降低运行成本的原则,设计并实现一个以方向优先电梯调度算法。
②要求能够使用按键模拟对电梯的控制,为了便于观察,将电梯所在的楼层(1~6)用数码管显示出来,将电梯的上下楼状态(上,下,开门,关门,静止)用发光管或数码管显示出来,并且能够实现对电梯实现锁定禁止运行。
③画出电梯控制器的状态机,写出状态编码方案。
④用Verilog语言对设计进行描述,并下载到实验板上调试成功,适当增加比较符合现实的控制限制。
⑤写出设计性实验报告,并打印各层次的源文件和仿真波形,然后作简要说明。
并谈谈此次实验的收获、感想及建议
1.2设计思路
我把电梯的状态分为三种:
上升、下降、停留(其中包括开门、关门、禁止),状态分别编码为00、01、10来识别。
楼层设计为六层,一般的电梯在每层外面都有上下请求的按钮,还有电梯内部的一楼到六楼的请求,以及持续开门、关门的请求。
我们可以通过按键的输入对各种变量进行赋值,代表不同的请求,然后用case语句分各个楼层进行条件判断,每层分为两大块的响应,即本层有无需求,若有需求,则进行开门动作,若无需求,则分上升的状态和下降和停留的状态,分别又有不同的请求(除第一层和第六层特殊,只有上升的或下降的请求),上升下降分别作不同的响应(主要对i值进行变化)即可
输入主要用按键实现(六个楼层加向上向下两个,共八个),电梯的状态分为4种,上升,下降,停留,禁止分别用4个LED灯来表示,用数码管显示电梯所在楼层。
对电梯的锁定操作,是同时按上下两个按键,电梯锁定的操作是电梯自动回到一楼,并对请求无任何响应。
之后对该系统进行了改进,对于开门与关门的区别,我采用LCD显示,主要是对停留状态进行进一步分解,停留时对LCD显示进行控制,从而显示开门关门状态。
二、系统设计
2.1系统框图和说明
系统分为四个模块,分别为分频模块、LCD模块、数码管显示模块、主控制模块,各模块协调工作,共同实现电梯系统的正常运行。
外界请求时钟
时钟50MHz输入1Hz1Hz
时钟输入为开发板上自带的50MHz的晶体振荡器,外界请求表示拨动各种开关来实现不同的请求。
LCD显示包括LCD的初始延时,LCD的主程序,LCD的控制程序。
2.2各模块的详细说明
分频模块
分频模块的实现是靠对输入的时钟进行计数来实现的,计数到一定的数后对输出的时钟进行取反,同时计数清零,重新进行计数,这样就实现了分频。
主程序模块
主程序模块主要是对楼层i进行划分,分别写其对输入信号的响应。
开始是把各种input与所设的变量进行联系,这样对变量就可以对整个系统进行控制。
情况可分为以下几种,首先是本层有无需求,若有,则进行停留,并进行开门关门动作,若无,则又根据电梯的状态进行分类,上升,下降或者停留,其中都各有上升的请求、下降的请求;对情况进行分析,然后对变量重新赋值,这样再下一个时钟来时就会继续产生不同的响应,此时的状态也有变化。
其中上升下降的操作用i+1,i-1来实现。
LCD模块
LCD模块主要是主控制程序中的control变量进行控制,对于每次control变化,LCD都会重新写一次数据,并且数据也是根据control的不同进行选择。
数码管模块
数码管模块是对楼层i进行译码然后进行显示,这里不赘述。
2.3系统转态转换图
状态图分析:
每当条件变化时,状态再一定的时间后更新,然后通过LED灯和数码管可以看到状态的变化。
S=00表示电梯处于停留状态,此间可进行开门关门操作,即用LCD显示开门关门状态;S=01代表电梯处于上升阶段,S=10代表电梯处于下降阶段,其状态的转换是根据有无上升下降的需求来进行条件判断的,每一次状态转换都会对已完成的需求进行清零操作,然后进行下一步的请求执行。
实例说明:
当此时电梯处于一楼,我们将六楼的开关向上拨动并复位,此时将变量floor3[5]=1,符合向上的要求,即只需floor3[1]~floor[5]任意一个为一,都会执行i+1操作,并将状态识别为S=01,直到电梯到达六楼,此时i=6,floor[5]=1,满足开门的条件判断,将状态转换为00,并改变control的值来实现LCD的显示,control=10,显示开门,0.5S后改为control=11,显示关门,最后control=00,即清屏,关门结束,不显示任何信息。
2.4输入输出设计
按键输入
上面左边的六个键分别是各层楼的需求按钮(从右到左分别是1~6)右边单独的两个是A、B两个键,分别表示外面有需求(配合楼层键进行)。
注意楼层键拨动后要复位,然后是A、B两键都拨上去的时候,电梯自动锁定,并且自动回到一楼。
数码管和LCD
LCD显示的箭头方向表示开门和关门,最右端的数码管显示电梯所在楼层。
LED灯
左边单个亮表示电梯处于停留状态,后面三个,第一个表示上升状态,第二个表示电梯锁定状态,第三个表示下降状态。
三、系统仿真
3.1各个情况下的仿真波形
注意,这里是在使用时钟分频前仿真的。
有以下各种情况:
上升请求
下降请求
多个上升请求
多个下降请求
电梯锁定
四、实验总结
4.1心得体会
本次的电子课程设计我选择了智能电梯控制。
选择题目时,因为电梯是我们再熟悉不过的了,所以以为设计会比较简单,然而真正实现起来并没有那么容易。
首先电梯请求会有多种情况,如何选取最有效率的步骤才是关键。
后来我通过实际了解电梯的流程,来通过状态图表示了算法。
本次课设我觉得给我最大的收获就是对Verilog语言的掌握和模块思想的更深刻的理解。
在大二时,我们学习了数字电路中的Verilog,并通过它进行了FPGA的数字钟设计。
然而此次的课程设计却要远远难于数字钟。
因此经过分析之后,我决定把大工程分成几个子模块来进行分别设计,这样会降低难度,也利于管理。
之后我又学习了Verilog语言,通过Altera公司网站上的教程,因此对它也有了更好的掌握。
附录:
源代码
moduledianti(ledup,leddown,ledforbid,ledstay,A,B,c1,c2,c3,c4,c5,c6,clock,out,LCD_DATA,LCD_EN,LCD_RS,LCD_RW,LCD_ON,LCD_BLON,test);
outputledup,leddown,ledstay,ledforbid;
output[6:
0]out;
outputLCD_EN,LCD_RS,LCD_RW,LCD_ON,LCD_BLON;
output[1:
0]test;//用于测试开门关门状态
inputA,B,clock,c1,c2,c3,c4,c5,c6;
inout[7:
0]LCD_DATA;//.输入输出变量的声明
reg[4:
0]floor1;
reg[5:
1]floor2;
reg[5:
0]floor3;
reg[3:
0]i;
reg[1:
0]s;
reg[6:
0]out;
reg[3:
0]t;
reg[1:
0]control;//寄存器变量
wireclk_out;//分频后的输出时钟
wire[1:
0]test;
regledup,leddown,ledforbid,ledstay;
assigntest=control;
Clockc(clock,clk_out);//分频
LCDd(clock,control,LCD_DATA,LCD_EN,LCD_RS,LCD_RW,LCD_ON,LCD_BLON);//LCD显示
always@(posedgeclk_out)
begin
t<=t+4'b0001;
ledup<=(s==2'b01&&!
(A==1&&B==1));//电梯上升中
leddown<=(s==2'b10&&!
(A==1&&B==1));//电梯下降中
ledforbid<=(A==1&&B==1);//电梯处于锁定
ledstay<=(s==2'b00&&!
(A==1&&B==1));//电梯停留
if(A==1&&B==0)
begin//requestup
if(c5==1)
floor1[4]<=1;
if(c4==1)
floor1[3]<=1;
if(c3==1)
floor1[2]<=1;
if(c2==1)
floor1[1]<=1;
if(c1==1)
floor1[0]<=1;
end
elseif(B==1&&A==0)
begin//requestdown
if(c6==1)
floor2[5]<=1;
if(c5==1)
floor2[4]<=1;
if(c4==1)
floor2[3]<=1;
if(c3==1)
floor2[2]<=1;
if(c2==1)
floor2[1]<=1;
end
elseif(A==0&&B==0)//requestintheelv
begin
if(c6==1)
floor3[5]<=1;
if(c5==1)
floor3[4]<=1;
if(c4==1)
floor3[3]<=1;
if(c3==1)
floor3[2]<=1;
if(c2==1)
floor3[1]<=1;
if(c1==1)
floor3[0]<=1;
end
else
begin
floor1[4:
0]<=floor1[4:
0];
floor2[5:
1]<=floor2[5:
1];
floor3[5:
1]<=floor3[5:
1];
floor3[0]<=1;
end
case(i)
1:
//the1stfloor
begin
if(floor1[0]==1'b1||floor3[0]==1'b1)//openthendoor
begin
if(t==2)
begin
s<=2'b00;//stop
control<=2'b10;
end
if(t==4)
begin
control<=2'b11;
end
if(t==6)
begin
floor1[0]<=1'b0;
floor3[0]<=1'b0;
control<=2'b00;
t<=0;
end
end
elseif(floor1[0]!
=1'b1&&floor3[0]!
=1'b1&&t==2)
begin
t<=0;
if(floor1[4:
1]==4'b0000&&floor2[5:
1]==5'b00000&&floor3[5:
1]==5'b00000)
i<=1;
else
begin
s<=2'b01;//up
i<=i+4'b0001;
end
end
end
2:
//the2edfloor
begin
if((floor1[1]==1'b1||floor3[1]==1'b1))//本层有需求,停留后开门和关门
begin
if(t==2)
begin
s<=2'b00;
control<=2'b10;
end
if(t==4)
begin
control<=2'b11;//开门
end
if(t==6)
begin
floor1[1]<=1'b0;
floor3[1]<=1'b0;
control<=2'b00;//关门
t<=0;
end
end
elseif(!
(s==2'b01&&(floor1[1]==1'b1||floor3[1]==1'b1))&&!
(s==2'b10&&(floor2[1]==1'b1||floor3[1]==1'b1))&&t==2)//本层无需求
begin
t<=0;
if(s==2'b01)//若处于上升中
if(floor1[4:
2]!
=3'b000||floor2[5:
2]!
=4'b0000||floor3[5:
2]!
=4'b0000)//上面有需求
i<=i+4'b0001;
elseif(floor1[4:
2]==3'b000&&floor2[5:
2]==4'b0000&&floor3[5:
2]==4'b0000&&floor3[0]==1'b1)//下面有需求
begin
s<=2'b10;//down
i<=i-4'b0001;
end
else
s<=2'b00;
elseif(s==2'b10)//down//若处于下降中
if(floor3[0]!
=1'b0||floor1[0]!
=1'b0)//下面有需求
i<=i-4'b0001;
elseif(floor1[0]==1'b0&&floor3[0]==1'b0&&floor1[4:
2]!
=3'b000)//上面有需求
begin
s<=2'b01;//up
i<=i+4'b0001;
end
else
s<=2'b00;
elseif(s==2'b00)//若处于停留
if(floor1[4:
2]!
=3'b000||floor2[5:
2]!
=4'b0000||floor3[5:
2]!
=4'b0000)//上面有需求
begin
s<=2'b01;//up
i<=i+4'b0001;
end
elseif(floor1[0]!
=1'b0||floor3[0]!
=1'b0)//下面有需求
begin
s<=2'b10;//down
floor2[1]<=1'b0;
floor3[1]<=1'b0;
i<=i-4'b0001;
end
end
end
//下面几层都和二层的情况一样,故不做相应的注释
3:
//the3rdfloor
begin
if((floor1[2]==1'b1||floor3[2]==1'b1))//openthendoor
begin
if(t==2)
begin
s<=2'b00;
control<=2'b10;
end
if(t==4)
begin
control<=2'b11;
end
if(t==6)
begin
floor1[2]<=1'b0;
floor3[2]<=1'b0;
control<=2'b00;
t<=0;
end
end
elseif((floor2[2]==1'b1||floor3[2]==1'b1))//openthendoor
begin
if(t==2)
begin
s<=2'b00;
control<=2'b10;
end
if(t==4)
begin
control<=2'b11;
end
if(t==6)
begin
floor2[2]<=1'b0;
floor3[2]<=1'b0;
control<=2'b00;
t<=0;
end
end
elseif(!
(s==2'b01&&(floor1[2]==1'b1||floor3[2]==1'b1))&&!
(s==2'b10&&(floor2[2]==1'b1||floor3[2]==1'b1))&&t==2)
begin
t<=0;
if(s==2'b01)//up
if(floor1[4:
3]!
=2'b00||floor2[5:
3]!
=3'b000||floor3[5:
3]!
=3'b000)
i<=i+4'b0001;
elseif(floor1[4:
3]==2'b00&&floor2[5:
3]==3'b000&&floor3[5:
3]==3'b000&&(floor2[1]!
=1'b0||floor3[1:
0]!
=2'b00))
begin
s<=2'b10;//down
i<=i-4'b0001;
end
else
s<=2'b00;
elseif(s==2'b10)//down
if(floor1[1:
0]!
=2'b00||floor3[1:
0]!
=2'b00||floor2[1]!
=1'b0)
i<=i-4'b0001;
elseif(floor2[1]==1'b0&&floor3[1:
0]==2'b00&&floor3[1:
0]==2'b00&&floor1[4:
3]!
=2'b00)
begin//up
s<=2'b01;
i<=i+4'b0001;
end
else//stop
s<=2'b00;
elseif(s==2'b00)
if(floor1[4:
3]!
=2'b00||floor2[5:
3]!
=3'b000||floor3[5:
3]!
=3'b000)//up
begin
s<=2'b01;
i<=i+4'b0001;
end
elseif(floor1[1:
0]!
=2'b00||floor2[1]!
=1'b0||floor3[1:
0]!
=2'b00)//down
begin
s<=2'b10;
i<=i-4'b0001;
end
else
s<=2'b00;
end
end
4:
//the4thfloor
begin
if((floor1[3]==1'b1||floor3[3]==1'b1))//openthendoor
begin
if(t==2)
begin
s<=2'b00;
control<=2'b10;
end
if(t==4)
begin
control<=2'b11;
end
if(t==6)
begin
floor1[3]<=1'b0;
floor3[3]<=1'b0;
control<=2'b00;
t<=0;
end
end
elseif((floor2[3]==1'b1||floor3[3]==1'b1))//openthendoor
begin
if(t==2)
begin
s<=2'b00;
control<=2'b10;
end
if(t==4)
begin
control<=2'b11;
end
if(t==6)
begin
floor2[3]<=1'b0;
floor3[3]<=1'b0;
control<=2'b00;
t<=0;
end
end
elseif(!
(s==2'b01&&(floor1[3]==1'b1||floor3[3]==1'b1))&&!
(s==2'b10&&(floor2[3]==1'b1||floor3[3]==1'b1))&&t==2)
begin
t<=0;
if(s==2'b01)//up
if(floor1[4]!
=1'b0||floor2[5:
4]!
=2'b00||floor3[5:
4]!
=2'b00)
i<=i+4'b0001;
elseif(floor1[4]==1'b0&&floor2[5:
4]==4'b00&&floor3[5:
4]==4'b00&&(floor2[2:
1]!
=2'b00||floor3[2:
0]!
=3'b000))
begin
s<=2'b10;//down
i<=i-4'b0001;
end
else
s<=2'b00;
elseif(s==2'b10)//down
if(floor1[2:
0]!
=3'b000||floor3[2:
0]!
=3'b000||floor2[2:
1]!
=2'b00)
i<=i-4'b0001;
elseif(floor2[2:
1]==2'b00&&floor3[2:
0]==3'b000&&floor1[4]==1'b1)
begin
s<=2'b01;//up
i<=i+4'b0001;
end
else
s<=2'b00;
elseif(s==2'b00)
if(floor1[4]!
=1'b0||floor2[5:
4]!
=2'b00||floor3[5:
4]!
=4'b00)
begin
s<=2'b01;//up
i<=i+4'b0001;
end
elseif(floor1[2:
0]!
=3'b000||floor2[2:
1]!
=2'b00||floor3[2:
0]!
=3'b000)
begin
s<=2'b10;//down
i<=i-4'b0001;
end
end
end
5:
//the5thfloor
begin
if((floor1[4]==1'b1||floor3[4]==1'b1))//openthendoor
begin
if(t==2)
begin
s<=2'b00;
control<=2'b10;
end
if(t==4)
begin
control<=2'b11;
end
if(t==6)
begin
floor1[4]<=1'b0;
floor3[4]<=1'b0;
control<=2'b00;
t<=0;
end
end
elseif((floor2[4]==1'b1||floor3[4]==1'b1))//openthendoor
begin
if(t==2)
begin
s<=2'b00;
control<=2'b10;
end
if(t==4)
begin
control<=2'b11;
end
if(t==6)
begin
floor2[4]<=1'b0;
floor3[4]<=1'b0;
control<=2'b00;
t<=0;
end
end
elseif(!
(s==2'b01&&(floor1[4]==1'b1||floor3[4]==1'b1))&&!
(s==2'b10&&(floor2[4]==1'b1||floor3[4]==1'b1))&&t==2)
begin
t<=0;
if(s==2'b01)//up
if(floor3[5]==1'b1||floor2[5]==1'b1)
i<=i+4'b0001;
elseif(floor2[5]==1'b0&&floor3[5]==1'b0&&(floor2[3:
1]!
=3'b000||floor3[3:
0]!
=4'b0000))
begin
s<=2'b1