文档库 最新最全的文档下载
当前位置:文档库 › 基于FPGA的六层电梯控制器

基于FPGA的六层电梯控制器

基于FPGA的六层电梯控制器
基于FPGA的六层电梯控制器

《EDA技术》项目设计报告

题目:基于FPGA的六层电梯控制器

学院:电子与信息工程学院专业:电子信息科学与技术姓名:X X X

班级:14电信本(2)班学号:140919022

指导老师:X X X

二〇一六年十二月

1、绪论-------------------------------- 错误!未定义书签。

1.1电梯控制器的发展现状------------- 错误!未定义书签。

1.2本次设计的主要内容--------------- 错误!未定义书签。

1.3设计原理与思路------------------- 错误!未定义书签。

1.4硬件设计 ------------------------ 错误!未定义书签。

1.5软件设计 ------------------------ 错误!未定义书签。

2、 FPGA 硬件结构知识------------------- 错误!未定义书签。

2.1 FPGA 概述----------------------- 错误!未定义书签。

2.2 FPGA 体系结构------------------- 错误!未定义书签。

2.3 FPGA 常用芯片介绍--------------- 错误!未定义书签。

3、VHDL 硬件描述语言-------------------- 错误!未定义书签。

3.1 VHDL 语言特点------------------- 错误!未定义书签。

3.2 状态机的VHDL 实现--------------- 错误!未定义书签。

4、电梯控制器的工作原理----------------- 错误!未定义书签。

5、电梯控制系统的设计内容--------------- 错误!未定义书签。

5.1 时钟分频模块-------------------- 错误!未定义书签。

5.2 按键处理模块-------------------- 错误!未定义书签。

5.3 电梯运行控制模块---------------- 错误!未定义书签。

5.4 数码管显示模块------------------ 错误!未定义书签。

5.5 电梯超重控制可行性分析---------- 错误!未定义书签。

6、电梯控制器顶层图形------------------ 错误!未定义书签。

7、总结-------------------------------- 错误!未定义书签。

1、绪论

1.1电梯控制器的发展现状

国家规定超过六楼以上的楼层必须按要求安装电梯,而且随着超高层建筑的出现,电梯的应用越来越来广泛了,与此同时,对电梯的要求也越来越高了。目前,电梯的设计、工艺不断提高,电梯的品种也逐渐增多,电梯的材质由黑白到彩色,样式由直式到斜式,在操纵控制方面更是步步出新:手柄开关操纵、按钮控制、信号控制、集选控制、人机对话等;多台电梯还出现了并联控制、智能群控;双层轿箱电梯展示出节省井道空间,提升运输能力的优势,变速式自动人行道扶梯大大节省了行人的时间;不同外形的电梯则使身处其中的乘客的视线不再封闭。

电梯的结构分为:四大空间,八大系统;四大空间:机房部分、井道及地坑部分、轿厢部分、层站部分;八大系统:曳引系统、导向系统、轿厢、门系统、重量平衡系统、电力拖动系统、电气控制系统、安全保护系统;电梯的功能结构决定电梯的八大应用技术:

1) 全数字识别乘客技术(所有乘客进入电梯前进行识别,其中包括眼球识别、指纹识别)

2) 数字智能型安全控制技术(通过乘客识别系统或者IC 卡以及数码监控设备,拒绝外来人员进入)

3) 第四代无机房电梯技术(主机必须与导轨和轿厢分离,完全没有共振共鸣,速度可以达到2.0M/S 以上,最高可以使用在30 层以上。)

4) 双向安全保护技术(双向安全钳、双向限速器,在欧洲必须使用,中国正在被普遍使用)

5) 快速安装技术(改变过去的电梯安装方法,能够快速组装)

6) 节能技术(采用节能技术,使电梯更节约能源)

7) 数字监控技术(完全采用计算机进行电梯监控与控制)

8) 无线远程控制及报警装置(当电梯产生故障时,电梯可以通过无线装置给手机发送故障信息,并通过手机发送信号对电梯进行简单控制。)本次设计主要是控制电梯的运行模式和状态,对信号进行处理的模块,重点在对响应的信号进行处理,并将处理结果反馈给对应功能的控制端口,实现对电

梯运行的全面控制。

1.2本次设计的主要内容

