单片机交通灯专周实习报告

单片机专周实习 专业:

班级:

姓名:

学号:

交 通 灯 控 制 系 统

前言

交通的发达,标志着城市的发达,于是交通的管理也显得越来越重要。对于复杂的城市交通系统,为了确保安全,保证正常的交通秩序,十字路口的信号控制必须按照一定的规律变化,以便于车辆行人都能顺利地通过十字路口。考虑到单片机具有性价比高、功能强、使用方便灵活、可靠性强等特点,故我们拟采用AT89C51系列的单片机来实现十字路口交通信号灯的控制。 正常情况下,十字路口的红绿灯应交替变换, 以下设计中,将用发光二极管来模拟信号灯。

交通信号灯系统设计

设计目的:

1、通过交通信号灯系统的设计,掌握AT89C51并行口传输数据的方法,以控制发光二极管的亮与灭;

2、用AT89C51作为输出口,控制6个发光二极管亮与灭,模拟交通灯管理.

3、通过单片机控制设计,熟练掌握汇编语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力;

4、完成控制系统的硬件设计、软件设计、仿真调试。

一、任务

1.交通控制系统AB方向亮绿灯60s,然后黄灯闪烁3次,每次一秒(亮灭各50ms),红灯40s,同时CD方向红灯65s,绿灯35s,黄灯闪烁3s

2.各路灯用LED模拟显示,同时用七段数码管显示两路的倒计时时间

3.利用键盘可修改灯亮时间

4.PC机设置灯亮时间,利用PC与单片机串口通信实现

二、 方案比较

1、单片机型号选择

(1) ATMEL公司生产的AT89C51单片机作为主控制器进行对采集到的信号处理再输送给八段数码显示。Intel公司生产的AT89C51是一个低功耗,字长为8位的单片微型计算机,由中央处理器、片内128B RAM、片内4KBROM、两个16位的定时计数器、四个8位的I/O口(P 0、P l、P 2、P 3)、一个全双工的串行口、五个中断源以及时钟等组成。它具有体积小,重量轻,抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好。

1

(2)TI公司生产的MSP430系列是一个特别强调超低功耗的单片机品种,很 适合采用电池供电的长时间工作场合。在这个系列中有很多型号,它们是有

一 些基本功能模块按不同不同的应用目标组合而成。MSP430系列的CUP采用16位精简指令集系统,集成有16位寄存器和常数发生器,发挥了最高的代码效率。它采用了数字控制振荡器,使得从低功耗模式到唤醒模式的转换时间小于6微妙。其中MSP430X41X系列微控制器设计有一个16位定时器,一个比较器,96段LCD驱动器和48个通用I/O口引脚。

综合比较上面两点,虽然方案一的单片机没有方案二的速度快,功能也没那么强,但是它价格相对而言低廉一些,而且完全满足本题目的设计要求,所以选择了方案一。

2、译码器型号选择 (1)74138,其是一个3到8的译码器,其输出为低电平有效,使能端G1为高电平有效,/G2,/G3为低电平有效,当其中一个为低电平,输出端全部为1。 使用74138须注意两点:

1.74138的输出是低电平有效,故实现逻辑功能时,输出端不可接或门及或非门(因为每次仅一个为低电平,其余皆为高电平);

2.74138与前面不同的是,其有使能端,故使能端必须加以处理,否则无法实现需要的逻辑功能。下图给出了其最终的电路。

74HC138:74LS138 为3 线-8 线译码器,共有 54/74S138和 54/74LS138 两种线路结构型式,其74LS138工作原理如下: 当一个选通端(G1)为高电平,另两个选通端(/(G2A)和/(G2B))为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。

74LS138的作用:利用 G1、/(G2A)和/(G2B)可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器用与非门组成的3线-8线译码器。

2

74LS13871LS138有三个附加的控制端、

单片机交通灯专周实习报告

和。当、时,输出为高电平(S=1),译码器处于工作状态。否则,译码器被禁止,所有的输出端被封锁在高电平,如

单片机交通灯专周实习报告

