交通灯控制器的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三交通灯控制器的设计与实现
一、实验目的
1)了解交通灯管理的基本工作原理。
2)熟悉计数器/定时器的工作方式及应用编程。
3)掌握多位LED显示的方法。
二、实验内容
设计一个用于十字路口的交通灯控制器。
基本要求:
东西和南北方向各有一组红、黄、绿灯用于指挥交通,红、黄、绿的持续时间分别为25s,5s,20s。当有紧急情况(如消防车)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,正常工作。一组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间。
三、实验学时:6学时
四、实验步骤
1. 根据实验要求作预习报告。
2. 根据实验需求,进行程序的设计。
3. 根据以前设计的经验,反复调试程序。
4. 调试通过,下载到FPGA开发板上进行实践调试。
5. 完成整个过程,写实验报告。
附:有关管脚配置参看前6次实验的实验指导书
五、实验要求:
实验报告应包含实验目的、实验原理,分析与设计思路,实验程序,对应变量的管脚配置表,实验结果,实验总结。其中具体要求为:
1)程序实现模块化设计,写出设计思路,认真标注代码注释;
2)达到正确地运行结果;
3)实验中出现的问题进行详细总结。
六.实验原理
八段数码显示管的原理,Verilog 程序设计原理,实际情况中交通灯的原理。
七.分析与设计思路
题目要求是东西和南北方向各有一组红、黄、绿灯用于指挥交通,红、黄、绿的持续时间分别为25s,5s,20s。当有紧急情况(如消防车)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,正常工作。一组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间。
根据要求,我们可以有这样的思路:
1. 首先,紧急情况时候,必须两个走向的道路都是红灯。
2. 其次,正常情况下,两个走向的道路必须有一个且只有一个是亮红灯的。
3. 再者,正常情况下,若一条道路亮红灯时,另一条道路必须是绿灯,或者
是黄灯。
除此之外,关于八段数码显示管的显示,我们先采用片选信号选出,然后对这个已选出的数码管进行段选来让它显示指定的数字。
综上所述,同时考虑到时间问题。可以表述如下:
紧急情况时,我们按下路灯控制按钮,让两条道路的红灯同时点亮。
正常情况时,东西走向的道路的红灯亮的同时从25s倒计时,与此同时,南北走向的道路的黄灯亮同时从5s倒计时。当红灯倒计时至20s时,南北走向的道路的黄灯灭绿灯开始从20s倒计时。当两条道路的灯同时到
达0时,两灯同时灭并点亮南北走向道路的红灯从25s倒计时,与此同
时,点亮东西走向的黄灯并从5s开始倒计时,当南北走向的道路的红灯
倒计时至0s时,东西走向的黄灯灭绿灯亮,同时从20s开始倒计时。如此往复循环,就是一个十字路口的交通灯的原理。
八.实验程序
module jiaotongdeng(clk,ji,R,D,L,cs);
input clk,ji;
output R,L,D,cs;
reg tick;
reg [1:0]n;
reg [50:0]i;
reg [10:0]j;
reg[2:0]R;
reg[2:0]L;
reg[7:0]D;
reg[6:0]a;
reg[6:0]cs;
reg[2:0]as;
reg[4:0]ag;
reg[2:0]bs;
reg[4:0]bg;
reg [10:0]m;
always @(posedge clk) //在clk频率下运行begin
if(ji)
begin tick<=tick;end
else
begin
i<=i+1;
if(i==9999999) //对clk信号分频
begin
tick<=~tick;
i<=0;
end
end
end
always@(posedge tick) //在所分频率下运行
begin //当红绿黄灯循环交替一次所用时间为50s,设置变量a控制循环;
if(a==0)
a<=50 ;
else
a<=a-1;
end
always@(posedge clk) //在clk频率下运行;
begin //L表示B方向的红绿黄灯,用D1、2、3信号灯输出表示;R表示A方向的绿黄红灯,用D6、7、8信号灯输出表示;
if (ji) //选用R23开关给出紧急信号,
begin L<=3'b100;R<=3'b100; end // 当波动R23按钮时,A.B方向都亮起红灯;else //在非紧急情况下
begin
if (a<=20) //在前20s的时间里
begin L<=3'b001;R<=3'b100; end //A方向亮绿灯,B方向亮红灯;
else if (a<=25&&a>20) //在21s-25s的时间里,
begin L<=3'b010;R<=3'b100; end // A方向亮黄灯,B方向亮红灯;
else if (a>25&&a<45) //在26s-45s的时间里
begin L<=3'b100;R<=3'b001; end // A方向亮红灯,B方向亮绿灯
else if (a<=50&&a>45) //在46s-50s的时间里
begin L<=3'b100;R<=3'b010; end // A方向亮红灯,B方向亮黄灯
end
end