随着可编程逻辑电路和EDA 技术的发展,在逻辑电路设计和嵌入式系统设计方面,以CPLD/FPGA 为代表的可编程逻辑器件已经逐步代替了传统的标准逻辑器件;本次设计的电梯控制器所有的程序可以集成在一个FPGA 开发芯片上面,不用在用其他功能的分立逻辑元件,达到集成度高、响应快、功耗低的特点。

本次设计是基于 FPGA 的电梯控制器的研究,是电梯控制的核心技术,通过电梯控制器可以对电梯运行模式和状态进行全面的控制,这也是次设计的研究重要性;电梯的层数为6 层,本次设计采用模块化设计,主要分为四大模块:时钟分频模块、按键处理模块、电梯运行控制模块、数码管显示模块。

由于 FPGA 技术近些年来蓬勃发展,而且在很多领域已经应用的十分成熟,用FPGA 可以实现对电梯精确、实时性控制,而且用于FPGA 开发的芯片都是一些微处理器芯片,便于集成和智能化设计,而且大大缩短了开发周期。

1.3设计原理与思路

本次设计是实现 6 层电梯的运行控制,当在某一楼层按下上升或者下降请求按钮时,控制器响应该请求并控制电梯前往该楼层,当到达该楼层时电梯开门,当进入电梯后,电梯关门,此时按下要到达的楼层按钮,控制器响应该请求并控制电梯前往该楼层,当到达前往楼层后,电梯开门,走出电梯,然后关门......,就这样往复的实现电梯的控制功能。电梯运行时遵循如下规则:当电梯处于上升模式时,只响应比电梯所在位置高的上楼信号,由下至上依次执行;直到最后一个上楼请求执行完毕,如有更高层有下楼请求时,则直接升到有下降请求的最高楼,然后进入下降模式,电梯处于下降模式时,则与上升相反。

电梯的输入信号主要包括外部输入信号和内部输入信号;对于电梯外部输入信号:每一层电梯门外都有上升请求和下降请求按钮,其中一楼电梯门外只有上升请求按钮,六楼电梯门外只有下降请求按钮。对于电梯内部输入信号主要有:6 个前往楼层的按钮、提前关门按钮、延时关门按钮、电梯异常按钮。

电梯输出信号也主要包括外部输出信号和内部输出信号;对于电梯外部输出信号包括上升请求按钮和下降按钮指示信号、电梯当前所在楼层指示信号、电梯运行方向指示信号。电梯内部输出信号包括6 个前往楼层按钮指示信号、超重

等警告指示信号、电梯当前所在楼层指示信号、电梯运行方面指示信号。

1.4硬件设计

本次设计主要是通过 Altera 公司生产的CycloneIII这一款芯片进行功能的实现,CycloneIII 器件采用TSMC90nm 低K 绝缘材料工艺技术,这种技术结合Altera 低成本的设计方式,使之能够在更低的成本下制造出更大容量的器件。这种新的器件比第一代Cyclone 产品具有两倍多的I/O 引脚,且对可编程逻辑的存储块和其它特性进行了最优的组合,具有许多新的增强特性。

CycloneIII 器件包含了许多新的特性,如嵌入存储器、嵌入乘法器、PLL 和低成本的封装,这些都为诸如视频显示、数字电视(DTV)、机顶盒(STB)、DVD 播放器、DSL调制解调器、家用网关和中低端路由器等批量应用进行了优化。在EDA 设计的开发板上面,支持SOPC 片上可编程,在CycloneIII 芯片旁边外围有按键模块、液晶显示模块、LED 指示灯等,通过QuartusⅡ平台将硬件描述语言下载至该芯片中,然后进行程序的调试、运行并进行功能的实现。

1.5软件设计

Altera 的FPGA 设计主要采用两种标准语言:VHDL/Verilog HDL。其中VerilogHDL 出现早,运用广泛,而且比较简单,在NIOS 项目里运用较多;而VHDL 语言功能强大,语句相对要复杂一些,所以对于现在一些复杂的可编程项目多采用VHDL语言编写。

VHDL(Very-High-Speed Integrated Circuit Hardware Description Language)主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具有硬件特征的语句外,VHDL 的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分、端口)和内部(或称不可视部分),涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。如下图4-1 是VHDL 的层次模型:

图 4-1 具有不同构造体的VHDL 模型

