交通灯控制系统终结版.docx

上传人:b****6 文档编号:6889624 上传时间:2023-01-12 格式:DOCX 页数:22 大小:228.78KB
下载 相关 举报
交通灯控制系统终结版.docx_第1页
第1页 / 共22页
交通灯控制系统终结版.docx_第2页
第2页 / 共22页
交通灯控制系统终结版.docx_第3页
第3页 / 共22页
交通灯控制系统终结版.docx_第4页
第4页 / 共22页
交通灯控制系统终结版.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

交通灯控制系统终结版.docx

《交通灯控制系统终结版.docx》由会员分享,可在线阅读,更多相关《交通灯控制系统终结版.docx(22页珍藏版)》请在冰豆网上搜索。

交通灯控制系统终结版.docx

交通灯控制系统终结版

 

河南机电高等专科学校

《可编程逻辑器件原理与应用》

课程设计报告

 

交通控制器系统设计

 

专业班级:

医电131

姓名:

徐长伟

学号:

130411116

时间:

2015年6月

成绩:

交通灯控制系统的设计

摘要:

随着时代的发展交通事故也急剧增加,为了改善交通秩序减少交通事故,交通灯起着越来越重要的作用。

交通灯安装在各个路口上,需要交通灯控制器来对它进行控制,所以设计交通灯控制器有着至关重要的作用。

随着EDA技术的大力发展,FPGA等数字可编程器件的出现,数字出租车计费器的设计也就变得更加简单,而且性能更稳定、能实现较复杂的功能,且运用EDA软件可方便的在计算机上实现设计与仿真。

本设计基于VHDL(FPGA)语言是电子设计领域中最具活力和发展前途的一项技术,未来必定会取代部分落伍的数字元元件。

随着电子技术的不断发展与进步,集成电路的设计方法也在不断地更新。

键关词:

交通灯、控制器、VHDL语言。

 

目录

一、概述4

二、课程设计要求5

三、总体构思6

四、硬件电路的设计8

五、软件设计10

六.仿真及下载调试18

6.1仿真18

6.2程序下载21

七.总结与展望24

参考文献25

1概述

现代社会的标志之一就是信息产品的广泛使用,而且是产品的性能越来越强,复杂程度越来越高,更新步伐越来越快。

支撑信息电子产品高速发展的基础就是微电子制造工艺水平的提高和电子产品设计开发技术的发展。

前者以微细加工技术为代表,而后者的代表就是电子设计自动化(electronicdesignautomatic,EDA)技术。

本设计采用的VHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述、覆盖面广、抽象能力强,因此在实际应用中越来越广泛。

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秒

St1

St2

主路黄灯亮了5秒

St2

St3

主路绿灯亮了15秒

St3

St0

支路黄灯亮了5秒

St0orst1orst2orst3

St0

复位信号使能

(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:

INTEGER:

=5;--定义主通道黄灯亮的时间,这里为5秒

green2_cnt:

INTEGER:

=15;--定义支路绿灯亮的时间,这里为15秒

yellow2_cnt:

INTEGER:

=5--定义支路黄灯亮的时间,这里为5秒

);

PORT(

CLK:

INSTD_LOGIC;--时钟信号

rst:

INSTD_LOGIC;--复位信号

lgt1_red:

OUTSTD_LOGIC;--主通道红灯控制信号

lgt1_yellow:

OUTSTD_LOGIC;--主通道黄灯控制信号

lgt1_green:

OUTSTD_LOGIC;--主通道绿灯控制信号

lgt2_red:

OUTSTD_LOGIC;--支路红灯控制信号

lgt2_yellow:

OUTSTD_LOGIC;--支路黄灯控制信号

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<=st0;

cnt<=1;

ELSIF(rising_edge(CLK))THEN--时钟上升沿

IF(cnt_enb='1')THEN--计数器计数

cnt<=cnt+1;

ELSE

cnt<=1;

ENDIF;

CASEstateIS

WHENst0=>--主通道绿灯亮了一段时间适时转换状态st1

IF(cnt=green1_cnt)THEN

state<=st1;

ELSE

state<=st0;

ENDIF;

WHENst1=>--主通道黄灯亮了一段时间适时转换状态st2

IF(cnt=yellow1_cnt)THEN

state<=st2;

ELSE

state<=st1;

ENDIF;

WHENst2=>--支路绿灯亮了一段时间适时转换状态st3

IF(cnt=green2_cnt)THEN

state<=st3;

ELSE

state<=st2;

ENDIF;

WHENst3=>--支路黄灯亮了一段时间适时转换状态st0

IF(cnt=yellow2_cnt)THEN

state<=st0;

ELSE

state<=st3;

ENDIF;

ENDCASE;

ENDIF;

ENDPROCESS;

PROCESS(state)

BEGIN

CASEstateIS

WHENst0=>--st0表示主路绿灯亮,支路红灯亮

lgt1_red<='0';

lgt1_yellow<='0';

lgt1_green<='1';

lgt2_red<='1';

lgt2_yellow<='0';

lgt2_green<='0';

cnt_enb<='1';

IF(cnt=green1_cnt)THEN

cnt_enb<='0';

ENDIF;

WHENst1=>--st1表示主路黄灯亮,支路红灯亮

lgt1_red<='0';

lgt1_yellow<='1';

lgt1_green<='0';

lgt2_red<='1';

lgt2_yellow<='0';

lgt2_green<='0';

cnt_enb<='1';

IF(cnt=yellow1_cnt)THEN

cnt_enb<='0';

ENDIF;

WHENst2=>--st2表示主路红灯亮,支路绿灯亮

lgt1_red<='1';

lgt1_yellow<='0';

lgt1_green<='0';

lgt2_red<='0';

lgt2_yellow<='0';

lgt2_green<='1';

cnt_enb<='1';

IF(cnt=green2_cnt)THEN

cnt_enb<='0';

ENDIF;

WHENst3=>--st3表示主路红灯亮,支路黄灯亮

lgt1_red<='1';

lgt1_yellow<='0';

lgt1_green<='0';

lgt2_red<='0';

lgt2_yellow<='1';

lgt2_green<='0';

cnt_enb<='1';

IF(cnt=yellow2_cnt)THEN

cnt_enb<='0';

ENDIF;

ENDCASE;

ENDPROCESS;

ENDrt1;

(2)分频器的代码:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYfenpinIS

PORT(CLK:

INSTD_LOGIC;

OUTCLK:

BUFFERSTD_LOGIC);

ENDfenpin;

ARCHITECTUREoneOFfenpinIS

SIGNALCLK1,CLK2:

STD_LOGIC;

BEGIN

PROCESS(CLK)

VARIABLEcnt:

INTEGERrange0to4;--500khz50M/500k=100

BEGIN

IFclk'eventANDclk='1'THEN

IFcnt=4THENOUTCLK<=notOUTCLK;cnt:

=0;

ELSEcnt:

=cnt+1;

ENDIF;

ENDIF;

ENDPROCESS;

--PROCESS(CLK1)

--VARIABLEcnt:

INTEGERrange0to49;--5khz500k/5k=100

--BEGIN

--IFCLK1'eventANDCLK1='1'THEN

--IFcnt=49THENCLK2<=notCLK2;cnt:

=0;

--ELSEcnt:

=cnt+1;

--ENDIF;

--ENDIF;

--ENDPROCESS;

--PROCESS(CLK2)

--variablecnt:

integerrange0to49;--50hz5k/50=100

--BEGIN

--IFCLK2'eventANDCLK2='1'THEN

--IFcnt=49THENCLK4<=notCLK4;cnt:

=0;

--ELSEcnt:

=cnt+1;

--ENDIF;

--ENDIF;

--ENDPROCESS;

--PROCESS(CLK3)

--variablecnt:

integerrange0to24;--1hz50/50=1

--BEGIN

--IFCLK3'eventANDCLK3='1'THEN

--IFcnt=24THENOUTCLK<=notOUTCLK;cnt:

=0;

--ELSEcnt:

=cnt+1;

--ENDIF;

--ENDIF;

--ENDPROCESS;

ENDone;

(3)转换器的代码:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_arith.ALL;

ENTITYzhuanhuanIS

PORT(clk:

instd_logic;

zhitime:

inSTD_LOGIC_VECTOR(6DOWNTO0);

zhutime:

inSTD_LOGIC_VECTOR(6DOWNTO0);

outtime:

outSTD_LOGIC_VECTOR(7DOWNTO0);

scan:

outSTD_LOGIC_VECTOR(0to7));

ENDzhuanhuan;

ARCHITECTUREbehaviorOFzhuanhuanIS

SIGNALdata1:

STD_LOGIC_VECTOR(7DOWNTO0);

SIGNALdata2:

STD_LOGIC_VECTOR(7DOWNTO0);

SIGNALdata:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALdatatime1:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALdatatime10:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALdatatime2:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALdatatime20:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

datatime10<=data1(7downto4);

datatime1<=data1(3downto0);

datatime20<=data2(7downto4);

datatime2<=data2(3downto0);

WITHzhitimeSELECT

data1<="00000000"WHEN"0000000",

"00000001"WHEN"0000001",

"00000010"WHEN"0000010",

"00000011"WHEN"0000011",

"00000100"WHEN"0000100",

"00000101"WHEN"0000101",

"00000110"WHEN"0000110",

"00000111"WHEN"0000111",

"00001000"WHEN"0001000",

"00001001"WHEN"0001001",

"00010000"WHEN"0001010",

"00010001"WHEN"0001011",

"00010010"WHEN"0001100",

"00010011"WHEN"0001101",

"00010100"WHEN"0001110",

"00010101"WHEN"0001111",

"00010110"WHEN"0010000",

"00010111"WHEN"0010001",

"00011000"WHEN"0010010",

"00011001"WHEN"0010011",

"00100000"WHEN"0010100",

"00100001"WHEN"0010101",

"00100010"WHEN"0010110",

"00100011"WHEN"0010111",

"00100100"WHEN"0011000",

"00100101"WHEN"0011001",

"00100110"WHEN"0011010",

"00100111"WHEN"0011011",

"00101000"WHEN"0011100",

"00101001"WHEN"0011101",

"00110000"WHENothers;

WITHzhutimeSELECT

data2<="00000000"WHEN"0000000",

"00000001"WHEN"0000001",

"00000010"WHEN"0000010",

"00000011"WHEN"0000011",

"00000100"WHEN"0000100",

"00000101"WHEN"0000101",

"00000110"WHEN"0000110",

"00000111"WHEN"0000111",

"00001000"WHEN"0001000",

"00001001"WHEN"0001001",

"00010000"WHEN"0001010",

"00010001"WHEN"0001011",

"00010010"WHEN"0001100",

"00010011"WHEN"0001101",

"00010100"WHEN"0001110",

"00010101"WHEN"0001111",

"00010110"WHEN"0010000",

"00010111"WHEN"0010001",

"00011000"WHEN"0010010",

"00011001"WHEN"0010011",

"00100000"WHEN"0010100",

"00100001"WHEN"0010101",

"00100010"WHEN"0010110",

"00100011"WHEN"0010111",

"00100100"WHEN"0011000",

"00100101"WHENothers;

process(clk,datatime20,datatime2,datatime10,datatime1)

variablecnt:

std_logic_vector(1downto0);

begin

ifclk'eventandclk='1'then

cnt:

=cnt+1;

endif;

casecntis

when"00"=>data<=datatime2;scan<="11111110";

when"01"=>data<=datatime20;scan<="11111101";

when"10"=>data<=datatime1;scan<="10111111";

when"11"=>data<=datatime10;scan<="01111111";

endcase;

endprocess;

process(data)

begin

casedatais

when"0000"=>outtime<="11111100";

when"0001"=>outtime<="01100000";

when"0010"=>outtime<="11011010";

when"0011"=>outtime<="11110010";

when"0100"=>outtime<="01100110";

when"0101"=>outtime<="10110110";

when"0110"=>outtime<="10111110";

when"0111"=>outtime<="11100000";

when"1000"=>outtime<="11111110";

when"1001"=>outtime<="11110110";

whenothers=>outtime<="00000000";

endcase;

endprocess;

ENDbehavior;

(4)顶层模块的代码:

LIBRARYIEEE;

USEIEEE.

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

当前位置:首页 > 解决方案 > 学习计划

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

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