交通灯控制器的设计.docx
《交通灯控制器的设计.docx》由会员分享,可在线阅读,更多相关《交通灯控制器的设计.docx(16页珍藏版)》请在冰豆网上搜索。
交通灯控制器的设计
EDA实验报告
一、课程设计题目及要求
题目:
十字路口交通灯
具体要求:
设计一个十字路口的交通灯控制器,能显示十字路口东西、南北两个方向红、黄、绿灯的指示状态。
用两组红、黄、绿三种颜色的灯分别作为东西、南北两个方向红、黄、绿等。
变化规律为:
东西绿灯亮,南北红灯亮——东西黄灯亮,南北红灯亮——东西红灯亮,南北绿灯亮——东西红灯亮,南北黄灯亮——东西绿灯亮,南北红灯亮······,这样循环下去。
南北方向每次通行时间为45秒,东西方向每次通行时间为45秒,要求两条交叉道路上的车辆交替运行,时间可设置修改。
绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道。
并要求所有交通灯的状态变化在时钟脉冲上升沿处。
二、实验编程环境
QuartusII8.0
三、课程设计的详细设计方案
(一)、总体设计方案的描述
1.1、根据交通灯系统设计要求,可以用一个有限状态机来实现这个交通灯控制器。
首先根据功能要求,明确两组交通灯的状态,这两组交通灯总共共有四种状态,我们用ST0,ST1,ST2,ST3来表示:
St0表示东西路绿灯亮,南北路红灯亮;
St1表示东西路黄灯亮,南北路红灯亮;
St2表示东西路红灯亮,南北路绿灯亮;
St3表示东西路红灯亮,南北路黄灯亮;
1.2、根据上述四种状态描述列出的状态转换表
表9-1交通灯控制器状态转换表
当前状态
下一状态
转换条件
St0
St1
主路绿灯亮了40秒
St1
St2
主路黄灯亮了5秒
St2
St3
主路绿灯亮了40秒
St3
St0
支路黄灯亮了5秒
1.3、根据状态转换表得到交通灯控制器的状态转移图如图所示。
交通灯控制器的状态转移图
(二)各个模块设计
2.1、控制器模块
控制器模块示意图
其中,clk为时钟信号,时钟上升沿有效。
hold为紧急制动信号,低电平有效。
ared,agreen,ayellow分别表示东西方向的红灯,黄灯,绿灯显示信号,高电平有效。
bred,bgreen,byellow分别表示南北方向的红灯,黄灯,绿灯显示信号,高电平有效。
用于控制红绿黄灯的亮暗情况。
2.2、45秒倒计时计数器模块
45秒倒计时计数器模块示意图
其中,CLK为时钟信号,时钟上升沿有效。
EN为使能端,高电平有效。
CR为紧急制动信号低电平有效。
QL{3..0}是计数低位。
QH{3..0}是计数高位。
用于45秒的倒计时计数。
2.3、7位译码器模块
7位译码器模块示意图
其中dat{3..0}为要译码的信号。
a,b,c,d,e,f,g为译码后的信号。
用于将45秒倒计时计数的信号译码成数码管可以识别的信号。
2.4、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;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycontrolis
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;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitym45is
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;
useieee.std_logic_1164.all;
entityseg7is
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;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydevideis
port(
clk:
instd_logic;
clk_out:
outstd_logic
);
enddevide;
architecturearc_devideofdevideis
begin
process(clk)
variablecount:
integerrange0to49999999;
begin
ifclk'eventandclk='1'then
if(count=49999999)then
count:
=0;
clk_out<='1';
else
count:
=count+1;
clk_out<='0';
endif;
endif;
endprocess;
endarchitecturearc_devide;