表3.3.5所示。这三个控制端也叫做“片选”输入端,利用片选的作用可以将多篇连接起来以扩展译码器的功能。带控制输入端的译码器又是一个完整的数据分配器。在图3.3.8电路中如果把作为“数据”输入端(在同一个时间),而将作为“地址”输入端,那么从送来的数据只能通过所指定的一根输出线送出去。这就不难理解为什么把叫做地址输入了。例如当=101时,门的输入端除了接至输出端的一个以外全是高电平,因此的数据以反码的形式从输出,而不会被送到其他任何一个输出端上。

(2) 74LS47是一个4到8的译码器

74LS47的端子功能图如下图:

74LS47的主要功能端如下:

3

BI为熄灭输入端,低电平有效,当BI=0时,无论其他输入端状态如何,译码器输出七段同时熄灭;BI=1时,不影响译码器正常译码。

LT为测试输入端,低电平有效,用于检查数码管的七段是否正常发光。当LT=0,同时BI=1时,不管输入的BCD码是什么状态,都可使驱动数码管的七段同时点亮。译码器要正常译码,必须LT输入无效电平。

RBI为灭零输入端,低电平有效。设置灭零输入端的目的是为了能将不希望显示的0熄灭,例如一个四位数码显示电路,整数部分两位,小数部分两位,在显示6.4时,将出现06.40的字样,如果将前、后多余的0熄灭,显示的结果更醒目一些。灭零输入端只能对显示的0进行熄灭,而对其他数字没有影响。 在原理图中,译码器与数码管的连接如图:

单片机交通灯专周实习报告

综合比较上述资料,考虑到价格、电路需要等因素,74LS47比较常用且便宜,所以选择4LS47设计译码电路的方案。

3、数码管显示选择

静态显示方式:静态显示就是显示驱动电路具有输入的锁存功能,单片机将所要显示的数据送出后就不再管,知道下一次显示数据需要更新时再传送一次新数据,显示数据稳定,占用CPU时间少。静态显示数据稳定,但接线复杂。

4

动态显示方式:动态扫描显示的硬件接口简单,只需要一个公共的七段码输入口,一个选择显示位的数位选择口,显示时,从左到右轮流点亮每位显示器。动态显示的它硬件成本低,接口简单,但它要求CPU频繁地显示服务。

综合比较上面两点,虽然静态显示比动态显示稳定、占用CPU时间少,但静态显示接线复杂,而动态显示的它硬件成本低,接口简单,但它要求CPU频繁地显示服务。所以选择动态显示方案。

三、功能模块介绍

按键模块:本设计采用了四个功能按键,根据题目要求,一个按键为设置按键,一个对时间设置进行确认的按键,一个对时间进行60至1秒进行减可调按键,一个对时间进行1至60秒进行加可调按键。采用独立按键格式,图如下:

单片机交通灯专周实习报告

数码显示:本机数码管显示部分由两个两位共阴极7段数码显示管、1片七段译码器74LS47译码器及相关驱动电路组成,接口是一个8位的接口。本模块可以用来显示数值等信息。

74LS47是高速的七段译码器。有四根数据输入口线,及八根译码输出口线。可用于数码管的驱动中。

5

实验板电路如下图:

单片机交通灯专周实习报告

串行通信模块:通过MAX232芯片将单片机、主机的电平进行转换,使之达到通信的电平的要求。通过TxD、RxD接口实现主从机之间的通信。串行通信模块电路如下:

单片机交通灯专周实习报告

四、 硬件图

6

单片机交通灯专周实习报告

五、系统硬件设计

1、系统硬件设计

选用设备:AT89C51弹片机一片,74LS47芯片二片,电阻排RESPACK-7三个,共阴极的七段数码管7SEG-MPX2-CA两个,红、黄、绿交通灯各四个,开关键盘、连线、电阻、电容若干。

2、系统总框图如下:

7

3、系统工作原理

(1)开关键盘:改变数码管显示的时间。

(2) 由AT89C51单片机每秒钟通过P0、P2口向74LS47的数据口送信息,由P1口显示红、绿、黄灯的燃亮情况;由7SEG-MPX2-CA显示每个灯的燃亮时间。

(3) AT89C51 P3.2有下降沿触发时,时间暂停,进入时间显示状态,但P3.6为低电平时,时间显示以1秒的速度进行加1,但P3.7为低电平时,时间显示以1秒的速度进行减一。

(4)初始状态AB方向绿灯60秒CD方向红灯65秒。

