课程设计--电梯控制器
希望大家喜欢。附部分代码:
/************************************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 PortosOut输出当前电梯所在的楼层,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个状态。
*
*Detailed Illustration:电梯在上述七个状态间的转移是通过三段式状态机来实现的,各状态间的转移
*大体与生活中的电梯运转一致,有如下的基本原则:
*1、方向为第一优先准则,这就是说电梯在运转时先响应同方向上的请求,只有当同方向上的请求
*响应完后,才能转而响应不同方向上的请求。
*2、电梯处于等待模式时,其同时受到多个请求激发时,进入哪个模式,依次由内部请求、向上请求和向下请求
*决定,请参考源程序理解这一点。
*3、电梯的初始化状态为1楼等待门是关闭的
*
*Author:EI HUST bripengandre
*Email:bripengandre@126.com (or bripengandre@smail.hust.edu.cn)
*
*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;
//定义电梯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; |