基于FPGA的交通灯设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]

东西向 交通灯

南北向 交通灯

数码管显示

输入

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;

相关文档
最新文档