没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
智能电梯控制器附件
目录
一、 StateShift.v 1
二、 KeyProcess.v 10
三、 display.v 16
四、 alarm.v 22
一、 StateShift.v
/
************************************StateShift.v*********************************
*********
*Module Name:StateShift
*
*Function:实时接受各楼层的上下请求信号及电梯内部的停靠请求,然后根据这些请求实现
对电梯正确的控制:
*1、除了顶层和底层外,各楼层均设有上下请求开关,顶层和底层分别设有下降和上升请
求开关;
*电梯内设有乘客到达层次的请求开关。
*2、电梯每 1s 上升或下降一层
*3、电梯到达有停站请求的楼层后,经过 1s 后电梯门打开,开门指示灯亮,开门 4s 后电梯
指示灯灭,电梯继续
*运行,直至运行完最后一个请求后停靠在当前层。
*4、能记忆点个体内外的所有请求信号,并按运行规则顺序相应各个请求,每个请求信号
*保持至被执行完成后才被清除,这将与 display 模块配合实现
*5、电梯运行规则:与一般的电梯的运行规则一致,请参见后面的关于状态转移的说明
*
*Input Port:F1Up, F2Up, F3Up 分别为 1-3 楼的上行请求信号,F2Dn, F3Dn, F4Dn 则分别为 2-4
楼的下行请求信号
*F1Stop, F2Stop, F3Stop, F4Stop 则分别为电梯内部的停靠 1-4 楼的请求
*上述各端口均为有请求时,输入为高电平,否则为低电平;
*clk 为状态转移时钟,reset 为复位信号
*
*Output Port:PosOut 输出当前电梯所在的楼层,DoorFlag 为开门标志,UpDnFlag 为电梯上下标
志
*LiftState 输出当前电梯的状态.
*PosOut 取值可为 4'b0001,4'b0010,4'b0100,4'1000,分别代表电梯处在 1,2,3,4 楼。这样编码的
话,有利于后面的比较判断。
*DoorFlag 取值可为 1'b0,1'b1,分别代表当前门是关闭和当前门是打开的。
*UpDnFlag 取值可为 2'b00,2'b01,2'b10,分别代表当前电梯是上升的,下降的和静止的。
*LiftState 取 值 可 为
7'b0000001,7'b0000010,7'b0000100,7'b0001000,7'b0010000,7'b0100000,7'b1000000,
*分别电梯处于等待模式、上升模式、下降模式、上升停止,下降停止、开门和关门等 7 个
第 1 页,共 22 页
012004015602 电子信息工程 0406 班 彭令鹏
状态。
*
*Detailed Illustration:电梯在上述七个状态间的转移是通过三段式状态机来实现的,各状态
间的转移
*大体与生活中的电梯运转一致,有如下的基本原则:
*1、方向为第一优先准则,这就是说电梯在运转时先响应同方向上的请求,只有当同方向
上的请求
*响应完后,才能转而响应不同方向上的请求。
*2、电梯处于等待模式时,其同时受到多个请求激发时,进入哪个模式,依次由内部请求、
向上请求和向下请求
*决定,请参考源程序理解这一点。
*3、电梯的初始化状态为 1 楼等待门是关闭的
*
*Author:EI HUST bripengandre
*Email:bripengandre@126.com (or bripengandre@smail.hust.edu.cn)
*
*date:08-07-2007
*
*bug:No bug has been found up to now.
*******************************************************************************
********/
module StateShift(PosOut, DoorFlag, UpDnFlag, LiftState, clk, reset, F1Up, F2Up, F3Up
,F2Dn, F3Dn, F4Dn, F1Stop, F2Stop, F3Stop, F4Stop);
//各端口的意义,请参见最前面的模块简介中的相关说明
output [3:0] PosOut;
output DoorFlag;
output [1:0]UpDnFlag;
output [6:0] LiftState;
input clk,reset,F1Up,F2Up,F3Up,F2Dn,F3Dn,F4Dn,F1Stop,F2Stop,F3Stop,F4Stop;
//pos 与 Posout 的关系:当前状态一改变,pos 立即作相应改变,而 PosOut 则是当前状态在
要变到下一状态的瞬间
//,将 PosOut 作相应改变。如从 WAIT 切换到第一个 UP 时,pos 立即加一,而 PosOut
则要等到第一个 UP
//即将切换到第二个 UP 时,才加一。
reg [3:0]pos,PosOut;
reg[2:0] count;//门开后要持续 4 个时钟周期,用 count 来计数
reg DoorFlag;
reg [1:0] UpDnFlag;
reg [6:0] LiftState,NextState;//分别表示电梯的当前状态和下一状态
//UpReq,DownReq,StopReq 分别用来合并向上请求的各信号,向下请求的各信号和停
靠请求的各信号
//以便判断电梯在状态间如何转移时更简洁
reg [3:0] UpReq,DownReq,StopReq;
第 2 页,共 22 页
智能电梯控制器附件
//定义电梯 7 种状态的符号常量
parameter WAIT=7'b0000001, UP=7'b0000010, DOWN=7'b0000100, UPSTOP=7'b0001000
, DOWNSTOP=7'b0010000, OPENDOOR=7'b0100000, CLOSEDOOR=7'b1000000;
//定义楼层的符号常量
parameter FLOOR1=4'b0001, FLOOR2=4'b0010, FLOOR3=4'b0100, FLOOR4=4'b1000;
parameter TRUE=1'b1, FALSE=1'b0;
//定义门打开和门关闭的符号常量
parameter OPEN=1'b1, CLOSED=1'b0;
//定义电梯上升,下降和静止的符号常量
parameter UPFLAG=2'b01,DNFLAG=2'b10,STATIC=2'b00;
//将各上升请求信号实时地合并(4 楼为顶层,无上升请求,考虑到通用性,将第 4 位填
零)
always @(F1Up or F2Up or F3Up )
UpReq={1'b0,F3Up,F2Up,F1Up};
//将各下降请求信号实时地合并(1 楼为底层,无下降请求,考虑到通用性,将第 1 位填零)
always @(F2Dn or F3Dn or F4Dn)
DownReq={F4Dn, F3Dn, F2Dn,1'b0};
//将各停靠请求信号实时地合并
always @(F1Stop or F2Stop or F3Stop or F4Stop)
StopReq={F4Stop, F3Stop, F2Stop, F1Stop};
//1st StateShift always block,sequential state transition
always @(posedge clk or posedge reset)
if(reset)
begin
LiftState<=WAIT;
end
else
LiftState<=NextState;
//2nd StateShift always block,combinational condition judgement
always @(LiftState or UpReq or DownReq or StopReq or pos or count or UpDnFlag)
case(LiftState)
WAIT:
begin
if(StopReq>0)//有停靠请求否
begin
if((StopReq&pos)>0)//停靠请求中有当前楼层停靠请求否
NextState=OPENDOOR;//有当前楼层请求,则下一状态转开门
else if(StopReq>pos)//有当前楼层之上的停靠请求否(优先向上的请求)
NextState=UP;//有则,下一状态转上升
else
NextState=DOWN;//只有当前楼层之下的停靠请求,下一状态转下降
第 3 页,共 22 页
012004015602 电子信息工程 0406 班 彭令鹏
end
else if((UpReq&pos)||(DownReq&pos))//上下请求中有当前楼层请求否
begin
NextState=OPENDOOR;
end
else if((UpReq>pos)||(DownReq>pos))//上下请求中有当前楼层之上的请求否
NextState=UP;
else if(UpReq||DownReq)//上下请求中有当前楼层之下的请求否
NextState=DOWN;
else
NextState=WAIT;//无任何请求,继续处于 WAIT 模式
end
UP:
begin
if((StopReq&pos)||(UpReq&pos))//停靠或上升请求中有当前楼层的请求否
NextState=UPSTOP;//有,下一状态转为 UPSTOP(停靠后要 1s 才开门,UPSTOP
即为这 1s 的过渡期)
else if((StopReq>pos)||(UpReq>pos))//停靠或上升请求中有当前楼层之上的请求否
NextState=UP;
else if(DownReq>0)//有下降请求否
begin
if((DownReq>pos)&&((DownReq^pos)>pos))//下降请求中有当前楼层的请求
否
NextState=UP;
else if((DownReq&pos)||(pos<FLOOR4)) //其实这样做意义不大,只是使上下
标志提前变化
NextState=UPSTOP;
else if((DownReq&pos)&&(pos==FLOOR4))//事实上不满足第一条件的话,
电梯根本不会到达第四层
NextState=DOWNSTOP;
else//下降请求中只有当前楼层之下的请求
NextState=DOWN;
end
else if(StopReq||UpReq)//只有当前楼层之上的停靠或上升请求否
NextState=DOWN;
else
NextState=WAIT;//无任何请求,转为 WAIT 模式
end
//DOWN 的状态转移请参见 UP 的状态转移
DOWN:
begin
第 4 页,共 22 页
智能电梯控制器附件
if((StopReq&pos)||(DownReq&pos))
NextState=DOWNSTOP;
else if(((StopReq&FLOOR1)<pos&&(StopReq&FLOOR1))||
((StopReq&FLOOR2)<pos&&(StopReq&FLOOR2))||
((StopReq&FLOOR3)<pos&&(StopReq&FLOOR3))||
((StopReq&FLOOR4)<pos&&(StopReq&FLOOR4)))
NextState=DOWN;
else if(((DownReq&FLOOR1)<pos&&(DownReq&FLOOR1))||
((DownReq&FLOOR2)<pos&&(DownReq&FLOOR2))||
((DownReq&FLOOR3)<pos&&(DownReq&FLOOR3))||
((DownReq&FLOOR4)<pos&&(DownReq&FLOOR4)))
NextState=DOWN;
else if(UpReq>0)
begin
if(((UpReq&FLOOR1)<pos&&(UpReq&FLOOR1))||
((UpReq&FLOOR2)<pos&&(UpReq&FLOOR2))||
((UpReq&FLOOR3)<pos&&(UpReq&FLOOR3))||
((UpReq&FLOOR4)<pos&&(UpReq&FLOOR4)))
NextState=DOWN;
else if((UpReq&pos)&&(pos>FLOOR1))
NextState=DOWNSTOP;
else if((UpReq&pos)&&(pos==FLOOR1))
NextState=UPSTOP;
else
NextState=UP;
end
else if(StopReq||DownReq)
NextState=UP;
else
NextState=WAIT;
end
UPSTOP:
begin
NextState=OPENDOOR;//停靠 1 时钟周期后开门
end
DOWNSTOP:
begin
NextState=OPENDOOR;//停靠 1 时钟周期后开门
end
OPENDOOR:
begin
if(count<4)//开门不足 4 周期,则继续转移到开门状态
第 5 页,共 22 页
剩余21页未读,继续阅读
资源评论
guangzhizi1988
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功