(5)当AB方向绿灯60秒倒计时完了,进入下一阶段,AB方向黄灯3秒,CD方向红灯5秒。

(6)当AB方向黄灯3秒倒计时完,第三阶段,AB方向红灯40秒,CD方向红灯2秒。

(7)当CD方向红灯2秒倒计时完,第四阶段,AB方向红灯38秒,CD方向绿灯35秒。

(8)当CD方向绿灯35秒倒计时完,第五阶段,AB方向红灯3秒,CD方向黄灯3秒。

(8)AB方向红灯和CD方向黄灯3秒同时倒计时完毕,重新循环。

单片机交通灯专周实习报告

8

六、系统软件设计

1、每秒钟的设定

延时方法可以有两种一中是利用AT89C51内部定时器才生溢出中断来确定1秒的时间,另一种是采用软延时的方法。

2、1秒的方法

我们采用在主程序中设定一个初值为20的软件计数器和使T0定时50毫秒.这样每当T0到50毫秒时CPU就响应它的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,CPU先使软件计数器减1,然后判断它是否为零。为零表示1秒已到可以返回到输出时间显示程序.

3、软件框图

9

10

单片机交通灯专周实习报告

七、汇编程序

ORG 0000H ;伪指令、程序开始、中断入口地址 LJMP MAIN

ORG 0003H

LJMP ZHD1

ORG 000BH

LJMP ZHD2

ORG 0013H

LJMP ZHD3

ORG 1000H

;主程序

MAIN:MOV TMOD,#01H ;

MOV TL0,#0F0H ;

MOV TH0,#0D8H

SETB EA ;

SETB ET0 ;

SETB TR0 ;

SETB EX0 ;

SETB EX1 ;

SETB IT0 ;

CLR IT1 ;

SETB PT0

CYCLE:MOV R0,#60 ;AB

MOV R1,#65 ;CD

MOV R2,#25 ;

;CD红灯 AB绿灯

LOOP1:SETB P3.4

MOV P1,#01H 设工作方式 设初值 ,单片机晶振12M,定时10ms 开放总中断 开放T0中断 启动T0定时 开放外中断0 开放外中断1 设外中断0为边沿触发 设外中断1为低电平有效 方向绿灯显示时间 方向红灯显示时间 为延时1秒而用

11

SETB P1.7 ;点亮红灯 SETB P1.4 ;点亮绿灯

LCALL DISPLAY ;调用显示程序 DJNZ R2,LOOP1

MOV R2,#25

DEC R1

DJNZ R0,LOOP1

MOV R0,#3 ;AB

;CD红灯 AB黄灯

LOOP2:MOV P1,#01H

SETB P1.7 ;

SETB P1.3 ;

LLJ: LCALL DISPLAY ;

CPL P1.3

DJNZ R2,LLJ

DEC R1

MOV R2,#25

DJNZ R0,LOOP2

MOV R0,#40 ;AB

;CD红灯 AB红灯

LOOP3:MOV P1,#01H

SETB P1.7 ;

SETB P1.2 ;

LCALL DISPLAY ;

DJNZ R2,LOOP3

MOV R2,#25

DEC R0

DJNZ R1,LOOP3

MOV R1,#35 ;CD方向黄灯显示时间点亮红灯 点亮黄灯 调用显示程序 方向红灯显示时间点亮红灯 点亮红灯 调用显示程序 方向绿灯显示时间

12

;CD绿灯 AB红灯

LOOP4:MOV P1,#01H

SETB P1.5 ;点亮绿灯 SETB P1.2 ;点亮红灯

LCALL DISPLAY ;调用显示程序 DJNZ R2,LOOP4

MOV R2,#25

DEC R0

DJNZ R1,LOOP4

MOV R1,#3 ;CD

;CD黄灯 AB红灯

LOOP5:MOV P1,#01H

SETB P1.6 ;

SETB P1.2 ;

LLJ1: LCALL DISPLAY ;

CPL P1.6

DJNZ R2,LLJ1

MOV R2,#25

DEC R0

DJNZ R1,LOOP5

LJMP CYCLE

;键盘中断程序

ZHD1: LCALL DISPLAY

JB P3.6,Q2

INC R1

INC R0

CJNE R1,#99,TIAO2

