数字系统
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
课程设计三层电梯控制器03071207
题目: 三层电梯控制器
姓名: 钟玉钊
班级: 计算机052班
学号: 05071232
日期:2008.7.5,2008.7.12
地点:南山综合楼B—805
EDA实验室
数字系统课程设计
一、设计目的:
1(熟练利用VHDL语言进行数字系统设计;
2. 掌握数字系统的设计方法——自顶向下的设计思想;
3(掌握电梯控制器的设计与使用;
4(根据电梯控制器的功能要求设计一个电梯控制器;
二、实验器材:
PC机一台,EDA教学实验系统一台,下载电缆一根(已接好),导线若干。
三、 设计要求:
设计一个简单的三层电梯控制器,它的具体功能为:
1、每层电梯的入口处设有上下请求开关,电梯内有乘客到达楼层停站请求开关,能
够提前关门和延时关门。
2、每层外面入口处有显示当前电梯处在第几层的数码管,电梯内部有显示当前电梯
所处位置的数码管,并有上升或下降的指示灯,有开门或关门的状态指示。
3、电梯到请求站后,开门时间大概为2.6(200*1/76)秒,每两层之间的运行时间为
2.6秒,若当前层没有请求则停留在当前层的关门状态。
4、能记忆电梯内外的所有请求信号,并能按照电梯运行规则次序响应,每个信号保
留至执行后消除。
5 、电梯运行规则:无论电梯当前是处于何种状态,若电梯没有竞争信号请求,则只
要有请求则响应,若当前电梯处于第一层,优先响应第一层的开门请求,若其它层任
何信号请求,则应当进入运行状态,然后达到第二层,同理处于第三层的时候,也是
优先开门请求,然后再响应其他层的请求,必须经过第二层。处于第二层时就需要根
据电梯的当前方向来判断。若处于下降模式,且第第三层到第一层的请求还没有响应,
此时若二层有请求,只第二层有下降请求,不响应二层的上层请求,到达一层后再回
来响应上升请求。同理若为上升状态,则相反。
四、实验原理:
1(功能描述:
随着社会的发展,电梯的使用越来越普遍,已从原来只在商业大夏、宾馆使用,过渡到在办公楼、居民楼等场合使用,并且对电梯的功能要求也不断提高。根据系统设计的要求,并考虑到可验证性,整个系统的输入输出接口设计如图1所示:
系统工作于305Hz的时钟信号CLK,经过4分频后得到76Hz的采样控制脉冲,楼层上升请求信号UP1、UP2 ;下降请求信号DOWN3、DOWN2;提前关门eary、延时关门delay ;楼层选择信号KEY1、KEY2、KEY3分别与开关相连,低电平有效。电梯上升或下降指示UP_DOWN , 一层上升指示F1_UP,二层上升指示UP2 ,二层下降指示F2_DOWN ,三层下降指示F3_DOWN ,门开或关状态指示gate都与一个LED灯相连指示响应状态。
- 1 -
数字系统课程设计
外部可见部分:
图1 整个系统的输入输出
内部:
图2 系统的内部结构原理图
- 2 -
数字系统课程设计
(基本原理: 2
本系统主要分为四个模块,模块fenpin将305Hz的时钟源clk经过4分频作为请求键的采样脉冲,mod80是一个模四计数器作为数码管的位选,decoder7是数码管的段译码,keytest是最主要的模块,完成电梯的请求检测与状态转换,并给出响应,复位后电梯处于第一层关门状态。基本方框图如下:
Fenpin 请求信号输入
4分频(76hz)
Keytest (信号请求检测与电梯状态控制) 305Hz 时钟源
clk
LED灯 Decoder7 译码
段选
位选 数码管显示
Mod80 模4计数器
- 3 -
数字系统课程设计
四、 实验
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
:(画出流程图)
、 状态转换图: 1
电梯控制器分为6种状态:C1、C2、C3、CLOSE_D、CLOSE_D1、TIEME3和TIME4 C1:第一层
C2:第二层
C3:第三层
CLOSE_D:关门状态
CLOSE_D1:关门状态
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
:请示关门状态只要一个就够了的,但是一个的话,里边的共享变量或者逻辑门的数量过多,使得编译的时候器件不够,无法下载。
TIME3:运行状态
TIME4:开门状态
U(1) =’1’:
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
明一楼有人按了上升请求F1_UP
U(2)=’1’ : 二楼有人按了F2_UP
D2=’1’ : 二楼有人按了F2-DOWN
U(3)=’1’ : 三楼有人按了下降请求F3_DOWN
TING(1)=’1’ : 电梯内有人按了一楼停的请求键KEY1
TING(2)=’1’ : 电梯内有人按了二楼停的请求键KEY2
TING(3)=’1’ : 电梯内有人按了三楼停的请求键KEY3
UP_DOWN=’1’ :电梯当前的状态为上升模式,等于0则为下降模式;端口为双向的可读可写
F1、F2、F3 分别表示从一楼、二楼和三楼出来,即当到达另一状态时,是根据这三个值是否为’1’来判断前一种状态是从C1或者C2还是C3过来的,作为下一状态转移的依据。因为运行和关门状态都只有一个,是各层公用的。只能用
标志
禁止坐卧标志下载饮用水保护区标志下载桥隧标志图下载上坡路安全标志下载地理标志专用标志下载
来区别。
上电复位后,电梯处于C1,即第一层
C1:处于第一层时,先令F1=0、F2=0、F3=0,UP_DOWN=1,表明第一层出来的时候是上升模式。
若U(1)=’1’ 或者TING(1)=’1’ 即第一层的任何请求都应该开门,因为已经到了第一层应该优先响应开门,进入TIME4开门状态并且使F1=1状态图中的?,表明是从C1到达TIME4状态的,否则若其它层有请求(U(2)、d2、 U(3)、TING(3)、TING(2)中至少有一个值为‘1‘),则进入运行状态TIME3 ,并使F1=1,即状态图中的?。
- 4 -
数字系统课程设计
C2 :第二层的时候需要根据当前的电梯状态来决定下一个状态。 优先顺序是: 电梯上升时二楼门外有上升请求,电梯下降时二楼门外的下降请求, 电梯下降时电梯内一楼还没响应的停请求,电梯上升时电梯内三楼还没有响应的停请求,上升时三楼门外的下降请求,下降时三楼门外的上升请求,若以上的都没有则随便任何一个请求都响应。进入运行状态经过?,二楼的开门请求经过A进入TIME4。并且上升时需要给UP_DOWN=1,下降UP_DOWN=0,一到二楼F1=F2=F3=0,从二楼出来时F2=1.
C3 :一到C3则优先响应三楼的下降请求经过E进入TIME4,否则只要一层二层的任意请求存在都经过C进入TIME3运行状态。同样进入C3时 F1=F2=F3=0,出来时F3=1。UP_DOWN=0。
TIME3 :一旦计数到的时候
如果F1=1 则经过D进入C3,如果F3=1则经过?进入C1。如果F2=1,是有优先响应顺序的:上升时则优先响应电梯内还没有响应的停(TING(3)=1)请求,经过D进入C3,下降时优先响应电梯内还没有响应停(ting(1)=1)请求,经过?进入C1,上升时三楼门外的下降请求,经过D进入C3,下降时一楼门外的上升请求,经过?进入C1,剩下的请求只要有请求则响应。 ( F1、F2、F3是不可能同时为1的,这样就保证了优先原则)
TIME4 :只是开门状态计数时间到则进入关门状态经过?到达CLOSE_D1
CLOSE_D1 :这个状态也是需要根据F1、F2、F3的值来决定下一状态的,当F1=1时,如果一楼有请求则经过?进入开门状态。否则经过?进入CLOSE_D状态。若F2=1,如二楼门外有请求则经过?进入TIME4,否则经过?进入CLOSE_D状态。如过F3=1,若三楼门外有请求同样是经过?进入TIME4开门状态,否则经过?进入CLOSE_D状态。其实CLOSE_D1只是用于检测门外的开门请求,若没有进入另一个关门状态去检测到达其他楼层的请求。没有请求的时候一直在CLOSE_D和CLOSE_D1之间循环。
CLOSE_D :如有到达其他层的请求,则经过?到达TIME3运行状态。否则进入CLOSE_D1。
- 5 -
数字系统课程设计
CLOSE_D
2 3
4
1 CLOSE_D1
5
6 C1
8
7
A 9
TIME3 TIME4 C2
B
E
D
C
C3
- 6 -
数字系统课程设计
开始
?
Clk’event and clk=’1’
yes
Up1=’1
一层外上升请求,
Y
U(1)=’1’
F1-UP=’1’ //1楼上升请
求灯亮
KEY1=‘0‘
一楼是否有停请求
A
Y
B
- 7 -
数字系统课程设计
B
A
Ting(1)=’1’
UP2=’0’
Y
U(2)=’1’
F2_UP=’1’ // 2楼上升请求灯亮
DOWN2=’0’
2楼门外下降请求
Y
D2=‘1‘
F2_DOWN=’1’ //2楼外下降请求灯亮
C
- 8 -
数字系统课程设计
C
KEY2=’0’ //2楼停
TING(2)=’1’
DOWN3=’0’//3楼外
下降请求
U(3)=’1’
F3_DOWN=’1’ //3楼外请求下降灯亮
Key(3)=‘0‘
D E
- 9 -
数字系统课程设计
D E
TING(3)=’1’
TIQIAN=’0’
提前关门
TI:=’1’
YANSHI=’0’ //
延时关门
YA=’1’
CASE STATE
C1 C2 C3 CLOSE_D TIME3 TIME4 close_d1
Close_d1 C1 C2 C3 Close_d Time3 Time4 一层 二层 三层 关门 运行 开门
- 10 -
数字系统课程设计
C1
CURRENT<=”01” //输出到数码管 使其显示1 F1=’0’ ; F2=’0’ ; F3=’0’; // 楼层标志清零 F1_UP=’0’ //请求灯灭
UP_DOWN=’1’
U(1)or ting(1)=’1‘
是否有停或请求
U(1)=‘0‘;//响应后请求清零
Ting(1)=‘0‘;//响应后请求清零
F1=’1’//表明是从一楼过到TIME4状态的
STATE=TIME4//进入开门状态
返回 开始
U(2)OR TING(2) OR TING(3)
OR U(3)=’1’ OR D2=’1’
F1=’1’
STATE=TIME3 //进入运行状态
返回 开始
- 11 -
数字系统课程设计
C2
F1=F2=F3=’0’;
CURRENT=”10”
F2_DOWN=’0’
F2_UP=’0’;
U(2) AND UP_DOWN=’1’
F2=‘1‘//上升时优先2楼上升请求
U(2)=’0’//表明已响应
STATE=TIME4 // 开门状态
返回开始处
UP_DOWN=’0’ AND
D2=’1’
F2=’1’ ; D2=’0’
STATE=TIME4 //下降时优先响应二楼下降请求
KK
返回开始处
- 12 -
数字系统课程设计
KK
UP_DOWN=’1’ AND
TING(3)=‘1‘
F2=’1’
STATE=TIME3//先响应还没响应完的
返回开始
UP_DOWN=’0’ AND
TING(1)=’1’
F2=1 ; STATE=TIME3
返回开始处
U(1)=’1’ AND UP_DOWN= ‘0’
JJ F2=’1’ ; STATE=TIME3
返回开始处
- 13 -
数字系统课程设计
JJ
U(3)=1 AND UP_DOWN=1
F2=’1’
STATE=TIME3
返回开始处
u(1) or ting(1) or u(3) or ting(3)=1
F2=1 ;
STATE=1
STATE=TIME3
返回
返回
- 14 -
数字系统课程设计
C3
F3_DOWN=’0’
CURRENT=”11”
F1=F2=F3=’0’
U(3) OR TING(3)
=‘1‘
U(3)=TING(3)=’0’
F3=’1’
STATE=TIME4//开门
返回开始出
U(1) or d2 OR U(2) OR
TING(1) OR TING(2)=’1’
F3=’1’
STATE=TIME3 //进入运行状态
返回开始
- 15 -
数字系统课程设计
CLOSE_D
DDOOR=’0’ //开门灯灭
F1=‘1‘
是否在一楼
CURRENT=”01”
F1_UP=’0’
U(2) OR U(3) OR d2 or TING(2) OR TING(3)=’1’
State= UP_DOWN=’1’//上Close_d升模式 1
STATE=TIME3
返回开始
F2=’1’
G F
- 16 -
数字系统课程设计
F
CURRENT=”10”
F1_UP=F2_DOWN=’0’
TING(1)=’1’AND UP_DOWN=’0’
//一楼有请求未响应且处于下降
UP_DOWN=’0’
STATE=TIME3
返回开始处
TING(3)=’1’)
AND UP_DOWN=’1’
//上升且3楼有请求未响应
STATE=TIME3
返回开始处
H
- 17 -
数字系统课程设计
H
U(1) =’1’ AND UP_DOWN=’0
STATE=TIME3
返回开始
U(3) OR’ AND UP_DOWN=’1’
STATE=TIME3
返回开始处
u(1) or ting(1) =1
STATE=TIME3
UP_DOWN=’0’
返回开始
U(3) OR TING(3)=1
STATE=CLOSE_D1 UP_down=1 STATE=TIME3 返回开始 返回开始
- 18 -
数字系统课程设计
G
F3=’1’
UP_DOWN=’0’ CURRENT=”11” 返回开始
F3_DOWN=’0’
U(1) OR TING(1) OR d2 or
U(2) OR TING(2)=’1’
下层是否有请求
State=close_d1
STATE=TIME3
返回开始处
TIME3
DDOOR=’0’ //运行时门是关的
QCNT2<200
J
K
- 19 -
数字系统课程设计
K
QCNT2=QCNT2+1
计数200个脉冲作为运行时间
返回开始处
J
QCNT2=0
F1=’1’
STATE=C2
//从一楼过来下一状态应该是2楼
返回开始处
F2=’1’
UP_DOWN AND TING(3)=1
STATE=C3 //二楼过来且上升,则优先电梯内尚未响应的三楼
L
返回开始处
PO
- 20 -
数字系统课程设计
PO
TING(1)=1 AND UP_DOWN=’0’
STATE=C1
返回开始处
U(3)=1 AND UP_DOWN=1
STATE=C3
返回开始处
U(1) =1 AND UP_DOWN=0
STATE=C1
返回开始
U(1) OR TING(1) =1
SATAE=C1
UP_DOWN=’0’
返回开始
LM
- 21 -
数字系统课程设计
LM
U(3) OR TING(3)=1
UP_DOWN=1 返回开始 STATE=C3
返回开始
L
F3=1
STATE=C2
返回开始
TIME4
DDOOR=’1’//开门灯亮
TI=’1’
提前关门请求
QCNT2=200
TI=’0’//清掉请求 N
O
- 22 -
数字系统课程设计
N
YA=’1’
YA=’0’
QCNT2=0//延时请求是重新计数
O
QCNT2<200
QCNT2=QCNT2+1
//开门计数延时
返回开始处
QCNT2=0
STATE=CLOSE_D1
//开门时间到 到达关门
//状态
返回开始处
- 23 -
数字系统课程设计
CLOSE_D1
DDOOR=’0’
F1=’1’
CURRENT=”01”
F1_UP=’0’
U(1) =1 U(1)=’0’ ; UP_DOWN=1
STATE=TIME4
STATE=CLOSE_D
返回开始
P
- 24 -
数字系统课程设计
P
F2=’1’
F2_UP=’0’
F2_DOWN=’0’
CURRENT=”10”
U(2) =’1’
U(2)=’0’
UP_DOWN=’1’
STATE=TIME4
D2=1
D2=’0’
UP_DOWN=’0’
STATE=TIME4
STATE=CLOSE_D
返回开始
Q
- 25 -
数字系统课程设计
Q
F3=’1’
CURRENT=”11”
F3_DOWN=’0’
U(3)=’1’
U(3) =’0’
STATE=TIME4
STATE=CLOSE_D
返回开始
- 26 -
数字系统课程设计
波形仿真及分析:
首先初始状态是一楼。定义的时候STATE=C1
在第一个200US内,三楼们外有人想要下来,按了DOWN3按键,即DOWN3=0, 从而F3_DOWN=1,表明三楼外面的下降请求灯立刻亮;之后二楼又有人想要下来,也是按了DOWN2, 即DOWN=0,F2_DOWN=1,二楼的下降请求灯立刻亮起。GATE=0,即门是关着的,UP_DOWN=1,说明电梯处于上升状态TIME3,OUT7=30(a段是接高位)译码后得到的数码管值为1。
到达第二层的时候即400us对下来。Out7的值为6D译码后为2,但是但是并没有停下来开门去响应二楼的下降请求,这点可以从GATE=0看出或者从OUT7的值6D维持的时间段可以看出,一位运行时间和开门时间都是相等的,只维持200个计数脉冲时间。 OUT7的值6D过后是79译码后数码管显示的是3,并且此时GATE=1,表明在三楼的开门状态,F3_DOWN也为0 ,门外指示灯灭掉。UP_DOWN=0,说明将要下降。 再过200个计数脉冲,开门时间到,进入关门状态GATE=0,由于二楼的下降请求还没有响应,所以进入运行状态,有图可见,79的时间维持在2段200个计数脉冲的时间,回到2楼后开门状态又维持200个计数脉冲之后gate=0并且一直停在二楼,原因是虽然二楼和三楼都有请求,但是都没有在电梯内按键选择到几楼,也就是说只是在门外请求,并没有人走进电梯内。
- 27 -
数字系统课程设计
在上面的基础上当到达三楼后按下KEY1键,请求到达一楼。波形图如下:
可见电梯最后是停在一楼的关门状态
撤掉二楼的下降请求,而是当电梯到三楼的时候二楼请求上升UP2。得到的波形图如下:
可见即使是有竞争存在,电梯仍然是先下一楼再回来响应二楼的上升。
- 28 -
数字系统课程设计
若电梯从到达三楼的时候二楼的请求是到一楼的,则电梯下降经过二楼的时候应该在二楼停,把二楼的人一起载下一楼。波形图如下
从波形图上可以看出,上升经过二楼的时候,GATE=0,而下降经过二楼的时候GATE显示1再接着变为0. 从OUT7的值6D维持的时间上也可以看出,下降时经过二楼是停下开门的,二上升经过二楼时却没有。
说明: 只要在一楼,UP_DOWN=1 即电梯模式都为上升,只要在三楼UP_DOWN=0,其实是应该在电梯开始运行的状态才赋值的。还有一个就是,第二层门外请求信号指示灯亮维持时间的为问题。这里并没有一直维持到响应才让灯灭掉,而是电梯经过的时候就灭掉了。但是这并没有影响到电梯的正常运行和工作。因为这些信号都只是一个让人看的人性化的信号,并不是电梯工作所需的信号。应当知道这个信号改正过来是很容易的,只需在响应的时候才给这个灯所代表的变量赋0就好了。
- 29 -
数字系统课程设计
1. 分频模块:
此模块定义一个全局时钟305Hz,然后分频得到一个76Hz采样的脉冲。
具体程序:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity fenpin is
port(clk305:in std_logic;
coo:out std_logic); end;
architecture a of fenpin is
signal p:integer range 0 to 4;
begin
process(clk305)
begin
if clk305'event and clk305='1' then
if p=4 then
p<=0;
else
p<=p+1;
end if;
end if;
if p<=2 then
coo<='1';
else
coo<='0';
end if;
end process;
end;
- 30 -
数字系统课程设计
2(计数器模块
此模块此模块是将305Hz的系统脉冲计数得到一个模4计数器。作为数码
管动态扫描为选信号
具体程序
library ieee;
use ieee.std_logic_unsigned.all; use ieee.std_logic_1164.all; entity mod80 is
port(clk1:in std_logic;
dout:out std_logic_vector(1 downto 0 )
);
end ;
architecture modba of mod80 is
signal qq:std_logic_vector(1 downto 0);
begin
process(clk1) is
begin
if(clk1'event and clk1='1') then
if(qq="11")then
qq<="00";
else
qq<=qq+1;
end if;
end if;
dout<=qq;
end process;
end architecture;
- 1 -
数字系统课程设计
4. 数码管译码器
段译码,将当前电梯处在的楼层通过数码管显示出来
library ieee;
use ieee.std_logic_1164.all;
entity decoder7 is
port(in2:in std_logic_vector(1 downto 0);
out7:out std_logic_vector(1 to 7)
);
end ;
architecture ade of decoder7 is
begin
process(in2) is
begin
case in2 is
when "01"=>out7<="0110000";
when "10"=>out7<="1101101";
when "11"=>out7<="1111001";
when others =>out7<="0000000";
end case;
end process;
end architecture;
5 电梯控制器的核心部分:
本模块的是整个电梯控制的关键部分,控制电梯的关键有是在于状态的转换。 本模块分为6个状态:C1、C2、C3、TIME3、TIME4、CLOSE_D、CLOSE_D1 其实只要5个就够了但是由于5个状态会造成太多的语句嵌套,使得逻辑器件超过了编译器所能接收的范围。
entity keytest is
port (clk,up1,up2,down2,down3,key1,key2,key3,tiqian,yanshi: in std_logic;
f1_up,f2_down,f2_up,f3_down,ddoor: out std_logic;
up_down:buffer std_logic;-- ke yi inout?
current:out std_logic_vector(1 downto 0));
end keytest;
architecture test1 of keytest is
type state_type is (c1,c2,c3,close_d,close_d1,time3,time4);
begin
process(clk)
variable u,ting: std_logic_vector(3 downto 1):="000";
variable state:state_type:=c1;
- 9 -
数字系统课程设计
variable qcnt2:integer range 0 to 300;
variable f1,f2,f3,ti,ya,d2:std_logic;
begin
if clk'event and clk='1' then
if up1='0' then
u(1):='1';
f1_up<='1';
end if;--
if up2='0' then
u(2):='1';
f2_up<='1';
end if;
if down2='0' then
d2:='1';
f2_down<='1';
end if;
if down3='0' then
u(3):='1';
f3_down<='1';
end if;--
if key1='0' then
ting(1):='1';
end if;--
if key2='0' then
ting(2):='1';
end if;--
if key3='0' then
ting(3):='1';
end if;--
if tiqian='0' then
ti:='1';
end if;
if yanshi='0' then
ya:='1';
end if;
case state is
- 10 -
数字系统课程设计
when time4 =>
ddoor<='1';
if ti='1' then
qcnt2:=201;
ti:='0';
elsif ya='1' then
qcnt2:=0;
ya:='0';
end if;
if qcnt2<200 then
qcnt2:=qcnt2+1;
else
qcnt2:=0;
state:=close_d1;
end if ;
when time3=>
ddoor<='0';
if qcnt2<200 then
qcnt2:=qcnt2+1;
else
qcnt2:=0;
if f1='1' then
state:=c2;
elsif f2='1' then
if up_down='1' and ting(3)='1' then
state:=c3;
elsif up_down='0' and ting(1)='1' then
state:=c1;
elsif up_down='1' and u(3)='1' then
state:=c3;
elsif up_down='0' and u(1)='1' then
state:=c1;
elsif u(1)='1' or ting(1)='1' then
state:=c1;
UP_DOWN<='0';
elsif u(3)='1' or ting(3)='1' then
state:=c3;
UP_DOWN='1';
end if;
- 11 -
数字系统课程设计
elsif f3='1' then
state:=c2;
end if;
end if;
when c1=>
current<="01";
up_down<='1';
f2:='0';
f3:='0';
f1:='0';
f1_up<='0';
if u(1)='1' or ting(1)='1' then
f1:='1';
u(1):='0';
ting(1):='0';
state:=time4;
elsif u(2)='1' or ting(2)='1' or u(3)='1' or ting(3)='1' or d2='1' then
f1:='1' ;
state:=time3;
end if;
when c2=>
f2_up<='0';
f2_down<='0';
f1:='0';
f2:='0';
f3:='0';
current<="10";
if up_down='1' and u(2)='1' then
u(2):='0';
f2:='1';
state:=time4;
elsif up_down='0' and d2='1' then
d2:='0';
f2:='1';
state:=time4;
elsif ting(1)='1' and up_down='0' then
f2:='1' ;
state:=time3;
elsif ting(3)='1' and up_down='1' then
f2:='1';
state:=time3;
elsif u(1)='1' and up_down='0' then
- 12 -
数字系统课程设计
f2:='1';
state:=time3;
elsif u(3)='1' and up_down='1' then
f2:='1';
state:=time3;
elsif u(1)='1' or ting(1)='1' then
f2:='1';
up_down<='0';
state:=time3;
elsif ting(3)='1' or u(3)='1' then
f2:='1' ;
up_down<='1';
state:=time3;
end if;
when c3=>
current<="11";
up_down<='0';
f3_down<='0';
f1:='0';
f2:='0';
f3:='0';
if u(3)='1' or ting(3)='1' then
f3:='1';
u(3):='0';
ting(3):='0';
state:=time4;
elsif u(1)='1' or u(2)='1' or ting(1)='1' or ting(2)='1' or d2='1' then
f3:='1';
state:=time3;
end if;
when close_d1=>
ddoor<='0';
if f1='1' then
current<="01";
f1_up<='0';
if u(1)='1' then
u(1):='0';
up_down<='1';
state:=time4;
else
state:=close_d;
- 13 -
数字系统课程设计
end if;
elsif f2='1' then
current<="10";
f2_up<='0';
f2_down<='0';
if u(2)='1' then
u(2):='0';
up_down<='1';
state:=time4;
elsif d2='1' then
d2:='0';
up_down<='0';
state:=time4;
else
state:=close_d;
end if;
elsif f3='1' then
current<="11";
f3_down<='0';
if u(3)='1' then
u(3):='0';
state:=time4;
else
state:=close_d;
end if;
end if;
when close_d=>
ddoor<='0';
if f1='1' then
current<="01";
f1_up<='0';
if u(2)='1' or d2='1' or ting(2)='1' or u(3)='1' or ting(3)='1' then
up_down<='1';
state:=time3;
- 14 -
数字系统课程设计
else
state:=close_d1;
end if;
elsif f2='1' then
current<="10";
f2_up<='0';
f2_down<='0';
if ting(1)='1' and up_down='0' then
up_down<='0';
state:=time3;
elsif ting(3)='1' and up_down='1' then
up_down<='1';
state:=time3;
elsif u(1)='1' and up_down='0' then
up_down<='0';
state:=time3;
elsif u(3)='1' and up_down='1' then
up_down<='1';
state:=time3;
elsif u(1)='1' or ting(1)='1' then
up_down<='0';--
state:=time3;--
elsif u(3)='1' or ting(3)='1' then
up_down<='1';
state:=time3;
else
state:=close_d1;
end if;
elsif f3='1' then
current<="11";
f3_down<='0';
if u(2)='1' or d2='1'or ting(2)='1' or u(1)='1' or ting(1)='1' then
up_down<='0';
state:=time3;
else
state:=close_d1;
end if;
end if;
- 15 -
数字系统课程设计
when others => null;
end case;
end if;--clk
end process;
end architecture test1;
总的模块:元件例化
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity main7 is
port(clk,up1,up2,down2,down3,key1,key2,key3,eary,delay:in std_logic;
f1_up,f2_down,f2_up,f3_down,gate:out std_logic;
up_down:buffer std_logic;-- ke yi inout ?
sel:out std_logic_vector(1 downto 0 );
out7:out std_logic_vector(1 to 7)
);
end entity main7;
architecture mar of main7 is
component fenpin is
port(clk305:in std_logic;
coo:out std_logic);
end component fenpin;
component mod80 is
port(clk1:in std_logic;
dout:out std_logic_vector(1 downto 0 )
);
end component mod80;
component decoder7 is
port(in2:in std_logic_vector(1 downto 0);
out7:out std_logic_vector(1 to 7)
);
end component decoder7;
component keytest is
port (clk,up1,up2,down2,down3,key1,key2,key3,tiqian,yanshi: in std_logic;
f1_up,f2_down,f2_up,f3_down,ddoor: out std_logic;
up_down:buffer std_logic;-- ke yi inout?
current:out std_logic_vector(1 downto 0));
end component keytest;
- 16 -
数字系统课程设计
signal clk100:std_logic;
signal ks:std_logic_vector(1 downto 0);
begin
unit1: fenpin port map(clk,clk100);
unit2: decoder7 port map(ks,out7);
unit3: keytest
port
map(clk100,up1,up2,down2,down3,key1,key2,key3,eary,delay,f1_up,f2_down,f2_up,f3_down,gate,up_down,ks);
unit4: mod80 port map(clk,sel);
end architecture mar;
5.程序使用:
KEY1接到试验台的K1开关
KEY2接到K2开关
KEY3接到K3开关
UP1 接到K4
UP2 接到K5
DOWN2 接到 K6
DOWN3 接到 K7
所有的开关均是低电平有效,所以初始状态应该是高电平的。
F1_UP 接到LED1
F2_UP 接到LED2
F2_DOWN 接到LED3
F3_DOWN 接到LED4
UP_DOWN 接到LED5
GATE 接到LED6
CLK 接到试验台的CLK3 并且20M时钟源经过跳线的到305Hz 6. 调试中遇到的问题与心得体会:
不同的环境和语言需要使用不同方法来实现,思想是不一样的。VHDL语言是不能使用面向过程的思想来设计的,本设计的主要思想是状态的转换,时间的延时可以用状态来表示。这点是很重要的。而不是想C语言那样使用循环空操作达到延时。这里的延时是在一种状态下不断的计数,到达时间后才跳出一种状态。
三层电梯控制状态转换难点是在第二层,因为只有第二层才存在竞争,要充分体现公平性。本设计是根据方向优先的规则来控制的。
Max plus II 有自己的局限行,即同一种状态下不能有太多的嵌套,因为其内部的逻辑单元是有限制的,当超过了其规定的最大单元数目的时候可以分成多个进程或者状态来完成同样的功能。所以本设计的程序分成了两个关门状态,原本我只定义5个状态,编译后出错,后来修改的时候无意中发现,分成多个状态可以解决这个问题。就分成6种状态。
学一种语言,最重要的是掌握其思想。
- 17 -