中北大学信息商务学院2009届本科毕业设计任务书
dataz(8)<=\
dataz(9)<=\
这段程定义了数码管显示的9种状态,在第1种状态下数码管显示出来的是“0”应为给出程序dataz(0)<=\就可以知道7段数码管的7个灯的工作状态,(灯1亮、灯2亮、灯3亮、灯4亮、灯5亮、灯6亮、灯7不亮、标点符号灯不亮)可以形成一个数字。通过这种原理可以显示出数字(1、2、3、4、6、7、8、9)。数码管灯的排列顺序为下图所示:
图4.2 数码管彩灯排列顺序
4.2.2 通常情况的程序说明
这是程序的开始,就是大道和小道都没有来车的时候,大道和小道的灯一直在这个状态,就是下面这段程序。 begin
if clk'event and clk='1' then
if small='0' then f_greenbig<='1';
f_yellowbig<='0'; f_redbig<='0'; f_greensmall<='0'; f_yellowsmall<='0'; f_redsmall<='1';
sign<=\
这段程序是在讲在p0程序中当产生上升沿时的时候,如果检测到小路没有车那么大道的绿灯亮,具体执行绿灯状态的程序为f_greenbig<='1'。同理下面的程序可以得出大道的黄灯和红灯灭,小道的黄灯和绿灯灭而红灯亮。可知当这段程序读
第 16 页 共33 页
中北大学信息商务学院2009届本科毕业设计任务书
完的时候数码管没有任何显示,停留在此不再对下面的程序进行读取。如下图所示:
图4.3 时序逻辑仿真图 4.2.3 小道来车的程序说明
若小道来车,大道经6秒由绿灯变为黄灯;再经过4秒,大道由黄灯变为红灯,同时,小道 由红灯变为绿灯。这个状态出现俩个时钟,即一个为4秒、一个为6秒。其中比较典型的程序段为下。 elsif small>'0'and big=\
case er_state is when erd0 =>
er_state<= erd1;
sign<=\ when erd1 =>
sign<=\
er_state<= erd21;
这段程序就是6秒的时钟控制器开始计数的开始,程序中在small>'0'and big=\即在小道来车,大道没有车的情况下为前提在进行对下面读取。其中从when直到when的读取的过程要花费1秒,这样就同样原理下编写6段就可以达到延迟6秒的目的。
同样原理延迟4秒的程序也是通过这样来编写的。在6秒后大道从绿灯变成黄
第 17 页 共33 页
中北大学信息商务学院2009届本科毕业设计任务书
灯的程序开始执行,这个过程中7段数码管开始运行计时,并且开始从6开始倒计时。如下图所示:
图4.4 时序逻辑仿真图 4.2.4 小道变绿灯后,若大道来车不到3辆情况下的程序说明
小道变绿灯后,若大道来车不到3辆,则经过25秒钟后自动由红灯变为黄灯,再经过4秒变为红灯,同时,大道由红灯变为绿灯。这个状态有个前提是大道来车不到3辆车,那就可以有2种可能要考虑到。即来了1辆车或来了2辆车。这个状态中主要的程序和上个阶段的主程序大体一样,其中有段程序是
when er23 =>
sign<=\
e_state<= er24;
when er24 =>
sign<=\
e_state<= er2;
when er2 =>
f_yellowsmall<='1'; f_greensmall<='0'; f_redbig<='1'; e_state<= er25;
这个程序段中首先说明了前提条件就是elsif small>'0' and big<=\and big>\它直接定义出了小道有车但是大道来的车辆小于3辆。然后执行时
第 18 页 共33 页
中北大学信息商务学院2009届本科毕业设计任务书
钟控制,同样原理在产生上升沿的情况下让 ,一直到从而延迟25秒后进行下面程序的读取,这时候2个7段数码管同时运作
其中7段数码管倒计时程序的解释是:当程序进行到elsif small>'0' and big<=\的时候让delay+1,但是delay不等于\的时候要执行i<=i+1让程序出现循环。知道delay等于\才中断循环程序由于程序的设定在这个过程中耗费的时间正好为25秒,从而达到延时和7段数码管的显示。时序图如下图所示:
图4.5 时序逻辑仿真图
4.2.5 小道变绿灯后,若大道来车超过3辆的情况下的程序说明
如果小道在绿灯亮时,小道绿灯亮的时间还没有到25秒,只要大道检测到已经超过3辆车在等候,那么小道应立即由绿灯变为黄灯,再经过4秒变为红灯,同时,大道由红灯变为绿灯。
在这个状态下也是有个前提条件才能进行,就是小道绿灯亮的时候再25秒内检测到大道已经超过3辆车等待。这段程序也是由2个时钟管理程序控制。时钟的程序说明前几个状态已经详细的说明,在此不再介绍。7段数码管又开始进行倒计时的工作,但是该程序要求考虑到没有在25秒延迟工程中出现大道检测已经超过3俩时会中断倒计时的工作而进行下个阶段的程序运作。这个状态中,中心程序是 elsif small>'0' and big>\ then
case state is when e0 =>
f_yellowbig<='0';
f_greenbig<='0';
第 19 页 共33 页
中北大学信息商务学院2009届本科毕业设计任务书
f_redbig<='1'; f_greensmall<='0';
f_yellowsmall<='1'; f_redsmall<='0';
state<= e25;
when e25 =>
sign<=\
state<= e26;
when e26 =>
sign<=\
state<= e27;
这段程序就是在25秒倒计时过程中出现的特殊情况,该程序就是在检测到上升沿时7段数码管停止当前运作从新开始读取。
这段程序的难点就是出现了2个时钟控制器相互制约的读取。在程序编辑上需要仔细考虑周全。状态的时序图为下图所示:
图4.6 时序逻辑仿真图 4.3总体程序说明
该程序的设计方法多种多样,可以按照4个状态来编写4个主要程序段,再对4个程序段进行连接从而组成一个完整的设计系统。但是考虑到过程的复杂性比较大,而且很容易从细小的地方出现问题,寻找问题繁琐难度大。我就用1段程序进行编译,虽然在程序语言的排列和逻辑思维上有点难度,但是可以减少连线及其他方面出现的细小问题。在处理第4状态突发事件的这段程序是一个比较难的地方,
第 20 页 共33 页