完整版FPGA毕业课程设计交通灯.docx
- 文档编号:23792706
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:20
- 大小:84.58KB
完整版FPGA毕业课程设计交通灯.docx
《完整版FPGA毕业课程设计交通灯.docx》由会员分享,可在线阅读,更多相关《完整版FPGA毕业课程设计交通灯.docx(20页珍藏版)》请在冰豆网上搜索。
完整版FPGA毕业课程设计交通灯
目录
1.设计思路1
1.1设计思想1
1.2系统功能与要求1
1.3总体设计2
2.主要模块设计程序4
2.1时基脉冲发生模块4
2.2技术及红绿灯控制模块5
2.3译码模块9
2.4主程序11
3.所实现功能说明14
3.1实现功能14
3.2仿真波形14
4.所设计原理图及故障分析15
5.心得体会17
参考文献18
附录1元件清单19
附录2管脚20
1.设计思路
1.1设计思想
交通灯是城市交通监管系统的重要组成部分,对于保证机动车辆的安全运行,维持城市道路的顺畅起到了重要作用。
目前很多城市交叉路口的交通灯实行的是定时控制,灯亮的时间是预先设定好的,在时间和空间方面的应变性能较差,一定程度上造成了交通资源的浪费,加重了道路交通压力。
本文在EDA技术的基础上,利用FPGA的相关知识设计了交通灯控制系统,可以根据实际情况对灯亮时间进行自由调整,整个设计系统通过Max+PlusⅡ软件进行了模拟仿真,并下载到FPGA器件中进行硬件的调试,验证了设计的交通信号灯控制电路完全可以实现预定的功能,具有一定的实用性。
1.2系统功能与要求
交通灯控制器控制两个主干道交叉路口的交通,路口车辆多,直行信号、左转弯信号分开显示,a,b两个主干道的通行时间相等,其中指示直行的绿灯亮30s,指示左转弯的绿灯亮12s,绿灯变至红灯时,黄灯亮3s,以便于车辆能停在停车线内,红灯信号的最后3s相应的黄灯也同时亮,以便提示驾驶人员准备起步。
在两个主干道路口都配备传感器用来检测有无车辆通行。
当两个主干道都有车辆时,自动处于主干道a绿灯,主干道b红灯的状态,然后轮流切换通行。
当主干道a无车辆时,自动处于主干道b绿灯,主干道a红灯的状态;反之亦然,以提高通行效率。
所设计的交通信号灯控制电路,主要适用于在两条干道汇合点形成的十字交叉路口,路口设计两组红绿灯分别对两个方向上的交通运行状态进行管理。
交通灯的持续闪亮时间由键盘输入控制。
灯亮规则为:
当B方向的红灯亮时,A方向对应绿灯亮,由绿灯转换成红灯的过渡阶段黄灯亮,即B方向红灯亮的时间等于A方向绿灯和黄灯亮的时间之和。
同理,当A方向的红灯变亮时,B方向的交通灯也遵循此规则。
各干道上安装有数码管,以倒计时的形式显示本道各信号灯闪亮的时间。
当出现特殊情况时,各方向上均亮红灯,倒计时停止。
特殊运行状态结束后,控制器恢复原来的状态,继续运行。
图1十字路口示意图
1.3总体设计
首先由晶振产生出发信号,由控制器处理成1HZ的时钟,利用此时钟进行计数,通过判断计数的值来控制交通灯的亮灭。
通过每种灯亮的时间总数与计数值比较得到数码管应该显示的数值,利用分位程序将其分成十位和个位。
通过译码电路来实现数码管的显示。
本实验所使用的芯片为EPF10K10LC84-4。
整个系统主要由计数模块、控制模块、分频模块、分位模块以及显示电路构成。
其中分频模块主要将系统输入的基准时钟信号转换为1Hz的激励信号,驱动计数模块和控制模块工作。
控制模块根据计数器的计数情况对交通灯的亮灭及持续时间进行控制,并通过分位电路将灯亮时间以倒计时的形式通过数码管显示出来。
由设计任务要求可知,输入部分有:
CLK时钟频率输入,可由实验板上直接提供,为准确确定时间长度,选择High挡的1MHz高平信号;无车状态按键KEY,当按一下键,表示路上无车,信息学院路道路显示红灯,东风路显示绿灯。
有车时两路红绿交替。
输出部分有:
东西方向和南北方向各使用4个LED显示,红黄绿各代表红黄绿灯,绿灯和另一个红灯同时亮时为左转时间;东西方向和南北方向计时均为2位数,共需要4个LED七段数码管显示。
Time信号输出显示的内容。
图2总体设计图
2.主要模块设计程序
2.1时基脉冲发生模块
在红绿灯交通信号系统中,大多数的情况是通过自动控制的方式指挥交通的。
因此,为了避免意外事件的发生,电路必须给出一个稳定的时钟才能让系统正常的工作。
因此时钟发生模块最主要的功能就是产生一些稳定的输出信号,并将其用做后面几个电路的使能控制与同步信号。
通过编程实现1Hz脉冲的产生,程序如下所示。
LibraryIEEE;
useIEEE.std_logic_1164.all;
ENTITYCLKGENIS
PORT(CLK:
INSTD_LOGIC;
CLK1:
OUTSTD_LOGIC);
ENDCLKGEN;
ARCHITECTUREbehavOFCLKGENIS
SIGNALCNTER:
INTEGERRANGE0TO;
BEGIN
PROCESS(CLK)BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCNTER=THENCNTER<=0;
ELSECNTER<=CNTER+1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CNTER)
BEGIN
IFCNTER=THENCLK1<='1';
ENDIF;
IFCNTER=THENCLK1<='0';
ENDIF;
ENDPROCESS;
ENDbehav;
2.2计数及红绿灯控制模块
南北向和东西向各有一组红黄绿灯,各自持续的时间为分别为25s、5s、20s。
通过编程可以实现控制各通道的计数控制且输出为二进制数,并且可以控制各灯的亮灭情况,高电平为亮,低电平为灭。
东西向模块程序为:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydaolu1is
port(
clk:
instd_logic;
timel:
outstd_logic_vector(4downto0);
r,g,t:
outstd_logic);
enddaolu1;
architecturedaoduofdaolu1is
typecoloris(green,yellow,red);
begin
process(clk)
variablereset:
std_logic:
='0';
variabletempr,tempg,tempt:
std_logic;
variabletemp_l:
std_logic_vector(4downto0);
variabletemp_color:
color:
=green;
begin
if(clk'eventandclk='1')then
casetemp_coloris
whenyellow=>
tempr:
='1';
tempg:
='0';
tempt:
='0';
caseresetis
when'0'=>
temp_l:
="00100";
reset:
='1';
whenothers=>
casetemp_lis
when"00000"=>
temp_l:
="11000";
temp_color:
=red;
whenothers=>
temp_l:
=temp_l-1;
endcase;
endcase;
whengreen=>
tempr:
='0';
tempg:
='0';
tempt:
='1';
caseresetis
when'0'=>
temp_l:
="10011";
reset:
='1';
whenothers=>
casetemp_lis
when"00000"=>
temp_l:
="00100";
temp_color:
=yellow;
whenothers=>
temp_l:
=temp_l-1;
endcase;
endcase;
whenred=>
tempr:
='0';
tempg:
='1';
tempt:
='0';
caseresetis
when'0'=>
temp_l:
="11000";
reset:
='1';
whenothers=>
casetemp_lis
when"00000"=>
temp_l:
="10011";
temp_color:
=green;
whenothers=>
temp_l:
=temp_l-1;
endcase;
endcase;
endcase;
endif;
timel<=temp_l;
r<=tempr;
g<=tempg;
t<=tempt;
endprocess;
end;
南北向模块程序为:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydaolu2is
port(
clk:
instd_logic;
time2:
outstd_logic_vector(4downto0);
r1,g1,t1:
outstd_logic
);
enddaolu2;
architecturedaoluofdaolu2is
typecoloris(red,green,yellow);
begin
process(clk)
variablereset:
std_logic:
='0';
variabletempr,tempg,tempt:
std_logic;
variabletemp_l:
std_logic_vector(4downto0);
variabletemp_color:
color:
=red;
begin
if(clk'eventandclk='1')then
casetemp_coloris
whenyellow=>
tempr:
='1';
tempg:
='0';
tempt:
='0';
caseresetis
when'0'=>
temp_l:
="00100";
reset:
='1';
whenothers=>
casetemp_lis
when"00000"=>
temp_l:
="11000";
temp_color:
=red;
whenothers=>
temp_l:
=temp_l-1;
endcase;
endcase;
whengreen=>
tempr:
='0';
tempg:
='0';
tempt:
='1';
caseresetis
when'0'=>
temp_l:
="10011";
reset:
='1';
whenothers=>
casetemp_lis
when"00000"=>
temp_l:
="00100";
temp_color:
=yellow;
whenothers=>
temp_l:
=temp_l-1;
endcase;
endcase;
whenred=>
tempr:
='0';
tempg:
='1';
tempt:
='0';
caseresetis
when'0'=>
temp_l:
="11000";
reset:
='1';
whenothers=>
casetemp_lis
when"00000"=>
temp_l:
="10011";
temp_color:
=green;
whenothers=>
temp_l:
=temp_l-1;
endcase;
endcase;
endcase;
endif;
time2<=temp_l;
r1<=tempr;
g1<=tempg;
t1<=tempt;
endprocess;
end;
2.3译码模块
计数控制电路输出为二进制码,要想用数码管显示计数需要把二进制码变为七段码。
通过编程先把二进制码转换为BCD码再把BCD码转换为七段码实现程序如下:
将二进制码转化为BCD码的程序如下:
libraryieee;
useieee.std_logic_1164.all;
entityyimais
port(time:
instd_logic_vector(4downto0);
tim:
outstd_logic_vector(7downto0));
endyima;
architectureoneofyimais
begin
process(time)
begin
casetimeis
when"00000"=>tim<="";
when"00001"=>tim<="";
when"00010"=>tim<="";
when"00011"=>tim<="";
when"00100"=>tim<="";
when"00101"=>tim<="";
when"00110"=>tim<="";
when"00111"=>tim<="";
when"01000"=>tim<="";
when"01001"=>tim<="";
when"01010"=>tim<="";
when"01011"=>tim<="";
when"01100"=>tim<="";
when"01101"=>tim<="";
when"01110"=>tim<="";
when"01111"=>tim<="";
when"10000"=>tim<="";
when"10001"=>tim<="";
when"10010"=>tim<="";
when"10011"=>tim<="";
when"10100"=>tim<="";
when"10101"=>tim<="";
when"10110"=>tim<="";
when"10111"=>tim<="";
when"11000"=>tim<="";
whenothers=>NULL;
endcase;
endprocess;
end;
将BCD码转化为七段码的程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityyima1is
port(jin:
instd_logic_vector(3downto0);
chu:
outstd_logic_vector(6downto0));
endyima1;
architectureartofyima1is
begin
process(jin)is
begin
casejinis
when"0000"=>chu<="";
when"0001"=>chu<="";
when"0010"=>chu<="";
when"0011"=>chu<="";
when"0100"=>chu<="";
when"0101"=>chu<="";
when"0110"=>chu<="";
when"0111"=>chu<="";
when"1000"=>chu<="";
when"1001"=>chu<="";
whenothers=>chu<="";
endcase;
endprocess;
endarchitectureart;
2.4主程序
在红绿灯交通信号系统中,大多数的情况是通过自动控制的方式指挥交通的。
主程序从整体上把握程序流程,程序如下所示。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityjtdis
port(clk:
instd_logic;
r,g,t,r1,g1,t1:
outstd_logic;
dout1,dout2,dout3,dout4:
outstd_logic_vector(6downto0));
endentityjtd;
architectureartofjtdis
componentclkgendaolu1is
port(
clk:
instd_logic;
clk1:
outstd_logic);
endcomponentclkgen;
componentdaolu1is
port(
clk:
instd_logic;
timel:
outstd_logic_vector(4downto0);
r,g,t:
outstd_logic);
endcomponentdaolu1;
componentdaolu2is
port(
clk:
instd_logic;
time2:
outstd_logic_vector(4downto0);
r1,g1,t1:
outstd_logic);
endcomponentdaolu2;
componentyimais
port(time:
instd_logic_vector(4downto0);
tim:
outstd_logic_vector(7downto0));
endcomponentyima;
componentyima1is
port(shr:
instd_logic_vector(4downto0);
chu:
outstd_logic_vector(7downto0));
endcomponentyima1;
signalad1,ad2:
std_logic_vector(4downto0);
signalac1,ac2:
std_logic_vector(7downto0);
begin
u0:
clkgenportmap(clk1=>clk)
u1:
daolu1portmap(clk=>clk,g=>g,t=>t,r=>r,timel=>ad1);
u2:
daolu2portmap(clk=>clk,g1=>g1,t1=>t1,r1=>r1,time2=>ad2);
u3:
yimaportmap(time=>ad1,tim=>ac1);
u4:
yimaportmap(time=>ad2,tim=>ac2);
u5:
yima1portmap(shr=>ac1(3downto0),chu=>dout1);
u6:
yima1portmap(shr=>ac1(7downto4),chu=>dout2);
u7:
yima1portmap(shr=>ac2(3downto0),chu=>dout3);
u8:
yima1portmap(shr=>ac2(7downto4),chu=>dout4);
endarchitectureart;
3.所实现功能说明
3.1实现功能
东风路和信息学院路各有一组绿,转弯,红,黄灯,各自的持续时间分别为10s,10s,25s,5s;当无车情况时,东风路(daolu1)显示绿灯,信息学院路(daolu2)显示红灯。
当情况结束后,控制器恢复原来状态,继续正常工作。
用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的剩余时。
3.2仿真波形
图3
图4
4.所设计原理图及故障分析
图5交通灯控制原理图
所设计的交通信号灯控制电路,主要适用于在两条干道汇合点形成的十字交叉路口,路口设计两组红绿灯分别对两个方向上的交通运行状态进行管理。
交通灯的持续闪亮时间由键盘输入控制。
灯亮规则为:
当B方向的红灯亮时,A方向对应绿灯亮,由绿灯转换成红灯的过渡阶段黄灯亮,即B方向红灯亮的时间等于A方向绿灯和黄灯亮的时间之和。
同理,当A方向的红灯变亮时,B方向的交通灯也遵循此规则。
各干道上安装有数码管,以倒计时的形式显示本道各信号灯闪亮的时间。
当出现特殊情况时,各方向上均亮红灯,倒计时停止。
特殊运行状态结束后,控制器恢复原来的状态,继续运行。
系统的硬件设计及调试:
所设计的这个系统的主要逻辑设计由一片型号为EPlK30TC144-3芯片完成,编写的VHDL源程序在Altera公司的逻辑综合工具Max+PlusⅡ下经过编译和功能仿真测试后,针对下载芯片进行管脚配置,下载到EPlK30TC144-3芯片中,进行相应的硬件调试,调试结果与软件仿真的结果相吻合,验证了设计完成了预定功能。
基于VHDL设计交通灯控制器,外围电路少、功耗低、可靠性高,便于系统功能的修改,设计效率高。
故障及分析:
对程序的选择分支认识不清楚,case语句嵌套不正确,编译后系统宏单元超出,修改嵌套关系后,宏单元大幅下降。
将程序编译引脚后,显示不是如同波形。
编写一个5-8译码器加入后,可显示正确。
黄灯时闪烁问题解决:
在黄灯控制线输出和时钟信号相与。
5.心得体会
通过综合实验的思考和设计,对一个项目的整体设计有了进一步认识,加深了对VHDL语言的了解,提高了编程能力。
同时,锻炼了独立发现问题解决问题的能力,提高了个人素质。
利用硬件描述语言VHDL编程,借助Altera公司的Ma
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整版 FPGA 毕业 课程设计 交通灯