完整word版Verilog语言设计电梯控制器文档docx.docx
- 文档编号:11714413
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:49
- 大小:25.25KB
完整word版Verilog语言设计电梯控制器文档docx.docx
《完整word版Verilog语言设计电梯控制器文档docx.docx》由会员分享,可在线阅读,更多相关《完整word版Verilog语言设计电梯控制器文档docx.docx(49页珍藏版)》请在冰豆网上搜索。
完整word版Verilog语言设计电梯控制器文档docx
1)、需求分析;
1、问题描述与要求:
用Verilig语言设计一个电梯控制器,通过实验板对设计进行演示;
要求楼层的高度大于等于6,并且所设计的电梯调度算法满足提高服务质量、降低运行成本的原则。
BACK
2)、系统描述;
1、设定电梯控制器适用的楼层为8层.
2、在电梯的内部有一个控制面板,它负责按下请求到的楼层,并且显示当前尚未完成的目的地
请求,当到达该楼层以后自动撤销本楼层的请求,即将面板灯熄灭.
3、除1层和7层分别只有上/下按钮外,每个楼层(电梯门口旁)的召唤面板都有两个按钮,
分别指示上楼和下楼请求。
当按下后,对应按钮灯亮。
如果电梯已经到达该楼层,按钮灯熄
灭。
4、电梯的外部面板会显示电梯当前所在的楼层,及上行还是下行(暂停显示刚才运行时的状态).当电梯在运行时,对应的楼层灯间固定显示一段时间进入下一楼层;在暂停时,灯一直在该楼层保持亮的状态。
5、电梯调度方案:
电梯向一个方向运行时,只对本方向前方的请求进行应答,直到本方向前
方无请求时,才对反方向的请求进行应答。
当前内部控制面板上有的请求,只要经过所在楼层
均会立即响应.在所有内部外部请求都已完成后,电梯转入等待。
电梯模型:
(如下附图)
第7层
第6层
第5层
第4层
第3层
第2层
第1层
电梯内部的控制面板,
显示信息有:
电梯当前的位置和电梯
当前的运行方向(上\下),以及请
求到达的楼层
控制信息有:
请求要到达的目的楼层
电梯
每楼层的召唤按钮面板,
显示信息有:
当前电梯所
在位置(楼层)和电梯的
运行方向(上\下)
控制信息:
使用电梯的请
求(向上或向下)
BACK
************************************************************
3)、算法设计;
1、电梯基本组成部分及其实现:
(1)FLOOR:
记录电梯所处楼层的记数器.
用模8计数器实现,由001~111的加减记数来表示电梯所在楼层的变化.
(2)RB:
电梯运行状态寄存器组.
用一位寄存器来表示电梯当前是运行还是暂停,再用一位寄存器表示当前或刚才的运行方向,
这样就可以在电梯停止时也可以判断电梯刚才的状态,从而确定下个时刻电梯的后续方向.对
于FLOOR,我们通过三个LED显示.
(3)RC:
电梯目的地信息寄存器,记录电梯还有哪些要去楼层的任务.
每个楼层对应一个状态触发器,同时控制一个LED显示.
(4)RD:
各个楼层召唤信息寄存器,它记录了各楼层还有哪些向上向下的请求.
每个楼层对应两个状态触发器,同时控制两个LED显示向上向下请求.
(5)CALL:
电梯各个楼层的召唤面板,用户通过它发出向上向下的请求;
(6)DESTINATION:
电梯目的地指定命令面板,用户通过它申请要去的楼层;
(7)CONTRAL:
电梯的集中控制器。
2、电梯控制基本结构图:
CALL
LED
LEDRDFLOOR
CONTROL
LED
RC
RB
DESTINATIONLED
N
3、电梯工作过程的具体描述:
a)、当电梯开始启动的时候,将当前所处的楼层置为第一层,电梯为暂停状态,方向向上,
然后等待控制器的调度.
b)、等待过程当中(FLOOR保持在该楼层),首先检测RC和RD,判断当前楼层(第i层)以上的楼层是否发出召唤或者已经有人已经发请求,若有则向上运行;否则以同样的方法判
断是否向下运行;若不向下运行则重复等待状态.
保持原状态循环进行2操作直到检测到有向上或向下的任务.
c)、若已经判明要向上运行,则首先使RB中的运行/暂停触发器置为运行,且标志向上运行,
控制LED在该楼层亮T1时间后将所在楼层加1,这时新的当前楼层(第i+1层)灯亮起,接
着电梯检索RC和RD,判断当前楼层是否发出向上召唤或者已经有人已经发出目的地为第i+1层的请求,若有则在第i+1层停靠;否则检索RC和RD,判断第i+1层以上的楼层是否发出
召唤或者已经有人已经发出目的地为第i+1层以上的请求,若有则向上运行;否则(必定是有第i+1层向下的请求)在第i+1层.若不在当前的第i+1层停靠,就使灯闪烁,继续3中开始的操作.如果停靠就修改运行状态为停止,撤销所在楼层的召唤请求和目的地任务,接受
用户的目的地请求,控制电梯在T2时间后电梯进入2中的等待状态.
注释:
、只要不是当前暂停在的楼层的用户发出的召唤命令都存入RD,以供控制器检索和
判断.
、只要不是当前暂停在的楼层的用户发出的目的地请求都存入RC,供运行过程当中
控制器的检索和判断。
BACK
************************************************************
4、电梯控制流程图:
开始
初始化电梯状
态和控制信息
等待
NO
所在i层以上有召唤
或有电梯内面板目
的地?
YES
向上运行;
i?
i+1
更新状态信息
NO
第i层为电梯目的地
或第i层有向上请求
?
所在i层以上有召唤YES
YES
或有电梯内面板目
的地?
在第i层停;
NO
乘客上下电梯
更新状态信息
NO
所在i层以下有召唤
或有电梯内面板目
的地?
YES
向下运行;
i?
i-1
更新状态信息
第i层为电梯目的地NO
或第i层有向下请求
?
所在i层以下有召唤
或有电梯内面板目
YES
YES
的
在第i层停;NO
乘客上下电梯
更新状态信息
BACK
*********************************************************
5、系统控制器ASM图:
Reset=0
ASM图
s00000
rst=1
s10001
ce=1;rst=0;
ce_Count=0;
Sel_Count=00;
s20010
no
ce=1;
K1?
ce_Count=0;
Sel_Count=01;
no
yes
s3
K2?
0011
yes
up_d=0;
s9
stop_r=1;1001
ce=0;
up_d=1;
stop_r=1;
ce=0;
s40100
ce_Count=1;
s10
1010
ce_Count=1;
s50101
s11
ce_Count=0;
inc_Floor=1;
ce_Count=0;
red_Floor=1;
s6
0110
s12
inc_Floor=0;
red_Floor=0;
sel_Con=10;
sel_Con=11;
s70111
no
K3?
sel_Con=00;K4?
yes
yes
K1?
s81000s14no
ce=1;
ce=1;
stop_r=0;
stop_r=0;
ce_Count=1
ce_Count=1
1011
1100
s1311
no
sel_Con=01;
yes
K2?
no
1110
BACK
************************************************************
4)、硬件实现;
为了更好地实现电梯的功能我们将其划分为数据处理单元和控制单元。
控制器通过
control模块实现它统一向其它各个模块发出控制信号,并且接收condition和counter模块
的反馈信号,使得个子运算按照算法设计中的顺序有序的进行,在S0~S14的状态之间进行
合理的跳转,从而完成电梯的各项逻辑功能。
下面分别简述使用verilog语言实现的各个模块的功能及其接口。
(1)、destination:
该模块是为了描述电梯内的目的请求的记录和撤销。
input:
set_dest:
当按下对应楼层的目的地请求且当前电梯来停在cur_floor时,便可以记录这个
请求。
rst:
在电梯进入初始状态时,撤销记录中的目的地请求。
ce:
在电梯进入暂停在cur_floor状态时ce=1;控制撤销cur_floor的目的地请求,并不记录
在当前状态下该楼层的目的地请求。
cur_Floor:
当前楼层作为判断的条件。
output:
get_dest:
通过输出LED显示当前未完成的目的地请求。
源代码如下:
moduledestination(set_dest,rst,ce,cur_Floor,get_dest);input[6:
0]set_dest;
input[2:
0]cur_Floor;
inputrst,ce;
output[6:
0]get_dest;
reg[6:
0]get_dest;
always@(rstorceorset_dest[0]orcur_Floor)
begin
if(rst==1)
get_dest[0]=0;
else
begin
if(set_dest[0]==0)
begin
if(ce==0||cur_Floor!
=1)
get_dest[0]=1;电梯不在1楼,目的地为1else
get_dest[0]=0;电梯在1楼目的地不显示
end
else
begin
if(ce==1&&cur_Floor==1)
get_dest[0]=0;
end
end
end
always@(rstorceorset_dest[1]orcur_Floor)
begin
if(rst==1)初始化
get_dest[1]=0;
elseif(set_dest[1]==0)没有请求
begin
if(ce==0||cur_Floor!
=2)
get_dest[1]=1;
else
get_dest[1]=0;
end
else
begin
if(ce==1&&cur_Floor==2)
get_dest[1]=0;
end
end
always@(rstorceorset_dest[2]orcur_Floor)
begin
if(rst==1)
get_dest[2]=0;
elseif(set_dest[2]==0)
begin
if(ce==0||cur_Floor!
=3)
get_dest[2]=1;
else
get_dest[2]=0;
end
else
begin
if(ce==1&&cur_Floor==3)
get_dest[2]=0;
end
end
always@(rstorceorset_dest[3]orcur_Floor)
begin
if(rst==1)
get_dest[3]=0;
elseif(set_dest[3]==0)
begin
if(ce==0||cur_Floor!
=4)
get_dest[3]=1;
else
get_dest[3]=0;
end
else
begin
if(ce==1&&cur_Floor==4)
get_dest[3]=0;
end
end
always@(rstorceorset_dest[4]orcur_Floor)
begin
if(rst==1)
get_dest[4]=0;
elseif(set_dest[4]==0)
begin
if(ce==0||cur_Floor!
=5)
get_dest[4]=1;
else
get_dest[4]=0;
end
else
begin
if(ce==1&&cur_Floor==5)
get_dest[4]=0;
end
end
always@(rstorceorset_dest[5]orcur_Floor)
begin
if(rst==1)
get_dest[5]=0;
elseif(set_dest[5]==0)
begin
if(ce==0||cur_Floor!
=6)
get_dest[5]=1;
else
get_dest[5]=0;
end
else
begin
if(ce==1&&cur_Floor==6)
get_dest[5]=0;
end
end
always@(rstorceorset_dest[6]orcur_Floor)
begin
if(rst==1)
get_dest[6]=0;
elseif(set_dest[6]==0)
begin
if(ce==0||cur_Floor!
=7)
get_dest[6]=1;
else
get_dest[6]=0;
end
else
begin
if(ce==1&&cur_Floor==7)
get_dest[6]=0;
end
end
endmodule
(2)、call:
该模块是为了描述电梯外的召唤的记录和撤销。
input:
set_call:
当按下对应楼层的召唤请求且当前电梯未停在cur_floor,便可以记录这个召唤。
rst:
当电梯进入初始状态时,撤销目的地面板上的请求。
ce:
在电梯进入暂停在cur_floor的状态时,控制撤销cur_floor的所在所在召唤请求,并
不记录当前状态下该楼层的召唤。
cur_Floor:
当前楼层作为判断的条件。
output:
get_call:
通过输出LED显示当前未完成的目的地请求。
源代码如下:
modulecall(set_call,rst,cur_Floor,ce,get_call);
input[11:
0]set_call;
input[2:
0]cur_Floor;
inputrst,ce;
output[11:
0]get_call;
reg[11:
0]get_call;
always@(rstorceorset_call[0]orcur_Floor)
begin
if(rst==1)
get_call[0]=0;
elseif(set_call[0]==0)
begin
if(ce==0||cur_Floor!
=1)
get_call[0]=1;
else
get_call[0]=0;
end
else
begin
if(ce==1&&cur_Floor==1)
get_call[0]=0;
end
end
always@(rstorceorset_call[1]orcur_Floor)
begin
if(rst==1)
get_call[1]=0;
elseif(set_call[1]==0)
begin
if(ce==0||cur_Floor!
=2)
get_call[1]=1;
else
get_call[1]=0;
end
else
begin
if(ce==1&&cur_Floor==2)
get_call[1]=0;
end
end
always@(rstorceorset_call[2]orcur_Floor)
begin
if(rst==1)
get_call[2]=0;
elseif(set_call[2]==0)
begin
if(ce==0||cur_Floor!
=2)
get_call[2]=1;
else
get_call[2]=0;
end
else
begin
if(ce==1&&cur_Floor==2)
get_call[2]=0;
end
end
always@(rstorceorset_call[3]orcur_Floor)
begin
if(rst==1)
get_call[3]=0;
elseif(set_call[3]==0)
begin
if(ce==0||cur_Floor!
=3)
get_call[3]=1;
else
get_call[3]=0;
end
else
begin
if(ce==1&&cur_Floor==3)
get_call[3]=0;
end
end
always@(rstorceorset_call[4]orcur_Floor)
begin
if(rst==1)
get_call[4]=0;
elseif(set_call[4]==0)
begin
if(ce==0||cur_Floor!
=3)
get_call[4]=1;
else
get_call[4]=0;
end
else
begin
if(ce==1&&cur_Floor==3)
get_call[4]=0;
end
end
always@(rstorceorset_call[5]orcur_Floor)
begin
if(rst==1)
get_call[5]=0;
elseif(set_call[5]==0)
begin
if(ce==0||cur_Floor!
=4)
get_call[5]=1;
else
get_call[5]=0;
end
else
begin
if(ce==1&&cur_Floor==4)
get_call[5]=0;
end
end
always@(rstorceorset_call[6]orcur_Floor)
begin
if(rst==1)
get_call[6]=0;
elseif(set_call[6]==0)
begin
if(ce==0||cur_Floor!
=4)
get_call[6]=1;
else
get_call[6]=0;
end
else
begin
if(ce==1&&cur_Floor==4)
get_call[6]=0;
end
end
always@(rstorceorset_call[7]orcur_Floor)
begin
if(rst==1)
get_call[7]=0;
elseif(set_call[7]==0)
begin
if(ce==0||cur_Floor!
=5)
get_call[7]=1;
else
get_call[7]=0;
end
else
begin
if(ce==1&&cur_Floor==5)
get_call[7]=0;
end
end
always@(rstorceorset_call[8]orcur_Floor)
begin
if(rst==1)
get_call[8]=0;
elseif(set_call[8]==0)
begin
if(ce==0||cur_Floor!
=5)
get_call[8]=1;
else
get_call[8]=0;
end
else
begin
if(ce==1&&cur_Floor==5)
get_call[8]=0;
end
end
always@(rstorceorset_call[9]orcur_Floor)
begin
if(rst==1)
get_call[9]=0;
elseif(set_call[9]==0)
begin
if(ce==0||cur_Floor!
=6)
get_call[9]=1;
else
get_call[9]=0;
end
else
begin
if(ce==1&&cur_Floor==6)
get_call[9]=0;
end
end
always@(rstorceorset_call[10]orcur_Floor)
begin
if(rst==1)
get_call[10]=0;
elseif(set_call[10]==0)
begin
if(ce==0||cur_Floor!
=6)
get_call[10]=1;
else
get_call[10]=0;
end
else
begin
if(ce==1&&cur_Floor==6)
get_call[10]=0;
end
end
always@(rstorceorset_call[11]orcur_Floor)
begin
if(rst==1)
get_call[11]=0;
elseif(set_call[11]==0)
begin
if(ce==0||cur_Floor!
=7)
get_call[11]=1;
else
get_call[11]=0;
end
else
begin
if(ce==1&&cur_Floor==7)
get_call[11]=0;
end
end
endmodule
(3)、floor:
描述电梯当前所处的楼层(从001~111的七层)。
input:
rst:
初始状态时电梯所处的楼层归为第一层。
inc_Floor:
正脉冲,控制电梯在向上运行时楼层加1。
red_Floor:
正脉冲,控制电梯在向下运行时楼层减1。
output:
cur_Floor:
输出LED显示当前电梯所在楼层。
源代码如下:
modulefloor(inc_Floor,red_Floor,rst,cur_Floor);
inputinc_Floor,red_Floor,rst;
output[2:
0]cur_Floor;
reg[2:
0]cur_Floor;
regfloor_clk;
always@(rstorinc_Floororred_Floor)
begin
if(rst)
floor_clk=0;
else
begin
if(inc_Fl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word Verilog 语言 设计 电梯 控制器 文档 docx