VHDL 语言具有强大的语言结构,只需采用简单明确的VHDL 语言程序就可以描述十分复杂的硬件电路。同时,它还具有多层次的电路设计描述功能:既支持自顶向下的设计方式,也支持自底向上的设计方法;既支持模块化设计方法,也支持层次化设计方法;既可描述系统级电路,也可以描述门级电路;描述方式既可以采用行为描述、寄存器传输描述或者结构描述,也可以采用三者的混合描述方式。VHDL 语言具有很强的移植能力,对于同一个硬件电路的VHDL 语言描述,它可以从一个模拟器移植到另一个模拟器上、从一个综合器移植到另一个综合器上或者从一个工作平台移植到另一个工作平台上去执行。VHDL 语言采用基于库 ( library) 的设计方法。在设计过程中,设计人员可以建立各种可再次利用的模块,一个大规模的硬件电路的设计不可能从门级电路开始一步步地进行设计,而是一些模块的累加,这些模块可以预先设计或者使用以前设计中的存档模块,将这些模块存放在库中,就可以在以后的设计中进行复用。

本次设计主要是运用 VHDL 语言进行程序的编写,采用自顶向下、模块化设计方法。按照要求可以分为:时钟分频模块、按键处理模块、电梯运行控制模块、数码管显示模块;分别设计出这四个模块之后,进行调试、运行、功能仿真和时序分析,然后将生产的模块图在原理图编辑器中连接起来,组成完整的电梯控制器。

2、FPGA 硬件结构知识

2.1 FPGA 概述

FPGA(Field Programmable Gate Arry)即现场可编程门阵列,它是在PAL、

GAL、CPLD 等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点;FPGA 采用了逻辑单元阵列LCA(Logic Cell Array)这样一3个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输入输出模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。

2.2 FPGA 体系结构

FPGA 采用逻辑单元阵列(LCA,Logic Cell Array)新概念,内部包括可配置逻辑模块(CLB,Configurable Logic Block)、输入输出模块(IOB,Input Output Block)和内部互连资源(IR,Interconnect Resources)三部分组成。

1) 可配置逻辑块(CLB,Configurable Logic Block)是FPGA 的主要组成部分,主要是由逻辑函数发生器、触发器、数据选择器等电路组成。

2)输入输出模块(IOB,Input Output Block)提供了器件引脚和内部逻辑阵列之间的连接,主要是由输入触发器、输入缓冲器和输出触发、锁存器、输出缓冲器组成。

3)可编程互连资源(IR,Interconnect Resources)可以将FPGA 内部的CLB 和CLB 之间、CLB 和IOB 之间连接起来,构成各种具有复杂功能的系统,IR主要由许多金属线段构成,这些金属线段带有可编程开关,通过自动布线实现各种电路的连接。

2.3 FPGA 常用芯片介绍

目前世界上有很多生产FPGA 芯片的公司,常用的主要有:Altera、XIlinx、Lattice和Actel,其中Altera 和XIlinx 占据主流市场。

1) Altera 的主流FPGA 分为两大类:一种是侧重低成本、容量中等、性能可以满足一般逻辑设计要求的,如Cyclone 系列;另一种是侧重高性能、容量大、性能可以满足各类高端应用,如Stratix 系列。

2) XIlinx 是FPGA发明者,是老牌PLD,产品的种类较全,主要有:

XC9500/4000、Cool Runner(XPLA3)、Spartan、Virtex 等系列。

3) Lattice 是在系统编程(ISP)技术的发明者,主要有:

ispLSI2000/5000/8000、MACH4/5、ispMACH4000 等系列。

4) Actel 公司是世界反熔丝技术的FPGA 领先供应商,主要有两大系列的反熔丝FPGA 产品SX-A 和MX 高速系列。

3、VHDL 硬件描述语言

3.1 VHDL 语言特点

VHDL(Very-High-Speed Integrated Circuit Hardware Description Language)是一种标准的硬件描述语言,中文意思是超高速集成电路硬件描述语言;利用VHDL 进行系统行为级设计已经成为FPGA 与ASIC 设计的主流,使用VHDL 不仅可以快速的描述和综合FPGA 设计,还可以提供一下的一些性能。

1) 功能强大且很具有灵活性,VHDL 具有很强大的语言结构,可以用简洁明确的代码描述复杂的控制逻辑,语言很灵活,支持设计库和可重复使用的元件生成。

