Verilog语言设计电梯控制器文档
更新时间:2024-05-18 16:36:01 阅读量: 综合文库 文档下载
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 LED RD FLOOR CONTROL LED RC RB DESTINATIONN LED
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、电梯控制流程图:
开始初始化电梯状态和控制信息等待所在i层以上有召唤或有电梯内面板目的地?YESNO所在i层以下有召唤或有电梯内面板目的地?YESNO向上运行;i ? i+1更新状态信息向下运行;i ? i-1更新状态信息NO第i层为电梯目的地或第i层有向上请求?YES所在i层以上有召唤或有电梯内面板目的地?NOYES第i层为电梯目的地或第i层有向下请求?NO在第i层停;乘客上下电梯更新状态信息YES所在i层以下有召唤或有电梯内面板目YES的NO在第i层停;乘客上下电梯更新状态信息
BACK
********************************************************* 5、系统控制器ASM图:
Reset=0ASM图s00000rst=1s10001ce=1;rst=0;ce_Count=0;Sel_Count=00;s2noK1?yess3up_d=0;stop_r=1;ce=0;00110010ce=1;ce_Count=0;Sel_Count=01;K2?yess9up_d=1;stop_r=1;ce=0;no1001s4ce_Count=1;0100s101010ce_Count=1;s5ce_Count=0;inc_Floor=1;0101s111011ce_Count=0;red_Floor=1;s60110s121100inc_Floor=0;sel_Con=10;red_Floor=0;sel_Con=11;s7noK3?yes0111nos1311sel_Con=00;K4?sel_Con=01;yesyesK1?K2?s81000nos14ce=1;stop_r=0;ce_Count=11110noce=1;stop_r=0;ce_Count=1
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显示当前未完成的目的地请求。
源代码如下:
module destination(set_dest,rst,ce,cur_Floor,get_dest);
input [6:0] set_dest; input [2:0] cur_Floor; input rst,ce;
output [6:0] get_dest; reg [6:0] get_dest;
always @ (rst or ce or set_dest[0] or cur_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楼,目的地为1
else
get_dest[0]=0;
电梯在1楼 目的地不显示
end else begin
if(ce==1&&cur_Floor==1) get_dest[0]=0;
end
end end
always @ (rst or ce or set_dest[1] or cur_Floor) begin
if(rst==1)初始化
get_dest[1]=0;
没有请求
else if(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 @ (rst or ce or set_dest[2] or cur_Floor) begin
if(rst==1)
get_dest[2]=0;
else if(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 @ (rst or ce or set_dest[3] or cur_Floor) begin
end
if(rst==1)
get_dest[3]=0;
else if(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
always @ (rst or ce or set_dest[4] or cur_Floor) begin
if(rst==1)
get_dest[4]=0;
else if(set_dest[4]==0) begin
end
end
always @ ( rst or ce or set_call[4] or cur_Floor) begin
if(rst==1)
get_call[4]=0;
else if(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 @ ( rst or ce or set_call[5] or cur_Floor) begin
if(rst==1)
get_call[5]=0;
else if(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 @ ( rst or ce or set_call[6] or cur_Floor) begin
if(rst==1)
get_call[6]=0;
else if(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 @ ( rst or ce or set_call[7] or cur_Floor) begin end
always @ (rst or ce or set_call[8] or cur_Floor) begin
if(rst==1)
get_call[8]=0; if(rst==1)
get_call[7]=0;
else if(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
else if(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 @ (rst or ce or set_call[9] or cur_Floor) begin
if(rst==1)
get_call[9]=0;
else if(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 @ (rst or ce or set_call[10] or cur_Floor) begin
if(rst==1)
get_call[10]=0;
else if(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 @ (rst or ce or set_call[11] or cur_Floor) begin
if(rst==1)
get_call[11]=0;
else if(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显示当前电梯所在楼层。
源代码如下:
module floor(inc_Floor,red_Floor,rst,cur_Floor);
always @ (rst or inc_Floor or red_Floor) input inc_Floor,red_Floor,rst; output [2:0] cur_Floor; reg [2:0] cur_Floor; reg floor_clk;
begin
if(rst)
floor_clk=0;
else begin if(inc_Floor || red_Floor)
floor_clk=1;
else
floor_clk=0;
end
end
always@(posedge floor_clk or posedge rst) begin if(rst==1)
cur_Floor=3'b001;
else if(inc_Floor==1)
cur_Floor=cur_Floor+1;
else if(red_Floor==1)
cur_Floor=cur_Floor-1;
else
cur_Floor=cur_Floor;
end
endmodule
(4)、stop_run:描述电梯的运行状态(停止或运行)。 input: rst:初始状态时,电梯状态未停止。
stop_r:当其有一个正向的电平跳变时,电梯状态由停止变为运行;有一个负向电平跳变
时电梯由运行变为停止。
output:
out_state_run:通过输出LED显示当前的电梯运行状态。
源代码如下:
module stop_run (rst,stop_r,out_state_run); //stop--0,run--1
endmodule
(5)、up_down:描述电梯当前或暂停前的运行方向(向上或向下)。 input:
rst:初始时电梯的运行方向向上。
up_d:当其有一个正向的电平跳变时,电梯的运行方向由向上变为向上;有一个负向电平always @(stop_r or rst) begin
if(rst==1||stop_r==0) out_state_run=0; else
out_state_run=1; end
input rst,stop_r; output out_state_run; reg out_state_run;
跳变时电梯的运行方向由向下变为向上。 output:
out_state_dir:通过输出LED灯显示当前或电梯暂停前的运行方向。
源代码如下:
module up_down (rst,up_d,out_state_dir); //up--0,down--1
input rst,up_d; output out_state_dir; reg out_state_dir;
always @(rst or up_d) begin
if(rst==1||up_d==0) out_state_dir=0; else
out_state_dir=1; end
endmodule
(6)、counter:计数器,可以通过技术控制电梯的运行和暂停的状态下保持一段时间。 input:
ce_count:当其为0时计数器不计数,但将其初始计数值赋给计数器,并将0作为结果返
回给计数器;当其为1时,计数器开始减计数,每当来一个clk下降沿时计数值减1,当计数值减为0时将其返回给控制器。
clk:电路的时钟脉冲。
output:
consignal:返回给控制器的反馈信号,当其为1时,表明计数完毕。
源代码如下:
module counter(ce_count,clk,consignal);
input ce_count,clk;
output consignal; reg consignal; integer count;
always@(negedge clk)
begin
if(!ce_count) begin
consignal<=0; count<=5;
end
else begin
if(count>1)
begin
consignal<=0;
count<=count-1;
end else
consignal<=1; end end endmodule
(7)、condition:选择各种条件,对其进行判断并将判断结果返回给控制器。 input:
sel_con:当其为00是判断cur_floor以上是否还有目的地请求或者召唤请求;当其为01
时,判断cur_floor以下是否还有目的地请求或者召唤请求;当其为10时,判断第cur_floor层是否还有目的地请求或者向上的召唤请求;当其为11时,判断第cur_floor层是否还有目的地请求或者向下的召唤请求。
get_dest:未完成的目的地请求。 get_call:未完成的召唤请求。 clk:时钟脉冲。
cur_Floor:当前楼层,作为判断条件。
output:
up_d<=1; stop_r<=1; ce<=0; end
S10:begin
ce_Count<=1; end
S11: begin
ce_Count<=0; red_Floor<=1; end
S12: begin
red_Floor<=0; sel_Con<=2'b11; end
S13: begin
sel_Con<=2'b01; end
S14: begin
ce<=1; stop_r<=0; ce_Count<=1; end
default:state<=HLT; endcase end endmodule
BACK
************************************************************ 5)、测试方案;
首先在电梯开始加电时不加请求,观察电梯是否状态稳定的停在1楼.
在电梯内控制面板加3,5层的目的地请求, 观察电梯能否正常暂停在这两层,并撤销控制面板的请求.
在行驶过2,4层后分别按下这两层的向上向下召唤请求,看电梯是否在当前不响应这个请求.以后下行时响应4层,再次上行时响应2层,并撤销电梯外部召唤.
在未到第6层的电梯运行时把电梯内控制面板加上第6层的请求, 检查电梯是不是正常停下, 并撤销控制面板的请求。
在未到第7层的电梯运行时按下7层的向上向下召唤请求,观察电梯是否能同时撤销向上向下的召唤.
下行以后,只在5楼是目的地,在它停的时候无请求,观察它是否稳定停止在5楼. 在行驶过3,4层后分别按下这两层的向上向下召唤请求,看电梯是否在当前不响应这个请求.以后上行时响应3层,再次下行时响应4层,并撤销电梯外部召唤.. 测试代码如下: `timescale 10ms/1ms module elevetor_test;
reg clk,reset; reg [11:0] set_Call; reg [6:0] set_Dest;
wire [2:0] cur_Floor;
wire state_Run,state_Dir; wire [11:0] get_Call; wire [6:0]
get_Dest;
integer i; initial
begin
clk=0; reset=1;
always #1 clk=~clk; initial begin
#4 reset=0; #2 reset=1;
#10 set_Call [3 ]=0; for(i=0;i<12;i=i+1) set_Call[i]=1; for(i=0;i<7;i=i+1) set_Dest[i]=1; end
#1 set_Call[3]=1; #1 set_Dest[5]=0; #2 set_Dest[5]=1; #70 set_Call[4]=0; #2 set_Call[4]=1; #26 set_Dest[6]=0; #2 set_Dest[6]=1; #92 set_Call[2]=0; #1 set_Call[2]=1;
#1 set_Call[0]=0; #1 set_Call[0]=1; #30 set_Dest[5]=0; #1 set_Dest[5]=1; #400 set_Call[10]=0; #1 set_Call[10]=1; #100 $stop;
end initial
$monitor($time,,,\
Call=%b,set_Dest=%b,get_Dest=%b\et_Dest,get_Dest); elevator
elevator(.clk(clk),.reset(reset),.set_Dest(set_Dest),.set_Call(set_Call),.get_Dest(get_Dest),.get_Call(get_Call),
.state_Run(state_Run),.state_Dir(state_Dir),.cur_Floor(cur_Floor));
endmodule 测试结果: 0
cur_Floor=x,state_Run=x,state_Dir=x,set_Call=111111111111,get_Call=xxxxxxxxxxxx,set_Dest=1111111,get_Dest=xxxxxxx #
5
cur_Floor=1,state_Run=0,state_Dir=0,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=0000000 #
16
cur_Floor=1,state_Run=0,state_Dir=0,set_Call=111111110111,get_Call=000000001000,set_Dest=1111111,get_Dest=0000000 #
17
cur_Floor=1,state_Run=0,state_Dir=0,set_Call=111111111111,get_Call=000000001000,set_Dest=1111111,get_Dest=0000000 #
18
cur_Floor=1,state_Run=0,state_Dir=0,set_Call=111111111111,get_Call=000000001000,set_Dest=0111111,get_Dest=1000000 #
20
cur_Floor=1,state_Run=0,state_Dir=0,set_Call=111111111111,get_Call=000000001000,set_Dest=1111111,get_Dest=1000000 #
21
cur_Floor=1,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000001000,set_Dest=1111111,get_Dest=1000000 #27
cur_Floor=2,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000001000,set_Dest=1111111,get_Dest=1000000 #37
cur_Floor=3,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000001000,set_Dest=1111111,get_Dest=1000000 #
47
cur_Floor=4,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000001000,set_Dest=1111111,get_Dest=1000000 #57
cur_Floor=5,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000001000,set_Dest=1111111,get_Dest=1000000 #67
cur_Floor=6,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000001000,set_Dest=1111111,get_Dest=1000000
正在阅读:
Verilog语言设计电梯控制器文档05-18
08高考文科试题分类函数04-20
2020浙版中考科学(生物)专题04-生命活动的调节(植物)05-07
C35混凝土配合比设计07-26
C++类与对象例题03-05
2014年青岛中考物理试题01-13
自考中国近代史纲要第六章练习题03-14
- 高一物理牛顿运动定律全套学习学案
- 水处理一级反渗透加还原剂亚硫酸氢钠后为什么ORP会升高
- 毕业设计(论文)-正文董家口 - 图文
- 荣盛酒店经营管理公司录用通知及入职承诺书II
- 第二讲 大学英语四级快速阅读技巧
- 质量管理体系文件(2015年委托第三方医药物流配送企业专用版本)
- 214071收款办法
- 苏轼对《文选》选文的评价
- 《诊断学基础B》1-8作业
- 广东省东莞市高一数学下学期期末教学质量检查试题
- 海南电网公司VIS推广应用管理办法
- 红星照耀中国习题
- 苏教版小学语文六年级上册期末复习资料之生字词整理
- 局域网组建与应用—王向东
- 税务稽查内部管理文书样式
- 环保社会实践调查表
- 九年级思品第一单元复习
- 2016年全国注册咨询工程师继续教育公路路线设计规范试卷
- 毕业设计-青岛港董家口港区防波堤设计
- 撞背锻炼方法与益处
- 控制器
- 电梯
- Verilog
- 语言
- 文档
- 设计
- 果蔬、谷物系列休闲食品加工项目可行性研究报告(目录)
- 人教版二年级下册语文总复习-整理打印版
- 2013远程软件工程试题答案
- 革命先烈事迹 读后感
- 2011-2015年中国立德粉产业竞争格局与未来前景预测研究报告
- 高二物理下册达标测试题8
- 种方法找注入点来源
- 基于单片机的自动门控制系统设计
- 本科毕业论文 - 大黄山煤矿2015年瓦斯抽采工程设计 - 图文
- 教育部2010年推荐高校职业素质
- 如何做好微博营销
- 中国胶木件行业市场调查研究报告(目录) - 图文
- 山西省运城市垣曲县九年级英语全册 Unit 8 It must belong to Ca
- 广东省遂溪县第一中学2017-2018学年高一3月月考物理试题Word版含
- 激励名言
- 民事诉讼法题库
- 2008东风汽车房地产公司工程系列专业知识的职称考试题(中级)
- 公司规章制度-简介
- 计算机网络单项选择题(整理完)
- 汽车词汇