基于FPGA的四层电梯控制器设计.docx

上传人:b****6 文档编号:4519067 上传时间:2022-12-01 格式:DOCX 页数:13 大小:113.73KB
下载 相关 举报
基于FPGA的四层电梯控制器设计.docx_第1页
第1页 / 共13页
基于FPGA的四层电梯控制器设计.docx_第2页
第2页 / 共13页
基于FPGA的四层电梯控制器设计.docx_第3页
第3页 / 共13页
基于FPGA的四层电梯控制器设计.docx_第4页
第4页 / 共13页
基于FPGA的四层电梯控制器设计.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

基于FPGA的四层电梯控制器设计.docx

《基于FPGA的四层电梯控制器设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的四层电梯控制器设计.docx(13页珍藏版)》请在冰豆网上搜索。

基于FPGA的四层电梯控制器设计.docx

基于FPGA的四层电梯控制器设计

山东大学

威海分校

课程设计报告

 

设计题目:

_基于FPGA的四层电梯控制器设计

指导教师:

李素梅郑亚民董晓舟___

 

姓名:

学号:

20058002089

院系:

信息工程学院

专业:

电子信息科学与技术

年级:

2005级

 

2008年7月15日

摘要:

本文介绍了基于FPGA的电梯控制器的总体设计方案,阐述了其内部功能模块的工作原理,基于状态机的原理,利用VHDL语言对各功能模块进行了编程、编译、仿真,并下载到实验箱上进行了验证。

结果表明,该电梯控制器按进循方向优先的原则可为四个楼层提供载客服务,并具有电梯运行情况指示功能。

文中使用的设计方法不仅简化了电路设计、节约了设计成本,而且提高了控制器的可靠性、稳定性和灵活性。

关键词:

VHDL;FPGA;状态机;电梯控制

 

1、设计要求

(1)使用VHDL语言与状态机设计思想设计一个4层建筑的电梯控制器;

(2)每层电梯入口设有上下请求开关及电梯内设有到达楼层请求开关;

(3)电梯每5秒钟升(降)一层;

(4)电梯到达有请求的楼层自动开门并定时关门和紧急状态紧急停止运行的功能;

(5)能记忆电梯内外所有请求信号并按照电梯运行规则按顺序响应,每个请求信号留至执行完后消除;

(6)电梯运行规则———当电梯处于上升模式时,只响应比电梯所在的位置高的上楼请求信号,由下而上逐个执行,直到最后一个上楼请求执行完毕,如果高层有下楼请求,则直接升到有下楼请求的最高楼层,然后进入下降模式,当电梯处于下降模式时,则与上升模式相反。

2、总体设计

根据上述设计要求,可以得到电梯控制器的总体结构如图1所示。

该系统包括外部数据采集模块、信号存储模块、中央处理模块、控制输出与显示模块。

外部数据采集模块负责采集用户通过按键输入的请求信号、光敏传感器采集的到达楼层信号和压力传感器采集的超载信号;信号存贮模块负责存储电梯内外及各层用户的请求信号和故障、超载信号;中央处理模块处理电梯运行中的各种状态,在电梯运行过程中,对信号存储模块的用户请求数据进行比对,从而确定电梯的运行状态;显示模块主要显示电梯所在楼层、电梯运行方向和关门延时等;控制输出主要有电梯的升、降、停和门的开、关、停以及报警等信号。

图1电梯控制器总体结构

3、详细设计

3.1中央处理模块

中央数据处理模块是系统的核心,通过对存储的数据(含用户请求、到达楼层和故障、超载等信号)进行比较、判断以驱动系统状态的转换。

电梯工作过程中共有4种状态:

第一层、第二层、第三层、第四层。

而每种状态都有等待、上升、下降、开关门、超载报警以及紧急停止动作(第一层无下降动作,第四层无上升动作)。

一般情况下,电梯工作起始点是第一层,起始状态是等待状态,启动条件是收到上升请求信号。

系统的状态流程图如图2所示。

图中超载状态时电梯关门动作取消,本系统由请求信号启动,运行中每检测到一个到达楼层信号,就将信号存储器的请求信号与楼层状态信号进行比较,再参考原方向信号来决定是否停止、转向等动作。

图2系统的状态转换图

系统输入输出端口的VHDL语言定义如下:

