【正文】
//6 default:over_alarm=1。b100000:out=739。b001_0010。//4 639。b001000:out=739。b011_0000。//2 639。b000010:out=739。b111_1001。//0 639。b000000:out=739。 reg over_alarm。 output over_alarm。 input cp_50M。 end endcase endendmodule數(shù)碼管譯碼模塊module display_decode(cp_50M,in,out,over_alarm)。 DoorFlag=CLOSED。 UpDnFlag=UpDnFlag。 end CLOSEDOOR: begin pos=pos。 DoorFlag=OPEN。 UpDnFlag=DNFLAG。 end DOWNSTOP: begin pos=pos。 DoorFlag=CLOSED。 UpDnFlag=DNFLAG。 end DOWN: begin pos=pos1。 DoorFlag=CLOSED。 UpDnFlag=STATIC。//PosOut的輸出慢pos一個(gè)時(shí)鐘周期 case(NextState) WAIT: //狀態(tài)為WAIT時(shí),樓層不變,門(mén)是關(guān)閉的,電梯是靜止的,其他模式的情況請(qǐng)大家自己推導(dǎo) begin pos=pos。 UpDnFlag=STATIC。 endcase //3rd StateShift always block,the sequential FSM output,有限狀態(tài)機(jī)第三段 always (posedge real_clk or posedge reset)//output if(reset) //復(fù)位后初始化當(dāng)前樓層為第一層,門(mén)是關(guān)閉的,電梯是靜止的 begin pos=FLOOR1。 else begin NextState=WAIT。 end else if((up_allpos)||(down_allpos)) NextState=UP。pos)||(down_allamp。 else NextState=DOWN。pos)0) NextState=OPENDOOR。 else NextState=WAIT。 else NextState=UP。 else if((up_allamp。(up_allamp。FLOOR6)posamp。(up_allamp。FLOOR5)posamp。(up_allamp。FLOOR4)posamp。(up_allamp。FLOOR3)posamp。(up_allamp。FLOOR2)posamp。(up_allamp。FLOOR1)posamp。FLOOR6))) NextState=DOWN。amp。FLOOR5))||((down_allamp。amp。FLOOR4))||((down_allamp。amp。FLOOR3))||((down_allamp。amp。FLOOR2))||((down_allamp。amp。FLOOR1))||((down_allamp。amp。 else if(((down_allamp。(request_allamp。FLOOR6)posamp。(request_allamp。FLOOR5)posamp。(request_allamp。FLOOR4)posamp。(request_allamp。FLOOR3)posamp。(request_allamp。FLOOR2)posamp。(request_allamp。FLOOR1)posamp。pos)) NextState=OPENDOOR。//無(wú)任何請(qǐng)求,轉(zhuǎn)為WAIT模式 end //請(qǐng)參考UpDnFlag=UPFLAG的注釋 else if(UpDnFlag==DNFLAG) begin if((request_allamp。 end else if(request_all||up_all)//上升和停靠請(qǐng)求中有當(dāng)前層的請(qǐng)求且只有當(dāng)前層下的請(qǐng)求 NextState=DOWN。pos)0)//有當(dāng)前樓層的下降請(qǐng)求信號(hào),且更上層無(wú)下降請(qǐng)求 NextState=OPENDOOR。((down_all^pos)pos)) NextState=UP。 else if(down_all0)//有下降請(qǐng)求否 begin if((down_allpos)amp。pos))//上升或停靠請(qǐng)求中有當(dāng)前樓層的請(qǐng)求否,有可能關(guān)門(mén)的瞬間又有新的請(qǐng)求 NextState=OPENDOOR。//開(kāi)門(mén)5周期后,關(guān)門(mén) end CLOSEDOOR: begin if(UpDnFlag==UPFLAG)//開(kāi)門(mén)關(guān)門(mén)前電梯是處于上升狀態(tài)嗎 begin if((request_allamp。//???時(shí)鐘周期后開(kāi)門(mén) end OPENDOOR: begin if(count5)//開(kāi)門(mén)不足5周期,則繼續(xù)轉(zhuǎn)移到開(kāi)門(mén)狀態(tài) NextState=OPENDOOR。 end UPSTOP: begin NextState=OPENDOOR。 end else if(request_all||down_all) NextState=UP。(pos==