
随着大规模集成电路技术和计算机技术的不断发展,在涉及通信、国防、航天、医学、工业自动化、计算机应用、仪器仪表等领域的电子系统设计工作中,EDA技术的含量正以惊人的速度上升,电子类高新技术项目的开发也更加依赖于EDA技术的应用。即使是普通的电子产品的开发,EDA技术常常使一些原来的技术瓶颈得以轻松突破,从而使产品的开发周期大为缩短、性能价格比大幅提高。不言而喻,EDA技术将迅速成为电子设计领域中的极其重要的组成部分。
1.1 EDA技术的含义及特点
EDA(Electronic Design Automation,电子系统设计自动化)技术是20世纪90年代初从CAD(计算机辅助设计),CAM(计算机辅助制造),CAT(计算机辅助测试)和CAE(计算机辅助工程)的概念发展而来的。现代EDA技术就是以计算机为工具,在EDA软件平台上,根据硬件描述语言HDL完成的设计文件,能自动地完成用软件方式描述的电子系统到硬件系统的逻辑编译、逻辑化简、逻辑分割、逻辑综合及优化、布局布线、逻辑仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。设计者的工作仅限于利用软件的方式来完成对系统硬件功能的描述,在EDA工具的帮助下和应用相应的FPGA/CPLD器件,就可以得到最后的设计结果。尽管目标系统是硬件,但整个设计和修改过程如同完成软件设计一样方便和高效。[3]
可见,利用EDA技术进行电子系统的设计具有以下几个特点:一是用软件的方式设计硬件;二是用软件方式设计的系统到硬件系统的转换是由有关的开发软件自动完成的;三是采用自顶向下(top--down)的设计方法;四是设计过程中可用有关软件进行各种仿真;五是系统可现场编程,在线升级;六是整个系统可集成在一个芯片上,体积小、功耗低、可靠性高。因此,EDA代表了当今电子设计技术的最新发展方向。
1.2EDA技术的主要内容
EDA技术涉及面很广,内容丰富,从教学和实用的角度看,主要应掌握如下个4个方面的内容:一是大规模可编程逻辑器件;二是硬件描述语言;三是软件开发工具;四是实验开发系统。其中,大规模可编程逻辑器件是利用EDA技术进行电子系统设计的载体,硬件描述语言是利用EDA技术进行电子系统设计的主要表达手段,软件开发工具是利用EDA技术进行电子系统设计的智能化的自动设计工具,实验开发系统则是利用EDA技术进行电子系统设计的下载工具及硬件验证工具。
1.3 FPGA、VHDL语言
FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
FPGA采用了逻辑单元阵列(LOA,Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块(CLB,Configurable Logic Block)、输入输出模块(IOB,Input Output Block)和内部连线(Interconnect)三个部分。FPGA的基本特点主要有:
(1)采用FPGA设计ASIC电路,用户不需要投片生产就能得到合用的芯片;
(2)FPGA可做其他全定制或半定制ASIC电路的试样片:
(3)FPGA内部有丰富的触发器和I/O引脚;
(4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一;
(5)FPGA采用高速CMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
可以说,FPGA芯片是小批量系统提高系统集成度和可靠性的最佳选择之一。
目前FPGA的品种很多,有XILINX的xc系列、TI公司的TPC系列、ALTERA公司的FIEX系列等。
VHDL于1983年有美国国防部(DOD)发起创建,由IEEE进一步发展并在1987年作为“IEEE标准1076”发布。从此,VHDL成为硬件描述语言的业界标准之一。VHDL作为一个规范语言和建模语言,随着VHDL的标准化,出现了一些支持该语言的行为仿真器。由于创建VHDL的最初目标是用于标准文档的建立和电路功能模拟,其基本想法是在高层次上描述系统和元件的行为。但到了20世纪90年代初,人们发现,VHDL不仅可以作为系统模拟的建模工具,而且可以作为电路系统的设计工具,可以利用软件工具将VHDL源码自动地转化为文本方式表达的基本逻辑元件连接图,即网表文件。这种方法显然对于电路自动设计师一个极大的推进。很快,电子设计领域出现了第一个软件设计工具,即VHDL逻辑综合器,它把标准VHDL的部分语句描述转化为具体电路实现的网表文件。
VHDL具有与具体硬件电路无关和与设计平台无关的特性,并且具有良好的电路行为描述和系统描述的能力,在语言易读性和层次化结构化设计方面表现了强大的生命力和应用潜力。因此,VHDL支持各种模式的设计方法:自顶向下雨自底向上或混合方法,在面对当今许多电子产品生命周期缩短,需要多次重新设计以融入最新技术、改变工艺等方面,VHDL具有良好的适应性。用VHDL进行电子系统设计的一个很大的优点神设计者可以专心致力于其功能的实现,而不需要对不影响功能的与工艺有关的因素花费过多的时间和精力。
1.4 Quartus II软件介绍
Quartus II应用开发工具提供完整的多平台设计环境,它可以轻易满足特定设计的需要,是可编程片上系统(SOPC)设计的综合性环境。Quartus II可在个人计算机或Unix/Linus工作站上使用,大大简便了整个设计过程,做到真正的快速CPLD/FPGA应用开发。与早期的MAX+plus II开发工具相比,Quartus II提供更为广泛的器件支持库、更高的编译效率、更好的图形界面和更为便捷的仿真平台。Quartus II全面支持Altera公司出品的芯片产品,就4.0版本而言,它支持的芯片型号包括ACEX 1K、APEX全系列、APEX II、基于ARM技术的Excalibur系列、Cyclone、FLEX全系列、HardCopy Stratix、MAX II、MAX全系列、Mercury、Stratix、Stratix II以及Stratix GX等。
Quartus II为电路设计者提供了完整的多平台设计环境,它可以满足众多特定设计的需要。Quartus II拥有CPLD/FPGA各个开发阶段对应的开发工具,设计者通过它的集成开发环境可一次性完成整体应用的开发。图1.1所示是利用Quartus II完成应用开发的流程图。
图1.1 Quartus II设计流程
第2章 电梯控制系统
2.1 设计背景与意义
目前国内七八十年代安装的许多电梯电气部分用继电器接触器控制系统,线路复杂,接线多,故障率高,维修保养难,许多已处于闲置状态,其拽引系统多采用交流双速电机系统换速,效率低,调速性能指标较差,严重影响电梯运行质量。由于这些电梯交流调压调速系统,交流双速电机拖动系统性能及乘坐舒适感较差,交流调压调速系统属能耗型调速的机械部分无大问题,为节约资金,大部分老式电梯用户希望对电梯的电气控制系统进行改造,提高电梯的运行性能。因此对电梯控制技术进行研究,寻找适合我国老式电梯的改造方法具有十分重要的意义。
电梯作为高层建筑物的重要交通工具与人们的工作和生活日益紧密联系。FPGA/CPLD作为新一代工业控制器,以其高可靠性和技术先进性,在电梯控制中得到广泛应用,从而使电梯由传统的继电器控制方式发展为计算机控制的一个重要方向,成为当前电梯控制和技术改造的热点之一。
由于FPGA/CPLD具有性能稳定、抗干扰能力强、设计配置灵活等特点。因此在工业控制方面得到了广泛应用。自90年代后期FPGA/CPLD引入我国电梯行业以来,由FPGA/CPLD组成的电梯控制系统被许多电梯制造厂家普遍采用。并形成了一系列的定型产品。在传统继电器系统的改造工程中,FPGA/CPLD系统一直是主流控制系统。电梯控制系统分为调速部分和逻辑控制部分。调速部分的性能对电梯运行是乘客的舒适感有着重要影响,而逻辑控制部分则是电梯安全可靠运行的关键。为了改善电梯的舒适感和运行的可靠性,现在都改为用FPGA/CPLD来控制电梯的运行,这样大大提高了电梯的性能。
2.2 设计要求
采用FPGA设计一个10层的电梯控制系统,用VHDL语言进行程序设计,用Quartus II软件进行结果仿真。该控制器可控制电梯完成10层楼的载客服务。要求遵循方向优先原则,能响应提前关门或延迟关门,并具有超载报警和故障报警;同时指示电梯运行情况和电梯内外请求信息。
第3章 电梯控制系统整体设计方案
3.1 不同的方案设计
3.1.1 基于单片机的电梯控制设计方案
电梯控制系统的工作原理是:当某层有电梯信号输入时,电梯信号锁存系统将电梯信号锁存,待单片机查询到电梯信号后,根据电梯信号的位置(即楼层数)和电梯所处的位置,决定电梯运行方向,并启动电梯到电梯层停梯、开门,待乘客进入电梯关门后,再根据乘客要求把乘客送到目的层。用单片机实现电梯控制系统的结构原理框图如图3.1所示。[9]
图3.1 单片机电梯控制系统的方框图
3.1.2 基于PLC的电梯控制设计方案
电梯PLC的控制系统和其他类型的电梯控制系统一样主要由控制系统和拖动控制系统两部分组成。其基本结构图如图3.2所示,主要硬件包括主机及扩展、机械系统、轿厢操纵盘、厅外呼梯盘、指层器、门机、调速装置与主拖动系统等。
图3.2 PLC电梯控制系统的基本结构图
3.1.3 基于FPGA的电梯控制设计方案
该设计采用方向优先控制方式方案,并能响应提前关门延时关门,并具有超载报警和故障报警;同时指示电梯运行情况和电梯内外请求信息。它主要由4个模块组成:外部数据高速采集模块、信号存储模块、基于FPGA的控制器模块、信号的输出、显示模块。
3.2 方案比较与选择
采用单片机的电梯控制系统是以MCS-51系列单片机为控制核心与可编程接口芯片和采用串入并出移位寄存器的显示驱动电路及带有比较器的信号输入滤波电路构造的一个主控板并利用软件手段实现对电梯运行的逻辑控制。结构简单,运行可靠,耗电量少且便于维修,具有造价低廉,维修方便之特点,但没FPGA控制方便灵活。
采用PLC的电梯控制系统是一种用于自动化控制的专用计算机,实质上属于计算机控制方式。PLC控制一般具有可靠高、易操作、维修、编程简单、灵活性强等特点。在设计中要使用到变频器,其功能强,使用灵活,由于PLC的针对性较强,每一台PLC都是根据一个设备而设计的,且使用到继电器,所以价格较昂贵,操作复杂。
采用FPGA的电梯控制系统通过对器件内部的设计来实现系统功能,是一种基于芯片的设计方法。设计者可以根据需要定义器件内部逻辑和引出端,将电路板设计的大部分工作放在芯片的设计中进行,通过对芯片设计实现数字系统的逻辑功能。灵活的内部功能块组合,引出端定义等,可大大减轻电路设计和电路板设计和电路板设计的工作量和难度,有效的增强设计的灵活性,提高工作效率。同时采用可编程逻辑器件,设计人员在实验室可反复编程,修改错误,以期尽快开发产品,迅速占领市场。基于芯片的设计方法可以减少芯片的数量,缩小系统体积,降低能源消耗,提高系统的性能和可靠性。
基于FPGA的电梯控制系统比基于单片机的控制更灵活、更方便于设计,基于PLC的控制系统的针对性要强,一台PLC只针对于一个设备而设计且要使用到继电器,所以价格昂贵,综合考虑使用FPGA设计电梯控制系统比较适合。
3.3 整体方案设计
设计一个10层楼的电梯控制器,该控制器可控制电梯完成10层楼的载客服务而且遵循方向优先原则,方向优先控制是指电梯运行到某一楼层时先考虑这一楼层是否有请求:有,则停止;无,则继续前进。停下后再启动时的步骤:
1考虑前方——上方或下方是否有请求:有,则继续前进;无,则停止;
2检测后方是否有请求,有请求则转向运行,无请求则维持停止状态。
这种运行方式下,电梯对用户的请求响应率为100%,且响应的时间较短,电梯在维修停止状态的时候可以进入省电模式,又能节省大量电能。具体功能如下:
(1)完成10层楼的载客服务控制;
(2)电梯初始位置为第一层;
(3)电梯运行时显示电梯的运行方向和所在的楼层;
(4)当电梯到达选择的楼层时,电梯自动开门;
(5)当电梯到达本层时,清除请求;
(6)具有提前关电梯门和延时关电梯门的功能;
(7)电梯处于等待状态时,上升和下降请求都响应;
(8)电梯处于上升状态时,有上升请求的分控制器所在楼层数大于电梯所在的楼层数。
(9)电梯处于下降状态时,有下降请求的分控制器所在楼层数小于电梯所在的楼层数。[2]
系统方框图如图3.3。如果压力传感器连续采集到3 次关门中断信号,则启动电梯故障信号,除非人为对故障进行清除,否则电梯将保持开门状态并不进行任何操作。如果压力传感器采集到电梯超载,电梯将报警,并保持开门状态不进行任何操作,直到压力传感器采集到电梯不再超载。电梯打开后,如果用户不进行任何操作,电梯3 秒后将自动关门,如果用户按提前关门键,电梯将立即响应关门指令。控制器模块对电梯内及电梯外用户的上升和下降请求进行处理,处理结果并置后存入信号存储模块。电梯在运行过程中,每到达一层将通过控制器模块,对信号存储模块的存储指令进行比对,以判断是否需要停止,并通过光敏采集到的信号来判断电梯所到达的楼层, 并通过显示模块进行显示。[1]
图3.3 电梯方向优先控制方式控制器系统方框图
第4章 电梯控制系统的硬件设计
4.1 外部数据高速采集模块设计
有效的对外部信号采集、处理要求电梯控制器:对外部请求信号的实时、准确采集;准确、实时的捕捉楼层到达信号;有效防止楼层到达信号、外部请求信号的误判。
控制器采用FPGA作为系统控制的核心,系统时钟频率是32MHz,完全可以满足实时采集数据的要求。由于电路中毛刺现象的存在,信号的纯净度降低,单个的毛刺往往被误作为系统状态转换的触发信号,严重影响电梯的正常工作。可以采用多次检测的方法解决这个问题,对一个信号进行多次采样以保证信号的可信度。
外部请求信号的输入形式为按键输入,到达楼层信号来自光敏传感器,关门中断信号及超载信号则产生于压力传感器。
4.1.1 键盘输入
外部请求信号输入采用键盘输入,用带有I/O口的线组成行列结构,按键设置在行列的交点上。本题目采用5×6的行列结构可以构成30个键盘,实际使用30个。按键设置在行列线交叉点,行、列线分别连接到按键开关的两端。列线通过上拉电阻接+5V的电压,即列线的输出被钳位到高电平状态。
判断键盘中有无按键按下时通过行线送入扫描信号,然后从列线读取状态得到的。其方法是依次给行线送低电平,检查列线的输入。如果列线信号全为高电平,则代表低电平信号所在的行中无按键按下;如果列线有输入为低电平,则低电平信号所在的行和出现低电平的列的交点处有按键按下,电路图如图4.1所示。
图4.1 键盘输入电路
4.2 信号存储模块
电梯控制器的请求输入信号有30个(电梯外有9个上升请求和9个下降请求的用户输入端口,电梯内有10个请求用户输入端口,一个提前关门quick,一个清楚报警信号clr),由于系统对内、外请求没有设置优先级,各楼层的内、外请求信号被采集后可先进行运算,再存到存储器内。
电梯运行过程中,由于用户的请求信号的输入是离散的,而且系统对请求的响应也是离散的,因此请求信号的存储要求新的请求信号不能覆盖原来的请求信号,只有响应动作完成后才能清除存储器内对应的请求信号位。对应某一楼层的请求信号的存储、清除电路如图4.2所示。
图4.2 请求信号操作电路
4.3 基于FPGA的控制器模块
控制器模块是系统的核心,通过对存储的数据(含请求、到达楼层等信号)进行比较、判断以驱动系统状态的流转。电梯工作过程有9种状态:等待、上升、下降、开门、关门、停止、休眠、超载报警以及故障报警状态。一般情况下,电梯工作起始点是第一层,起始状态是等待状态,启动条件是收到上升请求。
控制器模块采用FPGA芯片,编写控制程序后下载到芯片内,实现对电梯系统的控制。其使用的芯片是Xilinx公司Spartan II系列的XC2S15-5CS144C芯片。Spartan II器件的集成度可以达到15万门,系统速度可达到200MHz,能达到ASIC的性价比。Spartan II 2.5V现场可编程们Spartan II器件的工作电压为2.5V,采用0.22μm/0.18μm CMOS工艺,6层金属连线制造。
4.4 信号的输出、显示模块
本系统的输出信号有三种:一种是电机的升降控制信号(两位)和开门/关门控制信号;一种是面向用户的提示信号(含楼层显示、方向显示、已接受请求显示等);一种是对于超载、故障的报警信号。
电机的控制信号一般需要两位,本系统中电机有3种工作状态:正转、反转和停转状态。两位控制信号作为一个三路开关选通信号,此三路开关选用模拟电子开关。
系统的显示输出包括数码管请求信号显示、数码管楼层显示。电路图如图4.3,4.4所示。
图4.3 电梯内、外请求信号显示电路图
图4.4 数码管楼层显示电路图
本系统具有请求信号显示功能,结合方向显示,可以减少用户对同一请求的输入次数,这样就延长了电梯按键的使用寿命。假如电梯处于向上运动状态,初始位置是底层,初始请求是10楼,2楼时进入一人,如果他的目的地是10楼,他看到初始请求是10楼,就可以不再按键。同时,电梯外部的人也可以根据请求信号显示(上升请求、下降请求、无请求),就可以避免没必要的重复请求信号输入。电梯使用时,系统结合相应的电梯使用规范完全可以满足人们的需要,而且效率比较高。
图4.5 报警输出电路图
报警输出电路图主要由频率放大器构成。当电梯内超载时,压力传感器输出的电压超出范围时,双限比较器输出低电平,触发了报警电路,发出报警信号。
第5章 电梯控制系统软件设计及仿真
5.1 键盘输入软件设计
5.1.1 键盘扫描模块
键盘扫描电路是用于产生keydrv4到keydrv0信号,其变化的顺序依次为11110→11101→11011→10111→01111→……周而复始地扫描。其停留在每个状态的时间大约为10ms.更短的停留时间是没有必要的,因为人按键的时间大约为10ms,不可能有更快的按键动作发生;另外,更短的停留时间还容易采集到抖动信号,会干扰判断。而太长的停留时间则容易丢失某些较快的按键动作。
键盘扫描电路的外部接口如图5.1所示。其中clk_scan是周期为10ms的扫描时钟,keydrv为输出到键盘的扫描信号,宽度为5位。
键盘扫描电路程序:
library IEEE;
use IEEE.std_logic_11.ALL;
entity keysan is
port(clk_scan:in std_logic; --扫描时钟,周期10ms
keydrv:out std_logic_vector(4downto 0)); --输出扫描信号
end keysan;
architecture behavior of keysan is
constant s0:std_logic_vector(4 downto 0):="11110"; --定义状态机编码
constant s1:std_logic_vector(4 downto 0):="11101";
constant s2:std_logic_vector(4 downto 0):="11011";
constant s3:std_logic_vector(4 downto 0):="10111";
constant s4:std_logic_vector(4 downto 0):="01111";
signal present_state:std_logic_vector(4downto 0); --状态机现态
signal next_state:std_logic_vector(4 downto 0); --状态机次态
begin
process(clk_scan) --状态更新进程
begin
if(clk_scan'event and clk_scan='1') then
present_state<=next_state;
end if ;
end process;
process(present_state) --状态译码
begin
case present_state is
when s0=>next_state<=s1;
when s1=>next_state<=s2;
when s2=>next_state<=s3;
when s3=>next_state<=s4;
when s4=>next_state<=s0;
when others=>next_state<=s0; --多余态处理
end case;
end process;
keydrv<=present_state; --输出译码
end behavior;
以上程序采用一个状态机来实现扫描电路。该状态机是一个one-hot状态机,并且输出值就是状态机的状态,没有通过一个逻辑电路来做输出译码。这样做的好处是得到的输出信号比较“干净”,没有毛刺。图5.1为外部接口图,图5.2为波形仿真图。
图5.1 外部接口图
图5.2 波形仿真图
5.1.2 键盘译码电路
键盘译码电路是从keydrv4到keydrv0和keyin5到keyin0信号中译码出按键键值的电路。按键标志产生电路是产生按键标志信号keypressed的电路,其外部接口如图5.3所示。其中clk为全局时钟信号,它是由FPGA芯片的外部晶振给出的。clk在系统中的频率是最高,其他时钟都由它分频产生。keydrv为键盘扫描信号,keyin为键盘输入信号,keypressed表示有一个按键被按下,每发生一次按键动作,keypressed就输出一个宽度为全局时钟周期的正脉冲。该信号用于与其他模块一起,负责通知其他模块键盘上有按键发生。其他模块在keyypressed有效时,可以读取键值。
程序如下:
library IEEE;
use IEEE.std_logic_11.all;
use IEEE.std_logic_arith.all;
entity keydecoder is
port( keyin:in std_logic_vector(5 downto 0); --键盘输入
keydrv:in std_logic_vector(4downto 0); --扫描信号
clk:in std_logic; --全局时钟
clk_scan: in std_logic; --扫描时钟
c_u1,c_u2,c_u3,c_u4,c_u5,c_u6,c_u7,c_u8,c_u9:out std_logic; --输出值
c_d2,c_d3,c_d4,c_d5,c_d6 ,c_d7, c_d8, c_d9, c_d10:out std_logic;
d1,d2,d3,d4,d5,d6,d7,d8,d9,d10:out std_logic;
quick,clr:out std_logic;
keypressed: out std_logic); --有键被按下标志
end keydecoder;
architecture rt1 of keydecoder is
signal temp:std_logic_vector(10downto 0); --temp= keyin&keydrv
signal temp_pressed:std_logic; --用于产生keypressed
signal q1,q2,q3,q4,q5,q6,q7,q8,q9,q10:std_logic; --10个寄存器
signal keypressed_asy:std_logic; --同步化的keypressed
begin
temp<=keydrv&keyin;
process(temp) --译码进程
begin
case temp is
when "11110111110"=>c_u1<='1';
temp_pressed<='1';
when "11110111101"=>c_u2<='1';
temp_pressed<='1';
when "11110111011"=>c_u3<='1';
temp_pressed<='1';
when "11110110111"=>c_u4<='1';
temp_pressed<='1';
when "11110101111"=>c_u5<='1';
temp_pressed<='1';
when "11110111111"=> c_u6<='1';
temp_pressed<='1';
when "11101111110"=> c_u7<='1';
temp_pressed<='1';
when "11101111101"=> c_u8<='1';
temp_pressed<='1';
when "11101111011"=> c_u9<='1';
temp_pressed<='1';
when "11101110111"=>c_d2<='1';
temp_pressed<='1';
when "11101101111"=> c_d3<='1';
temp_pressed<='1';
when "11101011111"=> c_d4<='1';
temp_pressed<='1';
when "11011111110"=> c_d5<='1';
temp_pressed<='1';
when "11011111101"=> c_d6<='1';
temp_pressed<='1';
when "11011111011"=> c_d7<='1';
temp_pressed<='1';
when "11011110111"=> c_d8<='1';
temp_pressed<='1';
when "11011101111"=> c_d9<='1';
temp_pressed<='1';
when "11011011111"=> c_d10<='1';
temp_pressed<='1';
when "10111111110"=>d1<='1';
temp_pressed<='1';
when "10111111101"=>d2<='1';
temp_pressed<='1';
when "10111111011"=>d3<='1';
temp_pressed<='1';
when "10111110111"=>d4<='1';
temp_pressed<='1';
when "10111101111"=>d5<='1';
temp_pressed<='1';
when "10111011111"=>d6<='1';
temp_pressed<='1';
when "01111111110"=>d7<='1';
temp_pressed<='1';
when "01111111101"=>d8<='1';
temp_pressed<='1';
when "01111111011"=>d9<='1';
temp_pressed<='1';
when "01111110111"=>d10<='1';
temp_pressed<='1';
when "01111101111"=>quick<='1';
temp_pressed<='1';
when "01111011111"=>clr<='1';
temp_pressed<='1';
when others=>
temp_pressed<='0';
end case;
end process;
process(clk_scan) --按键标志产生电路
begin
if(clk_scan'event and clk_scan='1') then
q1<=temp_pressed;
q2<=q1;
q3<=q2;
q4<=q3;
q5<=q4;
q6<=q5;
q7<=q6;
q8<=q7;
end if;
keypressed_asy<=q1 or q2 or q3 or q4 or q5 or q6 or q7 or q8;
end process;
process(clk) --同步化keypressed_asy
begin
if(clk'event and clk='1') then
q9<=keypressed_asy;
q10<=q9;
end if;
keypressed<=q9 and not(q10);
end process;
end rt1;
输入信号clk_scan,它是用于产生扫描信号的时钟,周期为10ms。按键信号temp_pressed首先通过clk_scan信号的上升沿采样。通过采样后,抖动噪声被消除。采样后的信号被分别延迟1到8个clk_scan周期得到8个信号q1,q2,q3和q4 ,q5, q6, q7, q8,。这8个信号进行或运算得到一个宽约160ms并且与全局时钟异步的按键信号keypressed_asy。原来程序中一个长时间的按键过程有可能会被认为是多次按键,通过这种方法使得一个长时间的按键仍然被认为是一次按键。
图5.3 外部接口图
5.1.3 时钟产生电路
时钟产生电路是用用于产生扫描时钟的,它的输出提供给键盘扫描电路和按键标志产生电路,其外部接口如图5.4所示。它的输入是全局时钟,在这里假设全局时钟频率为32MHz。他的输出是周期为100ms的扫描时钟。
程序如下:
library IEEE;
use IEEE.std_logic_11.all;
use IEEE.std_logic_arith.all;
entity clk_gen is
port(clk:in std_logic; --全局时钟
clk_scan:out std_logic); --扫描时钟
end clk_gen;
architecture rt1 of clk_gen is
signal cnt:integer range 0 to 199; --做程序仿真时,用这个语句
begin
process(clk) --计数模块
begin
if(clk'event and clk='1') then
if(cnt=cnt'high) then
cnt<=0;
else
cnt<=cnt+1;
end if;
end if;
end process;
process(cnt,clk) --译码输出
begin
if(clk'event and clk='1') then --寄存器锁存输出,目的消除波形上的“毛刺”(小的抖动)
if cnt>=cnt'high/2 then
clk_scan<='1';
else
clk_scan<='0';
end if;
end if;
end process;
end rt1;
该程序主要包含有一个计数器模块和一个译码输出模块,该程序是通过计数器模块实现分频的。要从32MHz的全局时钟得到100Hz的时钟,必须进行320000倍的分频,如图5.5所示。
图5.4 外部接口图
图5.5 波形仿真图
5.2 控制模块设计及仿真
系统的状态流程图如图5.6所示。图中,超载状态时电梯关门动作取消,同时发出报警,直到警报被清除;故障时电梯不执行关门动作,同时发出警报,直到警报被清除(看门狗信号有效的条件是一层楼连续发生关门中断请求超过3次)。本系统由请求信号启动,运行中每检测到一个到达楼层信号,就将信号存储器的请求信号和楼层状态信号进行比较,再参考原方向信号来决定是否停止,转向等动作。电梯控制器功能:完成10个楼层的多用户载客服务控制;电梯内设有乘客到达层数的停站请求开关;每层电梯外设有上下请求开关,显示乘客的上升和下降请求;电梯运行时,楼内外同时显示电梯的运行状态和所在的楼层;当电梯到达选择的楼层时,经过1s 电梯门打开,开门指示灯亮,开门3s 后,电梯关闭,指示灯灭,电梯继续运行,直至执行完最后一个请求信号停在1 层;能记忆电梯外的所有请求信号,按照电梯运行规则次序响应,每个请求信号保留至执行后消除; 响应电梯外的有效请求,到达请求的楼层,电梯自动开门。电梯运行规则:电梯处于上升状态时,响应上升请求的楼层大于电梯的所在层;电梯处于下降状态时,响应有下降请求的楼层小于电梯的所在层;执行完上升状态时,若更高层有下楼请求,接开到下楼请求的最高层接客,然后进入下降模式;先执行完所有的上楼请求再执行下楼请求,抑或先执行完所有的下楼请求再执行上楼请求。其5.7为接口电路。
图5.6 系统状态流程图
1.控制源程序如下:
library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity dianti is
port(clk:in std_logic; --时钟信号
full,deng,quick,clr:in std_logic; --超载、关门中断、提前关门清除报警信号
c_u1,c_u2,c_u3,c_u4,c_u5,c_u6,c_u7,c_u8,c_u9:out std_logic;--电梯外人的上升请求信号
c_d2,c_d3,c_d4,c_d5,c_d6 ,c_d7, c_d8, c_d9, c_d10:out std_logic;--电梯外人的下降请求信号
d1,d2,d3,d4,d5,d6,d7,d8,d9,d10:in std_logic; --电梯内人请求信号
g1,g2,g3,g4,g5,g6,g7,g8,g9,g10:in std_logic; --到达楼层信号
door:out std_logic_vector(1 downto 0);--电梯门控制信号
led1:out std_logic_vector(6 downto 0);--电梯所在楼层显示
led2:out std_logic_vector(6 downto 0);
led_c_u:out std_logic_vector(9 downto 0);--电梯外人上升请求信号显示
led_c_d:out std_logic_vector(9 downto 0);--电梯外人下降请求信号显示
led_d:out std_logic_vector(9 downto 0);--电梯内请求信号显示
wahaha:out std_logic; --看门狗报警信号
ud,alarm:out std_logic; --电梯运动方向显示,超载警告信号
up,down:out std_logic); --电机控制信号和电梯运动
end dianti;
architecture behav of dianti is
signal d11,d22,d33,d44,d55,d66,d77,d88,d99,d1010:std_logic:=‘0’;--电梯内人请求信号寄存信号
signal c_u11,c_u22,c_u33,c_u44,c_u55,c_u66,c_u77,c_u88,c_u99:std_logic:=‘0’;--电梯外人上升请求信号寄存信号
signal c_d22,c_d33,c_d44,c_d55,c_d66,c_d77,c_d88,c_d99,c_d1010:std_logic:=‘0’; --电梯外人下降请求信号寄存信号
signal q:integer range 0 to 1; --分频信号
signal q1:integer range 0 to 6; --关门延时计数器
signal q2:integer range 0 to 9; --看门狗计数器
signal dd,cc_u,cc_d,dd_cc:std_logic_vector(9downto 0);--电梯内外请求信号寄存器
signal opendoor:std_logic; --开门使能信号
signal updown:std_logic; --电梯运动方向信号寄存器
signal en_up,en_dw:std_logic; --预备上升、预备下降预操作使能信号
begin
com:process(clk)
begin
if clk'event and clk='1'then
if clr='1'then q1<=0;q2<=0;wahaha<='0'; --清除故障报警
elsif full='1'then alarm<='1';q1<=0; --超载报警
if q1>=3 the door<="10 ";
else door<="00";
end if;
elsif q=1 then q<=0;alarm<='0';
if q2=3 then wahaha<='1'; --故障报警
else
if opendoor ='1'then door<="10";q1<=0;q2<=0;up<='0';down<='0'; --开门操作
elsif en_up='1'then --上升预操
if deng='1'then door <="10";q1<=0;q2<=q2+1; --关门中断
elsife quick ='1'then q1<=3; --提前关门
elsife q1=6 then door<="00";updown<='1';up<='1'; --关门状态,电梯进入上升状态
elsife q1>=3 then door<="01";q1<=q1+1; --电梯进入关门状态
else q1<=q1+1;door<="00"; --电梯进入等待状态
end if;
elsife en_dw='1'then --下降预操作
if deng='1'then door <="10";q1<=0;q2<=q2+1;
elsife quick ='1'then q1<=3;
elsife q1=6 then door<="00";updown<='0';down<='1';
elsife q1>=3 then door<="01";q1<=q1+1;
else q1<=q1+1;door<="00";
end if;
end if;
if g1='1'then led1<="1001111";led2<="1111111"; --电梯到达1楼,数码管显示1
if d11='1'or c_u11='1'then d11<='0';c_u11<='0';opendoor<='1'; --有当前层的请求,则电梯进入开门状态
elsif dd_cc>"0000000001"then en_up<='1'; opendoor<='0'; --有上升请求,则电梯进入预备上升状态
elsif dd_cc="0000000000"then opendoor<='0'; --无请求时,电梯停在1楼待机
end if;
elsif g2='1'then led1<="0010010";led2<="1111111"; --电梯到达2楼,数码管显示2
if updown='1'then
if d22='1'or c_u22='1'then d22<='0';c_u22<='0';opendoor<='1'; --有当前层的请求,则电梯进入开门状态
elsif dd_cc>"0000000011"then en_up<='1'; opendoor<='0'; --有上升请求,则电梯进入预备上升状态
elsif dd_cc<"0000000010"then en_dw<='1'; opendoor<='0'; --有下降请求,则电梯进入预备下降状态
end if;
elsif d22='1'or c_d22='1'then d22<='0';c_d22<='0';opendoor<='1'; --有当前层的请求,则电梯进入开门状态
elsif dd_cc<"0000000010"then en_dw<='1'; opendoor<='0'; --有下降请求,则电梯进入预备下降状态
elsif dd_cc>"0000000011"then en_up<='1'; opendoor<='0'; --有上升请求,则电梯进入预备上升状态
end if;
elsif g3='1'then led1<="0000110"; led2<="1111111"; --电梯到达3楼,数码管显示3
if updown='1'then
if d33='1'or c_u33='1'then d33<='0';c_u33<='0';opendoor<='1';
elsif dd_cc>"0000000111"then en_up<='1'; opendoor<='0';
elsif dd_cc<"0000000100"then en_dw<='1'; opendoor<='0';
end if;
elsif d33='1'or c_d33='1'then d33<='0';c_d33<='0';opendoor<='1'; elsif dd_cc<"0000000100"then en_dw<='1'; opendoor<='0';
elsif dd_cc>"0000000111"then en_up<='1'; opendoor<='0';
end if;
elsif g4='1'then led1<="1001100"; led2<="1111111"; --电梯到达4楼,数码管显示4
if updown='1'then
if d44='1'or c_u44='1'then d44<='0';c_u44<='0';opendoor<='1';
elsif dd_cc>"0000001111"then en_up<='1'; opendoor<='0';
elsif dd_cc<"0000001000"then en_dw<='1'; opendoor<='0';
end if;
elsif d344='1'or c_d44='1'then d44<='0';c_d44<='0';opendoor<='1'; elsif dd_cc<"0000001000"then en_dw<='1'; opendoor<='0';
elsif dd_cc>"0000001111"then en_up<='1'; opendoor<='0';
end if;
elsif g5='1'then led1<="0100100";led2<="1111111"; --电梯到达5楼,数码管显示5
if updown='1'then
if d55='1'or c_u55='1'then d55<='0';c_u55<='0';opendoor<='1';
elsif dd_cc>"0000011111"then en_up<='1'; opendoor<='0';
elsif dd_cc<"0000010000"then en_dw<='1'; opendoor<='0';
end if;
elsif d55='1'or c_d55='1'then d55<='0';c_d55<='0';opendoor<='1'; elsif dd_cc<"0000010000"then en_dw<='1'; opendoor<='0';
elsif dd_cc>"0000011111"then en_up<='1'; opendoor<='0';
end if;
elsif g6='1'then led1<="0100000";led2<="1111111"; --电梯到达6楼,数码管显示6
if updown='1'then
if d66='1'or c_u66='1'then d66<='0';c_u66<='0';opendoor<='1';
elsif dd_cc>"0000111111"then en_up<='1'; opendoor<='0';
elsif dd_cc<"0000100000"then en_dw<='1'; opendoor<='0';
end if;
elsif d55='1'or c_d55='1'then d55<='0';c_d55<='0';opendoor<='1'; elsif dd_cc<"0000100000"then en_dw<='1'; opendoor<='0';
elsif dd_cc>"0000111111"then en_up<='1'; opendoor<='0';
end if;
elsif g7='1'then led1<="0001111";led2<="1111111"; --电梯到达7楼,数码管显示7
if updown='1'then
if d77='1'or c_u55='1'then d77<='0';c_u77<='0';opendoor<='1';
elsif dd_cc>"0001111111"then en_up<='1'; opendoor<='0';
elsif dd_cc<"0001000000"then en_dw<='1'; opendoor<='0';
end if;
elsif d77='1'or c_d77='1'then d77<='0';c_d77<='0';opendoor<='1'; elsif dd_cc<"0001000000"then en_dw<='1'; opendoor<='0';
elsif dd_cc>"0001111111"then en_up<='1'; opendoor<='0';
end if;
elsif g8='1'then led1<="0000000";led2<="1111111"; --电梯到达8楼,数码管显示8
if updown='1'then
if d88='1'or c_u88='1'then d88<='0';c_u88<='0';opendoor<='1';
elsif dd_cc>"0011111111"then en_up<='1'; opendoor<='0';
elsif dd_cc<"0010000000"then en_dw<='1'; opendoor<='0';
end if;
elsif d88='1'or c_d88='1'then d88<='0';c_d88<='0';opendoor<='1'; elsif dd_cc<"0010000000"then en_dw<='1'; opendoor<='0';
elsif dd_cc>"0011111111"then en_up<='1'; opendoor<='0';
end if;
elsif g9='1'then led1<="0000100";led2<="1111111"; --电梯到达9楼,数码管显示9
if updown='1'then
if d99='1'or c_u99='1'then d99<='0';c_u99<='0';opendoor<='1';
elsif dd_cc>"0111111111"then en_up<='1'; opendoor<='0';
elsif dd_cc<"0100000000"then en_dw<='1'; opendoor<='0';
end if;
elsif d99='1'or c_d99='1'then d99<='0';c_d99<='0';opendoor<='1'; elsif dd_cc<"0100000000"then en_dw<='1'; opendoor<='0';
elsif dd_cc>"0111111111"then en_up<='1'; opendoor<='0';
end if;
elsif g10='1'then led1<="1111001";led2<="0000001"; --电梯到达10楼,数码管显示10
if d1010='1'or c_u1010='1'then d1010<='0';c_d1010<='0';opendoor<='1';
elsif dd_cc<"1000000000"then en_dw<='1'; opendoor<='0';
end if;
elsif en_up<='0';en_dw<='0'; --电梯进入上升或下降状态
end if;
end if;
else q<=1;alarm<='0'; --清除超载报警
if d1='1'then d11<=d1; --对电梯内人请求信号进行检测和寄存
elsif d2='1'then d22<=d2;
elsif d3='1'then d33<=d3;
elsif d4='1'then d44<=d4;
elsif d5='1'then d55<=d5;
elsif d6='1'then d66<=d6;
elsif d7='1'then d77<=d7;
elsif d8='1'then d88<=d8;
elsif d9='1'then d99<=d9;
elsif d10='1'then d1010<=d10;
end if;
if c_u1='1'then c_u11<=c_u1; --对电梯外人上升请求信号进行检测和寄存
elsif c_u2='1'then c_u22<=c_u2;
elsif c_u3='1'then c_u33<=c_u3;
elsif c_u4='1'then c_u44<=c_u4;
elsif c_u5='1'then c_u55<=c_u5;
elsif c_u6='1'then c_u66<=c_u6;
elsif c_u7='1'then c_u77<=c_u7;
elsif c_u8='1'then c_u88<=c_u8;
elsif c_u9='1'then c_u99<=c_u9;
end if;
if c_d2='1'then c_d22<=c_d2; --对电梯外人下降请求信号进行检测和寄存
elsif c_d3='1'then c_d33<=c_d3;
elsif c_d4='1'then c_d44<=c_d4;
elsif c_d5='1'then c_d55<=c_d5;
elsif c_d6='1'then c_d66<=c_d6;
elsif c_d7='1'then c_d77<=c_d7;
elsif c_d8='1'then c_d88<=c_d8;
elsif c_d9='1'then c_d99<=c_d9;
elsif c_d10='1'then c_d1010<=c_d10;
end if;
dd<=d1010&d99&d88&d77d66&d55&d44&d33&d22&d11; --电梯内人请求信号并置
cc_u<='0'&c_u99&c_u88&c_u77&c_u66c_u55&c_u44&c_u33&c_u22&c_u11; --电梯外人上升请求信号并置
cc_d<=c_d1010&c_d99&c_d88&c_d77&c_d66&c_d55&c_d44&c_d33&c_d22&'0'; --电梯外人下降请求信号并置
dd_cc<=dd or cc_u or cc_d --电梯内、外人请求信号进行综合
end if;
up<=updown; --电梯运行状态显示
led_d<=dd; --电梯内人请求信号显示
led_c_u<=cc_u; --电梯外人上升请求信号显示
led_c_d<=cc_d; --电梯外人下降请求信号显示
end if;
end process;
end behav;
图5.7 外部接口图
参考文献
[1] 邹其洪,李宗伦,黄智伟.VHDL/FPGA数字系统计算机仿真实验[M].吉林:吉林科学技术出版社,2006.
[2] 黄智伟.FPGA系统设计与实践[M].北京:电子工业出版社,2005.
[3] 潘松,黄继业.EDA技术实用教程(第二版)[M].北京:科学出版社,2004.
[4] 褚振勇,齐亮,田红心,高楷娟.FPGA设计及应用(第二版)[M].西安:西安电子科技大学出版社,2006.
[5] 求是科技.CPLD/FPGA应用开发技术与工程实践[M].北京邮电出版社,2005.
[6] 朱昌明,洪致育,张惠侨. 电梯与自动扶梯原理、结构、安装、测试[M] . 上海:上海交通大学出版社,1995.
[7] 及力.Protel 99 SE原理图与PCB设计教程[M].北京:电子工业出版社,2004.
[8] 康华光.电子技术基础模拟部分(第五版)[M].北京:高等教育出版社,2006.
[9] 李广弟,朱月秀,冷祖祁.单片机基础(第3版)[M].北京:北京航空航天大学出版社,2007.
[10] 赵家贵,付小美,董平.传感器电路设计手册[M].北京:中国计量出版社,2002.
[11] 赵负图.现代传感器集成电路(通用传感器电路)[M].北京:人民邮电出版社,2000.
[12] 韩团军.基于VHDL三层电梯控制器的设计[J].电子技术应用设计,2005.
[13] 温阳东,祖伟,刘友翔.电梯运行控制器的研究[N]. 合肥工业大学学报(自然科学版),1997.6,第20卷第3期.
[14] 高迎慧,侯忠霞,,杨成林.基于FPGA的自动升降电梯控制器设计[N]. 辽宁工程技术大学学报,2007.4, 第25卷第2期.
[15] 付家才.EDA原理与应用[M].北京:化学工业出版社,2001.
[16] 王振红.VHDL数字电路设计与应用实践教程[M].北京:机械工业出版社,2003.
[17] K.Yoshida and M.Ta Cao,“A Robust Control Based on DIisturbance Estimation in Ropeless Linear Elevator”[J] EIECTRIMACS’ 99.
[18] R.Roberts,“Control of high-rise/high-speed elevators.”[J]Proceeding of ACC,Philadelphia.1998