port(clk:

instd_logic;--时钟信号(频率为1Hz)

o_u1,o_u2,o_u3:

instd_logic;--电梯外人的上升请求信号

o_d2,o_d3,o_d4:

instd_logic;--电梯外乘客的下降请求信号

in1,in2,in3,in4:

instd_logic;--电梯内乘客的请求信号

led:

outstd_logic_vector(3downto0);--电梯所在楼层显示

led_c:

outintegerrange0to15;--开关门延时显示

stop,overload:

instd_logic--紧急停止运行及超载信号

);

3.2外部数据采集模块

外部数据采集模块的功能是实时、准确的采集外部信号,以便准确、实时的捕捉楼层到达信号、用户请求信号和超载信号等,有效防止对楼层到达信号和外部请求信号的误判。

由于外界干扰,电路中会出现毛刺现象,使信号的纯净度降低,单个的毛刺往往会被错误的当成系统状态转换的触发信号,从而严重影响电梯的正常工作。

为了增强系统的抗干扰能力,提高电梯工作的可靠性,可以采用多次检测的方法,即对一个信号连续进行多次采样,以保证信号的可信度。

本设计实际不包含此模块,而是采用按键输入模拟此模块来完成相应功能的。

在实际应用中需包含此功能模块。

外部请求信号和紧急停止信号的输入形式为按键输入,电梯自动上升或下降时间为5s,超载信号来自压力传感器。

3.3信号存储模块

电梯控制器的输入请求信号有10个(电梯外有3个上升请求和3个下降请求的用户输入端口,电梯内有4个用户请求输入端口),由于系统对内、外请求没有设置优先级,各楼层的内、外请求信号被采集后可先进行运算,再存到存储器内,但对请求信号的响应有一定的优先级,即:

当电梯处于上升模式时,只响应比电梯所在的位置高的上楼请求信号,由下而上逐个执行,直到最后一个上楼请求执行完毕;如果高层有下楼请求则直接升到有下楼请求的最高楼层,然后进入下降模式。

当电梯处于下降模式时则与上升模式相反。

电梯运行过程中,由于用户请求信号的输入是离散的,而且系统对请求的响应也是离散的,因此,请求信号的存储要保证新的请求信号不能覆盖原来的请求信号,只有当响应动作完成后才能清除存储器内对应的请求信号位。

对应某一楼层的请求信号的存储、清除电路如图3所示。

图3请求信号操作电路图

3.3显示模块

系统的显示输出包括楼层显示及关门延时显示(若需要,还可以增加请求信号显示和电梯运动方向指示)。

电梯每到一新楼层时,楼层数码管便会更新显示为新楼层的层数;关门时会有3秒的倒计时显示。

4、仿真结果

该电梯控制器使用VHDL语言设计,用Atera公司Cyclone系列中的EP1C3T144C8芯片实现,在QuartusII7.2(32-Bit)环境下通过编译和仿真,并下载到实验箱上进行了验证,其中部分仿真结果如图4和图5所示。

从图中可以看出,电梯在1楼(led=0)时处于等待状态,当有乘客在一楼电梯外请求要上3楼时(o_u1=1,in3=1),电梯开门后延时3秒(3个时钟周期,实际中1个时钟周期就是1秒,仿真时为提高速度时钟周期取10ns)后关门(led_c=3,2,1,0);电梯将要到达二楼时,有乘客在三楼电梯外请求要上四楼(o_u3=1),电梯到达三楼时开门,释放第一批乘客,接入第二批乘客;到达四楼后,进入第三批乘客要去二楼,当关门倒计时器数到1时(led_c=1),发现超载(overload=1),此时关门倒计时器停止,电梯一直处于四楼,对二楼乘客的请求(in2=1)也不响应;超载信号消失后(overload=0),电梯一直下降至二楼,在关门倒计时器数到3时(led_c=3),有人请求紧急停止(stop=1),此时电梯保持不动,紧急停止信号消失后(stop=0),电梯完成关门,在二楼等待。

图4仿真图(0~400ns)

图5续图4(400ns~)

5、结语

本文设计的基于FPGA的电梯控制器能够很好的控制电梯完成四层楼的载客服务,其硬件电路简单,可靠性高。

只要稍微改变程序就可以实现更多层的电梯控制,便于扩展,灵活性好,需用批量足够大时容易做成专用集成电路芯片,设计成本低具有较好的应用前景。

参考文献

附录:

源程序

--文件名:

dianti.vhd。

--功能:

