交通灯控制系统终结版Word格式文档下载.docx
《交通灯控制系统终结版Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《交通灯控制系统终结版Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器。
而FPGA是特殊的ASIC芯片,与其他的ASIC芯片相比,它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检测等优点。
在控制系统中,键盘是常用的人机交换接口,当所设置的功能键或数字键按下的时候,系统应该完成该键所设置的功能。
因此,键信息输入是与软件结构密切相关的过程。
根据键盘的结构不同,采用不同的编码方法。
但无论有无编码以及采用什么样的编码,最后都要转换成为相应的键值,以实现按键功能程序的转移。
现在是一个知识爆炸的新时代。
新产品、新技术层出不穷,电子技术的发展更是日新月异。
可以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。
在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。
因此我们需要一个定时系统来提醒这些忙碌的人。
数字化的钟表给人们带来了极大的方便。
近些年,随着科技的发展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。
多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。
2课程设计要求
随着各种交通工具的发展和交通指挥的需要,交通灯的诞生大大改善了城市交通状况。
要求设计一个交通灯控制器,控制十字路口主、支两条道路的红、绿、黄三色灯,指挥车辆和行人的安全通行。
具体要求:
设计一个十字路口的交通灯控制器,能显示十字路口东西、南北两个方向红、黄、绿灯的指示状态。
用两组红、黄、绿三种颜色的灯分别作为东西、南北两个方向红、黄、绿等。
变化规律为:
东西绿灯亮,南北红灯亮——东西黄灯亮,南北红灯亮——东西红灯亮,南北绿灯亮——东西红灯亮,南北黄灯亮——东西绿灯亮,南北红灯亮·
·
,这样循环下去。
南北方向是主干道车道,东西方向是支干道车道,要求两条交叉道路上的车辆交替运行,主干道每次通行时间为30秒,支干道每次通行时间为20秒,时间可设置修改。
绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道。
要求交通灯控制器有复位功能,并要求所有交通灯的状态变化在时钟脉冲上升沿处。
3总体构思
根据交通灯系统设计要求,可以用一个有限状态机来实现这个交通灯控制器。
首先根据功能要求,明确两组交通灯的状态,这两组交通灯总共共有四种状态,我们用ST0,ST1,ST2,ST3来表示:
St0表示主路绿灯亮,支路红灯亮;
St1表示主路黄灯亮,支路红灯亮;
St2表示主路红灯亮,支路绿灯亮;
St3表示主路红灯亮,支路黄灯亮。
(1)根据上述四种状态描述列出的状态转换表如表3-1所示。
表3-1交通灯控制器状态转换表
当前状态
下一状态
转换条件
St0
St1
主路绿灯亮了25秒
St2
主路黄灯亮了5秒
St3
主路绿灯亮了15秒
支路黄灯亮了5秒
St0orst1orst2orst3
复位信号使能
(2)根据状态转换表得到交通灯控制器的状态转移图如图3-1所示。
图3-1交通灯控制器的状态转移图
(3)交通灯控制系统的本质就是一个如图3-2所示的控制器模块。
图3-2交通灯控制器结构示意图
其中,clk为时钟信号,时钟上升沿有效。
Rst为复位信号,高电平有效。
lgt1_red,lgt1_yellow、lgt1_green,分别表示主干道的红灯,黄灯,绿灯显示信号,高电平有效。
lgt2_red,lgt2_yellow,lgt2_green分别表示支路的红灯,黄灯,绿灯显示信号,
4硬件电路的设计
硬件电路的设计包括状态控制模块、分频器模块、转换器模块、TOP文件模块的图形设计。
(1)状态控制模块的图形符号如图4-1所示。
图4-1状态控制模块图形
(2)分频器的图形模块如图4-2所示。
图4-2分频器模块图形
实现频率由5MHZ到1Hz的转变,达到我们素需要的1S的要求。
(3)转换器的图形模块如图4-3所示。
图4-3转换器模块图形
实现BCD码转化成数码块中显示的数字。
(4)TOP文件的图形模块如图4-4所示。
图4-4TOP文件模块图形
5软件设计
软件的设计包括对控制状态模块、分频器、转换器和顶层模块的设计,以下分别为控制状态模块、分频器、转换器和顶层模块的代码。
(1)状态控制模块的代码如下。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtraffic_ctrlIS
GENERIC(
green1_cnt:
INTEGER:
=25;
--定义主通道绿灯亮的时间,这里为25秒
yellow1_cnt:
=5;
--定义主通道黄灯亮的时间,这里为5秒
green2_cnt:
=15;
--定义支路绿灯亮的时间,这里为15秒
yellow2_cnt:
=5--定义支路黄灯亮的时间,这里为5秒
);
PORT(
CLK:
INSTD_LOGIC;
--时钟信号
rst:
--复位信号
lgt1_red:
OUTSTD_LOGIC;
--主通道红灯控制信号
lgt1_yellow:
--主通道黄灯控制信号
lgt1_green:
--主通道绿灯控制信号
lgt2_red:
--支路红灯控制信号
lgt2_yellow:
--支路黄灯控制信号
lgt2_green:
OUTSTD_LOGIC--支路绿灯控制信号
ENDENTITYtraffic_ctrl;
ARCHITECTURErt1OFtraffic_ctrlIS--定义结构体
TYPESTATESIS
(st0,st1,st2,st3);
--定义控制器各种状态
SIGNALstate:
states:
=st0;
--初始化状态
SIGNALcnt:
integerrange0to30:
=1;
--定义计数器
SIGNALcnt_enb:
std_logic:
='
0'
;
--初始化计数器使能信号
BEGIN
PROCESS(CLK,rst)
BEGIN
IF(rst='
1'
)THEN--复位信号为高电平则执行复位操作
state<
cnt<
ELSIF(rising_edge(CLK))THEN--时钟上升沿
IF(cnt_enb='
)THEN--计数器计数
=cnt+1;
ELSE
ENDIF;
CASEstateIS
WHENst0=>
--主通道绿灯亮了一段时间适时转换状态st1
IF(cnt=green1_cnt)THEN
=st1;
WHENst1=>
--主通道黄灯亮了一段时间适时转换状态st2
IF(cnt=yellow1_cnt)THEN
=st2;
WHENst2=>
--支路绿灯亮了一段时间适时转换状态st3
IF(cnt=green2_cnt)THEN
=st3;
WHENst3=>
--支路黄灯亮了一段时间适时转换状态st0
IF(cnt=yellow2_cnt)THEN
ENDCASE;
ENDPROCESS;
PROCESS(state)
--st0表示主路绿灯亮,支路红灯亮
lgt1_red<
lgt1_yellow<
lgt1_green<
lgt2_red<
lgt2_yellow<
lgt2_green<
cnt_enb<
--st1表示主路黄灯亮,支路红灯亮
--st2表示主路红灯亮,支路绿灯亮
--st3表示主路红灯亮,支路黄灯亮
ENDrt1;
(2)分频器的代码:
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYfenpinIS
PORT(CLK:
INSTD_LOGIC;
OUTCLK:
BUFFERSTD_LOGIC);
ENDfenpin;
ARCHITECTUREoneOFfenpinIS
SIGNALCLK1,CLK2:
STD_LOGIC;
BEGIN
PROCESS(CLK)
VARIABLEcnt:
INTEGERrange0to4;
--500khz50M/500k=100
IFclk'
eventANDclk='
THEN
IFcnt=4THENOUTCLK<
=notOUTCLK;
cnt:
=0;
ELSEcnt:
ENDPROCESS;
--PROCESS(CLK1)
--VARIABLEcnt:
INTEGERrange0to49;
--5khz500k/5k=100
--BEGIN
--IFCLK1'
eventANDCLK1='
--IFcnt=49THENCLK2<
=notCLK2;
--ELSEcnt:
--ENDIF;
--ENDIF;
--ENDPROCESS;
--PROCESS(CLK2)
--variablecnt:
integerrange0to49;
--50hz5k/50=100
--IFCLK2'
eventANDCLK2='
--IFcnt=49THENCLK4<
=notCLK4;
--ELSEcnt:
--PROCESS(CLK3)
integerrange0to24;
--1hz50/50=1
--IFCLK3'
eventANDCLK3='
--IFcnt=24THENOUTCLK<
--ELSEcnt:
--ENDIF;
ENDone;
(3)转换器的代码:
USEIEEE.STD_LOGIC_arith.ALL;
ENTITYzhuanhuanIS
PORT(clk:
instd_logic;
zhitime:
inSTD_LOGIC_VECTOR(6DOWNTO0);
zhutime:
outtime:
outSTD_LOGIC_VECTOR(7DOWNTO0);
scan:
outSTD_LOGIC_VECTOR(0to7));
ENDzhuanhuan;
ARCHITECTUREbehaviorOFzhuanhuanIS
SIGNALdata1:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALdata2:
SIGNALdata:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALdatatime1:
SIGNALdatatime10:
SIGNALdatatime2:
SIGNALdatatime20:
datatime10<
=data1(7downto4);
datatime1<
=data1(3downto0);
datatime20<
=data2(7downto4);
datatime2<
=data2(3downto0);
WITHzhitimeSELECT
data1<
="
00000000"
WHEN"
0000000"
"
00000001"
0000001"
00000010"
0000010"
"
00000011"
0000011"
00000100"
0000100"
00000101"
0000101"
00000110"
0000110"
00000111"
0000111"
00001000"
0001000"
00001001"
0001001"
00010000"
0001010"
00010001"
0001011"
00010010"
0001100"
00010011"
0001101"
00010100"
0001110"
00010101"
0001111"
00010110"
0010000"
00010111"
0010001"
00011000"
0010010"
00011001"
0010011"
00100000"
0010100"
00100001"
0010101"
00100010"
0010110"
00100011"
0010111"
00100100"
0011000"
00100101"
0011001"
00100110"
0011010"
00100111"
0011011"
00101000"
0011100"
00101001"
0011101"
00110000"
WHENothers;
WITHzhutimeSELECT
data2<
process(clk,datatime20,datatime2,datatime10,datatime1)
variablecnt:
std_logic_vector(1downto0);
begin
ifclk'
eventandclk='
then
endif;
casecntis
when"
00"
=>
data<
=datatime2;
scan<
11111110"
01"
=datatime20;
11111101"
10"
=datatime1;
10111111"
11"
=datatime10;
01111111"
endcase;
endprocess;
process(data)
casedatais
0000"
outtime<
11111100"
0001"
01100000"
0010"
11011010"
0011"
11110010"
0100"
01100110"
0101"
10110110"
0110"
10111110"
0111"
11100000"
1000"
1001"
11110110"
whenothers=>
ENDbehavior;
(4)顶层模块的代码:
USEIEEE.