MOV R1,#00H

TIAO2:CJNE R0,#99,TIAO3 方向黄灯显示时间点亮黄灯 点亮红灯 调用显示程序

13

MOV R0,#00H

TIAO3:LCALL DISPLAY

LCALL DISPLAY

LCALL DISPLAY

LCALL DISPLAY

LCALL DISPLAY

LCALL DISPLAY

JNB P1.0,Z2

Q2: JB P3.7,WAIT1

DEC R1

DEC R0

CJNE R1,#00H,TIAO

MOV R1,#99

TIAO: CJNE R0,#00H,TIAO1 MOV R0,#99

TIAO1:LCALL DISPLAY

LCALL DISPLAY

LCALL DISPLAY

LCALL DISPLAY

LCALL DISPLAY

LCALL DISPLAY

WAIT1:JNB P1.0,Z2

WAIT: LJMP ZHD1

Z2: RETI

;时间中断程序

ZHD2: MOV TL0,#0F0H ;重先赋值 MOV TH0,#0D8H

CLR P3.4

RETI

14

;应急通道中断程序 ZHD3:MOV P1,#85H MOV P0,#30H MOV P2,#30H JNB P3.3,ZHD3 RETI

;数显显示

DISPLAY:MOV A,R0 ;AB MOV B,#10

DIV AB ; ADD A,#00H ; MOV P0,A ;TI0: JNB P3.4,TT SJMP TI0 TT: SETB P3.4 MOV A,B

ADD A,#10H ; MOV P0,A ;TI1: JNB P3.4,TT1 SJMP TI1 TT1: SETB P3.4 ;CD方向的显示

MOV A,R1 ;CD MOV B,#10 DIV AB

ADD A,#40H ; MOV P0,A ;TI2: JNB P3.4,TT2 SJMP TI2 方向时间的显示 把要显示的数的十位存放在A中,个位存放在B中 位选通十位 显示十位数字 位选通个位 显示个位数字 方向时间的显示 位选通十位 显示十位数字

15

TT2: SETB P3.4

MOV A,B

ADD A,#50H ;位选通个位

MOV P0,A ;显示个位数字

TI3: JNB P3.4,TT3

SJMP TI3

TT3: SETB P3.4

HEAR: RET

八、参考文献

【1】李晓林,等.单片机原理与接口技术 。北京:电子工业出版社2008.

【2】段晨东 单片机原理及接口技术 北京:清华大学出版社 2008

【3】曾一江 单片微机原理及接口技术 成都:科学出版社 2005

【4】李朝阳编著 单片机原理及接口技术(第3版 北京航空航天大学出版社)

【5】江志红编著 51单片机技术与应用系统开发例案精选 清华大学出版社

【6】蒋正萍、刘虹、张松、李小平编著 《数字电子技术》

16

 

第二篇:交通灯设计实习报告

交通灯设计实习报告

专业班级:生医0702

γ

交通灯设计实习报告

交通灯设计实习报告

交通灯设计实习报告

目录

前言 ???????????????????????? 2

一 设计任务书????????????????????? 3

二 总体方案设计???????????????????? 5

三 单元模块设计???????????????????? 6

四 波形仿真?????????????????????? 18

五 调试(故障分析与解决)??????????????? 19

六 总结与体会????????????????????? 21

七 致谢???????????????????????? 22

参考文献 ?????????????????????? 22

1

前言 实现路口交通灯系统的控制方法很多,可以用标准逻辑器件、可编程序控制器和单片机等方案来实现。

若用单片机方案来实现的话,模型可以由电源电路、单片机主控电路、无线收发控制电路和显示电路四部分组成。在电源电路中,需要用到+5V的直流稳压电源,无线收发控制电路和显示电路应由编码芯片和数据发射模块两部分组成,主控电路的主要元件为AT89C51。硬件设计完成后还要利用计算机软件经行软件部分的设计才能够实现相应的功能。 虽然利用单片机系统设计的交通灯控制器相对来说较稳定,能够完成较多功能的实现,但这些控制方法的功能修改及调试都需要硬件电路的支持,在一定程度上增加了功能修改及系统设计与调试的困难。