4层楼的电梯控制系统。

--最后修改日期:

2008.7.20。

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

entitydiantiis

port(clk:

instd_logic;--时钟信号(频率为1Hz)

o_u1,o_u2,o_u3:

instd_logic;--电梯外乘客的上升请求信号

o_d2,o_d3,o_d4:

instd_logic;--电梯外乘客的下降请求信号

in1,in2,in3,in4:

instd_logic;--电梯内乘客的请求信号

led:

outstd_logic_vector(3downto0);--电梯所在楼层显示

led_c:

outintegerrange0to15;--开关门延时

stop,overload:

instd_logic--紧急停止运行,超载

);

enddianti;

architecturebehavofdiantiis

signalopendoor:

std_logic;--开门使能信号

signalupdown:

std_logic;--电梯运动方向信号寄存器

signalen_up,en_dw:

std_logic;--预备上升、预备下降预操作使能信号

typestateis(g1,g2,g3,g4);

signalg:

state;

signalen:

std_logic;--1电梯下一步动作使能;0进行动作上升,下降,开关门

begin

process(clk,en,stop,overload)

variablein1_r,in2_r,in3_r,in4_r:

std_logic;--电梯内乘客请求信号寄存信号

variableo_u1_r,o_u2_r,o_u3_r:

std_logic;--电梯外乘客上升请求信号寄存信号

variableo_d2_r,o_d3_r,o_d4_r:

std_logic;--电梯外乘客下降请求信号寄存信号

variablein_all,o_u_all,o_d_all,o_i_all:

std_logic_vector(3downto0);--电梯内外请求信号寄存器

begin

ifclk'eventandclk='1'then

--ifalarm='1'then

--in1_r:

='1';in2_r:

='0';in3_r:

='0';in4_r:

='0';

--o_u1_r:

='0';o_u2_r:

='0';o_u3_r:

='0';

--o_d2_r:

='0';o_d3_r:

='0';o_d4_r:

='0';

--else

ifin1='1'thenin1_r:

='1';endif;--对电梯内乘客请求信号进行检测和寄存

ifin2='1'thenin2_r:

='1';endif;

ifin3='1'thenin3_r:

='1';endif;

ifin4='1'thenin4_r:

='1';endif;

ifo_u1='1'theno_u1_r:

='1';endif;--对电梯外乘客上升请求信号进行检测和寄存

ifo_u2='1'theno_u2_r:

='1';endif;

ifo_u3='1'theno_u3_r:

='1';endif;

ifo_d2='1'theno_d2_r:

='1';endif;--对电梯外乘客下降请求信号进行检测和寄存

ifo_d3='1'theno_d2_r:

='1';endif;

ifo_d4='1'theno_d2_r:

='1';endif;

--endif;

in_all:

=in4_r&in3_r&in2_r&in1_r;--电梯内乘客请求信号并置

o_u_all:

='0'&o_u3_r&o_u2_r&o_u1_r;--电梯外乘客上升请求信号并置

o_d_all:

=o_d4_r&o_d3_r&o_d2_r&'0';--电梯外乘客下降请求信号并置

o_i_all:

=in_alloro_u_alloro_d_all;--电梯内、外乘客请求信号进行综合

endif;

ifclk'eventandclk='1'anden='1'andstop='0'andoverload='0'then

casegis

wheng1=>led<="0001";--电梯到达一楼,数码管显示1

ifin1_r='1'oro_u1_r='1'then--有当前层的请求,则电梯进入开门状态

in1_r:

='0';o_u1_r:

='0';

en_up<='0';en_dw<='0';opendoor<='1';g<=g1;

elsifo_i_all="0000"then--无请求时,电梯停在1楼待机

en_up<='0';en_dw<='0';opendoor<='0';g<=g1;

elsifo_i_all>"0001"then--有上升请求,则电梯进入预备上升状态

en_up<='1';en_dw<='0';opendoor<='0';g<=g2;

endif;

wheng2=>led<="0010";--电梯到达二楼,数码管显示2

ifupdown='1'then--电梯前一运动状态位上升

ifin2_r='1'oro_u2_r='1'oro_d2_r='1'then--有当前层的请求,则电梯进入开门状态

in2_r:

='0';o_u2_r:

='0';o_d2_r:

='0';

en_up<='0';en_dw<='0';opendoor<='1';g<=g2;

elsifo_i_all="0000"thenen_up<='0';en_dw<='0';opendoor<='0';g<=g2;

