上海海事大学本科生毕业设计(论文)
三 基于VHDL交通灯控制器设计和仿真
(一) 设计思想介绍
欲设计一个由一条主干道和一条支干道的汇合点形成的十字交叉路口的交通灯控制器, 具体要求如下:
1.主,支干道各设一个黄,绿,红指示灯,两个显示数码管。 2.支干道没有车辆通过时,主干道处于常允许通行状态。
3.当主干道无车辆通行而支干道有车辆通行时,主干道状态灯由“红—绿—黄”周期显示,支干道状态灯由“绿—黄—红”周期显示。
4.当主、支道均有车时,主干道状态灯由“绿—黄—红”周期显示,支干道状态灯由“红—绿—黄”周期显示。
5.主,支干道允许通行(绿灯)时间均为35S,禁止通行(红灯)时间均为39S,每次由亮绿灯到亮红灯的转换过程中,要亮4S的黄灯作为过渡,并进行减计时显示。整个结构原理图3.1如下所示:
Reset
holdmrbr计数器计数值控制器红,黄,绿发光二极管倒计时数字Clock(1hz)分位器七段数码管图3.1 基于VHDL交通灯信号控制设计结构原理图
11
上海海事大学本科生毕业设计(论文)
(二)系统各功能模块的实现
1.计数器模块:
主要对clock时钟的每一上升沿计数,即实现秒计数。除此之外,还实现了对整个交通灯的状态控制。
模块功能实现主要程序部分见附录1
2.控制器模块:
实现对整个交通灯的功能控制,包括监控主干道,支干道是否有普通车辆或特殊车辆通过;红,黄,绿灯状态转变以及持续时间倒计时控制。
图3.3 控制器模块图形文件 图3.2 计数器模块图形文件
模块功能实现主要程序部分见附录2.
3.分位器器模块:
实现对红,黄,绿灯状态持续时间的分位作用,让两个数码管能分别显示十位,个位。
12
上海海事大学本科生毕业设计(论文)
模块功能实现主要程序部分见附录3.
(三)系统综合设计与仿真
1.交通灯控制器顶层文件原理图3.5如下所示:
13
图3.4 控制器模块图形文件
上海海事大学本科生毕业设计(论文)
图3.5 顶层文件原理图
2. MAX+PLUS II中的仿真如图3.6所示:
Clock:时钟输入;
14
图3.6 交通灯信号控制仿真波形
上海海事大学本科生毕业设计(论文)
Hold:特殊车辆监控键。高电平时表示有特殊车辆通过,此时,主干道,支干道全变为红灯状态且计数停止,变为低电平后计数恢复正常。
Mr: 主干道车量监控键,高电平时表示有车连通过,反之则表示无。 Br: 支干道监控键,高电平时表示有车连通过,反之则表示无。 Reset:数码管计数复位键,高电平时所有计数恢复到初始状态。 R,G,Y,R1,G1,Y1分别表示主,支干道的红,绿,黄灯。
(四) 软件调试过程中遇到的问题
由于大学期间应用到VHDL的编程的设计较少,因此对VHDL没有过系统的学习,实践经验就更少,以致在学习实践过程中碰到了不少问题,但随着学习的逐渐深入,不断的练习实践,这些问题也逐步解决了。
1. 程序编译过程中遇到的问题
(1)首次编译成功一个程序后,紧接着编译第二个程序,提示框显示编译成功,可是在做顶层文件原理图仿真时,一直提示有错误。后来经过仔细检查才发现,原来我编译第二个程序时,没有把工作文件设我当前文件。
(2)编译文件时,跳出“type in waveform element must be “std_logic_vector”” 错误提示框。后来经过不断查阅相关书籍,终于发现了问题所在:VHDL语言是一种强类型语言,对每个常数,变量,信号等的数据类型都有一个要求,只有相同数据类型的量,才能相互传递。我所编写的程序数据输出类型是std_logic_vector(),而信号声明的数据类型为Integer,在数据传递过程中,我没有经过任何转变,直接将信号值赋予输出变量,所以出现
了以上错误提示框。在所有数据类型更改为一致后,这个问题也就迎刃而解了。
2.程序仿真仿真中遇到的问题
将编译成功的文件进行波形仿真后,发现输出信号的波形为一条直线,就是说没有信号输出。点击“放大镜”或者用鼠标拖动波形图下方滚动条,还是没有波形变化。后来才发现原来我设置的“End time”太小了,以至于不能显示完整的波形。解决方案:在波形文件下,点击软件“EDIT”下拉菜单,选择“End time…”,将其时间设的大些;同时也可以在波形文件下,选择菜单“Option”下拉菜单,点击“Grid size”将时钟周期设置小些。
四 系统调试与实现
(一)GW48-CK系统概述
15