相反,使用基于FPGA的设计方法具有周期短,设计灵活,易于修改等明显的的优点。而且,随着FPGA器件、设计语言和电子设计自动化工具的发展和改进,越来越多的电子系统采用FPGA来设计。未来,使用FPGA器件设计的产品将出现在各个领域里。因此,此次的交通信号灯控制器的设计将采用基于FPGA的设计方案来实现所要求的功能。

本次实习所作的是针对三路口即为丁字路口设计交通灯控制器,基于FPGA通过Quartus II仿真模拟并烧录至Altera-EPM7128SLC84-15N实现功能。

2

一、 设计任务书

1. 实习目的:

交通灯设计实习报告

图1、丁字交通控制 丁字路口如上图所示,我们所做的 EDA交通控制器所控制的是交通灯的亮灭和数码管的显示,已达到交通控制的作用。(图中的方框表示时间显示器)。

模拟丁字路口交通信号灯的工作过程,利用实验板上的三组红、黄、绿LED作为交通信号灯,设计一个交通信号灯控制器。能达到的要求:

(1) 交通灯从绿变红时,有5秒黄灯亮的间隔时间;

3

(2) 交通灯红变绿是直接进行的,没有间隔时间;

(3) 主干道上的绿灯时间为45秒,支干道的绿灯时间为30秒,主干

道的左转向绿灯亮的时间为25秒;

(4) 设两组数码管分别显示主、支干道在任意时间,显示每个状态到

该状态结束所需的时间。

交通灯设计实习报告

图2、红绿灯状态转换图

4

其中S0为主干道亮绿灯,支干道亮红灯,转向灯亮红灯(45秒) S1为主干道亮黄灯,支干道亮红灯,转向灯亮红灯(5秒)

S2为主干道亮红灯,支干道亮红灯,转向灯亮绿灯(25秒) S3为主干道亮红灯,支干道亮红灯,转向灯亮黄灯(5秒)

S4为主干道亮红灯,支干道亮红灯,转向灯亮绿灯(30秒) S5为主干道亮红灯,支干道亮红灯,转向灯亮黄灯(5秒)

S6为应急状态,指示灯全为红灯,任意状态都可转换到应急状态,应急状态后指示灯变为初始状态S0(认为控制,任意时间)

二、 总体方案设计

因主干道和支干道的车流量存在差异,因此红、黄、绿灯的时长也不相同,主干道直行时间定为45秒,黄灯5秒,主干道左转25秒,支干道左转30秒。同时用数码管指示当前状态(红、黄、绿)剩余时间。另外,设计一个紧急状态,当紧急状态出现时,两个方向都禁止通行,指示红灯。紧急状态解除后,重新计数并指示时间。

整个设计由秒发生电路产生一秒的时钟脉冲,并通过计数器计数。不同的状态的通行时间不一样,所以还必须加入预置数产生电路对状态的初始值置数;不同的状态则有状态发生器产生,状态发生器由两位二进制计数器构成,控制着红黄绿灯的显示输出。状态发生器的激励信号通过定时时间到检测电路检测计时器信号获得。计数器计数信号同时通过译码电路用于时间数据显示输出。下图为交通灯控制器的系统框图

5

图3、 系统框图

三、 单元模块设计

根基总体设计方案,我们知道整个分为如下几个单元,

1、分频单元

由于硬件给予的脉冲是50Mhz的,而我们交通灯需要的脉冲是1hz,所以我们需要分频电路来实现分频,VHDL程序部分如下:

PROCESS(clk,rst)

BEGIN

交通灯设计实习报告

IF (NOT rst = '1') THEN

6

