交通灯.docx
《交通灯.docx》由会员分享,可在线阅读,更多相关《交通灯.docx(14页珍藏版)》请在冰豆网上搜索。
![交通灯.docx](https://file1.bdocx.com/fileroot1/2023-4/16/0678d4f1-1023-49e3-9786-f816e4ee7f2c/0678d4f1-1023-49e3-9786-f816e4ee7f2c1.gif)
交通灯
通信工程学院实验报告
课程名称:
综合电子系统设计
题目:
交通灯控制器
院系:
通信工程学院
班级:
电信091班
专业:
电子信息工程
姓名:
徐州
学号:
208090519
实验时间:
2012.4
指导老师:
冯月琴
实验地点:
信息楼
成绩:
年月日
交通灯控制器
一、实验的目的
要求学生综合所学软件硬件知识,并应用基础实验所获得的实验设计技能,独立设计
能解决实际问题的应用系统。
二、实验任务和要求:
1.能显示十字路口东西、南北两个方向的红、黄、绿的指示状态用两组红、黄、绿三色灯作为两个方向的红、黄、绿灯。
变化规律为:
东西绿灯,南北红灯->东西黄灯,南北红灯->东西红灯,南北绿灯->东西红灯,南北黄灯->东西绿灯,南北红灯……依次循环。
2.能实现正常的到计时功能用两组数码管作为东西和南北方向的允许或通行时间的到计时显示,显示时间为红灯45秒、绿灯40秒、黄灯5秒。
3.能实现紧急状态处理的功能
出现紧急状态(例如消防车,警车执行特殊任务时要优先通行)时,两路上所有车禁止通行,红灯全亮;
(1)显示到计时的两组数码管闪烁;
(2)计数器停止计数并保持在原来的状态;
4.能实现系统复位功能
系统复位后,东西绿灯,南北红灯,东西计时器显示40秒,南北显示45秒。
5.用VHDL语言设计符合上述功能要求的交通灯控制器,并用层次化设计方法设计该电路。
6.个模块的功能用功能仿真的方法验证,可通过有关波形确认电路设计是否正确。
7.完成电路全部设计后,通过系统实验箱下载验证设计课题的正确性。
四:
交通灯控制器的状态:
五、交通灯控制器原理框图:
六、算法流程图:
七、顶层原理图:
8、子模块的设计:
控制部分的设计
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityledcontrolis
port(reset,clk,urgen:
instd_logic;
state:
outstd_logic_vector(1downto0);
sub,set1,set2:
outstd_logic);
endledcontrol;
architectureaofledcontrolis
signalcount:
std_logic_vector(6downto0);
signalsubtemp:
std_logic;
begin
sub<=subtempand(notclk);
statelable
process(reset,clk)
begin
ifreset='1'then
count<="0000000";
state<="00";
elsifclk'eventandclk='1'then
ifurgen='0'thencount<=count+1;subtemp<='1';elsesubtemp<='0';endif;
ifcount=0thenstate<="00";set1<='1';set2<='1';
elsifcount=25thenstate<="01";set1<='1';
elsifcount=30thenstate<="10";set1<='1';set2<='1';
elsifcount=45thenstate<="11";set2<='1';
elsifcount=50thencount<="0000000";elseset1<='0';set2<='0';endif;
endif;
endprocessstatelable;
enda;
显示部分的设计:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityledshowis
port(clk,urgen:
instd_logic;
state:
instd_logic_vector(1downto0);
sub,set1,set2:
instd_logic;
r1,g1,y1,r2,g2,y2:
outstd_logic;
led1,led2:
outstd_logic_vector(7downto0));
endledshow;
architectureaofledshowis
signalcount1,count2:
std_logic_vector(7downto0);
signalsetstate1,setstate2:
std_logic_vector(7downto0);
signaltg1,tg2,tr1,tr2,ty1,ty2:
std_logic;
begin
led1<="11111111"whenurgen='1'andclk='0'elsecount1;
led2<="11111111"whenurgen='1'andclk='0'elsecount2;
tg1<='1'whenstate="00"andurgen='0'else'0';
ty1<='1'whenstate="01"andurgen='0'else'0';
tr1<='1'whenstate
(1)='1'orurgen='1'else'0';
tg2<='1'whenstate="10"andurgen='0'else'0';
ty2<='1'whenstate="11"andurgen='0'else'0';
tr2<='1'whenstate
(1)='0'orurgen='1'else'0';
setstate1<="00100101"whenstate="00"else
"00000101"whenstate="01"else
"00100000";
setstate2<="00010101"whenstate="10"else
"00000101"whenstate="11"else
"00110000";
label2:
process(sub)
begin
ifsub'eventandsub='1'then
ifset2='1'then
count2<=setstate2;
elsifcount2(3downto0)="0000"thencount2<=count2-7;
elsecount2<=count2-1;endif;
g2<=tg2;
r2<=tr2;
y2<=ty2;
endif;
endprocesslabel2;
label1:
process(sub)
begin
ifsub'eventandsub='1'then
ifset1='1'then
count1<=setstate1;
elsifcount1(3downto0)="0000"thencount1<=count1-7;
elsecount1<=count1-1;endif;
g1<=tg1;
r1<=tr1;
y1<=ty1;
endif;
endprocesslabel1;
enda;
分频器部分的设计
libraryieee;
useieee.std_logic_1164.all;
usework.p_alarm.all;
entitydivideris
port(clk_in:
std_logic;
reset:
instd_logic;
clk:
outstd_logic);
enddivider;
architectureartofdivideris
constantdivide_period:
t_short:
=1000;
begin
process(clk_in,reset)is
variablecnt:
t_short;
begin
if(reset='1')then
cnt:
=0;
clk<='0';
elsifrising_edge(clk_in)then
if(cnt<=(divide_period/2))then
clk<='1';
cnt:
=cnt+1;
elsif(cnt<(divide_period-1))then
clk<='0';
cnt:
=cnt+1;
else
cnt:
=0;
endif;
endif;
endprocess;
endart;
p_alarm程序包
libraryieee;
useieee.std_logic_1164.all;
packagep_alarmis
subtypet_digitalisintegerrange0to9;
subtypet_shortisintegerrange0to65535;
typet_clock_timeisarray(5downto0)oft_digital;
typet_displayisarray(5downto0)oft_digital;
endpackagep_alarm;
9、仿真:
对交通灯控制部分进行仿真
在QuartusII软件中导入交通灯控制程序,对此程序编译无错误后,建立Vectorwaveformfile文件保存时仿真文件名要与设计文件名一致。
在其中设计始终开始时间为0,结束时间为5us,周期为50ns。
仿真结果如下:
当reset='1'state<="00"count<="0000000";
当reset='0'在上升沿到来时执行当count=0则state<="00";set1<='1';set2<='1';count=25state<="01";set1<='1';count=30thenstate<="10";set1<='1';set2<='1';
count=45thenstate<="11";set2<='1';
count=50thencount<="0000000",否则set1<='0';set2<='0'
仿真的结果正确。
对交通灯显示部分模块进行仿真
在QuartusII软件中导入交通灯显示程序,对此程序编译无错误后,建立Vectorwaveformfile文件保存时仿真文件名要与设计文件名一致。
将控制仿真的结果贴到显示仿真中,两次在其中设计的开始时间为0,结束时间为5us,周期为50ns。
仿真结果如下:
仿真结果与程序所要的结果一样。
当state=”00”时g1<=1;当state
(1)<=’0’时r2<=’1’.
当urgen=‘1’时r1<=’1’,r2<=’1’;仿真结果与程序设计符合。
对交通灯系统进行仿真
在QuartusII软件中导入交通灯系统程序,对此程序编译无错误后,建立Vectorwaveformfile文件保存时仿真文件名要与设计文件名一致。
在其中设计开始时间为0,结束时间为5us,周期为50ns。
仿真结果如下:
系统仿真的结果符合设计要求。
与前面仿真的结果也一致。
十、引脚的配置-----------程序的下载
适配后生成的下载或配置文件通过编程器,对CPLD的下载称为编程(Program)。
点击QuartusII软件中的Program就实行了本次试验的下载。
最后对载入了设计的FPGA或CPLD的硬件系统进行统一测试,以便最终验证设计项目在目标系统上的实际工作情况,以排除错误,改进设计。
在试验箱上按下k2东西红灯和南北红灯都亮。
按下k1即显示时间复位。
当k1、k2不按时交通灯正常即东西红灯亮时南北绿灯亮,且时间相差5秒即为南北黄灯的时间。
当南北红灯亮时,东西绿灯亮,且时间相差4秒即为东西黄灯亮的时间。
11、实验心得:
这次综合实验要求很高,我在思考和设计上花了不少时间,其中收获也是不少。
(1)拿到一个project后,不要急于写程序,首先要搞清楚要干什么,完成什么功能,分几部分完成,每部分完成什么功能,各部分之间的联系。
如果采用的是自顶向下的设计思想,
那么顶层的设计就很重要,顶层设计好后,下面各部分写起来就比较清楚容易了。
一旦出现问题,也好检查错误出在什么地方,哪一部分有问题,就进行相应的改动。
(2)在编程过程中,思路要清楚,明白要实现的功能,然后根据实现的功能一步一步的编写。
而且要采用各个击破的办法,先实现下层部分,再整体实现。
(3)编下层时,不用急于仿真,等整体编译成功后,先进行总体仿真,看出现的错误在什么地方,这个地方是由哪个部分控制的,然后再对该部分进行仿真,看有没有问题。
(4)编译成功后,不要急于下载,一定要先仿真,根据仿真波形判断是否达到要求。
一般仿真成功后,只要电路连接没问题,下载后就没什么问题了。