题目:电梯控制器 姓名:温庆 学号:031241214 班级:0312412 指导老师:黄双林 1
目录
摘 要 .............................................................. 3 正文 ............................................................... 4 1设计目的及要求 .................................................... 4 2设计原理 .......................................................... 4
2.1 设计实现原理 ............................................... 4 2.2项目分块及其实现方案......................................... 6 2.3电梯控制器的流程图........................................... 7 3设计内容 .......................................................... 8
3.1基本状态设计................................................. 8 3.2模块设计..................................................... 9 3.3波形仿真.................................................... 10 总结与致谢 ........................................................ 14 参考文献 .......................................................... 15 附录 .............................................................. 16
2
摘 要
电梯作为垂直方向的交通工具,在高层建筑和公共场所已成为不可或缺的设备。中国是全球最大的电梯市场,也具有最强的电梯生产能力,但由于缺乏自主知识产权和核心技术,自主品牌占市场的份额很少。因此要加大对电梯技术的创新和发展,提升电梯的性能,就需要引进更好的技术,电梯控制器就是很好的装置,大力开发控制器是很必要的。
电梯的微机化控制主要有以下几种形式:PLC控制;单片机控制;单板机控制;单微机控制;多微机控制;人工智能控制。本次课程设计采用了EDA技术进行操作EDA技术打破了软件和硬件间的壁垒,使计算机的软件技术与硬件实现、设计效率与产品性能合二为一,它代表了电子设计技术和应用技术的发展方向。
本设计采用Verilog HDL语言的编程技术,源程序Altera公司的Quartus II软件仿真。
关键字:EDA技术; Verilog HDL语言; Quartus II软件
3
正文
1设计目的及要求
1、进一步巩固理论知识,培养所学理论知识的在实际中的应用能力;掌握EDA设计的一般方法;熟悉一种EDA软件,掌握一般EDA系统的调试方法;利用EDA软件设计一个电子技术综合问题,培养Verilog HDL编程、书写技术报告的能力。为以后进行工程实际问题的研究打下设计基础。
2、设计一个6层电梯控制器电路,用数码管显示电梯所在楼层号,电梯初始状态为第一楼层;每楼层电梯外都有上、下楼请求开关,电梯内设有乘客到达楼层的请求开关、电梯所处楼层、上升模式及下降模式的指示;电梯每2秒升降一层,到达有停站请求的楼层后,经4秒电梯门打开,开门指示灯亮,开门4秒后,指示灯灭,关门,关门时间3秒,电梯继续运行。可以通过快速关门和关门中断信号控制;能记忆电梯内外的请求信号,当电梯处于上升模式时,只响应比电梯所在位置高的楼请求信号,直到最后一个上楼请求执行完毕,再进入下降模式。
2设计原理
2.1 设计实现原理
根据系统设计要求,并考虑到系统的可检验性,整个系统的输入输出接口设计如图1所示:系统工作用2Hz基准时钟信号CLKIN,楼层上升请求键UPIN,楼层下降请求键DOWNIN,楼层选择键入键ST_CH,提前关门输入键CLOSE,延迟关门输入键DELAY,电梯运行的开关键RUN_STOP,电梯运行或停止指示键LAMP,电梯运行或等待时间指示键RUN_WAIT,电梯所在楼层指示数码管ST_OUT,楼层选择指示数码管DIRECT。
4
DTKZQ CLKIN LAMP UPIN DOWNIN ST_CH[1] RU_WAIT CLOSE ST_OUT DELAY DIRECT
RUN_STOP 图 1. 电梯控制器DTKZQ的输入输出接口图
各输入端口的功能如下:
CLKIN:基准时钟信号,为系统提供2Hz的时钟脉冲,上升沿有效; UPIN:电梯上升请求键。由用户向电梯控制器发出上升请求。高电平有效; DOWNIN:电梯下降请求键,由用户向电梯控制器发出下降请求。高电平有效; ST_CH[2..0]:楼层选择键入键,结合DIRECT完成楼层选择的键入,高电平有效; CLOSE:提前关门输入键。可实现无等待时间的提前关门操作,高电平有效; DELAY: 延迟关门输入键。可实现有等待时间的延迟关门操作,高电平有效; RUN_STOP:电梯运行或停止开关键。可实现由管理员控制电梯的运行或停止,高电平有效。 一下为输出端口:
LAMP:电梯运行或等待指示键,指示电梯的运行或等待状况。高电平有效; RUN_WAIT:电梯运行或等待时间指示键,指示电梯运行状况或等待时间的长短,高电平有效;
ST_OUT:电梯所在楼层指示数码管,只是电梯当前所在的楼层数。即1~6层,高电平有效;
DIRECT:楼层选择指示数码管,指示用户所要选择的楼层数,高电平有效。
5
2.2项目分块及其实现方案
电梯的控制状态包括运行状态﹑停止状态及等待状态,其中运行状态又包含向上状态和向下状态。主要动作有开、关门,乘客可通过键入开、关门按键,呼唤按键,指定楼层按钮等来控制电梯的行与停。
据此,整个电梯控制器DTLZQ应包括如下几个组成部分:①时序输出及楼选计数器;②电梯服务请求处理器;③电梯升降控制器;④上升及下降寄存器;⑤电梯次态生成器。该电梯控制器设计的关键是确定上升及下降寄存器的置位与复位。整个系统的内部组成结构图2所示。
DRECT CLKIN 时序输出及楼选计数器(DIR) UOIN 电梯服DOWNIN 务请求ST_CH 处理器 RUN_STOP 电梯次态生成器(LADD) DELAY 电梯升降 控制器 CLOSE (LIFTOR) 上升请求寄存器(UR) 下降请求寄存器(DR) LAMP RUN_WAIT ST_OUT
图2. 电梯控制器的内部组成结构图
6
时钟CLK 请 楼层请求 请求信号显示 求 信 超 载 控 运行状态显示 输 出 号 输 关门中断 制 所在楼层显示 显示 入 模 提前关门 模 门控制信号 模块 块 清楚报警 块 超载报警
图3. 电梯控制器系统框图
2.3电梯控制器的流程图
外部按键 初始化
等待 请求信号寄存器 否 是否有请求? 状态寄存器 是 目标层与本层 内部软件执行机构 是否同层? 否 是
判定电梯运行方向 外部硬件执行机构 电梯运行 图4 总流程图
楼层检测 否 是否目标层?
是
7
否 电梯停止 开门 关门 是否停止运行? 是 停止 图5 电梯控制主流程图 3设计内容
3.1基本状态设计
1、采用信号并置处理很多输入信号的方式:
always @(call_up_1 or call_up_2 or call_up_3 or call_up_4 or call_up_5) up_all={1'b0, call_up_5, call_up_4, call_up_3, call_up_2, call_up_1};
//将各下降请求信号实时地合并(1楼为底层,无下降请求,考虑到通用性,将第1位填零)
always @(call_down_2 or call_down_3 or call_down_4 or call_down_5 or call_down_6)
down_all={call_down_6, call_down_5, call_down_4, call_down_3, call_down_2, 1'b0};
//将各停靠请求信号实时地合并
always @(request_1 or request_2 or request_3 or request_4 or request_5 or request_6)
request_all={request_6, request_5, request_4, request_3, request_2, request_1};
2、通过参数定义把信号并置的方法和有限状态机联系起来
parameter WAIT=7'b0000001, UP=7'b0000010, DOWN=7'b0000100, UPSTOP=7'b0001000, DOWNSTOP=7'b0010000, OPENDOOR=7'b0100000,
8
CLOSEDOOR=7'b1000000; //定义楼层的符号常量
parameterFLOOR1=6'b000001,FLOOR2=6'b000010,FLOOR3=6'b000100,
FLOOR4=6'b001000, FLOOR5=6'b010000, FLOOR6=6'b100000;
parameter TRUE=1'b1, FALSE=1'b0;//定义门打开和门关闭的符号常量 parameter OPEN=1'b1, CLOSED=1'b0;//定义电梯上升,下降和静止的符号常量
parameter UPFLAG=2'b01,DNFLAG=2'b10,STATIC=2'b00; 3、采用了七个状态实现了有限状态机
WAIT UP DOWN UPSTOP DOWNSTOP OPENDOOR CLOSEDOOR
图6.状态转换图
黑线:WAIT TO UP TO UPSTOP TO OPENDOOR TO CLOSEDOOR TO WAIT
粉红线:WAIT TO DOWN TO DOWNSTOP TO OPENDOOR TO CLOSEDOOR TO WAIT
3.2模块设计
1、电梯主控制器模块elevator_controller: 此段智能电梯控制器由三个重要部分组成的。
9
(a)信号并置部分,完成对5路向上请求、5路向下请求、6路内部请求的信号并置,化繁为简。
(b)三段式有限状态机部分。在有请求的情况下,电梯控制器还要根据电梯的当前状态和当前的楼层去判断电梯的下一步该如何运作。 (c)计数器部分。完成电梯的开门、关门的时间管理。
elevator_controllercp_50Mclkresetforbidcall_up_1call_up_2call_up_3call_up_4call_up_5call_down_2call_down_3call_down_4call_down_5call_down_6request_1request_2request_3request_4request_5request_6out[6..0]LiftState[6..0]over_alarmcount_out[6..0]count[2..0]malueeinst3 图7.电梯主控模块
2、分频模块frequence_div:
这段分频器完成对50Mhz的1分频操作。采用传统的“一半就翻转”的计数技巧。
frequence_divcp_50Mcp_1inst2 图8.分频模块
3、数码管译码模块
3.3波形仿真
1、当电梯处于初始状态时,电梯在高层有向下的请求时:
10
图9
2、当电梯停在6楼处于等待状态时,在1楼和2楼同时有向上的请求时:
图10
11
3、当电梯停在1楼处于等待状态时,在6楼和5楼同时有向下的请求时:
图11
4、当电梯停在6楼时,有在5楼的向下的请求时,电梯应该先到五楼,电梯内部请求到1楼,如果电梯在下降的过程中,有在2楼的向上的请求时,电梯应该先相应内部请求,然后相应外部请求:
图12
12
5、电梯的强制运行按钮forbid:
图13
13
总结与致谢
通过本次课程设计进一步熟悉Quartus II软件的使用和操作方法,以及硬件实现时的下载方法与运行方法;对Verilog HDL语言的自顶向下设计方法有了进一步的认识,对其中的许多语句也有了新了解,掌握;对自己独立思考和解决问题的能力也有了很大的锻炼。
短暂的课程设计就要结束了,在此,感谢所有在学习和生活中给予我关心和帮助的人们。
首先我要感谢杨红娟、王涛两位位老师,本次课程设计设计的选题、课题调研与撰写工作实在和老师的指导下完成的。和老师渊博的知识、严谨的治学态度、一丝不苟的工作作风、和不厌其烦的精神对我影响至深,使我受益终生,在此我向和老师表示崇高的敬意和衷心的感谢。
其次,在我的课程设计期间,同课题的同学都给予了我热情的帮助和无私的指导,在此向这些同学们表示衷心的感谢。
最后,向所有曾给予我关心和帮助的老师和同学们再次致以最衷心的感谢,向参加报告评审、答辩的老师表示衷心的感谢和崇高的敬意。
14
参考文献
[1] 黄仁欣.EDA技术实用教程.北京:清华大学出版社,2006 [2] 潘松,黄继业.EDA技术与VHDL.北京:清华大学出版社,2009 [3] 江国强编著.EDA技术与应用(第三版)..北京:电子工业出版社,2010 [4] 夏宇闻编著.Verilog HDL数字系统设计教程..北京:北京航空航天大学出版社,2008
[5] 周祖成,程晓军,马卓钊编著.数字电路与系统教学实验教程.北京:科学出版社,2010
[6] 周润景,苏良碧.基于Quartus II 的数字系统Verilog HDL设计实例详解.北京:电子工业出版社,2010
[7] (美国)Sanir Palnitkar 译者:夏宇闻 胡燕祥 刁岚松.Verilog HDL数字设计与综合(第2版).北京:电子工业出版社,2009
[8] 云创工作室.Verilog HDL程序设计与实践.北京:人民邮电出版社,2009
[9] 刘福奇,刘波.Verilog HDL应用程序设计实例精讲.北京:电子工业出版社,2009
[10] 张延伟,杨金岩,葛爱学.verilog hdl程序设计实例详解.北京:人民邮电出版社,2008
15
附录
1、分频模块
module frequence_div(cp_50M,cp_1); input cp_50M;//板子提供的最高时钟 output cp_1;//要求得到的秒脉冲 reg [27:0] counter_1;//计数器 reg cp_1;//类型声明
always@(posedge cp_50M) begin
if(counter_1==28'h17D7840)//50M的一半到了,秒脉冲翻转 begin
cp_1<=~cp_1;//翻转
counter_1<=28'h0000000; end else
counter_1<=counter_1+1'b1;//否则加1 end endmodule
2、智能电梯主控制模块
module elevator_controller(//input ports:
cp_50M,clk,reset,forbid, call_up_1, call_up_2, call_up_3, call_up_4, call_up_5, call_down_2, call_down_3, call_down_4, call_down_5,call_down_6, request_1, request_2, request_3, request_4, request_5, request_6, //output ports: out,LiftState,over_alarm,count_out,count ); //output ports:
output [6:0]out;//输出楼层
output [6:0] LiftState;//输出电梯状态 output over_alarm;//出错
output [6:0]count_out;//计数器输出,便于我控制开关门的状态显示 output [2:0]count;//计数器 //input ports: input cp_50M; input
clk,reset,call_up_1,call_up_2,call_up_3,call_up_4,call_up_5,call_down_2,call_down_3,call_down_4,call_down_5,call_down_6,request_1,request_2,request_3,request_4,request_5,request_6; input forbid;
16
//pos与Posout的关系:当前状态一改变,pos立即作相应改变,而PosOut则是当前状态在要变到下一状态的瞬间 //,将PosOut作相应改变。如从WAIT切换到第一个UP时,pos立即加一,而PosOut则要等到第一个UP //即将切换到第二个UP时,才加一。
//这个说的简单一点,就是移位寄存器,便于对电梯状态的实时的控制 wire over_alarm; wire [6:0]out; wire [6:0]count_out; reg [5:0]pos,PosOut;
reg [2:0] count;//门开后要持续5个时钟周期,用count来计数 reg DoorFlag;
reg [1:0] UpDnFlag;
reg [6:0] LiftState,NextState;//分别表示电梯的当前状态和下一状态
wire real_clk; //up_all,down_all,request_all分别用来合并向上请求的各信号,向下请求的各信号和停靠请求的各信号 //以便判断电梯在状态间如何转移时更简洁 reg [5:0] up_all,down_all,request_all; //定义电梯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=6'b000001, FLOOR2=6'b000010, FLOOR3=6'b000100, FLOOR4=6'b001000, FLOOR5=6'b010000, FLOOR6=6'b100000; parameter TRUE=1'b1, FALSE=1'b0; //定义门打开和门关闭的符号常量 parameter OPEN=1'b1, CLOSED=1'b0; //定义电梯上升,下降和静止的符号常量
parameter UPFLAG=2'b01,DNFLAG=2'b10,STATIC=2'b00;
assign real_clk=(clk&(~forbid));
//采用屏蔽时钟的方法来实现“电梯强制禁止运行”。方法虽然违反了“同步电路最好
//没有时钟门控”的要求,但是在此只要“负面影响”不是很大还是可以接受的。 //将各上升请求信号实时地合并(6楼为顶层,无上升请求,考虑到通用性,将第4位填零) always @(call_up_1 or call_up_2 or call_up_3 or call_up_4 or call_up_5)
up_all={1'b0, call_up_5, call_up_4, call_up_3, call_up_2, call_up_1}; //将各下降请求信号实时地合并(1楼为底层,无下降请求,考虑到通用性,将第1位填零) always @(call_down_2 or call_down_3 or call_down_4 or call_down_5 or call_down_6) down_all={call_down_6, call_down_5, call_down_4, call_down_3, call_down_2, 1'b0}; //将各停靠请求信号实时地合并
17
always @(request_1 or request_2 or request_3 or request_4 or request_5 or request_6) request_all={request_6, request_5, request_4, request_3, request_2, request_1};
always @(posedge real_clk or posedge reset) if(reset)
count<=0;
else if((NextState==OPENDOOR)&&(count<5))//or else if(NextState==OPENDOOR) count<=count+1;//如果计数不到5且下一状态为OPENDOOR的话,继续计数 else
count<=0;//清零,以备下次计数
//display which floor the elevator is....
display_decode h1(cp_50M,PosOut,out,over_alarm); display_decode_count h2(cp_50M,count,count_out);
// finite state machine in the style of three segments ,三段式 //1st StateShift always block,sequential state transition,有限状态机第一段 always @(posedge real_clk or posedge reset) if(reset) begin
LiftState<=WAIT; end else
LiftState<=NextState; //2nd StateShift always block,combinational condition judgement,有限状态机第二段 always @(LiftState or up_all or down_all or request_all or pos or count or UpDnFlag) case(LiftState) WAIT: begin if(request_all>0)//有停靠请求否 begin
if((request_all&pos)>0)//停靠请求中有当前楼层停靠请求否 NextState=OPENDOOR;//有当前楼层请求,则下一状态转开门
else if(request_all>pos)//有当前楼层之上的停靠请求否(优先向上的请求)
NextState=UP;//有则,下一状态转上升 else
NextState=DOWN;//只有当前楼层之下的停靠请求,下一状态转下降
end
18
else if((up_all&pos)||(down_all&pos))//上下请求中有当前楼层请求否 begin
NextState=OPENDOOR; end
else if((up_all>pos)||(down_all>pos))//上下请求中有当前楼层之上的请求否
NextState=UP;
else if(up_all||down_all)//上下请求中有当前楼层之下的请求否 NextState=DOWN; else
NextState=WAIT;//无任何请求,继续处于WAIT模式 end UP:
begin if((request_all&pos)||(up_all&pos))//停靠或上升请求中有当前楼层的请求否
NextState=UPSTOP;//有,下一状态转为UPSTOP(停靠后要1s才开门,UPSTOP即为这1s的过渡期)
else if((request_all>pos)||(up_all>pos))//停靠或上升请求中有当前楼层之上的请求否
NextState=UP;
else if(down_all>0)//有下降请求否 begin
if((down_all>pos)&&((down_all^pos)>pos))//下降请求中有当前楼层的请求否
NextState=UP;
else if((down_all&pos)||(pos else if((down_all&pos)&&(pos==FLOOR6))//事实上不满足第一条件的话,电梯根本不会到达第四层 NextState=DOWNSTOP; else//下降请求中只有当前楼层之下的请求 NextState=DOWN; end else if(request_all||up_all)//只有当前楼层之上的停靠或上升请求否 NextState=DOWN; else NextState=WAIT;//无任何请求,转为WAIT模式 end //DOWN的状态转移请参见UP的状态转移 DOWN: 19 begin if((request_all&pos)||(down_all&pos)) NextState=DOWNSTOP; else if(((request_all&FLOOR1) else if(up_all>0) begin if(((up_all&FLOOR1) else if((up_all&pos)&&(pos>FLOOR1)) NextState=DOWNSTOP; else if((up_all&pos)&&(pos==FLOOR1)) NextState=UPSTOP; else NextState=UP; end else if(request_all||down_all) NextState=UP; else NextState=WAIT; end UPSTOP: begin NextState=OPENDOOR;//停靠1时钟周期后开门 end DOWNSTOP: begin NextState=OPENDOOR;//停靠1时钟周期后开门 20 end OPENDOOR: begin if(count<5)//开门不足5周期,则继续转移到开门状态 NextState=OPENDOOR; else NextState=CLOSEDOOR;//开门5周期后,关门 end CLOSEDOOR: begin if(UpDnFlag==UPFLAG)//开门关门前电梯是处于上升状态吗 begin if((request_all&pos)||(up_all&pos))//上升或停靠请求中有当前楼层的请求否,有可能关门的瞬间又有新的请求 NextState=OPENDOOR; else if((request_all>pos)||(up_all>pos))//上升或停靠请求中有当前楼层之上的请求否 NextState=UP; else if(down_all>0)//有下降请求否 begin if((down_all>pos)&&((down_all^pos)>pos)) NextState=UP;//有当前楼层之上的下降请求,则下一状态转移上升 else if((down_all&pos)>0)//有当前楼层的下降请求信号,且更上层无下降请求 NextState=OPENDOOR; else//只有低于当前层的下降请求 NextState=DOWN; end else if(request_all||up_all)//上升和停靠请求中有当前层的请求且只有当前层下的请求 NextState=DOWN; else NextState=WAIT;//无任何请求,转为WAIT模式 end //请参考UpDnFlag=UPFLAG的注释 else if(UpDnFlag==DNFLAG) begin if((request_all&pos)||(down_all&pos)) NextState=OPENDOOR; else if(((request_all&FLOOR1) LOOR4) if(((up_all&FLOOR1) NextState=OPENDOOR; else NextState=UP;// end else if(request_all||down_all) NextState=UP; else NextState=WAIT;// end //请参考WAIT模式的注释 else begin if(request_all>0) begin if((request_all&pos)>0) NextState=OPENDOOR; else if(request_all>pos) NextState=UP; else NextState=DOWN; end else if((up_all&pos)||(down_all&pos)) begin NextState=OPENDOOR; end 22 else if((up_all>pos)||(down_all>pos)) NextState=UP; else if(up_all||down_all) NextState=DOWN; else begin NextState=WAIT; end end end default: NextState=WAIT; endcase //3rd StateShift always block,the sequential FSM output,有限状态机第三段 always @(posedge real_clk or posedge reset)//output if(reset) //复位后初始化当前楼层为第一层,门是关闭的,电梯是静止的 begin pos<=FLOOR1; DoorFlag<=CLOSED; UpDnFlag<=STATIC; end else begin PosOut<=pos;//PosOut的输出慢pos一个时钟周期 case(NextState) WAIT: //状态为WAIT时,楼层不变,门是关闭的,电梯是静止的,其他模式的情况请大家自己推导 begin pos<=pos; DoorFlag<=CLOSED; UpDnFlag<=STATIC; end UP: begin pos<=pos<<1; DoorFlag<=CLOSED; UpDnFlag<=UPFLAG; end 23 DOWN: begin pos<=pos>>1; DoorFlag<=CLOSED; UpDnFlag<=DNFLAG; end UPSTOP: begin pos<=pos; DoorFlag<=CLOSED; UpDnFlag<=UPFLAG; end DOWNSTOP: begin pos<=pos; DoorFlag<=CLOSED; UpDnFlag<=DNFLAG; end OPENDOOR: begin pos<=pos; DoorFlag<=OPEN; UpDnFlag<=UpDnFlag; end CLOSEDOOR: begin pos<=pos; DoorFlag<=CLOSED; UpDnFlag<=UpDnFlag; end default: //默认情况 begin pos<=FLOOR1; DoorFlag<=CLOSED; UpDnFlag<=STATIC; end endcase end endmodule 3、数码管译码模块 module display_decode(cp_50M,in,out,over_alarm); input [5:0]in; 24 input cp_50M; output [6:0]out; output over_alarm; reg [6:0]out; reg over_alarm; always@(posedge cp_50M) begin case(in) 6'b000000:out<=7'b100_0000;//0 6'b000001:out<=7'b111_1001;//1 6'b000010:out<=7'b010_0100;//2 6'b000100:out<=7'b011_0000;//3 6'b001000:out<=7'b001_1001;//4 6'b010000:out<=7'b001_0010;//5 6'b100000:out<=7'b000_0010;//6 default:over_alarm<=1; endcase end endmodule 25 因篇幅问题不能全部显示,请点此查看更多更全内容