📄 liftcontrol.v
字号:
module Lift(clk,rst,p1,p2,p3,p4,p5,p6,p7,d2,d3,d4,d5,d6,d7,d8,in_request, curfloorlight,inrequestlight,uplight,dnlight);///////inputinput clk,rst;input p1,p2,p3,p4,p5,p6,p7,d2,d3,d4,d5,d6,d7,d8; //out request,p:up; d:downinput [7:0]in_request;//choose floor///////outputoutput [7:0] inrequestlight;//display all choosed flooroutput uplight;//display the up stateoutput dnlight;//display the down stateoutput [3:0]curfloorlight;//display the current floor//output door; //door==1,open door;door==0,close doorreg [7:0] inrequestlight;reg uplight,dnlight;reg [3:0] curfloorlight;///////reg in modulereg [7:0] curfloor;//store the current floorparameter WAIT=2'b00,UP=2'b01,DOWN=2'b10,STOP=2'b11;//define the lift statereg [1:0] state;//store the lift state:UP or DOWN or WAIT or STOP reg [1:0] pre_state;reg [7:0] uprequest;//store all of the up request reg [7:0] dnrequest;//store all of the down requestreg [7:0] inrequest;//store all of the floor where user will go reg [2:0] count;//counter,when counter=0,the door opened,until count=5,then close the doorreg door;///accept and store the inputalways@(p1 or p2 or p3 or p4 or p5 or p6 or p7 or d2 or d3 or d4 or d5 or d6 or d7 or d8 or in_request)begin uprequest[0]=p1; uprequest[1]=p2; uprequest[2]=p3; uprequest[3]=p4; uprequest[4]=p5; uprequest[5]=p6; uprequest[6]=p7; uprequest[7]=0; dnrequest[0]=0; dnrequest[1]=d2; dnrequest[2]=d3; dnrequest[3]=d4; dnrequest[4]=d5; dnrequest[5]=d6; dnrequest[6]=d7; dnrequest[7]=d8; inrequest=in_request;end///////output the curflooralways @ (curfloor)begin case(curfloor) 8'b00000001:curfloorlight=4'b0001; 8'b00000010:curfloorlight=4'b0010; 8'b00000100:curfloorlight=4'b0011; 8'b00001000:curfloorlight=4'b0100; 8'b00010000:curfloorlight=4'b0101; 8'b00100000:curfloorlight=4'b0110; 8'b01000000:curfloorlight=4'b0111; 8'b10000000:curfloorlight=4'b1000; default:curfloorlight=4'b0000; endcaseend //output the current statealways @ (state)begin if(state==UP) begin uplight=1; dnlight=0; end else if(state==DOWN) begin uplight=1; dnlight=0; end else begin uplight=0; dnlight=0; endendalways@(posedge clk)begin if(!rst) begin state<=STOP; uprequest<=8'b00000000; dnrequest<=8'b00000000; inrequest<=8'b00000000; curfloor<=8'b00000001; end else begin case (state) STOP: begin if((uprequest==8'b0)&&(dnrequest==8'b0)) state<=STOP; else begin case(curfloor) 8'b00000001: if(uprequest[0]) begin uprequest[0]<=0; state<=WAIT; count<=0; door<=1; end else state<=UP; 8'b00000010: if(uprequest[1]||dnrequest[1]) begin uprequest[1]<=0; dnrequest[1]<=0; state<=WAIT; count<=0; door<=1; end else if((uprequest>curfloor)||(dnrequest>curfloor)) state<=UP; else state<=DOWN; 8'b00000100: if(uprequest[2]||dnrequest[2]) begin uprequest[2]<=0; dnrequest[2]<=0; state<=WAIT; count<=0; door<=1; end else if((uprequest>curfloor)||(dnrequest>curfloor)) state<=UP; else state<=DOWN; 8'b00001000: if(uprequest[3]||dnrequest[3]) begin uprequest[3]<=0; dnrequest[3]<=0; state<=WAIT; count<=0; door<=1; end else if((uprequest>curfloor)||(dnrequest>curfloor)) state<=UP; else state<=DOWN; 8'b00010000: if(uprequest[4]||dnrequest[4]) begin uprequest[4]<=0; dnrequest[4]<=0; state<=WAIT; count<=0; door<=1; end else if((uprequest>curfloor)||(dnrequest>curfloor)) state<=UP; else state<=DOWN; 8'b00100000: if(uprequest[5]||dnrequest[5]) begin uprequest[5]<=0; dnrequest[5]<=0; state<=WAIT; count<=0; door<=1; end else if((uprequest>curfloor)||(dnrequest>curfloor)) state<=UP; else state<=DOWN; 8'b01000000: if(uprequest[6]||dnrequest[6]) begin uprequest[6]<=0; dnrequest[6]<=0; state<=WAIT; count<=0; door<=1; end else if((uprequest>curfloor)||(dnrequest>curfloor)) state<=UP; else state<=DOWN; 8'b10000000: if(dnrequest[7]) begin dnrequest[7]<=0; state<=WAIT; count<=0; door<=1; end else state<=DOWN; endcase end end WAIT: begin if (count==3'b101) door<=0; else count<=count+1; if(inrequest==0 && uprequest==0 && dnrequest==0) state<=STOP; else if(inrequest>curfloor) state<=UP; else if((inrequest<curfloor)&&(inrequest!=0)) state<=DOWN; else state<=WAIT; end UP: begin case(curfloor) 'b00000001: begin if(inrequest[1] && uprequest[1]) begin inrequest[1]<=0; uprequest[1]<=0; pre_state<=state; state<=WAIT; count<=0; door<=1; end else if(uprequest[1]) begin uprequest[1]<=0; pre_state<=state; state<=WAIT; count<=3'b000; door<=1; end else if(inrequest[1]) begin inrequest[1]<=0; pre_state<=state; state<=WAIT; count<=3'b000; door<=1; end else state<=UP; end 'b00000010: begin if(inrequest[2] && uprequest[2]) begin inrequest[2]<=0; uprequest[2]<=0; pre_state<=state; state<=WAIT; count<=3'b000; door<=1; end else if(uprequest[2]) begin uprequest[2]<=0; pre_state<=state; state<=WAIT; count<=3'b000; door<=1; end else if(inrequest[2]) begin inrequest[2]<=0; pre_state<=state; state<=WAIT; count<=3'b000; door<=1; end else state<=UP; end 'b00000100: begin if(inrequest[3] && uprequest[3]) begin inrequest[3]<=0; uprequest[3]<=0; pre_state<=state; state<=WAIT; count<=3'b000; door<=1; end else if(uprequest[3]) begin uprequest[3]<=0; pre_state<=state; state<=WAIT; count<=3'b000; door<=1; end else if(inrequest[3]) begin inrequest[3]<=0; pre_state<=state; state<=WAIT; count<=3'b000; door<=1; end else state<=UP; end 'b00001000: begin if(inrequest[4] && uprequest[4]) begin inrequest[4]<=0; uprequest[4]<=0; pre_state<=state; state<=WAIT; count<=3'b000; door<=1; end else if(uprequest[4]) begin uprequest[4]<=0; pre_state<=state; state<=WAIT; count<=3'b000; door<=1; end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -