⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r4tgft.v

📁 六层电梯
💻 V
📖 第 1 页 / 共 2 页
字号:
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:    19:54:37 01/10/08
// Design Name:    
// Module Name:    r4tgft
// Project Name:   
// Target Device:  
// Tool versions:  
// Description:
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////
//电梯完成版
//操作说明:A键+数字键N=N楼有向上的请求
// B键+数字键N=N楼有向上的请求
// 只按数字键N=电梯内有到N楼的请求
// A键+B键=电梯锁定(电梯完成所有以记录的任务后,回到一楼,不在接受任何命令,直到解出锁定)
module dianti(position,go_up,go_down,forbid,A,B,floor1,floor2,floor3,floor4,floor5,floor6,clk,reset);
output [3:0]position;
output go_up,go_down,forbid;
input  A,B,clk,reset,floor1,floor2,floor3,floor4,floor5,floor6;
reg  [4:0] request_up_floor;
reg  [5:1] request_down_floor;
reg  [5:0] request_stop_floor;
reg  [3:0] position;
reg  [1:0] state;
reg  go_up,go_down,forbid;
reg  [5:0] t;

parameter stop=2'b00,up=2'b01,down=2'b10,lock=2'b11;
always @(posedge clk or negedge reset)
begin
    if(!reset)
    begin
        state<=stop;
        position<=4'b0001;
        request_up_floor<=5'b00000;
        request_down_floor<=5'b00000;
        request_stop_floor<=6'b000000;
        t<=0;
    end
    //------------------------------------------------------------------------------------
    else
    begin
      t<=t+1;
      go_up<=(state==up && !(A==1 && B==1) );
      go_down<=(state==down && !(A==1 && B==1));
      forbid<=(A==1 && B==1);
      if( A==1 && B==0)
         begin   // request up
            if(floor5==1)
               request_up_floor[4]<=1;
            if(floor4==1)
               request_up_floor[3]<=1;
            if(floor3==1)
               request_up_floor[2]<=1;
            if(floor2==1)
               request_up_floor[1]<=1;
            if(floor1==1)
               request_up_floor[0]<=1;   
         end
     else if (B==1 && A==0)
         begin   //request down
          if(floor6==1)
            request_down_floor[5]<=1;
          if(floor5==1)
            request_down_floor[4]<=1;
          if(floor4==1)
            request_down_floor[3]<=1;
          if(floor3==1)
            request_down_floor[2]<=1;
          if(floor2==1)
            request_down_floor[1]<=1;
         end
     else if(A==0 && B==0) //request in the elv
         begin
            if(floor6==1)
               request_stop_floor[5]<=1;
            if(floor5==1)
               request_stop_floor[4]<=1;
            if(floor4==1)
               request_stop_floor[3]<=1;
            if(floor3==1)
               request_stop_floor[2]<=1;
            if(floor2==1)
               request_stop_floor[1]<=1;
            if(floor1==1)
                request_stop_floor[0]<=1;
            end
    else 
         begin
           request_up_floor[4:0]<=request_up_floor[4:0];
           request_down_floor[5:1]<=request_down_floor[5:1];
           request_stop_floor[5:1]<=request_stop_floor[5:1];
           request_stop_floor[0]<=1;
        end
/****************************************************************************************/
case(position)
1: // the 1st floor 
begin
   if((request_up_floor[0]==1'b1 ||request_stop_floor[0]==1'b1) && t==20)  //open then door
        begin
         request_up_floor[0]<=1'b0;
         request_stop_floor[0]<=1'b0;
         //state<=stop; //stop
         t<=0;
         end
   else if(request_up_floor[0]==1'b0 && request_stop_floor[0]==1'b0 && t==10 )
       begin
           t<=0;
              if(request_up_floor[4:1]==4'b0000 && request_down_floor[5:1]==5'b00000 && request_stop_floor[5:1]==5'b00000)
                 begin
                    position<=1;
                    state<=stop;
                 end
              else
                 begin
                    state<=up; //up
                    position<=position+1;
                 end
       end
end
/******************************************************************************************************/
2: //the 2ed floor
begin
   if( state==up && (request_up_floor[1]==1'b1 || request_stop_floor[1]==1'b1) && t==20)  //open then door
      begin
         t<=0;
         request_up_floor[1]<=1'b0;
         request_stop_floor[1]<=1'b0;
         //state<=stop;
      end
   else if (state==down && (request_down_floor[1]==1'b1 || request_stop_floor[1]==1'b1) && t==20)  //open then door
      begin
         t<=0;
         request_down_floor[1]<=1'b0;
         request_stop_floor[1]<=1'b0;
         //state<=stop;
      end
   else if (!(state==up &&(request_up_floor[1]==1'b1 || request_stop_floor[1]==1'b1))&&!(state==down &&(request_down_floor[1]==1'b1 || request_stop_floor[1]==1'b1))&& t==10)
      begin 
       t<=0;
         if(state==up) //up
             if(request_up_floor[4:2]!=3'b000 || request_down_floor[5:2]!=4'b0000 || request_stop_floor[5:2]!=4'b0000) 
               position<=position+1;
             else if ((request_up_floor[4:2]==3'b000 && request_down_floor[5:2]==4'b0000 && request_stop_floor[5:2]==4'b0000 )&&( request_stop_floor[0]==1'b1||request_up_floor[0]==1'b0)) 
                begin
                state<=down;//down
                position<=position-1;
                end  
              else 
                   state<=stop;
        else if(state==down) //down
            if(request_stop_floor[0]==1'b1 || request_up_floor[0]==1'b1)
                 position<=position-1;
            else if( (request_up_floor[0]==1'b0 && request_stop_floor[0]==1'b0 )&& (request_up_floor[4:2]!=3'b000||request_down_floor[5:2]!=4'b0000||request_stop_floor[5:2]!=4'b0000))
               begin
                  state<=up; //up
                  position<=position+1;
               end
            else 
               state<=stop;
       else if( state==stop)
               if(request_up_floor[4:2]!=3'b000  || request_down_floor[5:2]!=4'b0000 || request_stop_floor[5:2]!=4'b0000)
                  begin
                        state<=up;//up
                       position<=position+1;
                  end
               else if(request_up_floor[0]!=1'b0 || request_stop_floor[0]!=1'b0)
                  begin
                       state<=down; //down
                        request_down_floor[1]<=1'b0;
                        request_stop_floor[1]<=1'b0;
                        position<=position-1;
                  end
      end
end
/******************************************************************************************************/

3: //the 3rd floor 
begin
   if( state==up && (request_up_floor[2]==1'b1 || request_stop_floor[2]==1'b1) && t==20)  //open then door
      begin
         t<=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -