基于FPGA实现的交通灯控制器详解.docx
- 文档编号:27079035
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:22
- 大小:687.76KB
基于FPGA实现的交通灯控制器详解.docx
《基于FPGA实现的交通灯控制器详解.docx》由会员分享,可在线阅读,更多相关《基于FPGA实现的交通灯控制器详解.docx(22页珍藏版)》请在冰豆网上搜索。
基于FPGA实现的交通灯控制器详解
基于FPGA实现的交通灯控制器
一、实验室名称
通信实验室(实训楼二楼)
二、实训内容
本实验为VerilogHDL的程序设计仿真,通过实验掌握状态机,时序CLK的控制模块,及时序同步的控制方式。
实验题目:
基于FPGA实现的交通灯控制器
实验要求:
1.LED灯显示交通灯状态。
2.7段数码管显示当前状态剩余时间。
状态要求:
1.主干道绿灯亮35s支道绿灯亮25s。
2.当主干道绿灯亮时,支道亮红灯。
3.由绿灯转红灯时,黄灯亮5s。
三、实训步骤
3.1设计思路和原理
本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。
设定东西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续35S后,主干道和支干道上的黄灯都亮启,持续5S后,主干道上红灯亮启,支干道上绿灯亮启持续25S,之后主干道和支干道上的黄灯都亮启5s,一个循环完成。
循环往复的直行这个过程。
其过程如下图所示:
3.2实现方法
本次采用文本编辑法,即利用VerilogHDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。
设计中用两组红黄绿LED模拟两个方向上的交通灯,用两个7段数码管显示主干道上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
3.3整体设计
交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:
说明:
该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。
进入10状态两路黄灯亮起。
结束一个循环,从00状态重新开始循环。
为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:
图3.交通灯控制系统结构图
其中rst为复位信号,clk为时钟信号,hold为特殊情况控制信号,输入hold时两个方向红灯无条件亮起。
3.4具体设计
根据整体设计要求,编写各个功能部分VerilogHDL程序,设置各输入输出变量说明如下
clk//实验箱1KHz的时钟计时
g1,g2,r1,r2,y1,y2;//g、r、y依次为绿green红red黄灯yellow,1为主干道,2为支道
smg;//定义一个smg,用于控制数码管输出数值
led;//led控制使用的数码管
state,next_state;//状态控制
ctrl;//定义一个ctrl,用于控制数码管显示smg1或smg2的值
a;//定义一个a,用于判断在当前状态下,是进行数值初始化,还是计时
smg1,smg2;//smg1为个位,smg2为十位
clk1m;//计数1秒
cnt;//产生1秒
3.4.1画出状态图
3.4.2写出状态表
g1
g2
r1
r2
y1
y2
smg1
smg2
State0
1
0
0
1
0
0
0101
0011
State1
0
0
0
1
1
0
0101
0000
State2
0
1
1
0
0
0
0101
0010
State3
0
0
1
0
0
1
0101
0000
3.4.3写出程序
3.4.3.1输入输出及中间变量设置如下:
moduleqiuge80fen(clk,g1,g2,r1,r2,y1,y2,smg,led);
inputclk;
outputregg1,g2,r1,r2,y1,y2;//g、r、y依次为绿、红、黄灯,1为主干道,2为支道
outputreg[7:
0]smg;//smg控制数码管输出数值
outputreg[1:
0]led;//led控制使用的数码管
reg[1:
0]state,next_state;//状态控制
reg[3:
0]ctrl;//ctrl为控制数码管显示smg1或smg2的值
rega;//a用来判断在当前状态下,是进行数值初始化,还是计时
reg[3:
0]smg1,smg2;//smg1为个位,smg2为十位
regclk1m;//计数1秒
reg[8:
0]cnt;//产生1秒
parameterstate0=2'b00,state1=2'b01,state2=2'b10,state3=2'b11;//定义状态机
3.4.3.2状态转换控制以及状态:
always@(posedgeclk1m)//在每秒的在上升沿运行,
begin
state=next_state;//记录当前状态
case(state)//通过case来选择当前状态
state0:
begin
if(!
a)begin//a=0时进行状态初始化
smg1=4'b0101;//5
smg2=4'b0011;//3
a=1;
g1=1;
g2=0;
r1=0;
r2=1;
y1=0;
y2=0;
end
elsebegin//a不为0时进行倒计时
if(!
smg1&&!
smg2)begin//当smg1、smg2都为0时,将state进入state1状态
next_state=state1;
a=0;//重设a值
end
elseif(smg1=='b0000)begin//当个位为0是,将个位重设为9,十位减1
smg1=4'b1001;
smg2=smg2-1;
end
else//当十位为0个位不为0时,个位减1
smg1=smg1-1;
end
end
state1:
begin//状态1与状态0运行大致相同
if(!
a)begin
smg1=4'b0101;//5
smg2=4'b0000;//0
a=1;
g1=0;
g2=0;
r1=0;
r2=1;
y1=1;
y2=0;
end
elsebegin
if(smg1=='b0000)begin
next_state=state2;
a=0;
end
else
smg1=smg1-1;
end
end
state2:
begin//状态2与状态0运行大致相同
if(!
a)begin
smg1=4'b0101;//5
smg2=4'b0010;//2
a=1;
g1=0;
g2=1;
r1=1;
r2=0;
y1=0;
y2=0;
end
elsebegin
if(!
smg1&&!
smg2)begin
next_state=state3;
a=0;
end
elseif(smg1=='b0000)begin
smg1=4'b1001;
smg2=smg2-1;
end
else
smg1=smg1-1;
end
end
state3:
begin//状态3与状态0运行大致相同
if(!
a)begin
smg1=4'b0101;//5
smg2=4'b0000;//0
a=1;
g1=0;
g2=0;
r1=1;
r2=0;
y1=0;
y2=1;
end
elsebegin
if(smg1=='b0000)begin
next_state=state0;
a=0;
end
else
smg1=smg1-1;
end
end
endcase
3.4.3.3计时信号
/*产生1秒*/
always@(posedgeclk)
begin
if(cnt==500)
begin
cnt=0;
clk1m=~clk1m;
end
else
cnt=cnt+1;
end
3.4.3.4数码管的译码及扫描显示
always@(posedgeclk)//每当时钟脉冲上升沿到来时运行
begin
if(led==2'b00)begin//判断led位选信号的状态
led=led+1;//led=00时,led+1
ctrl=smg1;//当led=0时,点亮第一个数码管
end
elsebegin
led=0;//当led=01时,led清零
ctrl=smg2;end//当led=01时,点亮第二个数码管
end
always@(ctrl)//每当ctrl变化时进行
begin
case(ctrl)//通过case语句来判断数码管显示的数值
'b0000:
smg='b00111111;//显示0
'b0001:
smg='b00000110;//显示1
'b0010:
smg='b01011011;//显示2
'b0011:
smg='b01001111;//显示3
'b0100:
smg='b01100110;//显示4
'b0101:
smg='b01101101;//显示5
'b0110:
smg='b01101101;//显示6
'b0111:
smg='b00000111;//显示7
'b1000:
smg='b01111111;//显示8
'b1001:
smg='b01101111;//显示9
endcase
3.5导入程序
打开QuartusII8.1,点击File,NewProjectWaizard:
Introdution,点击Next创建新的工程给命名为qiuge80fen,点击next,选择cycloneIII芯片,类型为FPGA,芯片型号EP3C40F78C08,点击File>New>DesignFile>VerilogHDlFile建立VerilogHDl编译环境。
将之前程序导入工程中,点击工具栏中的StartCompilation进行编译。
3.6管脚分配
在前面选择好一个合适的目标器件(在这个实验中选择为EP3C40F780C8),完成设计的分析综合过程,得到工程的数据文件以后,需要对设计中的输入、输出引脚指定到具体的器件管脚号码,指定管脚号码称为管脚分配或管脚锁定。
点击Assignments菜单下面的AssignmentEditor,进入到引脚分配窗口,首先将要分配管脚的信号放置在To下方。
双击To下方的New,选择NodeFinder进入如图1-18所示的NodeFinder对话框界面。
Filter窗口选择Pins:
all,在Named窗口中输入“*”,点击List在NodesFound窗口出现所有信号的名称,点击中间的>>按钮点击OK,再按分配管脚如下图
完成后点击工具栏中的StartCompilation进行编译。
3.7波形仿真
点击File,new,选择Verification/DebuggingFile中的VectorWaveform来建立一个波形仿真工程,右键点击Name,选择Insert>InsertNodeorBus。
点击NodeFinder选择Pins:
all再点击List并全部导入,点击clk,在编辑栏点击overwriteclock,在Period选择1.0ms点击OK。
在状态栏点击Edit>EndTime,选择80s。
再点击Processing>simulatorTool,点击GenerateFunctionalSimulatorNetlist建立波形网,再点击start进行仿真,等仿真结束,点击Report查看生成波形仿真。
3.8烧录程序到开发箱
点击QuartusII8.1中的Tool选择programmer,点击Hardwaresetup选择USB-Blaster传输方式,点击start将程序烧入LTE-SOPC-02FBEDA开发箱中。
查看开发箱的工作状态。
四、实训数据及结果分析
通过以上实验得出以下数据:
1.波形仿真结果:
2.开发箱运行结果:
状态0:
状态1:
状态2:
状态3:
五、思考与总结
在设计中采用VerilogHDL语言设计交通灯控制系统,借助其功能强大的语言结构,简明的代码描述复杂控制逻辑设计,与工艺无关特性,在提高工作效率的同时达到求解目的,并可以通过VerilogHDL语言的综合工具进行相应硬件电路生成,具有传统逻辑设计方法所无法比拟的优越性。
在设计过程中,觉得最难的部分是波形仿真部分,虽然程序编译通过但仿真出不了正确的波形,不是计数器无法正常计数,就是控制输出无法进入到下一个状态,每次出现问题就必须返回重新修改程序。
实践证明,在编写一个较复杂的程序时,一开始一定要画流程图,弄清楚各个功能及实现它们的逻辑算法,做到心中有数后在开始下笔写编写程序。
在编写的时候要尤其要注意语言的规范,如本次设计中编写的Verilog在Quartus7.0中可以正常生成时序图,而在低版本的软件中却无法生成,原因就是语言使用不规范,在解决这个问题时我总结了一些经验,首先程序要逻辑清晰,简洁明了,避免不必要的嵌套与条用,其次要适当地给程序加上注解文字,提高可读性,以方便之后的程序出错时进行查找,最后充分利用仿真软件提供的各项编译工具与报错消息,按图索骥,有方向的完成程序调试。
完成仿真后进行,进行试验箱上的硬件调试,该步骤主要是要求细心,按照引脚清单,逐一完成连线,本次设计用到两个时钟输入,注意一定要选择合适频率的时钟,以便达到期望的效果。
注意观察实物的现象,看是否满足设计要求,不满足时检查是硬件问题还是程序问题,如果是程序问题,在修改完之后必须要重新编译,重新烧入。
不断排查错误,直至达到满意的效果。
通过这次课程设计,熟悉了简单EDA设计的整个流程,加深了对VerilogHDL硬件描述语言的理解,提高了动手能力,并且锻炼了自己的耐心,收获颇丰,我会把在本次课程设计中学到的东西应用到今后的工作学习中。
最后感谢同学及老师提供的帮助与指导。
六、附录
moduleqiuge80fen(clk,clr,g1,g2,r1,r2,y1,y2,smg,led);
inputclk,clr;
outputregg1,g2,r1,r2,y1,y2;
outputreg[7:
0]smg;
outputreg[1:
0]led;
reg[1:
0]state,next_state;
reg[3:
0]ctrl;
rega;
reg[3:
0]smg1,smg2;
regclk1m;
reg[8:
0]cnt;
parameterstate0=2'b00,state1=2'b01,state2=2'b10,state3=2'b11;
always@(posedgeclk)
begin
if(cnt==500)
begin
cnt=0;
clk1m=~clk1m;
end
else
cnt=cnt+1;
end
always@(posedgeclk1m)
begin
state=next_state;
case(state)
state0:
begin
if(!
a)begin
smg1=4'b0101;//5
smg2=4'b0011;//3
a=1;
g1=1;//1主
g2=0;
r1=0;
r2=1;
y1=0;
y2=0;
end
elsebegin
if(!
smg1&&!
smg2)begin
next_state=state1;
a=0;
smg1=4'b0000;//清零
smg2=4'b0000;
end
elseif(smg1=='b0000)begin
smg1=4'b1001;
smg2=smg2-1;
end
else
smg1=smg1-1;
end
end
state1:
begin
if(!
a)begin
smg1=4'b0101;//5
smg2=4'b0000;//0
a=1;
g1=0;//1主
g2=0;
r1=0;
r2=1;
y1=1;
y2=0;
end
elsebegin
if(smg1=='b0000)begin
next_state=state2;
a=0;
smg1=4'b0000;//清零
smg2=4'b0000;
end
else
smg1=smg1-1;
end
end
state2:
begin
if(!
a)begin
smg1=4'b0101;//5
smg2=4'b0010;//2
a=1;
g1=0;//1主
g2=1;
r1=1;
r2=0;
y1=0;
y2=0;
end
elsebegin
if(!
smg1&&!
smg2)begin
next_state=state3;
a=0;
smg1=4'b0000;
smg2=4'b0000;
end
elseif(smg1=='b0000)begin
smg1=4'b1001;
smg2=smg2-1;
end
else
smg1=smg1-1;
end
end
state3:
begin
if(!
a)begin
smg1=4'b0101;//5
smg2=4'b0000;//0
a=1;
g1=0;//1主
g2=0;
r1=1;
r2=0;
y1=0;
y2=1;
end
elsebegin
if(smg1=='b0000)begin
next_state=state0;
a=0;
smg1=4'b0000;
smg2=4'b0000;end
else
smg1=smg1-1;
end
end
endcase
end
always@(posedgeclk)
begin
if(led==2'b00)begin
led=led+1;
ctrl=smg1;
end
elsebegin
led=0;
ctrl=smg2;end
end
always@(ctrl)
begin
case(ctrl)
'b0000:
smg='b00111111;//0
'b0001:
smg='b00000110;//1
'b0010:
smg='b01011011;//2
'b0011:
smg='b01001111;//3
'b0100:
smg='b01100110;//4
'b0101:
smg='b01101101;//5
'b0110:
smg='b01101101;//6
'b0111:
smg='b00000111;//7
'b1000:
smg='b01111111;//8
'b1001:
smg='b01101111;//9
/*
'b0000:
smg1='b00111111;
'b0001:
smg1='b00000110;
'b0010:
smg1='b01011011;
'b0011:
smg1='b01001111;
'b0100:
smg1='b01100110;
'b0101:
smg1='b01101101;
'b0110:
smg1='b01111101;
'b0111:
smg1='b00000111;
'b1000:
smg1='b01111111;
'b1001:
smg1='b01101111;
'b0000:
smg2='b00111111;
'b0001:
smg2='b00000110;
'b0010:
smg2='b01011011;
'b0011:
smg2='b01001111;
'b0100:
smg2='b01100110;
'b0101:
smg2='b01101101;
'b0110:
smg2='b01111101;
'b0111:
smg2='b00000111;
'b1000:
smg2='b01111111;
'b1001:
smg2='b01101111;
*/
endcase
end
endmodule
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 实现 交通灯 控制器 详解