2) 不依赖于器件的设计,VHDL 允许设计者生成一个设计而不需要首先选择一个用来实现设计的器件,对于同一个设计描述,可以采用多种不同的器件结构来实现其功能。

3) 具有可移植性,因为VHDL 是一种标准的语言,所以它可以被不同的工具所支持,这意味着同一个VHDL 设计描述可以在不同的设计项目中采用

4) 可以对其设计性能进行评估,设计者可以进行一个完整的设计描述,并对其进行综合,生产选定的器件结构的逻辑功能,然后评估结果,选用最适合设计需求的器件。

5) 上市时间快、成本低、开发周期短,VHDL 语言的设计将大大提高数字单片化设计实现的速度,为生产者大大节约开发成本。

3.2 状态机的VHDL 实现

有限状态机以及其设计技术是使用数字系统设计中的重要组成部分,也是实现高效率、高可靠和高速控制逻辑系统的重要途径,广义而论,只要是涉及到触发器的电路,都属于状态机,由此也可以看出其重要性。用VHDL 设计的状态机根据不同的标准可以分为不同的形式:

1) 从状态机的信号输出方式上分:Mealy 型和Moore 型;

2) 从状态机的描述结构上分:单进程状态机和多进程状态机;

3) 从状态机表达形式上分:符号化状态机和确定状态编码状态机;

4) 从状态机编码方式上分:顺序编码状态机、一位热编码状态机和其他编码方式状态机。

实际设计过程中,接触最多的分类方法就是 Mealy 型和Moore 型;从输出时序上看,前者是异步输出,后者是同步输出。Mealy 型状态机的输出是当前状态和所有输入信号的函数,它的输出是输入变化后立即变化的,不依赖时钟的同步。Moore 型状态的输出仅为当前状态的函数,但是在输入发生变化时还必须等到时钟的到来,输出才会变化,由此可见,Moore 型要多等待一个时钟周期。

本次设计中,电梯控制模块部分就利用Moore 型状态机的方法实现对电梯运行状态的同步控制,通过将电梯运行过程分解为一些实质性的状态来进行转换,使得电梯的运行变得方便、快捷、稳定。

4、电梯控制器的工作原理

本次设计是实现 6 层电梯的运行控制,当在某一楼层按下上升或者下降请求按钮时,控制器响应该请求并控制电梯前往该楼层,当到达该楼层时,电梯开门,当进入电梯后,电梯关门,此时按下要到达的楼层按钮,控制器响应该请求并控制电梯前往该楼层,当到达前往楼层后,电梯开门,走出电梯,然后关门......,就这样往复的实现电梯的控制功能。

在电梯运行时遵循如下规则:当电梯处于上升模式时,只响应比电梯所在位置高的上楼信号,由下至上依次执行;直到最后一个上楼请求执行完毕,如有更高层有下楼请求时,则直接升到有下降请求的最高楼,然后进入下降模式,电梯处于下降模式时,则与上升相反。

电梯的输入信号主要包括外部输入信号和内部输入信号;对于电梯外部输入信号主要有:每一层电梯门外都有上升请求和下降请求按钮,其中一楼电梯门外只有上升请求按钮,6 楼电梯门外只有下降请求按钮。对于电梯内部输入信号主要有:6 个前往楼层的按钮、提前关门按钮、延时关门按钮、电梯异常按钮。

电梯输出信号也主要包括外部输出信号和内部输出信号;对于电梯外部输出信号包括上升请求按钮和下降按钮指示信号、电梯当前所在楼层指示信号、电梯运行方向指示信号。电梯内部输出信号包括6 个前往楼层按钮指示信号、超重等警告指示信号、电梯当前所在楼层指示信号、电梯运行方面指示信号。

5、电梯控制系统的设计内容

本次设计是基于 FPGA 的电梯控制器的研究,是电梯控制的核心技术,通过电梯控制器可以对电梯运行模式和状态进行全面的控制,这也是次设计的研究重要性;电梯的层数为6 层,本次设计采用模块化设计方法,主要分为四大模块:时钟分频模块、按键处理模块、电梯运行控制模块、数码管显示模块。其方框原理图5-0 如下:

图5-0 电梯控制器原理图

5.1 时钟分频模块

时钟分频模块功能是将系统频率分频为两种不同的频率,一个是2 分频时钟供电梯运行控制模块使用,另一个8 分频时钟供其他模块使用,其源代码如下:

