交通信号灯控制器课程设计报告.docx
《交通信号灯控制器课程设计报告.docx》由会员分享,可在线阅读,更多相关《交通信号灯控制器课程设计报告.docx(10页珍藏版)》请在冰豆网上搜索。
交通信号灯控制器课程设计报告
交通信号灯控制器课程设计报告
交通信号灯控制器课程报告
一.设计要求
1、设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。
2、主、支干道交替允许通行,主干道每次放行45秒,支干道每次放行25秒,设立45秒、25秒计时、显示电路。
3、在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡。
提示:
1、选择1HZ时钟脉冲作为系统时钟。
2、45秒、25秒、5秒定时信号用倒计时,计时起始信号由主控电路给出,每当计满所需时间,计数器清零,由主控电路启、闭三色信号灯或启动另一计时电路。
2.设计思路
本设计针对一条主干道和一条支干道汇合成的十字路口,进行南北和东西直行情况下交通灯控制。
根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续45S后,主干道和支干道上的黄灯都亮启,持续5S后,主干道上红灯亮启,支干道上绿灯亮启持续25S,之后主干道和支干道上的黄灯都亮启5s,一个循环完成。
循环往复的执行这个过程。
设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
根据状态机的设计规范,本次设计了四个状态之间的循环转化,其真值表及状态转化图如下所示
目前状态
下一状态
输出
Light1
Light2
S0=00
S1=01
001
100
S1=01
S2=10
010
010
S2=10
S3=11
100
001
S3=11
S0=00
010
010
S0
S3
S1
S2
3.程序说明
1.各输入输出变量说明:
clk:
计数时钟
qclk:
扫描显示时钟
rst:
复位信号,当rst为1时,控制器和计数器回到初始状态
en:
使能信号,当en为1时控制器开始工作,en为0时
hold:
特殊情况控制信号,hold为1时,主、支干道方向无条件显示为红灯
seg:
用于数码管的译码输出
dig:
用于选择显示的数码管(片选)
num1:
用于主干道方向灯的时间显示
num2:
用于支干道方向灯的时间显示
light1:
控制主干道方向四盏灯的亮灭,其中,light1[0]~light1[2]分别控制主干道方向的绿灯、黄灯和红灯
light2:
控制支干道方向四盏灯的亮灭,其中,light2[0]~light2[2]分别控制支干道方向的绿灯、黄灯和红灯
2.输入输出及中间变量设置:
moduletraffic(en,clk,qclk,rst,hold,num1,num2,light1,light2,seg,dig;
inputen,clk,qclk,rst,hold;
output[5:
0]dig;
output[7:
0]num1,num2;
output[6:
0]seg;
output[2:
0]light1,light2;
regtim1,tim2;
reg[3:
0]disp_dat;
reg[6:
0]seg;
reg[7:
0]num1,num2;
reg[7:
0]red1,red2,green1,green2,yellow1,yellow2;
reg[5:
0]dig;
reg[1:
0]count;
reg[1:
0]state1,state2;
reg[2:
0]light1,light2;
3.初始状态设置:
always@(en)
if(!
en)
begin
green1<=8'b01000101;
red1<=8'b00100101;
yellow1<=8'b00000101;
green2<=8'b00100101;
red2<=8'b01000101;
yellow2<=8'b00000101;
end
4.主干道方向点亮顺序:
always@(posedgeclk)//主干道
begin
if(rst)
begin
light1<=3'b001;
num1<=green1;
end
elseif(hold)
begin
light1<=3'b100;
num1<=green1;
end
elseif(en)
begin
if(!
tim1)
begin
tim1<=1;
case(state1)
2'b00:
beginnum1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:
beginnum1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:
beginnum1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:
beginnum1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:
light1<=3'b100;
endcase
end
else//主干道倒数计时
begin
if(num1>0)
if(num1[3:
0]==0)
begin
num1[3:
0]<=4'b1001;
num1[7:
4]<=num1[7:
4]-1;
end
elsenum1[3:
0]<=num1[3:
0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
5.支干道方向点亮顺序:
always@(posedgeclk)//支干道
begin
if(rst)
begin
light2<=3'b100;
num2<=red2;
end
elseif(hold)
begin
light2<=3'b100;
num2<=red2;
end
elseif(en)
begin
if(!
tim2)
begin
tim2<=1;
case(state1)
2'b00:
beginnum2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:
beginnum2<=yellow2;light2<=3'b010;state2<=2'b11;end
2'b11:
beginnum2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:
beginnum2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:
light2<=3'b100;
endcase
end
else//支干道倒数计时
begin
if(num2>0)
if(num2[3:
0]==0)
begin
num2[3:
0]<=4'b1001;
num2[7:
4]<=num2[7:
4]-1;
end
elsenum2[3:
0]<=num2[3:
0]-1;
if(num2==1)tim2<=0;
end
end
else
begin
light2<=3'b010;
state2<=2'b00;
tim2<=0;
end
end
6.数码管译码及显示:
always@(posedgeqclk)//定义上升沿触发进程
begin
count<=count+1'b1;
end
always@(count)
begin
case(count)//选择扫描显示数据
2'd0:
disp_dat<=num1[3:
0];//第一个数码管
2'd1:
disp_dat<=num1[7:
4];//第二个数码管
2'd2:
disp_dat<=num2[3:
0];//第三个数码管
2'd3:
disp_dat<=num2[7:
4];//第四个数码管
default:
disp_dat<=0;
endcase
end
always@(count)
begincase(count)//选择数码管显示位
2'd0:
dig<=6'b011111;//选择第一个数码管显示
2'd1:
dig<=6'b101111;//选择第二个数码管显示
2'd2:
dig<=6'b110111;//选择第三个数码管显示
2'd3:
dig<=6'b111011;//选择第四个数码管显示
default:
dig<=6'b111111;
endcase
end
always@(disp_dat)
begin
case(disp_dat)//七段译码
4'b0000:
seg<=7'b0111111;//显示"0"
4'b0001:
seg<=7'b0000110;//显示"1"
4'b0010:
seg<=7'b1011011;//显示"2"
4'b0011:
seg<=7'b1001111;//显示"3"
4'b0100:
seg<=7'b1100110;//显示"4"
4'b0101:
seg<=7'b1101101;//显示"5"
4'b0110:
seg<=7'b1111101;//显示"6"
4'b0111:
seg<=7'b0000111;//显示"7"
4'b1000:
seg<=7'b1111111;//显示"8"
4'b1001:
seg<=7'b1101111;//显示"9"
default:
seg<=7'b0111111;//不显示
endcase
end
endmodule
3.仿真波形图
4.实物图