首页 Verilog语言设计电梯控制器文档

Verilog语言设计电梯控制器文档

举报
开通vip

Verilog语言设计电梯控制器文档Verilog语言设计电梯控制器文档 1)、需求分析; 1、问题描述与要求: 用Verilig语言设计一个电梯控制器,通过实验板对设计进行演示; 要求楼层的高度大于等于,,并且所设计的电梯调度算法满足提高服务质量、降低运行成本的原则。 BACK 2)、系统描述; 1、设定电梯控制器适用的楼层为8层. 2、在电梯的内部有一个控制面板,它负责按下请求到的楼层,并且显示当前尚未完成的目的地请求,当到达该楼层以后自动撤销本楼层的请求,即将面板灯熄灭. 3、除1层和7层分别只有上/下按钮外,每个楼层(电梯门口...

Verilog语言设计电梯控制器文档
Verilog语言设计电梯控制器文档 1)、需求分析; 1、问题描述与要求: 用Verilig语言设计一个电梯控制器,通过实验板对设计进行演示; 要求楼层的高度大于等于,,并且所设计的电梯调度算法满足提高服务质量、降低运行成本的原则。 BACK 2)、系统描述; 1、设定电梯控制器适用的楼层为8层. 2、在电梯的内部有一个控制面板,它负责按下请求到的楼层,并且显示当前尚未完成的目的地请求,当到达该楼层以后自动撤销本楼层的请求,即将面板灯熄灭. 3、除1层和7层分别只有上/下按钮外,每个楼层(电梯门口旁)的召唤面板都有两个按钮,分别指示上楼和下楼请求。当按下后,对应按钮灯亮。如果电梯已经到达该楼层,按钮灯熄灭。 4、电梯的外部面板会显示电梯当前所在的楼层,及上行还是下行(暂停显示刚才运行时的状态).当电梯在运行时,对应的楼层灯间固定显示一段时间进入下一楼层;在暂停时,灯一直在该楼层保持亮的状态。 5、电梯调度方案:电梯向一个方向运行时,只对本方向前方的请求进行应答,直到本方向前方无请求时,才对反方向的请求进行应答。当前内部控制面板上有的请求,只要经过所在楼层均会立即响应.在所有内部外部请求都已完成后,电梯转入等待。 电梯模型:(如下附图) 电梯内部的控制面板, 显示信息有:电梯当前的位置和电梯 当前的运行方向,上,下,,以及请第7层 求到达的楼层 控制信息有:请求要到达的目的楼层 第,层 第,层 第,层 电梯 第,层 每楼层的召唤按钮面板, 第,层 显示信息有:当前电梯所 在位置,楼层,和电梯的 运行方向,上,下, 第,层 控制信息:使用电梯的请 求,向上或向下, BACK ************************************************************ 3)、算法设计; 1、电梯基本组成部分及其实现: (1) FLOOR:记录电梯所处楼层的记数器( 用模,计数器实现,由001,111的加减记数来 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示电梯所在楼层的变化( (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 LED 3、电梯工作过程的具体描述: a)、当电梯开始启动的时候,将当前所处的楼层置为第一层,电梯为暂停状态,方向向上,然后等待控制器的调度( b)、等待过程当中(FLOOR保持在该楼层),首先检测RC和RD,判断当前楼层(第i层)以上的楼层是否发出召唤或者已经有人已经发请求,若有则向上运行;否则以同样的方法判 断是否向下运行;若不向下运行则重复等待状态( 保持原状态循环进行,操作直到检测到有向上或向下的任务( c)、若已经判明要向上运行,则首先使RB中的运行,暂停触发器置为运行,且标志向上运行,控制LED在该楼层亮T1时间后将所在楼层加,,这时新的当前楼层(第i+1层)灯亮起,接着电梯检索RC和RD,判断当前楼层是否发出向上召唤或者已经有人已经发出目的地为第i+1层的请求,若有则在第i+1层停靠;否则检索RC和RD,判断第i+1层以上的楼层是否发出召唤或者已经有人已经发出目的地为第i+1层以上的请求,若有则向上运行;否则(必定是有第i+1层向下的请求)在第i+1层(若不在当前的第i+1层停靠,就使灯闪烁,继续,中开始的操作(如果停靠就修改运行状态为停止,撤销所在楼层的召唤请求和目的地任务,接受用户的目的地请求,控制电梯在T2时间后电梯进入,中的等待状态( 注释: 、只要不是当前暂停在的楼层的用户发出的召唤命令都存入RD,以供控制器检索和判断( 、只要不是当前暂停在的楼层的用户发出的目的地请求都存入RC,供运行过程当中控制器的检索和判断。 BACK ************************************************************ 4、电梯控制流程图: 开始 初始化电梯状 态和控制信息 等待 NO所在i层以上有召唤 或有电梯内面板目 的地, NOYES所在i层以下有召唤 或有电梯内面板目 的地?向上运行;YES i ß i+1 更新状态信息 向下运行; i ß i-1 更新状态信息 NO第i层为电梯目的地 或第i层有向上请求 ? YES所在i层以上有召唤YESNO第i层为电梯目的地或有电梯内面板目或第i层有向下请求的地,?在第i层停;NO所在i层以下有召唤乘客上下电梯或有电梯内面板目YESYES更新状态信息的 NO在第i层停; 乘客上下电梯 更新状态信息 BACK ********************************************************* 5、系统控制器ASM图: s00000Reset=0 ASM图 rst=1 0001s1 ce=1;rst=0; ce_Count=0; Sel_Count=00; s20010 noce=1; K1?ce_Count=0; Sel_Count=01;no yesK2?s30011 yesup_d=0;s9stop_r=1;1001ce=0;up_d=1; stop_r=1; ce=0;s40100 1010s10ce_Count=1; ce_Count=1;s50101 s111011ce_Count=0; inc_Floor=1; ce_Count=0; red_Floor=1;s6s1211000110 inc_Floor=0;red_Floor=0;sel_Con=10;sel_Con=11; 1101s70111s13 nono K3?sel_Con=00;K4?sel_Con=01; yes yes yesyes K1?K2? nos810001110s14no ce=1;ce=1;stop_r=0;stop_r=0;ce_Count=1ce_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 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 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 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 @ (rst or ce or set_dest[5] or cur_Floor) begin if(rst==1) get_dest[5]=0; else if(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 @ (rst or ce or set_dest[6] or cur_Floor) begin if(rst==1) get_dest[6]=0; else if(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显示当前未完成的目的地请求。 源代码如下: module call(set_call,rst,cur_Floor,ce,get_call); input [11:0] set_call; input [2:0] cur_Floor; input rst,ce; output [11:0] get_call; reg [11:0] get_call; always @ (rst or ce or set_call[0] or cur_Floor) begin if(rst==1) get_call[0]=0; else if(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 @ (rst or ce or set_call[1] or cur_Floor) begin if(rst==1) get_call[1]=0; else if(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 @ (rst or ce or set_call[2] or cur_Floor) begin if(rst==1) get_call[2]=0; else if(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 @ ( rst or ce or set_call[3] or cur_Floor) begin if(rst==1) get_call[3]=0; else if(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 @ ( 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 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 end always @ (rst or ce or set_call[8] or cur_Floor) begin if(rst==1) get_call[8]=0; 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); input inc_Floor,red_Floor,rst; output [2:0] cur_Floor; reg [2:0] cur_Floor; reg floor_clk; always @ (rst or inc_Floor or red_Floor) 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 input rst,stop_r; output out_state_run; reg out_state_run; always @(stop_r or rst) begin if(rst==1||stop_r==0) out_state_run=0; else out_state_run=1; end endmodule (5)、up_down:描述电梯当前或暂停前的运行方向(向上或向下)。 input: rst:初始时电梯的运行方向向上。 up_d:当其有一个正向的电平跳变时,电梯的运行方向由向上变为向上;有一个负向电平 跳变时电梯的运行方向由向下变为向上。 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: result:是把sel_con中对应条件判断的结果送给控制器。 源代码如下: //judge whether there are calls or destinations above the cur_Floor //judge the condition K1,K2,K3,K4 module condition(get_dest,get_call,cur_Floor,sel_condition,clk,result); input [6:0] get_dest; input [11:0] get_call; input [1:0] sel_condition; input clk; input [2:0] cur_Floor; output result; reg result; integer flag,i; always @(negedge clk) begin case(sel_condition) 2'b00: begin //judge the condition K1 case(cur_Floor) 3'b001:begin if(get_dest[1]||get_dest[2]||get_dest[3]||get_dest[4]||get_dest[5]||get_dest[6]||get_c all[1]||get_call[2]||get_call[3]||get_call[4]||get_call[5]||get_call[6]||get_call[7]||get_call[ 8]||get_call[9]||get_call[10]||get_call[11]) result=1; else result=0; end 3'b010:begin if(get_dest[2]||get_dest[3]||get_dest[4]||get_dest[5]||get_dest[6]||get_call[3]||get_ca ll[4]||get_call[5]||get_call[6]||get_call[7]||get_call[8]||get_call[9]||get_call[10]||get_call[ 11]) result=1; else result=0; end 3'b011:begin if(get_dest[3]||get_dest[4]||get_dest[5]||get_dest[6]||get_call[5]||get_call[6]||get_cal l[7]||get_call[8]||get_call[9]||get_call[10]||get_call[11]) result=1; else result=0; end 3'b100:begin if(get_dest[4]||get_dest[5]||get_dest[6]||get_call[7]||get_call[8]||get_call[9]||get_call [10]||get_call[11]) result=1; else result=0; end 3'b101:begin if(get_dest[5]||get_dest[6]||get_call[9]||get_call[10]||get_call[11]) result=1; else result=0; end 3'b110:begin if(get_dest[6]||get_call[11]) result=1; else result=0; end default: result=0; endcase end 2'b01: begin //judge the condition K2 case(cur_Floor) 3'b111:begin if(get_dest[0]||get_dest[1]||get_dest[2]||get_dest[3]||get_dest[4]||get_dest[5]||get_c all[0]||get_call[1]||get_call[2]||get_call[3]||get_call[4]||get_call[5]||get_call[6]||get_call[ 7]||get_call[8]||get_call[9]||get_call[10]) result=1; else result=0; end 3'b110:begin if(get_dest[0]||get_dest[1]||get_dest[2]||get_dest[3]||get_dest[4]||get_call[0]||get_ca ll[1]||get_call[2]||get_call[3]||get_call[4]||get_call[5]||get_call[6]||get_call[7]||get_call[8 ]) result=1; else result=0; end 3'b101:begin if(get_dest[0]||get_dest[1]||get_dest[2]||get_dest[3]||get_call[0]||get_call[1]||get_call [2]||get_call[3]||get_call[4]||get_call[5]||get_call[6]) result=1; else result=0; end 3'b100:begin if(get_dest[0]||get_dest[1]||get_dest[2]||get_call[0]||get_call[1]||get_call[2]||get_call[ 3]||get_call[4]) result=1; else result=0; end 3'b011:begin if(get_dest[0]||get_dest[1]||get_call[0]||get_call[1]||get_call[2]) result=1; else result=0; end 3'b010:begin if(get_dest[0]||get_call[0]) result=1; else result=0; end default: result=0; endcase end 2'b10: begin //judge the condition K3 if(cur_Floor==7) result=1; else begin if(get_call[2*cur_Floor-2]||get_dest[cur_Floor-1]) result=1; else result=0; end end 2'b11: begin //judge the condition K4 if(cur_Floor==0) result=1; else begin if(get_call[2*cur_Floor-3]||get_dest[cur_Floor-1]) result=1; else result=0; end end endcase end endmodule (8)、control:接受其它各个模块的反馈信号并控制其它各个模块进行协同工作。 input: clk: 时钟脉冲。 Reset复位端,低电平有效,将电路状态清0。 consignal:来自counter模块的反馈信号。 Result_Con:来自condition模块的反馈信号。 output: rst,sel_Con,inc_Floor,red_Floor,ce,up_d,stop_r, ce_Count为向其它模块的输出控制信号。 源代码如下: module control(clk,reset,result_Con,consignal,sel_Con,inc_Floor,red_Floor,ce,up_d,stop_r,rst,ce_Co unt); parameter S0=4'b0000,S1=4'b0001,S2=4'b0010,S3=4'b0011,S4=4'b0100,S5=4'b0101,S6=4'b0110,S7 =4'b0111, S8=4'b1000,S9=4'b1001,S10=4'b1010,S11=4'b1011,S12=4'b1100,S13=4'b1101,S14=4'b111 0,HLT=4'b1111; input clk,reset,result_Con,consignal; output [1:0] sel_Con; output inc_Floor,red_Floor,ce,up_d,stop_r,rst,ce_Count; reg [1:0] sel_Con; reg inc_Floor,red_Floor,ce,up_d,stop_r,rst,ce_Count; reg[3:0] state; always @ (posedge clk or negedge reset) begin if(!reset) state<=S0; else begin case(state) S0:state<=S1; S1:if(result_Con) state<=S3; else state<=S2; S2:if(result_Con) state<=S9; else state<=S1; S3:state<=S4; S4:if(consignal) begin state<=S5; end else state<=S4; S5:state<=S6; S6:if(result_Con) state<=S8; else state<=S7; S7:if(result_Con) state<=S4; else state<=S8; S8:if(consignal) begin state<=S1; end else state<=S8; S9:state<=S10; S10:if(consignal) begin state<=S11; end else state<=S10; S11:state<=S12; S12:if(result_Con) state<=S14; else state<=S13; S13:if(result_Con) state<=S10; else state<=S14; S14:if(consignal) begin state<=S2; end else state<=S14; default:state<=HLT; endcase end end always @ (state) begin case(state) S0: begin rst<=1; end S1: begin ce<=1; rst<=0; ce_Count<=0; sel_Con<=2'b00; end S2: begin ce<=1; ce_Count<=0; sel_Con<=2'b01; end S3: begin up_d<=0; stop_r<=1; ce<=0; end S4: begin ce_Count<=1; end S5: begin ce_Count<=0; inc_Floor<=1; end S6: begin inc_Floor<=0; sel_Con<=2'b10; end S7: begin sel_Con<=2'b00; end S8: begin ce<=1; stop_r<=0; ce_Count<=1; end S9: begin 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)、测试方案; 首先在电梯开始加电时不加请求,观察电梯是否状态稳定的停在,楼( 在电梯内控制面板加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; 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 always #1 clk=~clk; initial begin #4 reset=0; #2 reset=1; #10 set_Call [3 ]=0; #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,,,"cur_Floor=%d,state_Run=%b,state_Dir=%b,set_Call=%b,get_Call=%b,set_Dest=%b,get_Dest=%b",cur_Floor,state_Run,state_Dir,set_Call,get_Call,set_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 # 77 cur_Floor=7,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000001000,set_Dest=1111111,get_Dest=1000000 #81 cur_Floor=7,state_Run=0,state_Dir=0,set_Call=111111111111,get_Call=000000001000,set_Dest=1111111,get_Dest=0000000 #89 cur_Floor=7,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000001000,set_Dest=1111111,get_Dest=0000000 #90 cur_Floor=7,state_Run=1,state_Dir=1,set_Call=111111101111,get_Call=000000011000,set_Dest=1111111,get_Dest=0000000 #92 cur_Floor=7,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000011000,set_Dest=1111111,get_Dest=0000000 #95 cur_Floor=6,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000011000,set_Dest=1111111,get_Dest=0000000 #105 cur_Floor=5,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000011000,set_Dest=1111111,get_Dest=0000000 #115 cur_Floor=4,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000011000,set_Dest=1111111,get_Dest=0000000 #118 cur_Floor=4,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000011000,set_D est=0111111,get_Dest=1000000 #120 cur_Floor=4,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000011000,se t_Dest=1111111,get_Dest=1000000 #125 cur_Floor=3,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000011000,set_Dest=1111111,get_Dest=1000000 #129 cur_Floor=3,state_Run=0,state_Dir=1,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=1000000 #137 cur_Floor=3,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=1000000 #143 cur_Floor=4,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=1000000 #153 cur_Floor=5,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=1000000 #163 cur_Floor=6,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=1000000 #173 cur_Floor=7,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=1000000 #177 cur_Floor=7,state_Run=0,state_Dir=0,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=0000000 #212 cur_Floor=7,state_Run=0,state_Dir=0,set_Call=111111111011,get_Call=000000000100,set_Dest=1111111,get_Dest=0000000 #213 cur_Floor=7,state_Run=0,state_Dir=0,set_Call=111111111111,get_Call=000000000100,set_Dest=1111111,get_Dest=0000000 #214 cur_Floor=7,state_Run=0,state_Dir=0,set_Call=111111111110,get_Call=000000000101,set_Dest=1111111,get_Dest=0000000 # 215 cur_Floor=7,state_Run=0,state_Dir=0,set_Call=111111111111,get_Call=000000000101,set_Dest=1111111,get_Dest=0000000 #217 cur_Floor=7,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000000101,set_Dest=1111111,get_Dest=0000000 #223 cur_Floor=6,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000000101,set_Dest=1111111,get_Dest=0000000 #233 cur_Floor=5,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000000101,set_D est=1111111,get_Dest=0000000 # 243 cur_Floor=4,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000000101,set_Dest=1111111,get_Dest=0000000 # 245 cur_Floor=4,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000000101,set_Dest=1011111,get_Dest=0100000 #246 cur_Floor=4,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000000101,set_Dest=1111111,get_Dest=0100000 #253 cur_Floor=3,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000000101,set_Dest=1111111,get_Dest=0100000 #263 cur_Floor=2,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000000101,set_Dest=1111111,get_Dest=0100000 #273 cur_Floor=1,state_Run=1,state_Dir=1,set_Call=111111111111,get_Call=000000000101,set_Dest=1111111,get_Dest=0100000 #279 cur_Floor=1,state_Run=0,state_Dir=1,set_Call=111111111111,get_Call=000000000100,set_Dest=1111111,get_Dest=0100000 # 287 cur_Floor=1,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000100,set_Dest=1111111,get_Dest=0100000 # 293 cur_Floor=2,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000100,set_Dest=1111111,get_Dest=0100000 # 297 cur_Floor=2,state_Run=0,state_Dir=0,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=0100000 #303 cur_Floor=2,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=0100000 # 309 cur_Floor=3,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=0100000 # 319 cur_Floor=4,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000000,set_Dest=1111111,get_Dest=0100000 # 329 cur_Floor=5,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000000,s et_Dest=1111111,get_Dest=0100000 # 339 cur_Floor=6,state_Run=1,state_Dir=0,set_Call=111111111111,get_Call=000000000000,s et_Dest=1111111,get_Dest=0100000 # 343 cur_Floor=6,state_Run=0,state_Dir=0,set_Call=111111111111,get_Call=000000000000, set_Dest=1111111,get_Dest=0000000 # 646 cur_Floor=6,state_Run=0,state_Dir=0,set_Call=101111111111,get_Call=000000000000 ,set_Dest=1111111,get_Dest=0000000 # 647 cur_Floor=6,state_Run=0,state_Dir=0,set_Call=111111111111,get_Call=000000000000, set_Dest=1111111,get_Dest=0000000 由于波形图过于复杂,在此省略. BACK ************************************************************ 6)、感想及意见 通过学习数字系统这门课程,我们了解到数字系统设计的基本步骤和其在实现过程当中必须注意的各个方面。以前的课程较多的停留在理论的高度上,而这门课程使我们真正认识到如何才能成为真正的硬件设计师。使我们获益匪浅的,也是使我们深有感触的是,唐老师在讲课的过程当中穿插了许多在多年科研过程当中积累的宝贵经验,如我们所学的知识在对应的科研领域怎样应用;怎样应用所学的知识解决实际工程当中遇到的问题。 在课程设计的实践当中,我们的电梯也可谓经历了风风雨雨,在Modelsim中的语言设计过程当中进行的还算顺利的情况下,经过软件模拟成功以后很快就可以进行硬件的综合仿真了。直到这时,我们才发现,很多语言所描述的东西通过硬件无法实现,这时才开始匆忙修改。但是因为对Xilinx的综合环境的综合要求不甚了解,排错花了很长的时间,自以为改的差不多的时候下到板子上的时候才发现结果还是不对,几经周折,通过 观察楼层的变化的错误才发现floor模块中需要增加时钟变量才能稳定变化。 “梅花香自苦寒来”,成功的喜悦之情难以言表,做工程的确是有苦有甜。在这个过程当中,唐老师给了我们很大的帮助,特别是反复强调要注意硬件的设计要考虑实现以及后模拟的重要性。我们在将来的实践过程当中一定注意以上的问题。 这门课程是我们对硬件设计产生了浓厚的兴趣,这必将成为推动我们在这个领域前进的不竭动力。 *最后给这门课程提一条小建议:希望选择一本与您所教授的内容相符合的教材. BACK
本文档为【Verilog语言设计电梯控制器文档】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
最新资料
资料动态
专题动态
is_337177
暂无简介~
格式:doc
大小:93KB
软件:Word
页数:51
分类:工学
上传时间:2017-09-20
浏览量:44