module clockgen(reset,clk,clkout); input reset,clk; output reg clkout; parameter i=50000000; reg [25:0]counter; initial counter=0; always@(posedge clk) begin if(reset) clkout=0; else if(counter==i-1) begin counter=0; clkout=~clkout; end else counter=counter+1; end endmodule module elevator(en,reset,clk,out1,out2,out3,f1,f2,f3,l_m,l_o,l_c,sel); input en,reset,clk,out1,out2,out3,f1,f2,f3; output reg l_m,l_o,l_c; output reg [1:0]sel; parameter floor1=2'b01; parameter floor2=2'b10; parameter floor3=2'b11; parameter floor0=2'b00; wire clkout; clockgen m1(reset,clk,clkout); reg [1:0]present_state,next_state; initial begin present_state=0; next_state=0; end always @ (posedge clkout or posedge reset) begin if (reset == 1'b1) begin present_state = floor0; l_m=0; l_o=0; l_c=0; sel=2'b00; end else begin present_state=next_state; end end always @ (en,clkout,reset,out1,out2,out3,f1,f2,f3) begin case(present_state) floor1: begin if(out1==1'b1) begin if(f2==1) begin next_state=floor2; l_m=1; //delay(200); l_o=1; l_c=1; sel=2'b10; end else if(f3==1) begin next_state=floor3; l_m=1; //delay(300); l_o=1; l_c=1; sel=2'b11; end else next_state=present_state; l_o=1; l_c=1; sel=2'b01; end end floor2: begin if(out2==1'b1) begin if(f3==1'b1) begin next_state=floor3; l_m=1; //delay(200); l_o=1; l_c=1; sel=2'b11; end else if(f1==1'b1) begin next_state=floor1; l_m=1; //delay(200); l_o=1; l_c=1; sel=2'b01; end else begin next_state=floor2; l_o=1; l_c=1; sel=2'b10; end end end floor3: begin if(out3==1'b1) begin if(f2==1'b1) begin next_state=floor2; l_m=1; //delay(200); l_o=1; l_c=1; sel=2'b10; end else if(f1==1'b1) begin next_state=floor1; l_m=1; //delay(300); l_o=1; l_c=1; sel=2'b01; end else begin next_state=floor3; l_o=1; l_c=1; sel=2'b11; end end end floor0: begin if(en==1'b1) begin next_state=floor1; sel=2'b01; l_m=1; //delay(200); end else begin next_state=floor0; sel=2'b00; end end default: begin next_state=floor0; sel=2'b00; end endcase end /* function delay; input [9:0]value; //reg delay; integer i; begin for(i=0;i