电子工程学院北京邮电大学张阗1数字电路与逻辑设计实验简易电梯控制器实验报告电子工程学院2010211205班张阗电子工程学院北京邮电大学张阗2目录一、功能设计....................................31、电梯运行规则........................................32、实验板硬件实现......................................3二、程序架构...................................41、分频模块............................................52、状态机模块..........................................53、寄存器模块..........................................64、外部显示模块........................................6三、程序代码.....................................7四、结果仿真....................................17五、实验心得....................................20电子工程学院北京邮电大学张阗3一、功能设计1、电梯运行规则电梯初始状态为一层开门状态。电梯外部设有1层请求上升、2层请求下降、2层请求上升、3层请求下降按钮;内部设有1层到达、2层到达、3层到达、关门按钮。可显示电梯当前所在楼层、外部请求楼层、内部请求楼层。可现实上升或下降状态。电梯每秒上升(下降)一层楼。电梯到达需要停止的楼层,经过1秒电梯门打开,开门指示灯亮,开门4秒后,电梯门关闭(开门指示灯灭),电梯继续运行,直至执行完最后一个请求信号后停留在当前层。电梯需要寄存器来记忆电梯内外所有请求,并按照电梯运行规则按顺序响应,每个请求信号保留至执行后消除。当电梯处于上升模式时,只响应比电梯所在位置高的上楼请求信号和停站请求信号,由下而上逐个执行,直到最后一个上楼请求执行完毕;如果高层有下楼请求,则直接上升到有下楼请求的最高层,然后进入下降模式。当电梯处于下降模式时则与上升模式相反。2、实验板硬件实现(1)控制部分(输入):硬件类型硬件名称功能对应管脚纽扣开关BTN71层外部上升请求124纽扣开关BTN62层外部上升请求123纽扣开关BTN52层外部下降请求122纽扣开关BTN43层外部下降请求121纽扣开关BTN3内部1层到达61纽扣开关BTN2内部2层到达91纽扣开关BTN1内部3层到达89电子工程学院北京邮电大学张阗4纽扣开关BTN0关门20拨码开关SW7复位125时钟输入时钟18(2)显示部分(输出):硬件类型硬件名称功能对应管脚数码管CAT0-CAT5AA-AG每两位显示一个数据,依次为外部请求楼层,内部请求楼层,当前所在楼层63,66,67,68,69,70;62,59,58,57,55,53,52点阵ROW0-ROW7COL0-COL7电梯上升时显示向上箭头,下降时显示向下箭头8,7,6,5,4,3,2,1;22,21,16,15,14,13,12,11LED灯LD7显示开门状态,开门时亮,关门时灭73二、程序架构图1程序架构电子工程学院北京邮电大学张阗51、分频模块外部时钟频率为50M,通过分频模块后得到不同功能对应的频率,作为其他模块的时钟输入,包括:状态机模块中的电梯控制时钟、寄存器模块中的按键保存时钟、外部显示模块中的数码管扫描时钟和点阵扫描时钟。2、状态机模块状态机模块包括十个状态,分别为:stopon1(位于1层),dooropen(开门),doorclose(关门),doorwait1(开门等待第1秒),doorwait2(开门等待第2秒),doorwait3(开门等待第3秒),doorwait4(开门等待第4秒),up(上升),down(下降),stop(停止)。电梯初始状态为stopon1,各状态之间的转移情况如图2所示。电子工程学院北京邮电大学张阗6图2状态转移图3、寄存器模块由于纽扣按钮不能长时间按下,所以需要寄存器模块中的变量来储存按钮的输入。当按下某按钮时,其对应布尔型变量为‘1’,即使松开按钮,该变量仍然为‘1’。寄存器模块包括各层的上升、下降、请求停站信号,来控制各状态间的转移。4、外部显示模块电子工程学院北京邮电大学张阗7外部显示模块包括数码管显示和点阵显示的控制。根据点阵显示图形的特征,设置点阵扫描方式为逐行扫描,以保证各点亮度的均衡性。控制行时,低电平对应亮,高电平对应灭;控制列时,高电平对应亮,低电平对应灭。三、程序代码libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entitythreeliftisport(clk_in:instd_logic;close:instd_logic;--关门信号reset:instd_logic;--异步复位端口f1upbutton:instd_logic;--一层上升请求端口f2upbutton:instd_logic;--二层上升请求端口f2dnbutton:instd_logic;--二层下降请求端口f3dnbutton:instd_logic;--三层下降请求端口stop1button:instd_logic;--一层停站请求端口stop2button:instd_logic;--二层停站请求端口stop3button:instd_logic;--三层停站请求端口position:bufferintegerrange1to3;--电梯位置信号udsig:bufferstd_logic;--上升或下降信号fuplight,fdnlight,stoplight:bufferstd_logic_vector(3downto1);--上升、下降、停站请求寄存信号doorlight:outstd_logic;--开关门状态信号row:outstd_logic_vector(7downto0);col:outstd_logic_vector(7downto0);cat:outstd_logic_vector(5downto0);led:outstd_logic_vector(6downto0);beep:outstd_logic);endentitythreelift;architectureoneofthreeliftistypelift_stateis--定义十个状态(stopon1,dooropen,doorclose,doorwait1,doorwait2,doorwait3,doorwait4,up,down,stop);signalmylift:lift_state;signalclearup:std_logic;--上升和停站请求清除信号signalcleardn:std_logic;--下降和停站请求清除信号电子工程学院北京邮电大学张阗8signalbuttonclk,liftclk,ledclk,clk_2:std_logic;--分频后时钟signalq1:integerrange0to24999999;--分频中间变量signalq2:integerrange0to39999999;signalq3:integerrange0to9;signalq4:integerrange0to49;signalduan:std_logic_vector(6downto0);--数码显示管中间变量signalshuju:std_logic_vector(3downto0);--选择输入端的中间变量signalcnt:std_logic_vector(2downto0);--控制数码管的中间变量signalaim,request,stair:std_logic_vector(3downto0);--控制数码管的传值变量signalhang:std_logic_vector(7downto0);--控制点阵的行signallie:std_logic_vector(7downto0);--控制点阵的列signalcount:std_logic_vector(2downto0);--控制点阵的中间变量beginprocess(clk_in)--分频模块beginIf(clk_in'eventandclk_in='1')thenIfq1=24999999thenq1=0;buttonclk=notbuttonclk;elseq1=q1+1;endif;endif;endprocess;process(clk_in)beginIf(clk_in'eventandclk_in='1')thenIfq2=39999999thenq2=0;liftclk=notliftclk;elseq2=q2+1;endif;endif;endprocess;process(clk_in)beginIf(clk_in'eventandclk_in='1')thenIfq3=9thenq3=0;ledclk=notledclk;elseq3=q3+1;endif;endif;endprocess;电子工程学院北京邮电大学张阗9process(clk_in)beginIf(clk_in'eventandclk_in='1')thenIfq4=49thenq4=0;clk_2=notclk_2;elseq4=q4+1;endif;endif;endprocess;ctrlift:process(reset,liftclk)--状态机模块variablepos:integerrange3downto1;beginifreset='1'then--异步复位,电梯的初始状态为一层开门状态mylift=stopon1;clearup='0';cleardn='0';elseifliftclk'eventandliftclk='1'thencasemyliftiswhenstopon1=doorlight='1';position=1;pos:=1;mylift=doorwait1;--电梯等待4swhendoorwait1=clearup='0';cleardn='0';if(close='1')thenmylift=doorclose;--如果有关门信号,则转至关门状态elsemylift=doorwait2;endif;whendoorwait2=if(close='1')thenmylift=doorclose;--如果有关门信号,则转至关门状态elsemylift=doorwait3;endif;whendoorwait3=if(close='1')thenmylift=doorclose;--如果有关门信号,则转至关门状态elsemylift=doorwait4;电子工程学院北京邮电大学张阗10endif;whendoorwait4=mylift=doorclose;whendoorclose=--关门,判定电梯下一个运行方式doorlight='0';ifudsig='1'then--电梯正在上升ifposition=3theniffuplight=000andfdnlight=000andstoplight=000then--没有请求信号时,电梯停在当前层udsig='0';mylift=doorclose;elsiffdnlight(3)='1'orstoplight(3)='1'then--本层有请求信号时,电梯开门udsig='0';mylift=dooropen;else--否