要求:模拟一个简单的十字路口交通灯(各个只有红绿黄灯,没有转弯灯)。交通灯一共有4 个状态,一是倒计时60 秒,同时亮南北方向绿灯、东西方向红灯;二是倒计时5 秒,同时数码管闪烁显示‘0’,同时亮南北方向红灯、东西方向黄灯;三是倒计时30 秒,东西方向亮红灯、南北方向绿灯;四是倒计时5 秒,数码管闪烁显示‘0’,东西方向亮黄、南北方向红灯。四个状态循环就构成了一个简单的交通灯(未了降低难度,我们设计简化交通灯,与真实情况不太一样)。
1.假定系统输入时钟为10KHz。
2.设计出以上要求的交通灯,每个方向有一个倒计时指示(两个8 段数码
管)和红黄绿三种颜色的灯。
3.给出仿真波形。
设计思路
首先根据设计要求,交通灯在四个状态间相互转换,为交通灯分配状态:
A-00:倒计时60 秒,同时亮南北方向绿灯、东西方向红灯;
B-01:倒计时5 秒,同时数码管闪烁显示‘0’,同时亮南北方向红灯、东西方向黄灯;
C-10: 倒计时30 秒,东西方向亮红灯、南北方向绿灯;
D-11: 倒计时5 秒,数码管闪烁显示‘0’,东西方向亮黄、南北方向红灯。
其次,把设计分为几大模块-----时钟输入,时钟分频,状态转换,译码,数码管显示输出。其中状态转换包括了A,B,C,D四种状态的转换以及倒计时五秒时数码管闪烁所需的状态转换,把这几个模块连接起来就完成了交通灯的设计。
(1)时钟从外部输入。
(2)时钟分频用计数器来实现,首先对系统输入时钟10KHz进行100分频,得到数码管动态扫描时钟信号,再对扫描信号进行100分频得到数码管显示时间所需的1Hz时钟信号。
(3)状态转换用case(state)语句,在满足状态转换条件时对状态进行转换。
(4)译码原理:二进制转BCD码采用左移加3的方法,具体描述如下(此处以8-bit 二进制码为例):
a.左移要转换的二进制码1位
b.左移之后,BCD码分别置于百位、十位、个位
c.如果移位后所在的BCD码列大于或等于5,则对该值加3
d.继续左移的过程直至全部移位完成
二进制转化为BCD码后,就可以来驱动数码管显示十进制数字了。
(5).8段共阴极数码管的编码:
0x3f,0x06,0x5b,0x4f,
//0~3
0x66,0x6d,0x7d,0x07,
//4~7
0x7f,0x6f,0x77,0x7c,
//8~b
0x39,0x5e,0x79,0x71
//c~f
verilog程序及仿真结果(仿真平台:Quartus II)。
变量说明:
CLK:系统的输入时钟。
CLK_A:数码管动态扫描时钟信号。
CLK_B:1Hz计数时钟信号。
Lamp_SN:南北方向的红绿灯的状态,00--green,01--yellow,10—red。
Lamp_EW:东西方向的红绿灯的状态,00--green,01--yellow,10—red。
ten_SN1:实际显示时(如倒计时5秒闪烁)南北方向驱动数码管十位的8位数据。
one_SN1:南北方向驱动数码管个位的8位数据。
ten_EW1:东西方向驱动数码管十位的8位数据。
one_EW1:东西方向驱动数码管个位的8位数据。
state:表示ABCD四种状态。
state1:表示倒计时5秒时数码管闪烁显示0,1的两种状态,在状态A或C时该状态才对数码管有效。
counter:倒计时计数器