elsifo_i_all>"0011"then--有上升请求,则电梯进入预备上升状态

en_up<='1';en_dw<='0';opendoor<='0';g<=g3;--无请求时,电梯停在二楼待机

elsifo_i_all<"0010"then--有下降请求,则电梯进入预备下降状态

en_up<='0';en_dw<='1';opendoor<='0';g<=g1;

endif;

else--电梯前一运动状态为下降

ifin2_r='1'oro_d2_r='1'oro_u2_r='1'then--有当前层的请求,则电梯进入开门状态

in2_r:

='0';o_d2_r:

='0';o_u2_r:

='0';

en_up<='0';en_dw<='0';opendoor<='1';g<=g2;

elsifo_i_all="0000"thenen_up<='0';en_dw<='0';opendoor<='0';g<=g2;--无请求时,电梯停在二楼待机

elsifo_i_all<"0010"then--有下降请求,则电梯进入预备下降状态

en_up<='0';en_dw<='1';opendoor<='0';g<=g1;

elsifo_i_all>"0011"then--有上升请求,则电梯进入预备上升状态

en_up<='1';en_dw<='0';opendoor<='0';g<=g3;

endif;

endif;

wheng3=>led<="0011";--电梯到达三楼,数码管显示3

ifupdown='1'then

ifin3_r='1'oro_u3_r='1'oro_d3_r='1'then

in3_r:

='0';o_u3_r:

='0';o_d3_r:

='0';en_up<='0';en_dw<='0';opendoor<='1';g<=g3;

elsifo_i_all="0000"thenen_up<='0';en_dw<='0';opendoor<='0';g<=g3;

elsifo_i_all>"0111"thenen_up<='1';en_dw<='0';opendoor<='0';g<=g4;

elsifo_i_all<"0100"thenen_up<='0';en_dw<='1';opendoor<='0';g<=g2;

endif;

else

ifin3_r='1'oro_d3_r='1'oro_u3_r='1'then

in3_r:

='0';o_d3_r:

='0';o_u3_r:

='0';en_up<='0';en_dw<='0';opendoor<='1';g<=g3;

elsifo_i_all="0000"thenen_up<='0';en_dw<='0';opendoor<='0';g<=g3;

elsifo_i_all<"0100"thenen_up<='0';en_dw<='1';opendoor<='0';g<=g2;

elsifo_i_all>"0111"thenen_up<='1';en_dw<='0';opendoor<='0';g<=g4;

endif;

endif;

wheng4=>led<="0100";--电梯到达四楼,数码管显示4

ifin4_r='1'oro_d4_r='1'then

in4_r:

='0';o_d4_r:

='0';en_up<='0';en_dw<='0';opendoor<='1';g<=g4;

elsifo_i_all="0000"thenen_up<='0';en_dw<='0';opendoor<='0';g<=g4;

elsifo_i_all<"1000"thenen_up<='0';en_dw<='1';opendoor<='0';g<=g3;

endif;

whenothers=>null;--en_up<='0';en_dw<='0';--电梯进入上升或下降状态

endcase;

endif;

endprocess;

process(clk,en_up,en_dw,opendoor,stop,overload)

variablev_en:

std_logic;

variablet1:

integerrange0to3;--开关门延时计数器

variablet2:

integerrange0to5;--开关门延时计数器

variableflag:

std_logic;------

begin

if(rising_edge(clk)andstop='0'andoverload='0')then

if((en_uporen_dworopendoor)='0')thenv_en:

='1';

elsev_en:

='0';

ifopendoor='1'then

if(t1=0andflag='0')then--

flag:

='1';

t1:

=3;

elsif(t1=0andflag='1')then

v_en:

='1';--flag:

='0';

else

t1:

=t1-1;--开门操作--

endif;

elsif(en_up='1')then--上升预操作

t1:

=0;flag:

='0';

updown<='1';

if(t2=5)then

v_en:

='1';t2:

=0;

else

t2:

=t2+1;--开门操作

endif;

elsifen_dw='1'then--下降预操作

t1:

=0;flag:

='0';

updown<='0';

if(t2=5)then

v_en:

='1';t2:

=0;

else

t2:

=t2+1;--开门操作

endif;

endif;

endif;

endif;

en<=v_en;

led_c<=t1;

endprocess;

endbehav;

资料仅供参考!

!

!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1