2013—2014学年第二学期数字电子技术课程设计报告
专业班级自动化1班
姓名张青
学号 12051124
开课系室电工电子学教学中心
设计日期 2014年7月4/5日~8日
目录
数字电子技术课程设计题目:交通灯控制电路设计 (1)
一、设计任务及原理 (1)
二、具体要求 (1)
三、输入输出资源说明 (3)
四、基础设计方案 (4)
五、模块仿真结果 (6)
六、总结与讨论 (8)
七.各模块关键代码 (9)
数字电子技术课程设计题目:交通灯控制电路设计
一、设计任务及原理:
交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就很简单,而如果车子可以左右转弯的通行就比较复杂。
要完成本实验,首先必须了解交通路灯的燃灭规律。本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各四个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的燃灭规律为:东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯闪烁,红灯亮(表示左转弯),再延时一段时间后,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯闪烁,红灯亮(表示左转弯),再延时一段时间后,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。
在实验中使用4个七段码管中的任意两个数码管显示时间。东西路和南北路的通车时间均设定为20s(其中,绿灯亮时间为10s,绿灯闪烁时间为5s,黄灯闪烁时间为5s)。数码管的时间总是显示为20、19、18、17……2、1、0、20、19、18……。在显示时间小于等于5秒的时候,通车方向的黄灯闪烁。在东西向绿灯期间,点阵显示自己的姓名;在南北向绿灯期间,点阵显示自己的学号后3位。
二、具体要求:
本实验要完成任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的50MHz时钟,黄灯和绿灯闪烁时钟要求为2Hz,七段码管的时间显示为1Hz脉冲,即每1s中递减一次。在东西向绿灯期间,点阵显示自己的姓名;在南北向绿灯期间,点阵显示自己的学号后3位。显示方式:1秒显示一个汉字或者一个数字(汉字和数字均静止不动,即不循环),然后全暗1秒,然后再显示一个汉字或者一个数字,以此类推。
实验箱中用到的数字时钟模块、按键开关、数码管、点阵与FPGA的接口电路,以及数字时钟源、按键开关、数码管、点阵与FPGA的管脚连接在以前的实验中都做了详细说明,这里不再赘述。交通灯模块原理与LED灯模块的电路原理一致,当有高电平输入时LED灯就会被点亮,反之不亮。只是LED发出的光有颜色之分。其与FPGA的管脚连接如下表所示:
三、输入输出资源说明:
1、外部输入脉冲信号时钟源CP(50MHz),经适当分频后供计数器使用。
2、输出2组显示译码信号(每组7个输出端),分别接到外部的两个七段数码管M1、M2上,M1和M2分别显示倒计时的十位和个位。
3、输出6个高低电平信号,分别接到外部的6个指示纵向、横向的LED灯。(输出高电平时,对应的LED灯亮)
其具体框图如下:
图1 交通灯控制电路结构框图
同时可以拓展:
1、利用一个开关将0-20s扩展为0-30s(30-10s之间绿灯亮,其他与基本要求相同);
2、增加交警控制模块:用一个开关切换自动模式(上述情况属于自动模式)和人工
模式(交警控制模式):用4个开关分别实现东西向通行(东西向绿灯亮,南北
向红灯亮,没有时间限制),实现南北向通行(南北向绿灯亮,东西向红灯亮,
没有时间限制),实现东西向左转弯(东西向绿灯闪烁,东西向红灯亮,南北向
红灯亮,没有时间限制),实现南北向通行(南北向绿灯闪烁,南北向红灯亮,
东西向红灯亮,没有时间限制)。
四、基础设计方案:
图2 交通灯控制电路图
图3 交通灯控制模块图4 点阵显示模块
图5 倒计时计数模块
图6 分频器模块图7 LED显示模块
关键代码见最后
首先对于50MHz 使用,我们要进行分频,把其分成1KHz、2Hz、1Hz,三种频率。1KHz用于点阵显示的扫描频率,1Hz用于计数器计时,2Hz用于交通灯的闪烁情况。
关于交通灯的控制模块,输入clk 为2Hz ,接信号灯实现闪烁,两次上升时间为1秒;输入k2 是控制20秒和30秒的切换;w1~w2 相当于使能端,用于之后控制交警模式信号灯明暗情况并使LED保持在00 的状态。
倒计时计数模块实现简单的倒计时计数的功能。Clk 为计数脉冲;k1 是20和30秒之间的切换,k2 是交警模式保持00的使能端。
点阵模块实现16×16点阵显示,同时使能端使在东西向绿灯期间,点阵显示自己的姓名;在南北向绿灯期间,点阵显示自己的学号后3位。clk 是逐行显示进位端,clk3列扫描端。k2 是实现滚动功能的开关。
五、模块仿真结果(基础模块仿真,不带使能端):
1.分频器模块
50MHz不能仿真,用50Hz进行模拟。
1Hz:(50-2)/ 2 = 24 ;
5Hz: ( 10- 2) / 2 = 4 ;
CP1 为50Hz 到1Hz
CP2 为50Hz 到5Hz
2.交通灯控制模块
15.125ns 的延时是对num赋值
此后经过20脉冲实现10s (因为clk 频率为2Hz),东西路(灯1)和南北路(灯2)的通车时间均设定为20s(其中,绿灯亮时间为10s,绿灯闪烁时间为5s,黄灯闪烁时间为5s)。数码管的时间总是显示为20、19、18、17……2、1、0、20、19、18……。在显示时间小于等于5秒的时候,通车方向的黄灯闪烁。
3.倒计时计数模块
gw 为个位,sw 为十位。倒计时19.18.17……3.2.1.0 计数。
4.LED灯显示模块
LED 为共阳极 0 亮,1 不亮。
六、总结与讨论
七.各模块关键代码
1.分频器
module divider(clk,CP1_1hz,CP2_2hz,CP3_1khz);
input clk;
output CP1_1hz,CP2_2hz,CP3_1khz;
reg CP1_1hz,CP2_2hz,CP3_1khz;
reg [31:0] n1,n2,n3;
initial
begin
CP1_1hz=0;
CP2_2hz=0;
CP3_1khz=0;
n1=0;
n2=0;
n3=0;
end
always@(posedge clk)
begin
if(n1==32'd2*******)
begin
n1=32'd0;
CP1_1hz <= ~CP1_1hz;
end
else n1=n1+1;
if(n2==32'd1*******)
begin
n2=32'd0;
CP2_2hz <= ~CP2_2hz;
end
else n2=n2+1;
if(n3==32'd24999)
begin
n3=32'd0;
CP3_1khz <= ~CP3_1khz;
end
else n3=n3+1;
end
endmodule
2.信号灯控制
module
control(clk,red1,yellow1,green1,red2,yellow2,green2,k,k2,w1,w2,w3,w4);
input clk,k2,w1,w2,w3,w4;
output red1,yellow1,green1,red2,yellow2,green2;
reg red1,yellow1,green1,red2,yellow2,green2,nb;
output reg [5:0]k;
reg [6:0]num;
initial
num=0;
always @(posedge clk)
begin
if((w1+w2+w3+w4)>1) begin red1=1;red2=1;green1=0;green2=0; end //判断交警模式操作间隔,w1~w4 同时连接或门给LED信号.有延时
else begin
begin
if(k2==0) //此处条件为20,30切换
begin
if(w1==1) num<=10;
else if(w2==1) num<=50;
else num<=(num==(7'd79))?1'd0:(num+1'd1);
if(num>0&&num<(20))
begin
k=6'd0;
red1=0;yellow1=0;green1=1;red2=1;yellow2=0;green2=0;k=6'd0; end
else if((num>(19))&&num<(30)) // no.1 green flash
begin
k=6'd1;
red1=1;
if(num%2==0)
green1=1;
else
green1=0;
end
else if(num>(29)&&num<(40)) // no.1 yellow flash
begin
k=6'd2;
red1=0;
if(num%2==0)
yellow1=1;
else
yellow1=0;
end
else if(num>(39)&&num<(60))
begin
k=6'd3;
red1=1;yellow1=0;green1=0;
red2=0;yellow2=0;green2=1;
end
else if(num>(59)&&num<(70)) // no.2 green flash begin
k=6'd4;
red2=1;
if(num%2==0)
green2=1;
else
green2=0;
end
else if(num>(69)&&num<(80)) // no.2 yellow flash begin
k=6'd5;
red2=0;
if(num%2==0)
yellow2=1;
else
yellow2=0;
end
if(w3==1) begin red1=1;yellow1=0;yellow2=0;if(green1==0) green1=1; else green1=0; end//
if(w4==1) begin red2=1;yellow1=0;yellow2=0;if(green2==0) green2=1; else green2=0; end//
end
else
begin //k2!=0 此处切换为30s
if(w1==1) num<=20;
else if(w2==1) num<=70;
else num<=(num==(7'd119))?1'd0:(num+1'd1);
if(num>0&&num<40)
begin
k=6'd0;
red1=0;yellow1=0;green1=1;red2=1;yellow2=0;green2=0;k=6'd0;
end
else if((num>39)&&num<50) // no.1 green flash
begin
k=6'd1;
red1=1;
if(num%2==0)
green1=1;
else
green1=0;
end
else if(num>49&&num<60) // no.1 yellow flash begin
k=6'd2;
red1=0;
if(num%2==0)
yellow1=1;
else
yellow1=0;
end
else if(num>59&&num<100)
begin
k=6'd3;
red1=1;yellow1=0;green1=0;
red2=0;yellow2=0;green2=1;
end
else if(num>99&&num<110) // no.2 green flash begin
k=6'd4;
red2=1;
if(num%2==0)
green2=1;
else
green2=0;
end
else if(num>109&&num<120) // no.2 yellow flash
begin
k=6'd5;
red2=0;
if(num%2==0)
yellow2=1;
else
yellow2=0;
end
else if(w3==1) begin red1=1;yellow1=0;yellow2=0;if(green1==0) green1=1; else green1=0; end//
else if(w4==1) begin red2=1;yellow2=0;yellow1=0;if(green2==0) green2=1; else green2=0; end//
end end end end
endmodule
3.倒计时计数器
module nback(clk,gw,sw,k1,k2);
input clk,k1,k2;
output [3:0]gw,sw;
reg [3:0]gw,sw;
reg flag;
always@(posedge clk)
begin
if(k2==1) begin
gw=4'b0000;
sw=4'b0000; end
else begin
if(gw==4'b0000&&sw==4'b0000) begin
gw=4'b1001;
if(k1==1)
sw=4'b0010;
else sw=4'b0001;
end
else if(gw==4'b0000)
begin
gw=4'b1001;
sw=sw-4'b0001;
end
else
begin
gw=gw-4'b0001;
end
end
end
endmodule
4.LED灯模块
module led7(input [3:0] cnt,output reg[6:0]led);