?? r4tgft.v
字號:
`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 + -