基于FPGA的交通灯控制器设计Word文件下载.docx
- 文档编号:22840040
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:20
- 大小:663.68KB
基于FPGA的交通灯控制器设计Word文件下载.docx
《基于FPGA的交通灯控制器设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于FPGA的交通灯控制器设计Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
本次采用文本编辑法,即利用VerilogHDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。
设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
VerilogHDL程序设计
2.1整体设计
根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:
图2.交通灯控制状态转化
说明:
该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。
进入10状态两路黄灯亮起。
结束一个循环,从00状态重新开始循环。
为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:
图3.交通灯控制系统结构图
其中rst为复位信号,clk为时钟信号,hold为特殊情况控制信号,输入hold时两个方向红灯无条件亮起。
2.2具体设计
根据整体设计要求,编写各个功能部分VerilogHDL程序,设置各输入输出变量说明如下
clk:
为计数时钟;
qclk:
为扫描显示时钟;
en:
使能信号,为1的话,则控制器开始工作;
rst:
复位信号,为1的话,控制及技术回到初始状态;
hoid:
特殊情况控制信号,为1的话,则两个方向无条件显示为红灯;
light1:
控制主干道方向四盏灯的亮灭;
其中,light1[0]~light[2],分别控制主干道方向的
绿灯、黄灯和红灯;
light2:
控制支干道方向四盏灯的亮灭;
其中,light2[0]~light2[2],分别控制支干道方向的
num1:
用于主干道方向灯的时间显示,8位,可驱动两个数码管;
num2:
用于支干道方向灯的时间显示,8位,可驱动两个数码管;
counter:
用于数码管的译码输出;
st1,st2:
数码管扫描信号。
输入输出及中间变量设置如下:
moduletraffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);
inputen,clk,qclk,rst,hold,rst1;
outputst1,st2;
output[7:
0]num1,num2;
output[6:
0]counter;
output[2:
0]light1,light2;
regtim1,tim2,st1,st2;
reg[1:
0]state1,state2,ste;
reg[2:
0]light1,light2;
reg[3:
0]num;
reg[6:
reg[7:
0]red1,red2,green1,green2,yellow1,yellow2;
1.二极管点亮控制
该部分程序的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段数码管的译码电路。
此外,当检测到特殊情况(hold=‘1’)发生时,无条件点亮红灯的二极管,当检测到复位信号,两个方向计数与控制回复到00状态。
因为主、支干道两个方向二极管点亮的顺序与延迟时间不同,顾编写两个独立的部分来控制,具体程序如下:
1)主干道方向
always@(posedgeclk)
begin
if(rst)//复位与特殊情况控制
begin
light1<
=3'
b001;
num1<
=green1;
end
elseif(hold)
b100;
num1<
elseif(en)
begin//使能有效开始控制计数
if(!
tim1)//
begin//主干道交通灯点亮控制
tim1<
=1;
case(state1)
2'
b00:
beginnum1<
light1<
state1<
=2'
b01;
end
b01:
=yellow1;
b010;
b11;
b11:
=red1;
b10;
b10:
b00;
default:
endcase
2)支干道方向
always@(posedgeclk)
light2<
num2<
=red2;
begin
tim2)
tim2<
beginnum2<
light2<
state2<
=green2;
=yellow2;
2.倒数计时
该部分程序完成二极管发光时延的计数,并将计数结果送到数码管显示电路,每切换到一个状态,计数器的初值都被重置,以实现不同颜色二极管不同的时延要求。
本次设计直接用逻辑运算完成2位十进制数的计数,未采用分位器的设计。
因为主、支干道上计数器的结构完全相同,顾只列出一路的程序,其具体程序如下所示:
else
begin//倒数计时
if(num1>
0)
if(num1[3:
0]==0)
num1[3:
0]<
=4'
b1001;
num1[7:
4]<
=num1[7:
4]-1;
elsenum1[3:
=num1[3:
0]-1;
if(num1==1)tim1<
=0;
end
else
light1<
num1=2'
3.数码管的译码及扫描显示
该段程序主要完成4个7段数码管的译码显示及扫描,使系统能正常显示主、支干道两个方向上的剩余时间。
译码的时钟频率要低,为Hz级。
扫描的时钟频率要高,最低不得小于人眼分辨频率50Hz,具体程序如下所示:
always@(posedgeqclk)
begin//数码管扫描
if(rst1)
st1=0;
st2=0;
else
case({st2,st1})
beginnum<
0];
{st2,st1}<
4];
=num2[3:
=num2[7:
begin//数码管译码显示
case(num)
4'
b0000:
counter<
=7'
b0111111;
//0
b0001:
b0000110;
//1
b0010:
b1011011;
//2
b0011:
b1001111;
//3
b0100:
b1100110;
//4
b0101:
b1101101;
//5
b0110:
b1111101;
//6
b0111:
b0000111;
//7
b1000:
b1111111;
//8
b1001:
b1101111;
//9
default:
endcase
endmodule
总体程序见程序清单所示
仿真与硬件调试
3.1波形仿真
在QuartursⅡ软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。
设置仿真时间,时钟周期,输入输出端口,进行波形仿真。
具体仿真波形图及说明如下所示:
仿真截止时间:
100us;
时钟:
clk1us,qclk0.1us
1.正常工作时波形仿真图
图4.正常工作时波形仿真图
图形说明
波形仿真主要完成了控制与计数以及数码管显示的波形图。
en为低电品时,计数器置初值,高电平时开始正常控制与计数。
控制发光二极管首次输出为“light1=001,light2=100”,表示主干道路绿灯亮,支杆道路红灯亮,计数器num1和num2从“00110101”开始递减计数,计数至“00000000”时,进入下一个状态,控制输出量为light=010,light2=010,表示主、支干道黄灯均亮起,计数器num1和num2从“00000101”开始计数递减,计数至”00000000”时进入下一个状态,light=100,light2=001,表示主干道路红灯亮,支杆道路绿灯亮。
Counter根据num1,num2变化随时钟上升沿输出译码后的数据。
由于屏幕显示大小有限,未仿真出一个完整周期。
2.特殊情况仿真波形
图5.特殊情况仿真波形
当hold输入高电平时,在时钟上升沿的控制下,light1与light2被强制置位为”100”,表示两路红灯均亮起
3.复位情况仿真波形
图6.复位情况仿真波形
当rst输入高电平时,在时钟上升沿控制下,计数与控制都回到00状态,即light1=001,light2=100,计数器num1和num2从“00110101”开始递减计数。
3.2硬件调试
完成时序仿真确认无误后,进行实验箱管脚设置,注意设置完成后一定要再进行一次全局仿真,使程序真正对应于硬件输出输出。
具体连接说明如下所示
输入变量:
rst、clk、qclk、hold、en
其中en,hold,rst接”0-1”拨码开关,以稳定的输出可变化的电平。
计数时钟clk接实验箱上1Hz时钟,扫描显示时钟qclk接125Khz时钟。
输出变量:
light1[2:
0]、light2[2:
0]、counter[6:
0]、st1、st2
其中light1[0]、light2[0]分别接绿色的发光二极管;
light1[1]、light2[1]分别接黄色的发光二极管;
light1[2]、light2[2]分别接红色的发光二极管。
counter[0]~counter[6],分别接七段数码管的a~f,st1、st2分别接试验箱上”4-16”译码器的低两位。
完成接线后将程序烧写到芯片上,开始功能调试。
分辨改变使能信号,复位信号以及特殊情况信号,观察数码管以及发光二级管情况。
程序清单
always@(en)
if(!
en)
begin//设置计数初值
green1<
=8'
b00110101;
red1<
b00100101;
yellow1<
b00000101;
green2<
red2<
yellow2<
tim1)//开始控制
if(num2>
if(num2[3:
num2[3:
num2[7:
elsenum2[3:
if(num2==1)tim2<
state2<
总结
在设计中采用VerilogHDL语言设计交通灯控制系统,借助其功能强大的语言结构,简明的代码描述复杂控制逻辑设计,与工艺无关特性,在提高工作效率的同时达到求解目的,并可以通过VerilogHDL语言的综合工具进行相应硬件电路生成,具有传统逻辑设计方法所无法比拟的优越性。
在设计过程中,觉得最难的部分是波形仿真部分,虽然程序编译通过但仿真出不了正确的波形,不是计数器无法正常计数,就是控制输出无法进入到下一个状态,每次出现问题就必须返回重新修改程序。
实践证明,在编写一个较复杂的程序时,一开始一定要画流程图,弄清楚各个功能及实现它们的逻辑算法,做到心中有数后在开始下笔写编写程序。
在编写的时候要尤其要注意语言的规范,如本次设计中编写的Verilog在Quartus8.1中可以正常生成时序图,而在低版本的软件中却无法生成,原因就是语言使用不规范,在解决这个问题时我总结了一些经验,首先程序要逻辑清晰,简洁明了,避免不必要的嵌套与条用,其次要适当地给程序加上注解文字,提高可读性,以方便之后的程序出错时进行查找,最后充分利用仿真软件提供的各项编译工具与报错消息,按图索骥,有方向的完成程序调试。
完成仿真后进行,进行试验箱上的硬件调试,该步骤主要是要求细心,按照引脚清单,逐一完成连线,本次设计用到两个时钟输入,注意一定要选择合适频率的时钟,以便达到期望的效果。
注意观察实物的现象,看是否满足设计要求,不满足时检查是硬件问题还是程序问题,如果是程序问题,在修改完之后必须要重新编译,重新烧入。
不断排查错误,直至达到满意的效果。
通过这次课程设计,熟悉了简单EDA设计的整个流程,加深了对VerilogHDL硬件描述语言的理解,提高了动手能力,并且锻炼了自己的耐心,收获颇丰,我会把在本次课程设计中学到的东西应用到今后的工作学习中。
参考资料
[1]夏宇闻.复杂数字电路与系统的VerilogHDL设计技术[M].北京:
北京航空航天大学出版社,1998
[2]郭梯云.移动通信[M].西安:
西安电子科技大学出版社,1995
[3][法]MichelMouly,MarieBernadet
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 交通灯 控制器 设计