时钟分频模块:clkdiv.vhd

LIBRARY ieee;

USE ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all; --定义所用的标准库

ENTITY clkdiv IS --时钟分频寄存器(CLKDIV)

PORT(

clk : in out std_logic; --系统时钟频率

clk_2hz: out std_logic; --2分频脉冲(作为电梯控制时钟

clk_8hz: out std_logic --8分频脉冲(作为按键处理时钟));--定义输入输出变量

end clkdiv;

ARCHITECTURE behave OF clkdiv IS

signal cnt:std_logic_vector(7 downto 0); --定义一个8 位的变量

begin process (clk) --时钟分频进程

begin

if clk'event and clk='1' then --时钟脉冲上升沿有效

cnt <= cnt + 1;

clk_8hz <= cnt(1); --变量cnt 的第1 位输出2 分频

clk_2hz <= cnt(4); --变量cnt 的第3 位输出8 分频

end if;

end process;

end behave;

源程序编写完成后,进行调试、运行并生成模块文件,确认没有错误之后进行功能仿真、时序分析。其模块原理图5-1 如下:

图5-1 时钟分频模块原理图

5.2 按键处理模块

按键处理模块的功能是把电梯外部与内部的按键信号进行处理,把处理好的按键信号送到电梯运行控制模块;根据电梯外部按键信号转化为电梯运行控制模块的外部请求信号,根据电梯内部的按键信号转化为电梯运行控制模块的电梯前往信号,根据电梯楼层信号及时清除电梯外部与内部按键信号。其源代码编写如下:

按键处理模块:keypro.vhd

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

entity keypro is

port ( clk: in std_logic; --按键时钟

reset: in std_logic; --异步置位按键

fup: in std_logic_vector(5 downto 1); --上升请求按键(低电平有fdn: in std_logic_vector(6 downto 2); --下降请求按键(低电平有效) fuplight: o ut std_logic_vector (6 downto 1);--电梯外部上升请求指示灯

fdnlight: o ut std_logic_vector (6 downto 1);--电梯外部下降请求指示灯

st: in std_logic_vector (6 downto 1); --电梯内部各层请求按键stlight: out std_logic_vector (6 downto 1);--电梯内部各层请求指示灯

position: in integer range 1 to 6 ; --电梯位置指示

clearup:in std_logic;--用于清除上升请求指示灯的信号

cleardn:in std_logic--用于清除下降请求指示灯的信号

);

end keypro;

architecture behave of keypro is--控制按键信号灯进程

begin

process(reset,clk)

begin

if reset = '0' then

stlight <= "000000";

fuplight <= "000000";

fdnlight <= "000000";

else

if clk'event and clk='1' then

--清除电梯当前外部上升请求信号和电梯内部前往该楼层信号if clearup = '1' then

stlight(position) <= '0';

fuplight(position) <= '0';

else

fuplight <=(not fup) & '0';

stlight <= not st;

end if;

--清除电梯当前外部下降请求信号和电梯内部前往该楼层信号

if cleardn = '1' then

stlight(position) <= '0';

fdnlight(position) <= '0';

else

fdnlight <= '0' & (not fdn);

stlight <= not st;

end if;

end if;

end if;

end process;

end behave;

源程序编写完成后,进行编译、运行并生成模块文件,确认没有错误之后进行波形仿真、时序分析。其模块原理图5-2 如下:

图 5-2 按键处理模块原理图

5.3 电梯运行控制模块

电梯运行控制模块是此次设计的核心,电梯运行的模式和状的态控制效果完全取决于电梯控制模块,它的功能是在系统2 分频时钟下,根据按键处理模块

输出的信号,控制电梯上升与下降运行模式和状态,当电梯关门时输出相应的上升与下降清除信号,同时输出电梯当前所在楼层的数码管输出信号与电梯运行方向,本次是设计的6层电梯控制系统,在源程序中具体要体现一下功能:

1) 每层电梯(除1 楼和6 楼外,1 楼只有上升请求按钮,6 楼只有下降请求按钮)入口出设置有上升和下降请求按钮,电梯内部设有要到达楼层的请求按钮1-6 楼。

2) 设有电梯所处位置数码管显示部分,电梯运行模式的LED 显示部分。

3) 电梯能记忆电梯外部所有信号请求,并按照电梯运行规则进行顺序响应,每个电梯请求信号保留到电梯响应结束。

