交通灯控制器的设计.docx
- 文档编号:3271614
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:15
- 大小:146.92KB
交通灯控制器的设计.docx
《交通灯控制器的设计.docx》由会员分享,可在线阅读,更多相关《交通灯控制器的设计.docx(15页珍藏版)》请在冰豆网上搜索。
交通灯控制器的设计
?
EDA实验报告
*
一、课程设计题目及要求
题目:
十字路口交通灯
具体要求:
-
设计一个十字路口的交通灯控制器,能显示十字路口东西、南北两个方向红、黄、绿灯的指示状态。
用两组红、黄、绿三种颜色的灯分别作为东西、南北两个方向红、黄、绿等。
变化规律为:
东西绿灯亮,南北红灯亮——东西黄灯亮,南北红灯亮——东西红灯亮,南北绿灯亮——东西红灯亮,南北黄灯亮——东西绿灯亮,南北红灯亮······,这样循环下去。
南北方向每次通行时间为45秒,东西方向每次通行时间为45秒,要求两条交叉道路上的车辆交替运行,时间可设置修改。
绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道。
并要求所有交通灯的状态变化在时钟脉冲上升沿处。
二、实验编程环境
QuartusII
三、课程设计的详细设计方案
(一)、总体设计方案的描述
、根据交通灯系统设计要求,可以用一个有限状态机来实现这个交通灯控制器。
首先根据功能要求,明确两组交通灯的状态,这两组交通灯总共共有四种状态,我们用ST0,ST1,ST2,ST3来表示:
(
St0表示东西路绿灯亮,南北路红灯亮;
St1表示东西路黄灯亮,南北路红灯亮;
St2表示东西路红灯亮,南北路绿灯亮;
St3表示东西路红灯亮,南北路黄灯亮;
、根据上述四种状态描述列出的状态转换表
&
表9-1交通灯控制器状态转换表
当前状态
下一状态
转换条件
St0
St1
主路绿灯亮了40秒
。
St1
St2
主路黄灯亮了5秒
St2
St3
主路绿灯亮了40秒
St3
St0
;
支路黄灯亮了5秒
、根据状态转换表得到交通灯控制器的状态转移图如图所示。
。
交通灯控制器的状态转移图
(二)各个模块设计
、控制器模块
控制器模块示意图
|
其中,clk为时钟信号,时钟上升沿有效。
hold为紧急制动信号,低电平有效。
ared,agreen,ayellow分别表示东西方向的红灯,黄灯,绿灯显示信号,高电平有效。
bred,bgreen,byellow分别表示南北方向的红灯,黄灯,绿灯显示信号,高电平有效。
用于控制红绿黄灯的亮暗情况。
、45秒倒计时计数器模块
…
45秒倒计时计数器模块示意图
其中,CLK为时钟信号,时钟上升沿有效。
EN为使能端,高电平有效。
CR为紧急制动信号低电平有效。
QL{3..0}是计数低位。
QH{3..0}是计数高位。
用于45秒的倒计时计数。
^
、7位译码器模块
7位译码器模块示意图
其中dat{3..0}为要译码的信号。
a,b,c,d,e,f,g为译码后的信号。
用于将45秒倒计时计数的信号译码成数码管可以识别的信号。
、50MHZ分频器模块
;
50MHZ分频器模块示意图
其中clk为50MHZ时钟信号,时钟上升沿有效。
输出clk_out为1HZ时钟信号,时钟上升沿有效。
用于将50MHZ的时钟信号转变成1HZ的时钟信号。
(三)结构图设计
。
(四)仿真电路
时序仿真图
从图中可看到首先进入st0状态,此时东西路绿灯亮,南北路红灯亮;计数器计数到40秒时,交通灯控制器进入st1状态,此时东西路黄灯亮,南北路红灯亮;在st1状态计数器又开始计数,计数器计数到5秒后,交通灯控制器状态进入st2,此时东西路红灯亮,南北路绿灯亮;在st2状态计数器又开始计数,计数器计数到40秒后,交通灯控制器状进入st3状态,此时东西路红灯亮,南北路绿灯亮;在st3状态计数器又开始计数,计数器计数到5秒后,交通灯控制器状态进入st0状态,此时东西路绿灯亮,南北路红灯亮,如些循环反复,完成十字交通路口的红绿灯控制。
{
A0-G0,A1-G1分别为45到0的译码。
(五)分配引脚
为了对此工程进行硬件测试,应将编译成功后的程序下载到目标芯片上,并指定输入输出信号的管脚,以便添加激励信号和测试输出信号。
在下载编译成功的文件之前,需要制定器件的管脚,选择Assignments|Pins命令,在随后出现的下拉列表框中选择对应端口信号名的器件引脚号,如下图:
四、设计总结和心得
通过此次EDA设计,我系统性的学习了课本上相关的知识,对课堂上的知识更加了解。
通过认真研究课本,使我对EDA程序设计有了一定思路;通过实验课的学习,在程序的设计,程序的调试方面都学到了很多东西,在这几天时间里,实验室的氛围对我们的影响很大,大家一起努力,这也是我们能完成课设的动力。
其中在编程中也出现了很多的问题,但通过老师和同学的帮助下,把问题一一解决。
其实只要我们自己认真看书,仔细分析,仔细调试,就一定会发下错误,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习EDA更是如此,程序只有经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
@
五、源代码
控制器模块:
libraryieee;
usecontrolis
port(clk,hold:
instd_logic;
ared,agreen,ayellow,bred,bgreen,byellow:
outstd_logic);
!
endcontrol;
architecturebehaviorofcontrolis
typestate_typeis(s0,s1,s2,s3,s4);
signalcurrent_state,next_state:
state_type;
signalcounter:
std_logic_vector(6downto0);
begin
)
synch:
process
begin
waituntilclk'eventandclk='1';
ifhold='0'then
counter<=counter;
else
ifcounter<89then
counter<=counter+1;
$
else
counter<=(others=>'0');
endif;
endif;
endprocess;
process
begin
{
waituntilclk'eventandclk='1';
current_state<=next_state;
endprocess;
state_trans:
process(current_state)
begin
casecurrent_stateis
whens0=>
:
ifhold='0'then
next_state<=s4;
else
ifcounter<39then
next_state<=s0;
else
next_state<=s1;
endif;
<
endif;
whens1=>
ifhold='0'then
next_state<=s4;
else
ifcounter<44then
next_state<=s1;
else
@
next_state<=s2;
endif;
endif;
whens2=>
ifhold='0'then
next_state<=s4;
else
ifcounter<84then
!
next_state<=s2;
else
next_state<=s3;
endif;
endif;
whens3=>
ifhold='0'then
next_state<=s4;
|
else
ifcounter<89then
next_state<=s3;
else
next_state<=s0;
endif;
endif;
whens4=>
~
ifhold='0'then
next_state<=s4;
else
ifcounter<39then
next_state<=s0;
elsifcounter<44then
next_state<=s1;
elsifcounter<84then
-
next_state<=s2;
elsifcounter<89then
next_state<=s3;
endif;
endif;
endcase;
endprocess;
;
output:
process(current_state)
begin
casecurrent_stateis
whens0=>
ared<='0';
agreen<='1';
ayellow<='0';
bred<='1';
·
bgreen<='0';
byellow<='0';
whens1=>
ared<='0';
agreen<='0';
ayellow<='1';
bred<='1';
bgreen<='0';
[
byellow<='0';
whens2=>
ared<='1';
agreen<='0';
ayellow<='0';
bred<='0';
bgreen<='1';
byellow<='0';
&
whens3=>
ared<='1';
agreen<='0';
ayellow<='0';
bred<='0';
bgreen<='0';
byellow<='1';
whens4=>
】
ared<='1';
agreen<='0';
ayellow<='0';
bred<='1';
bgreen<='0';
byellow<='0';
endcase;
endprocess;
}
endbehavior;
45秒倒计时计数器模块:
libraryieee;
usem45is
port(
CLK:
instd_logic;
【
EN:
instd_logic;
CR:
instd_logic;
QL,QH:
outstd_logic_vector(3downto0);
OC:
outstd_logic
);
endm45;
architecturebehavofm45is
·
signalcouL,couH:
std_logic_vector(3downto0);
begin
process(CR,CLK,EN)
begin
ifCR='0'then
couL<="0000";
couH<="0000";
…
elsifclk'eventandclk='1'then
ifEN='1'then
if(couL=0andcouH=0)then
couL<="0100";
couH<="0100";
elsifcouL=0then
couL<="1001";
couH<=couH-1;
【
else
couL<=couL-1;
endif;
endif;
endif;
endprocess;
process(couL,couH)
[
begin
if(couL=0andcouH=0)then
OC<='1';
else
OC<='0';
endif;
endprocess;
QL<=couL;
》
QH<=couH;
endbehav;
7位译码器模块:
libraryieee;
useseg7is
port(dat:
instd_logic_vector(3downto0);
(
a,b,c,d,e,f,g:
outstd_logic);
endseg7;
architecturearcofseg7is
signaltmp:
std_logic_vector(6downto0);
begin
process(dat)
begin
"
casedatis
when"0000"=>tmp<="0000001";
when"0001"=>tmp<="1001111";
when"0010"=>tmp<="0010010";
when"0011"=>tmp<="0000110";
when"0100"=>tmp<="1001100";
when"0101"=>tmp<="0100100";
when"0110"=>tmp<="0100000";
:
when"0111"=>tmp<="0001111";
when"1000"=>tmp<="0000000";
when"1001"=>tmp<="0000100";
when"1010"=>tmp<="0001000";
when"1011"=>tmp<="1100000";
when"1100"=>tmp<="0110001";
when"1101"=>tmp<="1000010";
when"1110"=>tmp<="0110000";
when"1111"=>tmp<="0111000";
whenothers=>null;
endcase;
endprocess;
a<=tmp(6);
b<=tmp(5);
c<=tmp(4);
d<=tmp(3);
e<=tmp
(2);
f<=tmp
(1);
g<=tmp(0);
endarc;
50MHZ分频器模块:
libraryieee;
usedevideis
port(
clk:
instd_logic;
clk_out:
outstd_logic
);
enddevide;
architecturearc_devideofdevideis
begin
process(clk)
variablecount:
integerrange0to;
begin
ifclk'eventandclk='1'then
if(count=)then
count:
=0;
clk_out<='1';
else
count:
=count+1;
clk_out<='0';
endif;
endif;
endprocess;
endarchitecturearc_devide;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 交通灯 控制器 设计