基于FPGA的交通灯设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:随着经济社会的快速发展,交通灯的优化设计成为提高人们生活水平和
效率,保障人民安全的重要课题。本论文基于交通灯的基本原理:设计的交通灯由一组红黄绿灯信号控制交通灯。基于quatursII软件的Verilog HDL语言设计交通灯代码,采用Protel 99se软件绘制原理图、PCB布线。实现了交通的实物搭建。
关键字:交通灯分频模块
1、引言:交通灯的最重要作用是最优化的形式引导车流、人流,是实现在固定
交通资源约束的情况下,满足较多行人、车辆通过该交叉路段,实现城市交通的畅通。交通灯的工作原理是:行人车辆在各自的行走道上绿灯行、红灯停;交通灯以倒计时的方式实现各车道行人、车辆的交互通行。设计的交通灯由一组红黄绿灯信号控制交通灯。‘1’表示灯亮,‘0’表示灯熄。其中绿灯,黄灯,红灯的持续时间分别为25秒,5秒,20秒。从而实现交通灯的高效运行。
2、系统构架:
交通灯的系统构建是分为时基脉冲发生模块(即秒脉冲发生器)、红绿灯倒计时计数及控制模块(即下图中的定时器、控制器)、译码模块
所设计的交通信号灯控制电路,主要适用于在两条干道汇合点形成的十字交叉路口,路口设计两组红绿灯分别对两个方向上的交通运行状态进行管理。
东西方向和南北方向各使用3个LED显示,红黄绿各代表红黄绿灯,绿灯
亮同时是人行灯。东西方向和南北方向计时均为2位数,共需要4个LED七段
数码管显示。考虑到硬件条件的限制,我们只模拟了其中一组交通灯。Time 信号输出显示的内容。
设计方案:
方案一:采用Verilog HDL 语言直接编写,实现交通灯指挥功能。
方案二:采用模块层次化设计,将此设计分为四个模块:计时模块,状态控制模块,信号灯显示模块,数码扫描显示模块。将四个模块再分别用VHDL 语言编写成,做成原理图模块,用原理图输入法做整个设计的顶层文件。
Clk1 r Key g
t
r1
g1
t1
time1[4..0]
time2[4..0]
c
东西向 交通灯
南北向 交通灯
数码管显示
输入
交
通
灯
的
基
本
系
统
构
架
图
3 软硬件设计
3.1 硬件设计
上图中心为EP4CE622C8N芯片,在实物搭建时,利用LED灯作为交通灯,
数码管作为倒计时计数显示器。
硬件部分为搭建实物电路,即在Quartus软件中Verilog HDL语言编写的交通灯设计与EP4C6E芯片进行引脚一一搭配。实验中,LED灯指示相应的灯是否亮,且能够在相应的持续时间内保持,当计数器倒计时为零时要切换到另一个LED灯。七段数码管的使用需要把BCD码转化为七段码,从而才能进行七段码倒计时。
实物演示需要把一直程序烧录入开发板中,并且引脚必须一一对应正确。
3.2 软件设计
软件部分主要利用protel(Altium Designer也可)软件设计的原理图和PCB图,其中PCB
图需布线和铺铜。在相关的交通灯原理图如下:
脉冲发生器电路原理图:(应用555芯片进行设计)
计数器部分电路、控制器电路原理图如下(分别可以采用两个74LS163芯片联级作为计数倒计时、控制电路用三个74LS153芯片和触发器控制):
译码器部分:(主要是把控制器的输出信息转化为LED灯的亮或灭信息)
在利用QuartusII.12软件进行Verilog编程,主要程序如下:
module ww(CLK,sm_bit,sm_seg,light);
input CLK;//定义时钟引脚
output [3:0]sm_bit;//定义数码管位选引脚
output [6:0]sm_seg;//定义数码管段选引脚
output[2:0]light;//定义两个方向交通灯
reg [3:0]sm_bit_r;
reg [6:0]sm_seg_r;
reg[24:0]count;//定义计数器寄存器
reg sec;//定义秒信号寄存器
reg tim1=0,st1=0;//定义tim1位倒计时是否到达的位标识
reg[1:0]state1,state2,ste;//定义一些状态
reg[2:0]light1;
reg[3:0]num;
reg[7:0]num1,num2;//num1和num2的值为倒计时的值assign sm_bit=sm_bit_r;
assign sm_seg=sm_seg_r;
always@(posedge clk)
begin
count=count+1'b1;
if(count==25'd2*******)//时间达到一秒
begin
count<=25'd0;
sec=~sec;
end
end
always@(posedge clk)
begin
case (count[16:15])
3'd0:sm_bit_r<= num1[3:0];//秒个位
3'd1:sm_bit_r<= num1[7:4]; //秒十位
3'd2:sm_bit_r<= num2[3:0]; //分个位
3'd3:sm_bit_r<= num2[7:4]; //分十位
endcase
case(sm_bit_r) //选择数码管显示位
4'd0:sm_seg_r<= 7'b0111111; //选择第一个数码管显示4'd1:sm_seg_r<= 7'b0000110; //选择第二个数码管显示4'd2:sm_seg_r<= 7'b1011011;
4'd3:sm_seg_r<= 7'b1001111;
4'd4:sm_seg_r<= 7'b1100110;
4'd5:sm_seg_r<= 7'b1101101;
4'd6:sm_seg_r<= 7'b1111101;
4'd7:sm_seg_r <= 7'b0000111;
4'd8:sm_seg_r <= 7'b1111111;
4'd9:sm_seg_r <= 7'b1101111;
endcase
end
always@(posedge sec)
begin
light<=3'b001;
num1<=8'd25;