EDA课程设计十字路口红绿灯模拟.docx
- 文档编号:11352064
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:17
- 大小:233.93KB
EDA课程设计十字路口红绿灯模拟.docx
《EDA课程设计十字路口红绿灯模拟.docx》由会员分享,可在线阅读,更多相关《EDA课程设计十字路口红绿灯模拟.docx(17页珍藏版)》请在冰豆网上搜索。
EDA课程设计十字路口红绿灯模拟
课题名称:
简易十字路口车流量模拟及红绿灯控制
学生姓名:
班级:
学号:
指导教师:
项目功能:
1、自动模拟简易十字路口(只两个方向通行)的车流状况
2、根据当前的车流状况确定红绿灯的时常(可变)以最快的疏散交通
3、增添交通管制功能:
所有路口禁行,指示灯闪烁
4、通过数码管将每个路口的停车数量和交通灯的时常倒计时显示出来;交通灯通过指示灯显示
5、特点:
自动模拟一简易十字路口的交通状况,程序运行后即不需再进行其他的控制,可以从数码管上看到当前的交通状况
项目原理框图
1、
本项目主要分为3个模块:
十字路口停车数的统计、交通灯时长及功能控制、数码管显示
2、原理框图
交通灯时长
各子模块的设计及验证
停车数统计模块Car-wave:
顶层图
其中Car-counter模块由模4计数器和加法器counter100实现
模4计数器有元件定制方式实现(略)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycounter100is
port(clk:
instd_logic;--时钟信号
sel:
instd_logic_vector(1downto0);--加法/减法功能选择信号
dataIn:
instd_logic_vector(1downto0);--加法/减法器输入
num11,num12:
outstd_logic_vector(3downto0));--计数器结果
endcounter100;
architecturebhvofcounter100is
signaldn11,dn12:
std_logic_vector(3downto0);
signaldin:
std_logic_vector(3downto0);
Counter100由VHDL代码编写,其代码如下
begin
process(clk,dataIn)
begin
din<="00"&dataIn;
ifrising_edge(clk)then
ifsel="00"then--00时做加法
if(dn11<10-din)thendn11<=dn11+din;--判断是否有进位
elsif(dn11>10-din)thendn11<=dn11+din-10;dn12<=dn12+1;
endif;
elsifsel="01"then--01时做减法
if((dn11+din<4)anddn12>0)thendn11<=dn11+6+din;dn12<=dn12-1;--判断是否要借位
elsif(dn11>4)thendn11<=dn11-4+din;
elsedn11<="0000";
endif;
endif;
endif;
num11<=dn11;
num12<=dn12;
endprocess;
endbhv;
Counter100说明:
由sel信号决定执行加法还是减法功能,sel为00时执行加法功能,sel为01时执行减法功能;sel信号由lamp(交通灯)模块生成;该加法/减法器的输入为lpm_counter4的计数值
功能验证
1、波形仿真:
GridSize:
100ns,EndTime:
10.0us
信号说明:
clk1:
Counter100的时钟信号COUNTEVERY:
100.0ns
clk2:
模4的时钟信号COUNTEVERY:
15.0ns
raod1,road2:
两个路口的等待车辆数目
sel1,sel2:
Counter100功能选择信号
2、下载验证:
添加数码管显示电路后的下载验证
管脚分配
信号
管脚
clk1(Counter100的时钟信号)
P122
clk2(模4和七段译码器时钟)
P128
sel1[1..0],sel2[1..0]
P86,P87,P92,Mp95
eq0,eq1,eq3,eq4
(数码管片选信号)
P96,P97,P99,P100
qa..qg(数码管段选信号)
P51,P49,P48,P47,P46,P44,P43
仿真结论:
两个路口的车辆能正确的增加和减少,该模块设计正确
交通灯时长和功能控制模块lamp
该模块的主要功能是:
根据输入的路口等待车辆数自动调整红绿灯时长;产生时长倒计时;自动的进行两个路口红-黄-绿灯之间的转换
该模块通过VHDL语言设计实现,其代码如下
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitylampis
port(clk,enemy,en:
instd_logic;--enemy是交通管制信号,en使能信号
daIn11,daIn12:
instd_logic_vector(3downto0);--南北路口的等待车辆数
daIn21,daIn22:
instd_Logic_vector(3downto0);--东西路口的等待车辆数
flash:
outstd_logic;--交通管制信号
red1,green1,yellow1:
outstd_logic;--路口1交通灯信号
red2,green2,yellow2:
outstd_logic;--路口2交通灯信号
time1,time2:
outstd_logic_vector(3downto0);--交通灯时长
sel1:
outstd_logic_vector(1downto0);--南北路口控制信号
sel2:
outstd_logic_vector(1downto0);--东西路口控制信号
);
endlamp;
architecturebhvoflampis
signalt1,t2:
std_logic_vector(3downto0);--thelengthoftime—交通灯时长信号
signallamp_rgy:
std_logic_vector(6downto0);--交通指示灯
signalfuc:
std_logic_vector(1downto0);--功能转换控制信号
signalload:
std_logic;--交通灯时长装载信号
begin
--交通灯和车流量控制信号的产生
process(clk,en,enemy)
begin
ifenemy='1'thenlamp_rgy(5downto0)<="100100";lamp_rgy(6)<=clk;
elsifrising_edge(clk)then
ifen='1'then
iffuc="00"thensel1<="01";sel2<="00";--green1red2南北通行时
lamp_rgy<="0001100";
elsiffuc="01"thensel1<="00";sel2<="00";--yellow1red2
lamp_rgy<="0010100";
elsiffuc="10"thensel1<="00";sel2<="01";--red1green2东西通行时
lamp_rgy<="0100001";
elsiffuc="11"thensel1<="00";sel2<="00";--red1yellow2
lamp_rgy<="0100010";
endif;
endif;
endif;
endprocess;
--确定交通灯时长产生时长倒计时模块
process(clk,en,enemy,fuc,load)
begin
if(rising_edge(clk)anden='1')then
ifload='0'then
iffuc="00"thent1<='0'&daIn11(3downto1)+5;t2<='0'&daIn12(3downto1);load<='1';
elsiffuc="01"thent1<="0101";t2<="0000";load<='1';
elsiffuc="10"thent1<='0'&daIn21(3downto1)+5;t2<='0'&daIn22(3downto1);load<='1';
elsiffuc="11"thent1<="0101";t2<="0000";load<='1';
endif;
else
ifenemy='1'thent1<="0000";t2<="0000";
elsifenemy='0'then
ift1>0thent1<=t1-1;
elsift2>0thent2<=t2-1;t1<="1001";
elsif(t1="0000"andt2="0000"andenemy='0'anden='1')thenload<='0';fuc<=fuc+1;
endif;
endif;
endif;
endif;
endprocess;
time1<=t1;
time2<=t2;
flash<=lamp_rgy(6);
red1<=lamp_rgy(5);
yellow1<=lamp_rgy(4);
green1<=lamp_rgy(3);
red2<=lamp_rgy
(2);
yellow2<=lamp_rgy
(1);
green2<=lamp_rgy(0);
endbhv;
交通灯时长的确定是根据当前排队车辆数目除以2再加5得到的
功能验证
1、波形仿真;GridSize:
100.0nsEndTime:
20.0us
en=1,enemy=0,flash=0,sel1=01,sel2=00,lamp1=001,lamp2=100;time=17
状态:
路口1绿灯,路口2红灯
en=1,enemy=0,flash=0,sel1=00,sel2=00,lamp1=010,lamp2=100;time=5
状态:
路口1黄灯,路口2红灯
en=1,enemy=0,flash=0,sel1=00,sel2=00,lamp1=010,lamp2=001;time=17
状态:
路口1黄灯,路口2绿灯
2、下载验证:
添加了数码管显示电路后的下载验证
管脚分配
信号
管脚
Clk1(lamp时钟)
P122
Clk2(数码管时钟)
P125
En
P95
Enemy
P92
red1,green1,yellow1
(路口1指示灯)
P23,P22,P21
red2,green2,yellow2
(路口2指示灯)
P20,P19,P18
daIn11(daIn11)
P72,P73,P78,P79
信号
管脚
daIn12(daIn12)
P86,P87,P88,P89
Flash(交通管制指示灯)
P9
sel1[1..0]
P41,P39
Sel2[1..0]
P32,P31
eq0,eq1(显示时间)
(数码管片选信号)
P96,P97
qa..qg(数码管段选信号)
P51,P49,P48,P47,P46,P44,P43
下载主要验证了交通灯能否正确的执行各功能之间的转换以及交通灯时长是否会根据车辆书发生变化,经验证能正确的实现设计目的
数码管显示模块SMG1:
显示路口车辆数及交通灯时长倒计时
由模6计数器,3-6译码器,6-1多路选择器、7449构成
顶层图:
这部分在以前的实验中使用过多次,基本原理已十分清楚,在这里不在赘述
项目总的顶层图及功能验证
进行功能验证的时候主要进行了实验箱上的下载验证,其中管脚分配的情况在上图中已有显示;经验证能正确的实现设计目的,设计完成
操作手册:
显示状态说明:
运行时数码管上的P8和P102显示交通灯时长变化;P96和P97显示路口1的停车数量的变化;P100和P101显示路口2的停车数量的变化;指示灯P23P22P21对应路口1的红黄绿灯得状态,P20P19P1对应路口2的红黄绿灯的状态,P9对应交通管制信号
操作说明:
该程序的控制按键共有两个en和enemy,接在电平开关P95和P92上;各按键的状态和对应的功能如下
en
enemy
执行功能
显示状态
1
0
正常运转
交通灯,车辆数,时长有规律的变化
1
1
紧急状况,
交通管制
两个路口同时亮红灯,指示灯闪烁,停车数逐渐增加,时长显示为0
0
X
废弃状态
不工作
交通灯灭,时长显示为0,车辆数显式为0
实验日志
在整个综合实验中遇到过很多问题,比如频率的选取、交通灯功能的自动转换等等;下面我分别介绍一下在每个模块中遇到的主要问题及解决方法,和做完整个设计后的总体感受
停车数统计模块Car-wave:
在该模块出现的问题主要有两个
1、模4计数器和counter100的频率的选取:
设计要求counter100的频率要远低于模4,以此实现随机性;但在波形仿真的时候却发现选取不同的频率时会出现意外情况:
counter100从模4计数器读取的值会大于4甚至更大,在数码管上无法正确显示;分析问题可能出在时钟信号不稳定上;经多次试验发现,当counter100的频率是模4的七次分频时效果最佳;因此单独设计了一个50%占空比的7次分频器(这在最后的综合设计时仍被淘汰掉),在最后的综合设计中二者选取的相同的时钟频率,实现了相对的随机性
2、进行加法或减法计数时的进位和借位的判断:
这里主要是一开始遗漏了一些情况,对判断条件设定有误;后结合波形图进行了修改解决了这个问题
交通灯时长和功能控制模块lamp
1、红绿黄灯之间的自动切换:
设计要求交通灯之间能自动的切换以实现不同的功能,通过增加控制信号fuc(两位2进制)实现,每当交通灯时长变到0的时候,fuc的值加1;fuc四个不同的值刚好对应交通灯四种不同的状态:
fuc
路口1
路口2
00
绿灯
红灯
01
黄灯
红灯
10
红灯
绿灯
11
红灯
黄灯
2、红绿灯时长装载或是产生倒计时的确定:
红绿灯时长有两个改变发式:
产生时长倒计时和切换到另一时长;在设计时一开始是将这两部分分别写到两个进程中,后来报错误:
不能再两个进程中对同一信号的值进行更改;当把它们放到同一个进程中时问题就是怎么确定不同情况下时间的改变方式,经过对程序的仔细分析增加了一个中间信号load来控制:
当load=0时进行时长的切换,load=1时时长递减1;并且在时长切换后将load值设为1这样在下一个时钟周期就能正确的实现时长递减1了;在时长减为0时将load设为0再进行时长的切换,很好的实现了这部分的设计
3、红绿灯时长的确定:
黄灯时长固定的设为了5s;绿灯的时长则根据路口的等待车辆数确定;经过多次测试发现将绿灯的时长设为(路口等待车辆数目/2)+5能较好的疏散交通
在数码管显示模块和最后的综合设计中没出现什么大的问题
实验总结
1、整个项目的设计花费自己了很多时间,在这中间我学到了很多东西,同时也复习了前面所学的计数器、加法器、分频器和数码管显示电路等等;其中实验的大部分内容都是通过VHDL编写的,加深了自己对VHDL语言的了解,比如其中进程语句process的使用,中间信号的定义和使用方法等;同时通过本次实验,也锻炼了自己独立设计程序的能力;在本次试验中我很重视功能划分以及各模块的封装,将整个实验分成了三个子模块,这有利于程序的检测和修改;实验中由于自己对红绿灯模型不是很熟悉,在设计绿灯的时间时是通过很多测试才得到合理的结果,这个过程消耗了自己很多时间;
2、总体来看本次设计,只是十分简单的模拟了简化后的十字路口车辆行驶场景:
只能东西和南北两个方向通行,交通灯只有三个状态(红、黄、绿);同时中间关于车辆数量的统计和红绿灯时长计算都进行了很多简化,不一定能反映出真实的情况,整个设计还有很大的修改空间。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 课程设计 十字路口 红绿灯 模拟
![提示](https://static.bdocx.com/images/bang_tan.gif)