EDA课程设计十字路口红绿灯模拟.docx

上传人:b****8 文档编号:11352064 上传时间:2023-02-28 格式:DOCX 页数:17 大小:233.93KB
下载 相关 举报
EDA课程设计十字路口红绿灯模拟.docx_第1页
第1页 / 共17页
EDA课程设计十字路口红绿灯模拟.docx_第2页
第2页 / 共17页
EDA课程设计十字路口红绿灯模拟.docx_第3页
第3页 / 共17页
EDA课程设计十字路口红绿灯模拟.docx_第4页
第4页 / 共17页
EDA课程设计十字路口红绿灯模拟.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

EDA课程设计十字路口红绿灯模拟.docx

《EDA课程设计十字路口红绿灯模拟.docx》由会员分享,可在线阅读,更多相关《EDA课程设计十字路口红绿灯模拟.docx(17页珍藏版)》请在冰豆网上搜索。

EDA课程设计十字路口红绿灯模拟.docx

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、总体来看本次设计,只是十分简单的模拟了简化后的十字路口车辆行驶场景:

只能东西和南北两个方向通行,交通灯只有三个状态(红、黄、绿);同时中间关于车辆数量的统计和红绿灯时长计算都进行了很多简化,不一定能反映出真实的情况,整个设计还有很大的修改空间。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1