数字电路课程设计:四层电梯模拟控制器_第1页
数字电路课程设计:四层电梯模拟控制器_第2页
数字电路课程设计:四层电梯模拟控制器_第3页
数字电路课程设计:四层电梯模拟控制器_第4页
数字电路课程设计:四层电梯模拟控制器_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子技术课程设计实验报告 学院:电气与信息工程学院班级:08级电自07班姓名:徐骥(20080711122)组员:陈术子、傅梦体、石海清课题: 四层电梯模拟控制器 一、 课程设计的目的:1、能够全面巩固和应用“数字逻辑”课程中所学的基本理论和方法,并初步掌握小型数字系统设计的基本方法;2、掌握VHDL语言编制小型模块的方法,并采用层次化设计;3、培养电路设计能力,懂得理论设计与实物实现的有效结合。二、任务与要求 本次课程设计我们小组选择的是做一个四层的电梯,根据系统要求并考虑到系统的可验证性,该电梯应具有以下功能,具体陈述如下: 1、每层楼的电梯门口均应设有上楼(up)和下楼(down)的请求开关,电梯内设有供进入电梯的乘客选择要求到达楼层(14层)的停止(stop)请求开关。 2、应设有表示电梯目前正处于上升还是下降阶段以及电梯正位于哪一层楼的指示装置(我们采用的是LCD液晶显示)。 3、电梯应能记忆电梯内外的所有请求信号,并按照电梯的运行规则对信号进行分批响应。 为了满足上述功能,电梯应该符合以下运行规则: 1、电梯处于上升状态时,首先响应的是电梯所在位置以上楼层的上升请求信号,依楼层逐个进行,直到最后一个请求执行完毕。然后如果有下降信号,便直接降到有下楼请求信号的最高一层楼,开始执行下降信号。 2、电梯处于下降状态时,首先响应电梯所在位置以下楼层的下降请求信号,依楼层逐次进行,直至最后一个下降信号执行完毕。此时若有上升信号,再升至有上升请求信号的最低一层,开始执行上楼请求。 3、电梯执行完所有请求信号后,此时若无请求信号,考虑到节能环保,电梯应该停在第一层。 4、电梯以每2秒上升(下降)一层楼的速度运行到达某层楼位置,液晶显示板上自动显示相应的楼层,一直保持到到达新的一层时,楼层显示进行转换。 5、电梯到达有请求的楼层停下时,电梯门自动打开,开门用时1s,开门完成后等待。在等待过程中若有关门信号,则电梯提前关门。否则,电梯继续等待,直至自动关门。 6、开机时(接通电源),电梯应处于起始状态,即电梯留在第一层。三、设计概要为了实现上述各个功能本设计共采用了4个模块,主要有主控制模块,LCD显示模块,键盘转按键模块及蜂鸣器报警模块。上述功能的实现可用下面流程图来描述:NYYN是否为目标层电梯停止开门FULL=1延时关门Y蜂鸣器报警是否停止结束N开始是否有请求确认本层与目标层电梯选定运行方向电梯稳定运行楼层检测系统复位 YN图1 电梯控制流程图四、主控制的设计及构成主控制模块,是四层电梯的核心部分,主要包含三个进程分析:1、本层的状态分析当在第一层时,没有向下,只有向上和暂停两种状态;而在第四层时,只有向下和暂停两种状态。这两层都是比较简单的,在此就不再赘述。在第二层和第三层是都有三种状态:向上,向下和暂停。当电梯处于向上状态时,如果下面有请求就会想储存继续向上运行等到达目的地后再进入向下的状态,当到达该楼层时就会自动开门并把先前储存的请求信号消除掉;电梯处于向下状态的情况基本同向上状态相同;电梯处于暂停状态时,外面有请求信号时,就会向该楼层进发并开门同时消除该请求信号。2、请求信号寄存该进程主要实现的是对上升和下降信号进行寄存,包括外部请求和内部请求两部分,并且根据上升、下降状态和楼层信号对请求信号进行处理,其初始状态即电梯处在第一层时,输出的状态显示为上升(第一层初始状态不能向下)。当电梯处于上升状态,到达某一层时,指向该层的内部请求信号自动清零,同时该层外部和内部的请求信号被寄存;而当电梯处于下降状态,到达某一层时,指向该层的内部请求信号自动清零,同时该层外部和内部的的请求信号被寄存,以供下面的模块进行下一个楼层以及上升、下降状态的判断,完成电梯的功能,因此该模块是很重要的一部分。3、开关门延时以下是主控制模块的逻辑结构图:图2 主控制模块逻辑图其中: 输入:buttonclk为时钟脉冲;up1,up2,up3为外部上升请求信号;down2,down3,down4为外部下降请求信号;rest为复位键,电梯无论处于何种状态都会回归到最原始的状态;stop为电梯内部要下楼的请求信号。 输出:alarm连接蜂鸣器,当电梯超载时就会报警,我们设置为手动且只在开门状态时会报警;doorlight为门指示灯;position为所在楼层指示灯;udlight为向下状态指示灯,我们设置为D;uplight为向上状态指示灯,我们设置为U。以下是主控制模块的vhdl代码: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY fourlift ISPORT(buttonclk:IN STD_LOGIC; reset:IN STD_LOGIC; dopen:IN STD_LOGIC; dclose:IN STD_LOGIC; up1:IN STD_LOGIC; up2:IN STD_LOGIC; up3:IN STD_LOGIC; down2:IN STD_LOGIC; down3:IN STD_LOGIC; down4:IN STD_LOGIC; full:IN STD_LOGIC; stop1,stop2,stop3,stop4:IN STD_LOGIC; uplight1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); dnlight1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); stoplight1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); position1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); doorlight:OUT STD_LOGIC; udsig1:OUT STD_LOGIC_VECTOR(1 DOWNTO 0); alarm:OUT STD_LOGIC);END fourlift;ARCHITECTURE art OF fourlift ISTYPE state IS (stopon1,dooropen,doorclose,doorwait1,up,down,stop);SIGNAL mylift:state;SIGNAL clearup:STD_LOGIC;SIGNAL cleardn:STD_LOGIC;SIGNAL liftclk:STD_LOGIC;SIGNAL uplight:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL dnlight:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL stoplight:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL position:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL udsig:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGINctrlift:PROCESS(reset,liftclk)VARIABLE pos1:INTEGER RANGE 4 DOWNTO 0;BEGINIF reset=1 THEN mylift=stopon1; alarm=0; clearup=0; cleardn=0; udsigposition=0001; pos1:=0; myliftmyliftdoorlight=1; myliftIF full=1 THEN alarm=1; mylift=doorwait1; ELSIF dopen=1 THEN mylift=doorwait1; ELSIF dclose=1 THEN mylift=doorclose; ELSE alarm=0; clearup=0; cleardn=0; myliftdoorlight=0; IF udsig=00 THEN IF position=0001 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000 AND dopen=0 THEN udsig=00; mylift=doorclose; ELSIF dopen=1 THEN mylift=dooropen; ELSIF uplight(0)=1 THEN udsig=01; clearup=1; mylift=dooropen; ELSE udsig=01;mylift=up; END IF; ELSIF position=0010 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000 AND dopen=0 THEN udsig=00;mylift=doorclose; ELSIF dopen=1 THEN mylift=dooropen; ELSIF uplight(1)=1 THEN clearup=1; udsig=01; mylift=dooropen; ELSIF dnlight(1)=1 THEN cleardn=1; udsig=10; mylift=dooropen; ELSIF uplight(0)=1 THEN udsig=10; mylift=down; ELSE udsig=01; mylift=up; END IF; ELSIF position=0011 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000 AND dopen=0 THEN udsig=00;mylift=doorclose; ELSIF dopen=1 THEN mylift=dooropen; ELSIF uplight(2)=1 THEN clearup=1; udsig=01; mylift=dooropen; ELSIF dnlight(2)=1 THEN cleardn=1; udsig=10; mylift=dooropen; ELSIF uplight(3)=1OR dnlight(3)=1 THEN udsig=01; mylift=up; ELSE udsig=10; mylift=down; END IF; ELSIF position=0100 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000 AND dopen=0 THEN udsig=00; mylift=doorclose; ELSIF dopen=1 THEN mylift=dooropen; ELSIF dnlight(3)=1 THEN cleardn=1; udsig=10; mylift=dooropen; ELSE udsig=10; mylift=down; END IF; END IF; ELSIF udsig=01 THEN IF position=0100 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000 THEN udsig=00;mylift=doorclose; ELSIF dnlight(3)=1 THEN udsig=10; cleardn=1; mylift=doorclose; ELSE udsig=10; mylift=down; END IF; ELSIF position=0011 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000 THEN udsig=00; mylift=doorclose; ELSIF stoplight(3)=1 OR dnlight(3)=1 THEN udsig=01; clearup=1; mylift=up; ELSIF dnlight(2)=1 THEN udsig=10; cleardn=1; mylift=dooropen; ELSE udsig=10;mylift=down; END IF; ELSIF position=0010 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000 THEN udsig=00;mylift=doorclose; ELSIF stoplight(2)=1 OR uplight(2)=1 OR stoplight(3)=1 OR dnlight(3)=1 OR dnlight(2)=1 THEN udsig=01; clearup=1; mylift=up; ELSIF dnlight(1)=1 THEN udsig=10; cleardn=1; mylift=dooropen; ELSE udsig=10; mylift=down; END IF; ELSIF position=0001 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000 THEN udsig=00; mylift=doorclose; ELSIF uplight(0)=1 THEN udsig=01; clearup=1; mylift=dooropen; ELSE udsig=01; mylift=up; END IF; END IF; ELSIF udsig=10 THEN IF position=0001 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000 THEN udsig=00; mylift=doorclose; ELSIF uplight(0)=1 THEN udsig=01; clearup=1; mylift=doorclose; ELSE udsig=01;mylift=up; END IF; ELSIF position=0010 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000 THEN udsig=00; mylift=doorclose; ELSIF stoplight(0)=1 OR uplight(0)=1 THEN udsig=10; cleardn=1; mylift=down; ELSIF uplight(1)=1 THEN udsig=01; clearup=1; mylift=dooropen; ELSE udsig=01; mylift=up; END IF; ELSIF position=0011 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000 THEN udsig=00; mylift=doorclose; ELSIF stoplight(1)=1 OR dnlight(1)=1 OR stoplight(0)=1 OR uplight(0)=1 OR uplight(1)=1 THEN udsig=10; cleardn=1; mylift=down; ELSIF uplight(2)=1 THEN udsig=01; clearup=1; mylift=dooropen; ELSE udsig=01; mylift=up; END IF; ELSIF position=0100 THEN IF stoplight=0000 AND uplight=0000 AND dnlight=0000THEN udsig=00; mylift=doorclose; ELSIF dnlight(3)=1 THEN udsig=10; cleardn=1; mylift=dooropen; ELSE udsig=10; myliftposition=position+1; pos1:=pos1+1; IF pos13 AND (stoplight(pos1)=1 OR uplight(pos1)=1)THEN clearup=1; mylift=stop; ELSIF pos1=3 AND (stoplight(pos1)=1 OR dnlight(pos1)=1)THEN cleardn=1; mylift=stop; ELSE myliftposition0 AND (stoplight(pos1)=1 OR dnlight(pos1)=1) THEN cleardn=1; mylift=stop; ELSIF pos1=0 AND (stoplight(pos1)=1 OR uplight(pos1)=1) THEN clearup=1; mylift=stop; ELSE mylift=doorclose; END IF; END CASE; END IF;END IF;END process ctrlift;ctrlight:process(reset,buttonclk)BEGINIF reset=1THEN stoplight=0000;uplight=0000;dnlight=0000;ELSE IF buttonclkEVENT AND buttonclk=1 THEN IF clearup=1 THEN stoplight(Conv_INTEGER(position-1)=0; uplight(Conv_INTEGER(position-1)=0; ELSE IF up1=1 THEN uplight(0)=1; ELSIF up2=1 THEN uplight(1)=1; ELSIF up3=1 THEN uplight(2)=1; END IF; END IF; IF cleardn=1 THEN stoplight(Conv_INTEGER(position-1)=0; dnlight(Conv_INTEGER(position-1)=0; ELSE IF down2=1 THEN dnlight(1)=1; ELSIF down3=1 THEN dnlight(2)=1; ELSIF down4=1 THEN dnlight(3)=1; END IF; END IF; IF stop1=1 THEN stoplight(0)=1; ELSIF stop2=1 THEN stoplight(1)=1; ELSIF stop3=1 THEN stoplight(2)=1; ELSIF stop4=1 THEN stoplight(3)=1; END IF; END IF;END IF;END process ctrlight;FP:PROCESS(buttonclk,reset) VARIABLE cout:INTEGER range 0 to 4999999; BEGIN IF reset=1 THEN cout:=78;liftclk=0; ELSIF buttonclkEVENT AND buttonclk=1 THEN IF cout=0 THEN cout:=78;liftclk= NOT liftclk; ELSE cout:=cout-1; END IF; END IF; END PROCESS; PROCESS(uplight,dnlight,stoplight,position,udsig) BEGIN uplight1=uplight; dnlight1=dnlight; stoplight1=stoplight; position1=position; udsig1=udsig; END PROCESS;END art;五、外围模块的设计及构成1LCD显示模块 本模块是采用老师提供的LCD外围接口电路,在此基础上只做了少许变化,其逻辑结构图如下所示: 图3 LCD显示模块逻辑图以下是LCD外围模块的VHDL代码: -File name DIANTILCD- LCD(8)- 200910-LCDNLCUPLCNB:881- LCD-R:DOOR:1/0/ DNUP:10/01/00:/-BCD-LOGIC_VECTORLOGIC-VECTOR -CPIN 10MHz ;RLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity DTLCD is port (CPIN,R,BUSY,DOOR :IN STD_LOGIC; LCDN,LCUP,LCNB :IN STD_LOGIC_VECTOR(7 DOWNTO 0); LC : IN STD_LOGIC_VECTOR(3 DOWNTO 0); DNUP:IN STD_LOGIC_VECTOR(1 DOWNTO 0); CLK,RST,STROBE,OUTLINE : OUT STD_LOGIC; DATA : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); ADDR : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );end entity ;architecture JGT of DTLCD isfunction to_uint (a: std_Logic_vector) return integer isalias av: std_logic_vector (1 to alength) is a;variable val: integer := 0;variable b: integer := 1;beginfor i in alength downto 1 loopif (av(i) = 1) then - if LSB is 1,val := val + b; - add value for current bit positionend if;b := b * 2; - Shift left 1 bitend loop;return val;end to_uint;- Convert an integer to a std_ulogic_vector-function to_vector (size: integer; val: integer) return std_logic_vector isvariable vec: std_logic_vector (1 to size);variable a: integer;begina := val;for i in size downto 1 loopif (a mod 2) = 1) thenvec(i) := 1;elsevec(i) := 0;end if;a := a / 2;end loop;return vec;end to_vector; TYPE STATES IS (S0,S1,S2); SIGNAL S: STATES; SIGNAL LCDPT : INTEGER RANGE 0 TO 28; SIGNAL CPCT : INTEGER RANGE 0 TO 65535; SIGNAL CP: STD_LOGIC; -SIGNAL ASCEW,ASCSN : STD_LOGIC_VECTOR(7 DOWNTO 0);beginPROCESS(CPIN,R)BEGINCLK=CPIN;IF R=1 THEN CPCT=65535;ELSIF CPIN=1 AND CPIN EVENT THEN IF CPCT=0 THEN CPCT=65535;CP=NOT CP; ELSE CPCTS2 - :Y: S3- ;N; NULL-S2:STROBES1-S1,S2PROCESS(CP,R)BEGINIF R=1 THEN S=S0;LCDPT=0;RST S=S1;LCDPT=0;RST RST=0;STROBE=0; IF BUSY=0 THEN IF LCDPT=28 THEN LCDPT=1; ELSE LCDPT=LCDPT+1; END IF; S S=S1;STROBE NULL; END CASE;END IF; END PROCESS;-(LCDPT)-LCDPT=0,NULL- =18 1/0: A/: 9161/0:O/-1724:1/0:V / 2528-29: 30: 10/01/00: V/A/PROCESS(LCDPT,LCUP,LCNB,LCDN,DOOR,LC,DNUP)VARIABLE N: INTEGER RANGE 0 TO 31;VARIABLE NADD: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF NOT(LCDPT=0) THEN IF LCDPT9 THEN - N:=LCDPT-1; NADD:=TO_VECTOR(4,N); IF LCUP(N)=1 THEN DATA=X55; -U ELSE DATA=X20;- END IF; ADDR=NADD;OUTLINE=0;-LCUP1/0A ELSIF LCDPT17 THEN - N:=LCDPT-1; NADD:=TO_VECTOR(4,N); N:=N-8; -N815,07 IF LCNB(N)=1 THEN DATA=X4F; -O ELSE DATA=X20;- END IF; ADDR=NADD;OUTLINE=0;-LCNB1/0O ELSIF LCDPT25 THEN - N:=LCDPT-17; -N1624,07 NADD:=TO_VECTOR(4,N); IF LCDN(N)=1 THEN DATA=X44; -D ELSE DATA=X20;- END IF; ADDR=NADD;OUTL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论