【文章內(nèi)容簡介】
count=count+1。//如果計(jì)數(shù)不到5且下一狀態(tài)為OPENDOOR的話,繼續(xù)計(jì)數(shù) else count=0。//清零,以備下次計(jì)數(shù) //display which floor the elevator is.... display_decode h1(cp_50M,PosOut,out,over_alarm)。 display_decode_count h2(cp_50M,count,count_out)。 // finite state machine in the style of three segments ,三段式 //1st StateShift always block,sequential state transition,有限狀態(tài)機(jī)第一段 always @(posedge real_clk or posedge reset) if(reset) begin LiftState=WAIT。 end else LiftState=NextState。 //2nd StateShift always block,binational condition judgement,有限狀態(tài)機(jī)第二段 always @(LiftState or up_all or down_all or request_all or pos or count or UpDnFlag) case(LiftState) WAIT: begin if(request_all0)//有??空埱蠓? begin if((request_allamp。pos)0)//??空埱笾杏挟?dāng)前樓層??空埱蠓? NextState=OPENDOOR。//有當(dāng)前樓層請求,則下一狀態(tài)轉(zhuǎn)開門 else if(request_allpos)//有當(dāng)前樓層之上的??空埱蠓瘢▋?yōu)先向上的請求) NextState=UP。//有則,下一狀態(tài)轉(zhuǎn)上升 else NextState=DOWN。//只有當(dāng)前樓層之下的停靠請求,下一狀態(tài)轉(zhuǎn)下降 end else if((up_allamp。pos)||(down_allamp。pos))//上下請求中有當(dāng)前樓層請求否 begin NextState=OPENDOOR。 end else if((up_allpos)||(down_allpos))//上下請求中有當(dāng)前樓層之上的請求否 NextState=UP。 else if(up_all||down_all)//上下請求中有當(dāng)前樓層之下的請求否 NextState=DOWN。 else NextState=WAIT。//無任何請求,繼續(xù)處于WAIT模式 end UP: begin if((request_allamp。pos)||(up_allamp。pos))//??炕蛏仙埱笾杏挟?dāng)前樓層的請求否 NextState=UPSTOP。//有,下一狀態(tài)轉(zhuǎn)為UPSTOP(停靠后要1s才開門,UPSTOP即為這1s的過渡期) else if((request_allpos)||(up_allpos))//??炕蛏仙埱笾杏挟?dāng)前樓層之上的請求否 NextState=UP。 else if(down_all0)//有下降請求否 begin if((down_allpos)amp。amp。((down_all^pos)pos))//下降請求中有當(dāng)前樓層的請求否 NextState=UP。 else if((down_allamp。pos)||(posFLOOR6)) //其實(shí)這樣做意義不大,只是使上下標(biāo)志提前變化 NextState=UPSTOP。 else if((down_allamp。pos)amp。amp。(pos==FLOOR6))//事實(shí)上不滿足第一條件的話,電梯根本不會到達(dá)第四層 NextState=DOWNSTOP。 else//下降請求中只有當(dāng)前樓層之下的請求 NextState=DOWN。 end else if(request_all||up_all)//只有當(dāng)前樓層之上的??炕蛏仙埱蠓? NextState=DOWN。 else NextState=WAIT。//無任何請求,轉(zhuǎn)為WAIT模式 end //DOWN的狀態(tài)轉(zhuǎn)移請參見UP的狀態(tài)轉(zhuǎn)移 DOWN: begin if((request_allamp。pos)||(down_allamp。pos)) NextState=DOWNSTOP。 else if(((request_allamp。FLOOR1)posamp。amp。(request_allamp。FLOOR1))||((request_allamp。FLOOR2)posamp。amp。(request_allamp。FLOOR2))||((request_allamp。FLOOR3)posamp。amp。(request_allamp。FLOOR3))||((request_allamp。FLOOR4)posamp。amp。(request_allamp。FLOOR4))||((request_allamp。FLOOR5)posamp。amp。(request_allamp。FLOOR5))||((request_allamp。FLOOR6)posamp。amp。(request_allamp。FLOOR6))) NextState=DOWN。 else if(((down_allamp。FLOOR1)posamp。amp。(down_allamp。FLOOR1))||((down_allamp。FLOOR2)posamp。amp。(down_allamp。FLOOR2))||((down_allamp。FLOOR3)posamp。amp。(down_allamp。FLOOR3))||((down_allamp。FLOOR4)posamp。amp。(down_allamp。FLOOR4))||((down_allamp。FLOOR5)posamp。amp。(down_allamp。FLOOR5))||((down_allamp。FLOOR6)posamp。amp。(down_allamp。FLOOR6))) NextState=DOWN。 else if(up_all0) begin if(((up_allamp。FLOOR1)posamp。amp。(up_allamp。FLOOR1))||((up_allamp。FLOOR2)posamp。amp。(up_allamp。FLOOR2))||((up_allamp。FLOOR3)posamp。amp。(up_allamp