电子技术课程设计报告智能电梯控制器的设计班级自动化1306学号姓名日期2016-6-20目录:一.课程设计题目 (3)二.问题分析 (4)1.方向优先的电梯调度 (4)2.电梯的状态 (4)3.状态编码方案 (4)三.状态机 (5)四.系统输入与输出 (6)五.系统框图与系统设计 (7)1.系统框图 (7)2.系统设计 (8)六.波形仿真 (9)1.请求处理 (9)2.状态转换 (10)3.楼层推进 (11)4.电梯运行的优先级 (12)5.复位信号reset (13)6.锁定禁止运行按键forbid (13)七.程序源代码及注释 (14)八.引脚分配 (26)六.心得与体会 (27)一.课程设计题目设计内容与要求:①楼层的高度大于等于6,根据降低运行成本的原则,设计并实现一个以方向优先电梯调度算法。
②要求能够使用按键模拟对电梯的控制,为了便于观察,将电梯所在的楼层(1~6)用数码管显示出来,将电梯的上下楼状态(上,下,开门,关门,静止)用发光管或数码管显示出来,并且能够实现对电梯实现锁定禁止运行。
③画出电梯控制器的状态机,写出状态编码方案。
④用Verilog语言对设计进行描述,并下载到实验板上调试成功,适当增加比较符合现实的控制限制。
⑤写出设计性实验报告,并打印各层次的源文件和仿真波形,然后作简要说明。
并谈谈此次实验的收获、感想及建议二.问题分析1.方向优先的电梯调度电梯有三种运行状态,分别是上升、下降和静止等待。
出于降低成本的考虑,电梯在某一方向运行时,要完成该方向上所有的请求后,才能变换运动方向去响应反方向的请求。
电梯上升时,优先响应电梯现在楼层以上楼层的上升、下降和楼层选择信号;电梯下降时,优先响应电梯现处楼层以下楼层的上升、下降和楼层选择信号;电梯处于等待状态时,响应收到的第一个请求信号。
因此,电梯运行方向的判断要综合考虑三种请求信号、电梯当前所处楼层和电梯当前的状态等多种因素。
2.电梯的状态电梯运动过程中,有五种基本状态:上升,下降,开门,关门,静止。
考虑到电梯停止在某一楼层等待请求信号的状态为静止状态;另外,电梯运动过程中暂时停靠在某一楼层,开门后需要等待一段时间,这段时间电梯也没有动作,这时电梯也是“静止”状态。
若只用一个状态表示两种不同的静止情况,需要增加一个电梯的“开/关门标志”来区分两个“静止”状态。
因此,为了简化逻辑,在5个基本状态的状态编码中增加一个状态,用一个新状态(OPENWAIT)来表示开门情况下的静止状态。
最终,电梯的状态机中共有6个状态。
3.状态编码方案从数字电路设计的理论课中,我们学到,在进行状态编码时,若系统中存在多个状态,为了增强系统的稳定性。
可用二进制位数与状态数相同的变量来表征系统状态。
因此,电梯的状态用一个6位的二进制数currentstate[5:0]来表示。
6个状态分别编码为:STATIC=6'b000001,UP=6'b000010,DOWN=6'b000100,OPEN=6'b001000,CLOSE=6'b010000,OPENWAIT=6'b100000;这样,每次状态发生变化时,只用检测状态变量中的的某一位二进制数即可知道电梯处于哪一状态。
如要检测电梯是否处于OPEN开门状态,只需检测currentstate[3]是否等于1即可。
三.状态机电梯的状态机如上图所示,由于电梯状态转换时的判断条件过于复杂,在此不予列出。
四.系统输入与输出五.系统框图与系统设计1.系统框图2.系统设计六.波形仿真1.请求处理(1)楼层请求处理此时floorsel=6,request_button有一个脉冲信号,表示电梯有人要去6楼,因此request_out[5]保持置位,电梯到达5楼时,请求完成,request_out[5]被清零。
(2)上升请求处理此时floorsel=5,up_button有一个脉冲信号,表示5楼有人要上去,因此up_out[4]保持置位,电梯到达5楼时,请求完成,up_out[4]被清零。
(3)下降请求处理此时floorsel=6,down_button有一个脉冲信号,表示6楼有人要下去,因此down_out[5]保持置位,电梯到达6楼时,请求完成,down_out[5]被清零。
2.状态转换(1) 上升过程图中floorsel=3时,up_button有脉冲信号,表示3楼有上升请求。
电梯开始时静止在1楼,接收请求信号后,状态由1(静止)变为2(上升),到达目标层的3楼,状态变成4(开门),开门后状态变成6(开门静止),经过3个时钟周期,状态变为5(关门),因为没有新的请求,电梯状态保持为1(静止)。
(2)下降过程图中电梯在6楼的时候,接收到1楼的上升请求信号,电梯执行下降动作。
电梯开始时在6楼,接收请求信号后,状态由5(关门)变为3(下降),到达目标层的1楼时,状态变成4(开门),开门后状态变成6(开门静止),经过3个时钟周期,状态变为5(关门),因为没有新的请求,电梯状态保持为1(静止)。
3.楼层推进电梯首先接收到2楼的上升请求信号,然后电梯上升到2楼,停止在2楼的过程中又接收到6楼的下降请求,因此电梯又上升到6楼。
停止在6楼的过程中又接收到4楼的上升请求,电梯又接着下降到4楼。
4.电梯运行的优先级(1)上升过程中的下降请求电梯开始静止在1楼,首先接收到3楼的上升请求信号,还在1楼的时候又收到4楼的下降请求,停止在3楼的时候又收到6楼的下降请求,因此电梯延续方向优先的原则,一直升到6楼,中途并不响应4楼的下降信号,6楼的请求信号响应完成后才去响应4楼的请求信号。
(2)下降过程中的上升请求电梯上升到6楼之前就已经接收到1楼和3楼的上升请求信号,升到6楼后,电梯开始下降,基于方向优先的原则,电梯一直下降到1楼,中途并不响应3楼的上升请求。
5.复位信号reset电梯首先收到6楼的下降请求信号,电梯上升的过程中,差不多到4楼的时候,reset=1复位,电梯恢复到初始状态,楼层变为1,状态变为1,请求信号均被清零。
6.锁定禁止运行按键forbid电梯上升到6楼的过程中,forbid突然被置1,电梯停止运行,楼层和状态都保持不变。
Forbid清零后,电梯才恢复正常运行。
七.程序源代码及注释1.主模块moduleelevator(SYSCLKOUT,forbid,reset,floorsel,up_button,down_button,request_button,p os_out,state,up_request,down_request,st_request);output [6:0] state; //状态显示输出output [6:0] pos_out; //楼层显示输出output [5:0] up_request,down_request,st_request;//请求信号input [2:0] floorsel; //楼层选择开关input SYSCLKOUT,forbid,reset,up_button,down_button,request_button;//系统时钟、禁止运行、复位按键、上升请求按钮、下降请求按钮,楼层请求按钮wire CLKOUT; //0.5HZ的时钟wire [5:0] up_request,down_request,st_request,position,posout;wire [1:0] updnflag; //运行方向标志wire [5:0] currentstate,nextstate; //现态,次态wire [2:0] count; //OPENWAIT的计数值divider d1(SYSCLKOUT,forbid,CLKOUT);//分频器//上升请求处理up_manageru1(reset,floorsel,up_button,position,currentstate,up_request,updnflag);//下降请求处理down_managerd2(reset,floorsel,down_button,position,currentstate,down_request,updnflag);//楼层请求处理st_managers1(reset,floorsel,request_button,position,currentstate,st_request);//次态生成器nextgenn1(up_request,down_request,st_request,currentstate,position,count,updnflag,next state);//状态转换控制器statemachine s2(CLKOUT,reset,nextstate,count,position,posout,updnflag)pos_decoder p1(posout,pos_out); //楼层译码器state_decoder s3(currentstate,state); //状态译码器endmodule2.分频器module divider(SYSCLKOUT,forbid,CLKOUT);//将50MHZ的系统时钟分频为周期为2S的时钟信号input SYSCLKOUT,forbid; //forbid=1时,该模块输出的时钟强制为低,即时钟失效 output CLKOUT; //输出时钟信号reg CLK = 1'b0; //CLK为中间信号,为恒定的0.5HZ的时钟reg [25:0] Q;always @(posedge SYSCLKOUT)beginif(Q[25:0] == 49999999) //计数到半周期则反转beginQ <= 0;CLK <= ~CLK;endelseQ[25:0] <= Q[25:0] + 1'b1; //计数器增1计数endassign CLKOUT=CLK&(~forbid); //CLK和forbid相与得到CLKOUT最终输出时钟 endmodule3.上升请求处理模块moduleup_manager(reset,floorsel,up_button,position,currentstate,up_request,updnflag); //接收1-5的上升请求信号,完成请求后清除请求信号input up_button,reset;input [2:0] floorsel; //楼层选择开关input [5:0] position; //电梯所处的楼层input [1:0] updnflag; //电梯运行的方向input [5:0] currentstate;//电梯的状态output[5:0] up_request; //锁存起来的请求信号parameter UPFLAG=2'b01,DNFLAG=2'b10,STATIC=2'b00;//电梯运动方向标志parameter WAIT=6'b000001, UP=6'b000010, DOWN=6'b000100,OPENDOOR=6'b001000,CLOSEDOOR=6'b010000,OPENWAIT=6'b100000;parameter FLOOR1=6'b000001, FLOOR2=6'b000010, FLOOR3=6'b000100,FLOOR4=6'b001000, FLOOR5=6'b010000, FLOOR6=6'b100000;always@(posedge up_button,posedge reset,posedge currentstate[3])beginif(reset==1) up_request=6'd0;//复位时所有上升请求都清零else if(up_button==1) //up_button被按下时,说明有上升请求begincase(floorsel[2:0]) //根据floorsel判断是哪一层楼的上升请求3'b001:begin up_request[0]<=1'b1;end3'b010:begin up_request[1]<=1'b1;end3'b011:begin up_request[2]<=1'b1;end3'b100:begin up_request[3]<=1'b1;end3'b101:begin up_request[4]<=1'b1;enddefault:up_request<=up_request;//floorsel=0或6或7时均无效endcaseendelse //检测到电梯开门,说明有请求被完成,需要消除相应的请求if(updnflag==UPFLAG||updnflag==STATIC)//电梯方向为上升或静止时,沿途的上升请求和楼层请求可直接消除up_request<=(~position)&up_request;else if(updnflag==DNFLAG)//电梯的运动方向为下降时,只有在电梯当前楼层以下没有下降请求和楼层请求时,才能消除上升请求信号if(pos==FLOOR1) up_request[0]<=1'b0;else if(pos==FLOOR2)//1楼没有楼层请求,1-2楼没有下降请求 if((st_request&6'b000001==6'd0)&&(down_request&6'b000011==6'd0))up_request[1]<=1'b0;else if(pos==FLOOR3)if((st_request&6'b000011==6'd0)&&(down_request&6'b000111==6'd0))up_request[2]<=1'b0;else if(pos==FLOOR4)if((st_request&6'b000111==6'd0)&&(down_request&6'b001111==6'd0))up_request[3]<=1'b0;else if(pos==FLOOR5)if((st_request&6'b001111==6'd0)&&(down_request&6'b011111==6'd0))up_request[4]<=1'b0;else up_request[5]<=1'b0;else ;endendmodule4.下降请求处理模块moduledown_manager(reset,floorsel,down_button,position,currentstate,down_request,updn flag);//接收2-6楼的下降请求信号,完成请求后清除请求信号input down_button,reset;input [2:0] floorsel;input [5:0] position;input [1:0] updnflag;input [5:0] currentstate;output[5:0] down_request;parameter UPFLAG=2'b01,DNFLAG=2'b10,STATIC=2'b00;//电梯运动方向标志parameter WAIT=6'b000001, UP=6'b000010, DOWN=6'b000100,OPENDOOR=6'b001000,CLOSEDOOR=6'b010000,OPENWAIT=6'b100000;parameter FLOOR1=6'b000001, FLOOR2=6'b000010, FLOOR3=6'b000100,FLOOR4=6'b001000, FLOOR5=6'b010000, FLOOR6=6'b100000;always@(posedge down_button,posedge reset,posedge currentstate[3])beginif(reset==1) down_request=6'd0; //复位时所有下降请求都清零else if(down_button==1) //down_button被按下时,说明有下降请求begincase(Floorsel[2:0])//根据floorsel判断是哪一层楼的下降请求3'b001:begin down_request[0]<=1'b0;end3'b010:begin down_request[1]<=1'b1;end3'b011:begin down_request[2]<=1'b1;end3'b100:begin down_request[3]<=1'b1;end3'b101:begin down_request[4]<=1'b1;end3'b110:begin down_request[5]<=1'b1;enddefault:down_request<=down_request;//floorsel等于0,1,7时无效endcaseendelse //检测到电梯开门,说明有请求被完成,需要消除相应的请求if(updnflag==UPFLAG) //电梯的运动方向为上升时,只有在电梯当前楼层以上没有上升请求和楼层请求时,才能消除上升请求信号 if(pos==FLOOR1) down_request[0]<=1'b0;else if(pos==FLOOR2)//3-6楼没有楼层请求,2-5楼没有上升请求if((st_request&6'b111100==6'd0)&&(up_request&6'b111110==6'd0))down_request[1]<=1'b0;else if(pos==FLOOR3)if((st_request&6'b111000==6'd0)&&(up_request&6'b111100==6'd0))down_request[2]<=1'b0;else if(pos==FLOOR4)if((st_request&6'b110000==6'd0)&&(up_request&6'b111000==6'd0))down_request[3]<=1'b0;else if(pos==FLOOR5)if((st_request&6'b100000==6'd0)&&(up_request&6'b110000==6'd0))down_request[4]<=1'b0;else down_request[5]<=1'b0;else //电梯方向为下降或静止时,沿途的下降请求和楼层请求可直接消除down_request<=(~position)&down_request;endendmodule5.楼层请求处理模块modulest_manager(reset,floorsel,request_button,position,currentstate,st_request);//接收1-6楼的楼层请求信号,完成请求后清除请求信号input request_button,reset;input [2:0] floorsel;input [5:0] position;input [5:0] currentstate;output[5:0] st_request;always@(posedge request_button,posedge reset,posedge currentstate[3])beginif(reset==1) st_request=6'd0;//复位时所有楼层请求都清零else if(request_button==1) //request_button被按下时,说明有楼层请求begincase(Floorsel[2:0])//根据floorsel判断是哪一层楼的楼层请求3'b001:begin st_request[0]<=1'b1;end3'b010:begin st_request[1]<=1'b1;end3'b011:begin st_request[2]<=1'b1;end3'b100:begin st_request[3]<=1'b1;end3'b101:begin st_request[4]<=1'b1;end3'b110:begin st_request[5]<=1'b1;enddefault:st_request<=st_request;endcaseend//检测到电梯开门,说明有请求被完成,需要消除相应的请求else //不论电梯在向哪个方向运动,沿途的楼层请求限号都可以清零st_request<=(~position)&st_request;endendmodule6.电梯次态生成器modulenextgen(up_request,down_request,st_request,currentstate,position,count,updnflag ,nextstate);input [5:0] up_request,down_request,st_request; //三种请求信号input [5:0] currentstate,position; //电梯的现态和所处楼层input [2:0] count; //OPENWAIT的计数值input [1:0] updnflag; //运动方向标志output reg [5:0] nextstate; //输出电梯次态parameter UPFLAG=2'b01,DNFLAG=2'b10,STATIC=2'b00;//电梯运动方向标志 parameter WAIT=6'b000001, UP=6'b000010, DOWN=6'b000100,OPENDOOR=6'b001000,CLOSEDOOR=6'b010000,OPENWAIT=6'b100000;parameter FLOOR1=6'b000001, FLOOR2=6'b000010, FLOOR3=6'b000100,FLOOR4=6'b001000, FLOOR5=6'b010000, FLOOR6=6'b100000;always @(currentstate or up_request or down_request or st_request or position or count)case(currentstate)WAIT: //电梯静止状态下beginif(st_request>0) //电梯内有楼层请求信号beginif((st_request&position)>0)nextstate=OPENDOOR; //当前楼层有请求信号,开门 else if(st_request>position)nextstate=UP;//当前楼层以上有请求,上升elsenextstate=DOWN; //只有当前楼层以下有请求,下降end//没有楼层请求信号时,当前楼层有上升请求或下降请求,开门else if((up_request&position)||(down_request&position))beginnextstate=OPENDOOR;endelse if((up_request>position)||(down_request>position))nextstate=UP;//当前楼层以上有上升或下降请求信号,上升else if(up_request||down_request)nextstate=DOWN;//只有当前楼层以下有上升或下降请求信号else //没有请求信号,电梯则等待nextstate=WAIT;endUP: //电梯正处于上升状态时beginif((st_request&position)||(up_request&position))//当前楼层有楼层请求信号或上升请求信号时,需要开门nextstate=OPENDOOR;else if((st_request>position)||(up_request>position))nextstate=UP;//当前楼层以上有上升或楼层请求信号时,上升else if(down_request>0)beginif((down_request>position)&&((down_request^position)>position))nextstate=UP;//当前楼层以上有下降请求,继续上升else if((down_request&position)||(position<FLOOR6))//当前楼层以上没有任何请求信号,当前楼层有下降请求,下一状态转开门nextstate=OPENDOOR;else if((down_request&position)&&(position==FLOOR6))nextstate=OPENDOOR;//6楼有下降请求,直接开门else //只在当前楼层以下有下降请求信号,电梯下降nextstate=DOWN;endelse if(st_request||up_request)//只在当前楼层以下有上升或楼层请求信号nextstate=DOWN;else //没有请求信号时,电梯下一状态转为静止nextstate=WAIT;endDOWN: //电梯正下降中Begin //当前楼层有下降或楼层请求信号,需要开门if((st_request&position)||(down_request&position))nextstate=OPENDOOR;elseif(((st_request&FLOOR1)<position&&(st_request&FLOOR1))||((st_request&FLOOR2)<po sition&&(st_request&FLOOR2))||((st_request&FLOOR3)<position&&(st_request&FLOOR3 ))||((st_request&FLOOR4)<position&&(st_request&FLOOR4))||((st_request&FLOOR5)<p osition&&(st_request&FLOOR5))||((st_request&FLOOR6)<position&&(st_request&FLOOR 6))) //当前楼层以下有楼层请求信号,电梯继续下降nextstate=DOWN;elseif(((down_request&FLOOR1)<position&&(down_request&FLOOR1))||((down_request&FLOOR2)<position&&(down_request&FLOOR2))||((down_request&FLOOR3)<position&&(down_re quest&FLOOR3))||((down_request&FLOOR4)<position&&(down_request&FLOOR4))||((down _request&FLOOR5)<position&&(down_request&FLOOR5))||((down_request&FLOOR6)<posit ion&&(down_request&FLOOR6))) //当前楼层以下有下降请求信号,电梯继续下降nextstate=DOWN;//当前楼层以及当前楼层以下没有楼层请求信号和下降请求信号时,有上升请求信号的情况 else if(up_request>0)beginif(((up_request&FLOOR1)<position&&(up_request&FLOOR1))||((up_request&FLOOR2)<po sition&&(up_request&FLOOR2))||((up_request&FLOOR3)<position&&(up_request&FLOOR3 ))||((up_request&FLOOR4)<position&&(up_request&FLOOR4))||((up_request&FLOOR5)<p osition&&(up_request&FLOOR5))||((up_request&FLOOR6)<position&&(up_request&FLOOR 6))) //当前楼层以下有上升请求信号,继续下降nextstate=DOWN;//当前楼层以下没有任何请求信号,当前楼层没有下降请求,当前楼层有上升请求 else if((up_request&position)&&(position>FLOOR1)) nextstate=OPENDOOR; //开门else if((up_request&position)&&(position==FLOOR1)) nextstate=OPENDOOR; //1楼有上升请求信号else //当前楼层以上有上升请求信号,电梯上升nextstate=UP;//当前楼层以上有下降、楼层请求信号,电梯转上升else if(st_request||down_request)nextstate=UP;elsenextstate=WAIT; //没有任何请求信号,电梯静止endOPENDOOR: //开门后的下一状态就是OPENWAIT开门静止beginnextstate=OPENWAIT;endOPENWAIT: //OPENWAIT持续三个时钟周期后转关门beginif(count<3) nextstate=OPENWAIT;else nextstate=CLOSEDOOR;endCLOSEDOOR: //电梯关门后beginif(updnflag==UPFLAG) //电梯运动方向向上begin//关门后马上有人在当前楼层按楼层请求按钮或上升请求按钮,开门if((st_request&position)||(up_request&position))nextstate=OPENDOOR;elseif((st_request>position)||(up_request>position))//当前楼层以上有楼层请求信号或上升请求信号,电梯继续上升nextstate=UP;else if(down_request>0)//有下降请求begin//当前楼层以上有下降请求信号 if((down_request>position)&&((down_request^position)>position))nextstate=UP;else if((down_request&position)>0)//只有当前楼层有下降请求信号nextstate=OPENDOOR;else //当前楼层以下才有下降请求信号nextstate=DOWN;end//当前楼层以下有上升请求信号或楼层请求信号else if(st_request||up_request)nextstate=DOWN;else //没有请求信号时nextstate=WAIT;else if(updnflag==DNFLAG)beginif((st_request&position)||(down_request&position)) nextstate=OPENDOOR;elseif(((st_request&FLOOR1)<position&&(st_request&FLOOR1))||((st_request&FLOOR2)<po sition&&(st_request&FLOOR2))||((st_request&FLOOR3)<position&&(st_request&FLOOR3 ))||((st_request&FLOOR4)<position&&(st_request&FLOOR4))||((st_request&FLOOR5)<p osition&&(st_request&FLOOR5))||((st_request&FLOOR6)<position&&(st_request&FLOOR 6)))nextstate=DOWN;elseif(((down_request&FLOOR1)<position&&(down_request&FLOOR1))||((down_request&FLOO R2)<position&&(down_request&FLOOR2))||((down_request&FLOOR3)<position&&(down_re quest&FLOOR3))||((down_request&FLOOR4)<position&&(down_request&FLOOR4))||((down _request&FLOOR5)<position&&(down_request&FLOOR5))||((down_request&FLOOR6)<posit ion&&(down_request&FLOOR6)))nextstate=DOWN;else if(up_request>0)beginif(((up_request&FLOOR1)<position&&(up_request&FLOOR1))||((up_request&FLOOR2)<po sition&&(up_request&FLOOR2))||((up_request&FLOOR3)<position&&(up_request&FLOOR3 ))||((up_request&FLOOR4)<position&&(up_request&FLOOR4))||((up_request&FLOOR5)<p osition&&(up_request&FLOOR5))||((up_request&FLOOR6)<position&&(up_request&FLOOR 6)))nextstate=DOWN;else if((up_request&position)>0)nextstate=OPENDOOR;elsenextstate=UP;//endelse if(st_request||down_request)nextstate=UP;elsenextstate=WAIT;//endelsebeginif(st_request>0)beginif((st_request&position)>0)nextstate=OPENDOOR;else if(st_request>position)nextstate=UP;elsenextstate=DOWN;endelseif((up_request&position)||(down_request&position))beginnextstate=OPENDOOR;endelseif((up_request>position)||(down_request>position))nextstate=UP;else if(up_request||down_request)nextstate=DOWN;elsebeginnextstate=WAIT;endendenddefault://nextstate=WAIT;endcaseendmodule7.电梯状态控制器+楼层计数器module statemachine(CLKOUT,reset,nextstate,count,position,posout,updnflag)input CLKOUT,reset;input [5:0] nextstate;output reg [2:0] count;output reg [5:0] position,posout;output reg [1:0] updnflag;parameter UPFLAG=2'b01,DNFLAG=2'b10,STATIC=2'b00;//电梯运动方向标志parameter WAIT=6'b000001, UP=6'b000010, DOWN=6'b000100,OPENDOOR=6'b001000,CLOSEDOOR=6'b010000,OPENWAIT=6'b100000;parameter FLOOR1=6'b000001, FLOOR2=6'b000010, FLOOR3=6'b000100,FLOOR4=6'b001000, FLOOR5=6'b010000, FLOOR6=6'b100000;//六个状态中,唯独OPENWAIT需要持续3个时钟周期,因此增加一个计数值count来控制 always @(posedge CLKOUT or posedge reset)if(reset) //复位,count清零count<=0;else if((nextstate==OPENWAIT)&&(count<3))count<=count+1; //电梯仍然在开门静止状态时 ,count增1计数 elsecount<=0;always @(posedge CLKOUT or posedge reset)//outputif(reset) //复位时,电梯静止在1楼position<=FLOOR1; updnflag<=STATIC;elsebeginposout<=position; //posout的值比position滞后一个周期case(nextstate)WAIT: //电梯转为静止时begin position<=position; updnflag<=STATIC; endUP: //电梯转为上升时,position马上增1,运行方向变成上升begin position<=position<<1; updnflag<=UPFLAG; endDOWN: //电梯转为下降时,position马上减1,运行方向变成下降begin position<=position>>1; updnflag<=DNFLAG; endOPENDOOR,OPENWAIT,CLOSEDOOR://其他状态下,position和updnflag不变begin position<=position; updnflag<=updnflag; enddefault:begin position<=FLOOR1; updnflag<=STATIC; endendcaseendendmodule8.楼层译码器module pos_decoder(in,out); //显示电梯现在所处的楼层input [5:0] in; //输入为FLOOR1~FLOOR6output reg [6:0] out; //输出是在七段数码管上显示的1-6always@(in)begincase(in)6'b000000:out<=7'b100_0000;//06'b000001:out<=7'b111_1001;//16'b000010:out<=7'b010_0100;//26'b000100:out<=7'b011_0000;//36'b001000:out<=7'b001_1001;//46'b010000:out<=7'b001_0010;//56'b100000:out<=7'b000_0010;//6default:;endcaseendendmodule9.状态译码器module state_decoder(currentstate,state); //显示电梯的状态input [5:0] currentstate;output reg [6:0] State; //输出状态在数码管上显示,输出是字母 parameter WAIT=6'b000001, UP=6'b000010, DOWN=6'b000100,OPENDOOR=6'b001000,CLOSEDOOR=6'b010000,OPENWAIT=6'b100000; always@(currentState)begincase(currentState)WAIT,OPENWAIT: State[6:0]=~7'b1101101;//S,静止OPENDOOR: State[6:0]=~7'b1110011;//P,开门CLOSEDOOR: State[6:0]=~7'b0111001;//C,关门UP: State[6:0]=~7'b0111110;//U,上升DOWN: State[6:0]=~7'b0111111;//O,下降endcaseendendmodule八.引脚分配九.心得与体会刚开始拿到这个题目时,确实是一头雾水,因为电梯里的判断条件过于繁琐,很难清晰地把逻辑完全理清楚。