4) 电梯运行规则:当电梯上升时候,只响应比电梯所在楼层高的上楼信号,由下到上依次执行,直到最后一个上升请求信号执行完毕,当电梯下降时候,只响应比电梯所在楼层低的下楼信号,由上到下依次执行,直到最后一下下降请求信号执行完毕。

电梯运行控制模块的源程序如下:

电梯运行控制模块:elevrun.vhd

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

entity elerun is

port (clk:in std_logic; --电梯时钟

alarm:in std_logic;

reset:in std_logic; --异步置位按键

fuplight:in std_logic_vector (6 downto 1);--电梯外部上升请求指示灯

fdnlight:in std_logic_vector (6 downto 1);--电梯外部下降请求指示灯

stlight:in std_logic_vector (6 downto 1); --电梯内部各层请求指示灯

position:out integer range 1 to 6; --电梯位置指示

doorlight:out std_logic; --电梯门开关指示灯

clearup:out std_logic;--用于清除上升请求指示灯的信号

cleardn:out std_logic;--用于清除下降请求指示灯的信号

yanshi:in std_logic;

tiqian:in std_logic;

udsig:buffer std_logic_vector(7 downto 0) --电梯升降指示

);

end elerun;

architecture sixflift of elerun is

type lift_state is

(stopon1,dooropen,doorclose,doorwait1,doorwait2,doorwait3, doorwait4,doorwait5,doorwait6,up,down,stop);

signal mylift: lift_state;

signal pos: integer range 6 downto 1;

signal udflag :std_logic;

signal posreg :integer range 1 to 6;

signal one: std_logic_vector (6 downto 1);

begin

process(reset,clk) --控制电梯状态的进程

begin

if (reset = '1' or alarm = '1') then

mylift <= stopon1;

clearup <= '1';

cleardn <= '1';

else