div_cnt <= "00000000000000000000000000"; ELSIF(clk'EVENT AND clk = '1')THEN

div_cnt <= div_cnt + 1;

END IF;

END PROCESS;

上面程序的意思是当复位键按下的时候,重新复位计数,当没有按下的时候自动加一计数,而clk的频率是50Mhz,我们将它2^26分频,在结构体部分我们已经定义div_cnt(25 downto 0),即将div_cnt(25)作为输出脉冲信号,它的脉冲接近于1。

2、倒计时单元

倒计时是用于控制每个状态显示的时间,该部分的VHDL程序如下:

PROCESS(div_cnt(25),rst,hold)

BEGIN

IF (NOT rst = '1') THEN

state <= st0;

first <= "0101";

second <= "0001";

third <= "0000";

forth <= "0011";

ELSIF hold='0' THEN

state<=st6;

7

ELSIF(div_cnt(25)'EVENT AND div_cnt(25) = '1')THEN

CASE state IS

WHEN st0 =>

st_hold<= state;

IF (first /= "0000") THEN

first <= first - "0001"; ELSE

IF (second /= "0000") THEN

second <= second - "0001"; first <= "1001";

ELSE

state <= st1;

first <= "0011";

second <= "0000";

END IF;

END IF;

IF (third /= "0000") THEN

third <= third - "0001"; ELSIF(forth /= "0000") THEN

forth <= forth - "0001"; third <= "1001";

END IF;

WHEN st1 =>

8

st_hold<= state;

IF (first /= "0000") THEN

first <= first - "0001"; ELSE

IF (second /= "0000") THEN second <= second - "0001"; first <= "1001";

ELSE

state <= st2;

first <= "1001";

second <= "0000"; END IF;

END IF;

IF (third /= "0000") THEN

third <= third - "0001"; ELSIF(forth /= "0000") THEN

forth <= forth - "0001"; third <= "1001";

END IF;

WHEN st2 =>

st_hold<= state;

IF (first /= "0000") THEN

first <= first - "0001"; ELSE

9

IF (second /= "0000") THEN first <= "1001";

second <= second - "0001"; ELSE

state <= st3;

first <= "0011" ;

second <= "0000";

END IF;

END IF;

IF (third /= "0000") THEN

third <= third - "0001"; ELSIF(forth /= "0000") THEN

forth <= forth - "0001"; third <= "1001";

END IF;

WHEN st3 =>

st_hold<= state;

IF (first /= "0000") THEN

first <= first - "0001"; ELSE

IF (second /= "0000") THEN first <= "1001";

second <= second - "0001"; ELSE

10

state <= st4;

first <= "0010" ;

second <= "0001";

third <= "1001" ; forth <= "0000";

END IF;

END IF;

IF (third /= "0000") THEN

third <= third - "0001"; ELSIF(forth /= "0000") THEN

forth <= forth - "0001"; third <= "1001";

END IF;

WHEN st4 =>

st_hold<= state;

IF (third /= "0000") THEN

third <= third - "0001"; ELSE

IF (forth /= "0000") THEN third <= "1001";

forth <= forth - "0001"; ELSE

state <= st5;

third <= "0011";

11

forth <= "0000";

END IF;

END IF;

IF (first /= "0000") THEN

first <= first - "0001"; ELSIF(second /= "0000") THEN

second <= second - "0001"; first <= "1001";

END IF;

WHEN st5 =>

st_hold<= state;

IF (third /= "0000") THEN

third <= third - "0001"; ELSE

IF (forth /= "0000") THEN third <= "1001";

forth <= forth - "0001"; ELSE

state <= st0;

first <= "0101"; second <= "0001"; third <= "0000";

forth <= "0011";

END IF;

12

END IF;

IF (first /= "0000") THEN

first <= first - "0001"; ELSIF(second /= "0000") THEN

second <= second - "0001"; first <= "1001";

END IF;

WHEN st6 =>

first <= first;

second <= second;

third <= third;

forth <= forth;

IF hold='1' THEN

state <= st_hold;

END IF;

WHEN OTHERS =>

first <= "0000";

second <= "0000";

third <= "0000";

forth <= "0000";

END CASE;

END IF;

END PROCESS;

13

程序中state是指六种状态,而first、second、third、forth是代表四个数码管,其中first与second分别表示主干路的倒计时数的个位与十位,third与forth自然就是另外一路的数据了。

3、状态转换单元

在设计任务中我们得知一个周期分包含六个状态,而这六种状态的变换和上面的倒计时是一致的,当上面的倒计时到零的时候进入下一个状态,程序如下所示:

PROCESS(state)

BEGIN

CASE state IS

WHEN st0 =>

light <= "111110011011";

WHEN st1 =>

light <= "111101011011";

WHEN st2 =>

light <= "111011110011";

WHEN st3 =>

light <= "111011101011";

WHEN st4 =>

light <= "111011011110";

when st5 =>

14

light <= "111011011101";

when st6 =>

light <= "111011011011";

WHEN OTHERS =>

light <= "111111111111"; END CASE;

END PROCESS;

我们实际上只用到了三组灯,但light却是十二位的,因为我们要将不用的那组灯灭掉,以便于我们的观察,我们知道控制灯的亮灭是高低电平控制,而这里是由高电平控制灭,所以我们将不亮的灯都要置“1”。

4、数码管选通单元

根据硬件原理图,我们知道8个数码管是共用a、b、c、d、e、f、g、h八个引脚控制端口的,而任意时刻所能用到的都只有一个数码管,但我们却要用到四个数码管同时显示倒计时数据,如何实现呢?我们根据人的视觉误差,将所用的数码管快速扫描选通,这样即便任一时刻只有一个选通,但在视觉上看起来却是几个同时亮着的,程序如下所示:

dig<=en;

seg<=dataout;

PROCESS(div_cnt(14 downto 13))

BEGIN

15

CASE div_cnt(14 downto 13) is

WHEN "00"=> en<="0111";dig2<="1111" WHEN "01"=> en<="1011";dig2<="1111" WHEN "10"=> en<="1101";dig2<="1111" WHEN "11"=> en<="1110";dig2<="1111" WHEN others => en<="1111";dig2<="1111"

END CASE;

END PROCESS;

上面部分是为了快速扫描选通前四个数码管,后四个数码管让它一直灭掉。

PROCESS(en,data4,first,second,third,forth)

BEGIN

IF(en="1110")THEN

data4<=first;

ELSIF(en="1101")THEN

data4<=second;

ELSIF(en="1011")THEN

data4<=third;

ELSIF(en="0111")THEN

data4<=forth;

END IF;

END PROCESS;

这部分是选数码管对应倒计时数据。

5、译码单元

16

此部分的作用是将data4的BCD代码译成二—十进制数,代码如下所示:

PROCESS(data4)

BEGIN

CASE data4 is

WHEN "0000" =>

dataout <= "00000011";

WHEN "0001" =>

dataout <= "10011111";

WHEN "0010" =>

dataout <= "00100101";

WHEN "0011" =>

dataout <= "00001101";

WHEN "0100" =>

dataout <= "10011001";

WHEN "0101" =>

dataout <= "01001001";

WHEN "0110" =>

dataout <= "01000001";

WHEN "0111" =>

dataout <= "00011111";

WHEN "1000" =>

dataout <= "00000001";

WHEN "1001" =>

17

dataout <= "00001001"; WHEN "1111" => dataout <= "11111111"; WHEN OTHERS => NULL;

END CASE;

END PROCESS;

四、波形仿真

仿真的作用是对源代码进行编译,检测语法上是否正确,如果发现语法错误则指出错误,并且尽可能地提供出错的原因。功能仿真只在功能上验证是否正确,时序上不做任何验证。我们编译通过后,仿真器再根据输入信号产生输出,根据输出可以判断功能是否正确。如果不正确需要反复修改代码,直到语法和功能都达到要求。

我们用的是QuartusII9.1进行功能仿真和时序仿真,虽然它的仿真器不如专业的仿真工具功能齐全,但在设计中使用它足以完成我们的需要。

在进行仿真前我们必须为仿真器提供测试激励,而这激励保存在波形响亮文件(Vector Waveform File)中,所以我们必须先建立Vector Waveform File,完成后弹出波形编辑窗口,在信号窗口中单击右键,在

18

弹出菜单中选择Insert Node or Bus,弹出Insert Node or Bus对话框,设置clk。我们将它设置为1us,整个交通灯运行一圈需要50us。

仿真图如下所示:

交通灯设计实习报告

交通灯设计实习报告

交通灯设计实习报告

五、 调试(故障分析与解决)

调试时一个错综复杂的过程,首先要对它编译看是否有错,如果没错的话进可以直接烧录了,如果有错的话就要查错排错再编译直到没错为止。

19

在整个过程中我们碰到了不少问题,但还好在六个人探讨以及老师的指导之下都得以解决了,下面把我们所遇到的问题例举如下:

1、没有连引脚

开始的时候以为不用连引脚就可以直接烧录,认为在编译完成之后会自动连接各个所需引脚,但实际上不是的,连接引脚是很关键的一步,每个端口对应哪个引脚都必须确定,这样烧录之后才能实现功能,并且自己才可以判断是否与自己预期的相同。

2、数码管没有按预期显示

根据原理图我们知道EDA开发板上的8个数码管共用a、b、c、d、e、f、g、dp八个数据引脚,当前可用数码管的选择通过其使能端实现,其使能信号为0表示可用,1表示不可用。在我们的设计中仅仅是对前四个数码管的使能信号赋值,对后四个数码管的使能信号没做处理,后面四个数码管的使能信号不确定,从而和前面四个数码管存在竞争现象,导致8个数码管均不能正常显示。解决的办法就是在VHDL程序中添加一个dig2的四位向量的输出端口,并将其值设置为“1111”,并将这四个端口和后四个数码管对应芯片的管脚连接起来。也即屏蔽后四个数码管,消除竞争现象,使得程序正常运行。

3、没有用到的一组红黄绿灯状态变化,使用的三组等的变化状态无规律变化。

虽然在EDA的开发板上12个灯并没有像数码管那样共用数据端,不存在片选信号上的竞争现象,但借鉴数码管出现的问题,我们还是想到了用屏蔽没用的那组灯,将其设置成常灭。同样,其实现方法是在VHDL程序中添加一个light4的三位向量的输出端口,其值设置为

20

“111”,并与对应芯片的管脚连接起来。做了修改后,重新编译程序无误后烧入芯片,意外发现三组红黄绿灯状态正常变化,没用的那组灯常灭。

六、 总结与体会

丁字路口交通灯的设计原理不难,况且在当初电工电子的实习中已经接触过类似的,难的是用EDA来实现它,因为EDA对于我们来说全是新的,之前根本没有接触过。也就是说在短暂的两周中我们不但要学习一个新的东西,而且还要融会贯通用它来设计丁字路口交通灯系统。还好前面的几次实习已经锻炼了我们快速学习的能力,对于一个完全陌生的东西也没有啥畏难情绪了,而这一次的实习就相当于一次考察,考察我们查找资料快速学习团结协作的能力。

不得不说我和搭档的合作是相当愉快的,虽然我俩的成绩都不咋样,但对于实习我们是积极地,徐老师一讲完实习任务,我们就去图书馆借来了书,学习EDA技术,了解FPGA使用方法,掌握VHDL编程语言以及QuartusII9.1软件的使用。当然这些的学习与我们的实习进程是同步的,我们分几个模块来设计,针对每个模块有针对性的快速学习,然后用VHDL语言编程,然后对于每个小模块分开编译,查错排错,再仿真,在实习的过程中我们由于对交通灯的状态转换有所争执,还实地去考察了,也许真的是水品所限,我和搭档最后编写的程序没有实现预期功能,但是整个过程是相当充实的,最后我们和其他组一起讨论学习,发觉分模块来写实很麻烦,其实就设计一块芯片里面,所有输出线都由这个芯片引出,这样编写的程序既简洁又明了,思路相当的清晰,在借鉴与学习的过程中,我们发现了自己的错误所在,但由于时间所限我们

21

未能对自己的进行改进,但只要达到了实习预期的目的,锻炼了我们各方面的能力,自己有所得,又何必太注重于结果了。

这已经是最后一次实习了,每结束一个实习,就越发觉得自己实在是有太多知识不会的,即便是在实习过程中掌握了的知识自己也不是很有底,当时目的性太强,学的太专,也许这就是快速学习的后遗症吧。但实习本身重点就不是用来系统学习知识的,而是用来锻炼能力的,锻炼查找资料快速学习融会贯通以及动手的能力,只要能有这方面的收获实习的目的就已经达到了,自己还是有不少收获的!

七、致谢

感谢学校为我们提供的实习机会

感谢徐老师的辛苦教诲与指导

感谢同学的支持与同组者的配合

八、参考文献

[1]刘爱荣、王振成.EDA技术与CPLD/FPGA开发应用简明教程.清华大学出版社.2007

[2]刘昌华、张希.数字逻辑EDA设计与实践—MAX+plusII与QuartusII双剑合璧.国防工业出版社.2009

[3]黄智伟.FPGA系统设计与实践.电子工业出版社.2004

[4]潘松、王国栋.VHDL实用教程。电子科技大学出版社。1999

22

相关推荐