verilog语言-设计一个交通灯信号控制电路
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西北工业大学
《FPGA》实验报告
学院:软件与微电子学院
学号: ********** *名:***
专业:微电子学
实验时间: 2013/11/11 实验地点:毅字楼335 指导教师:**
西北工业大学
2013 年11 月
为129。
通过比较器,每个灯的条件不同,当129>=k>=70时绿灯亮,69>=k>=60黄灯闪烁,59>=k>=0红灯亮。
对于数码管输出,当129>=k>=70时,数码管个位输出=(k-70)%10,十位输出为(k-70-个位)/10;当69>=k>=60数码管个位输出=(k-60)%10,十位输出为(k-60-个位)/10,当59>=k>=0时,数码管个位输出=k%10十位输出为(k-个位)/10。
分频模块:
分频模块用以把输入的50MHz的信号转换为1Hz信号,便于其后的交通灯控制及数码管输出。
译码模块:
考虑到数字显示需要两个七段译码器,且在数字系统中,数字的表示都是采用二进制,因为两个管子分别输入,所以需要把循环变量k转换为有用的十位和各位输出。
为了方便,把循环变量k减去各状态的基数值后,用数学方法取十位和各位分别做输入。如绿灯时,129>=k>=70时,数码管个位输出=(k-70)%10,十位输出为(k-70-个位)/10。
七段译码器的设计原理如图:
2.总体设计框图及说明:
图一
输入:clk 全局时钟信号,50MHz rst 全局复位端,高电平有效 输出:ctrl_1s 倒计时个位上数字 ctrl_10s 倒计时十位上数字 blu,yel,red 各个灯状态
框图说明:
状态机的输入,只有时钟信号clk 和复位信号reset.输出为数码管十位和个位的二进制显示状态以及三个灯的颜色显示(blu,yel,red,分别是绿黄红灯,“1”表示灯亮,“0”表示灭)。 输入clk 的频率很大,需要通过计数器对其进行分频。首先计数产生一个1Hz 的输出,通过该输出再次循环计数,产生周期为130的计数变量,从而控制各个灯的亮灭。而控制黄灯闪烁的分频,为方便起见,仍以1s 为单位,每秒钟改变一次。
用if 嵌套语句来控制三灯亮与灭,同时间接地进行倒计时的过程,输出个位和十位上的数,
red
Clk1 1Hz
循环变量k
129~0
yel
控制
Clk
50Hz
rst
blu
图四
译码显示模块:
输入端口:
din_1s 显示器个位数据,由控制模块输入 din_10s 显示器十位数据,由控制模块输入 输出端口:
led_data_1s 显示器个位数据的译码 led_data_10s 显示器十位数据的译码 时序说明:
此模块接受主模块输出的个位和十位的数值控制,并间接受(系统时钟)clk(50MHz) 和
clk 50MHz
计数器显示计数
rst J=49999999
clk=~clk
(全局复位)rst,及分频时钟clk1的控制,均为上升沿触发,当rst 为高电平时,电路复位,重新开始工作。当rst为低电平时,电路正常。
5.仿真及综合结果
表1 仿真结果信号解释说明
信号解释备注
clk 系统时钟, 50MHz 为了方便,这里取2ns
blu,yel,red 最终三灯状态分别绿红灯,
“1”为亮“0”为灭
k 循环计数变量用以状态判断控制
led10 倒计时十位七段译码数码管十位显示
led1 倒计时个位七段译码数码管个位显示
out1 倒计时个位上的数字控制模块的输出
out10 倒计时十位上的数字控制模块的输出
rst 系统控制变量高电平有效
上图中blu,yel,red,三个信号反映的绿黄红交通灯的状态,其中包括绿灯亮60秒,黄灯以2HZ 为周期闪烁,红灯亮60s,总周期为130s。
上图为循环控制变量的值随分频后信号从129到0的循环计数。
综合结果:
顶层及控制,分频模块的综合RTL级电路如图:
译码显示模块的综合如下:
RTL级门级
6.代码及注释
此为顶层及控制模块代码:
`include "./decode.v"
module bulb(clk,rst,red,blu,yel,led1,led10);
input clk,rst;
output blu,yel,red,led1,led10;
reg red,yel,blu;
wire [6:0] led1;
wire [6:0] led10;
reg[3:0] out10,out1;
reg[5:0] j;
reg[7:0] k; //j,k
reg clk1;
//
initial
begin
k='d129;
blu<=0;