if (clk 'event and clk = '1') then

case mylift is

when stopon1 =>

doorlight <= '0';

posreg <= 1;

mylift <= doorwait1;

clearup <= '0';

cleardn <= '0';

udsig <= "00000010";

when doorwait1 =>

if tiqian = '1' then

mylift <= doorclose;

elsif yanshi = '1' then

mylift <= doorwait1;

else

mylift <= doorwait2;

end if;

clearup <= '0';

cleardn <= '0';

when doorwait2 =>

if tiqian = '1' then

mylift <= doorclose;

elsif yanshi = '1' then

mylift <= doorwait1;

else

mylift <= doorwait3;

end if;

clearup <= '0';

cleardn <= '0';

when doorwait3 =>

if tiqian = '1' then

mylift <= doorclose;

elsif yanshi = '1' then

mylift <= doorwait1;

else

mylift <= doorwait4;

end if;

clearup <= '0';

cleardn <= '0';

when doorwait4 =>

if tiqian = '1' then

mylift <= doorclose;

elsif yanshi = '1' then

mylift <= doorwait1;

else

mylift <= doorwait5;

end if;

clearup <= '0';

cleardn <= '0';

when doorwait5 =>

if tiqian = '1' then

mylift <= doorclose;

elsif yanshi = '1' then

mylift <= doorwait1;

else

mylift <= doorwait6;

end if;

clearup <= '0';

cleardn <= '0';

when doorwait6 =>

mylift <= doorclose;

cleardn <= (not udflag);

clearup <= udflag;

when doorclose =>

doorlight <= '0';

clearup <= '0';

cleardn <= '0';

if posreg = 6 then

if (stlight = "000000" and fuplight = "000000" and fdnlight = "000000") then

mylift <= doorclose;

udsig <= "00000010";

elsif stlight > "000000" or fdnlight > "000000" or fuplight > "000000" then

mylift <= down;

udsig<="01111010";

udflag <= '1';

end if;

elsif posreg = 1 then

if (stlight = "000000" and fuplight = "000000" and fdnlight = "000000") then

mylift <= doorclose;

udsig <= "00000010";

elsif stlight > "000000" or fdnlight > "000000" or fuplight > "000000" then

mylift <= up;

udsig<="01111100";

udflag <= '0';

end if;

else

if (stlight = "000000" and fuplight = "000000" and fdnlight = "000000") then

mylift <= doorclose;

udsig <= "00000010";

elsif stlight >= (one + one) or fuplight >= (one + one) or fdnlight >= (one + one) then

mylift <= up;

udsig<="01111100";

udflag <= '0';

elsif (stlight + stlight) <= one or (fuplight + fuplight)

<= one or (fdnlight + fdnlight) <= one then

mylift <= down;

udsig<="01111010";

udflag <= '1';

else

mylift <= doorclose;

end if;

end if;

when up =>

clearup <= '0';

cleardn <= '0';

if posreg < 6 and (stlight(posreg) = '1' or fuplight(posreg) = '1' or (stlight = "000000" and fdnlight(posreg) = '1'))

then mylift <= stop;

if (stlight = "000000" and fdnlight(posreg) = '1' and fuplight = "000000") then

udflag <= '1';

end if;

elsif posreg = 6 and (stlight(posreg) = '1' or fuplight(posreg) = '1' or ( fuplight = "000000" and fdnlight(posreg) = '1'))

then mylift <= stop;

elsif posreg = 6 and ( fdnlight > "000000" or fuplight > "000000") then

mylift <= stop;

else

mylift <= up;

udsig<="01111100";

udflag <= '0';

if posreg<6 then

posreg <= (posreg+1);

end if;

end if;

when down =>

clearup <= '0';

cleardn <= '0';

if posreg > 1 and (stlight(posreg) = '1' or fdnlight(posreg) = '1' or ( stlight = "000000" and fuplight(posreg) = '1' ))

then mylift <= stop;

if (stlight = "000000" and fuplight(posreg) = '1' and fdnlight = "000000") then

udflag <= '0';

end if;

elsif posreg = 1 and (stlight(posreg) = '1' or fdnlight(posreg) = '1' or ( fdnlight = "000000" and fuplight(posreg) = '1'))

then mylift <= stop;

elsif posreg = 1 and ( fdnlight > "000000" or fuplight > "000000") then

mylift <= stop;

else

mylift <= down;

udsig<="01111010";

udflag <= '1';

if posreg>1 then

posreg <= (posreg-1);

end if;

end if;

when stop =>

mylift <= dooropen;

clearup <= '0';

cleardn <= '0';

when dooropen =>

doorlight <= '1';

clearup <= '0';

cleardn <= '0';

mylift <= doorwait1;

when others =>

mylift <= doorwait1;

clearup <= '0';

cleardn <= '0';

end case;

end if;

end if;

end process ;

position <= posreg;

process(clk,posreg)

begin

if clk 'event and clk = '1' then

case posreg is

when 1 => one <= "000001";

when 2 => one <= "000010";

when 3 => one <= "000100";

when 4 => one <= "001000";

when 5 => one <= "010000";

when 6 => one <= "100000";

end case;

end if;

end process ;

end ;

电梯控制运行模块源程序编写完成后,进行编译、运行并生成模块文件,确认没有错误之后进行波形仿真、时序分析。其模块原理图5-3 如下:

图 5-3 电梯运行控制模块原理图

5.4 数码管显示模块

数码管显示模块的功能主要是把楼层信号转化为数字信号,通过数码管进行显示,显示电梯运行到的楼层指示,本次设计用的是共阴极数码管,其源程序如下:

数码管显示模块:floorled.vhd

library ieee;

use ieee.std_logic_1164.all;--定义所用的标准库

entity floorled is

port( clk : in std_logic;--系统时钟频率

position :in std_logic_vector(2 downto 0);--电梯位置变量

posled : out std_logic_vector(7 downto 0)--电梯楼层显示变量); --定义输入输出变量

end floorled;

architecture behave of floorled is

begin

process(clk)--时钟分频进程

begin

if clk 'event and clk = '1' then--时钟脉冲上升沿有效

case position is

when "001" => posled <= "01100000";--显示数字1

when "010" => posled <= "11011010";--显示数字2

when "011" => posled <= "11110010";--显示数字3

when "100" => posled <= "01100110";--显示数字4

when "101" => posled <= "10110110";--显示数字5

when "110" => posled <= "10111110";--显示数字6

when others=>posled <= "01100000"; --显示数字1

end case;

end if;

end process ;

end behave;

数码管显示模块源程序编写完成后,进行编译、运行并生成模块文件,确认没有错误之后进行波形仿真、时序分析。其模块原理图5-4 如下:

图 5-4 数码管显示模块原理图

相关文档