数字电路交通灯控制器实验报告.docx

上传人:b****2 文档编号:17720227 上传时间:2023-08-03 格式:DOCX 页数:35 大小:1.92MB
下载 相关 举报
数字电路交通灯控制器实验报告.docx_第1页
第1页 / 共35页
数字电路交通灯控制器实验报告.docx_第2页
第2页 / 共35页
数字电路交通灯控制器实验报告.docx_第3页
第3页 / 共35页
数字电路交通灯控制器实验报告.docx_第4页
第4页 / 共35页
数字电路交通灯控制器实验报告.docx_第5页
第5页 / 共35页
数字电路交通灯控制器实验报告.docx_第6页
第6页 / 共35页
数字电路交通灯控制器实验报告.docx_第7页
第7页 / 共35页
数字电路交通灯控制器实验报告.docx_第8页
第8页 / 共35页
数字电路交通灯控制器实验报告.docx_第9页
第9页 / 共35页
数字电路交通灯控制器实验报告.docx_第10页
第10页 / 共35页
数字电路交通灯控制器实验报告.docx_第11页
第11页 / 共35页
数字电路交通灯控制器实验报告.docx_第12页
第12页 / 共35页
数字电路交通灯控制器实验报告.docx_第13页
第13页 / 共35页
数字电路交通灯控制器实验报告.docx_第14页
第14页 / 共35页
数字电路交通灯控制器实验报告.docx_第15页
第15页 / 共35页
数字电路交通灯控制器实验报告.docx_第16页
第16页 / 共35页
数字电路交通灯控制器实验报告.docx_第17页
第17页 / 共35页
数字电路交通灯控制器实验报告.docx_第18页
第18页 / 共35页
数字电路交通灯控制器实验报告.docx_第19页
第19页 / 共35页
数字电路交通灯控制器实验报告.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数字电路交通灯控制器实验报告.docx

《数字电路交通灯控制器实验报告.docx》由会员分享,可在线阅读,更多相关《数字电路交通灯控制器实验报告.docx(35页珍藏版)》请在冰点文库上搜索。

数字电路交通灯控制器实验报告.docx

数字电路交通灯控制器实验报告

课题三:

交通灯控制器

课题三:

交通灯控制器

一.设计课题的任务要求

(一)、实验目的

1.熟练掌握VHDL语言和QuartusII软件的使用;

2.理解状态机的工作原理和设计方法;

3.掌握利用EDA工具进行自顶向下的电子系统设计方法;

(二)、相关知识

本实验要利用CPLD设计实现一个十字路口的交通灯控制系统,和其他控制系统一样,本系统划分为控制器和受控电路两部分。

控制器使整个系统按设定的工作方式交替指挥车辆及行人的通行,并接收受控部分的反馈信号,决定其状态转换方向及输出信号,控制整个系统的工作过程。

路口交通灯控制系统的有东西路和南北路交通灯R(红)、Y(黄)、G(绿)三色,所有灯均为高电平点亮。

设置20s的通行时间和5s转换时间的变模定时电路,用数码管显示剩余时间。

提供系统正常工作/复位和紧急情况两种工作模式。

(三)、实验任务

1.基本任务:

设计制作一个用于十字路口的交通灯控制器。

1).南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20秒、5秒和25秒;

2).当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行;

3).用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间;

2.提高要求:

1).增加左、右转弯显示控制功能;

2).紧急状况时增加声光警告功能;

3).自拟其它功能。

二.系统设计(包括设计思路、总体框图、分块设计)

(一)设计思路

1.总体设计----输入部分:

1)CLK时钟频率输入,可由实验板上直接提供,为准确确定时间长度,选择High挡的1MHz高频信号。

2)紧急状态按键拨码开关EMERGENCY,当将其置为高电平,表示紧急情况发生,两个方向均为红灯亮,计时停止,蜂鸣器蜂鸣;当置其为低电平,信号灯和计时器恢复原来状态,正常工作。

3)复位拨码开关RESET,当将其置为高电平,表示复位,工作停止,全部回到初始状态;当置其为低电平,重新开始工作。

2.总体设计----输出部分:

1)东西方向和南北方向各使用4个LED显示,LIGHT1,LIGHT2,红黄绿各代表红黄绿灯,剩下两个红灯分别表示限制两个方向的禁止左转。

2)东西方向和南北方向计时均为2位数,共需要4个LED七段数码管显示。

由于为共阴极控制,输出一个CAT_TEMP信号控制选择数码管显示,NUM信号输出显示的内容。

3)增加一个BELL输出,控制紧急状态下的蜂鸣器。

(二)总体框图

1.输入输出示意图

CLK

LIGHT1

EMERGENCY

LIGHT2

RESET

 

BELL

NUM

CAT——TEMP

CLK

开关1

数码管显示输出

数码管共阴极控制

东西向

交通灯

南北向

交通灯

蜂鸣器

开关2

2.模块示意图

控制器

紧急请求

系统复位

BELL

控制器

南北灯(包括禁止左转灯)

东西灯(包括禁止左转灯)

复位

紧急请求

分频器

时钟

时间计数器

译码器

时间倒计时显示

警铃

3.流程图

YES

南北绿,东西红

东西禁止左转灯亮

是否绿灯时间到20s?

对黄灯开始计时

南北黄,东西红

东西禁止左转灯亮

是否黄灯时间到5s?

对绿灯开始计时

南北红,东西绿

南北禁止左转灯亮

是否绿灯时间到20s?

对黄灯开始计时

南北红,东西黄

南北禁止左转灯亮

是否黄灯时间到5s?

对绿灯开始计时

YES

YES

YES

NO

NO

NO

NO

启动/复位

任何/当前正常运行状态

警报开关

是否打开?

全部亮红灯+警铃

YES

NO

4.RTL图

5.状态转移列表(状态机)

红绿灯显示状态

状态

S0

南北绿灯亮,东西红灯亮,东西禁止左转

S1

南北黄灯亮,东西红灯亮,东西禁止左转

S2

南北红灯亮,东西绿灯亮,南北禁止左转

S3

南北红灯亮,东西黄灯亮,南北禁止左转

S4

南北东西红灯都亮,南北东西都禁止左右转

(三)分块设计-------在VHDL设计中,采用自顶向下的设计思路。

1.顶层模块中,根据硬件设计,设置如下端口:

◆外部时钟信号:

CLK

◆紧急状态按键:

EMERGENCY

◆南北方向状态灯:

LIGHT1

◆东西方向状态灯:

LIGHT2

◆蜂鸣器控制:

BELL

◆数码管显示信号:

NUM

◆数码管共阴极控制:

CAT_TEMP

2.在底层中,把不同功能分模块设计。

◆FREQUENCY模块,由于外部时钟信号CLK的频率为50MHz,而实际需要的内部计时时钟频率为1Hz,需要一个分频电路。

输入端口:

CLK外部时钟信号

输出端口:

CLK_OUT分频后信号

◆COUNTER模块,由于整个过程的显示周期为50秒,即50个状态,所以该模块为计数器模块,计数周期为50,输入为1Hz的外部时钟,并加入紧急信号和复位信号,当输入紧急信号,计数停止,当输入复位信号,计数置1.通过该计数器的计数输出信号来控制LIGHT模块和COUNTDOWN模块的状态。

输入端口:

CLK时钟信号,EMERGENCY紧急信号,RESET复位信号

输出端口:

COUNTER计数状态信号,BELL报警信号

◆COUNTDOWN模块,倒计时显示模块,通过输入的COUNTER和CLK来控制数码管共阴极和7段数码管数字显示控制。

输入接口:

CLK时钟信号,COUNT计数器信号

输出接口:

CAT_TEMP共阴极控制,NUMIN数字输出

◆SHOW模块,接收数字信号,进行7位数码管显示译码输出。

输入接口:

NUMIN输入信号

输出接口:

NUM译码输出

◆LIGHT信号灯控制模块,使用状态机,双进程控制5个状态

输入接口:

COUNT计数器信号,EMERGENCY紧急状态控制

输出接口:

LIGHT1,LIGHT2信号灯输出

三.仿真波形及波形分析

仿真波形-------由于时钟为50MHz,故在仿真时为了波形图更易读,将分频器设为20分频

1.状态周期为1~50,在每个状态内,数码管共阴极进行扫描,且扫描同时数码管显示进行循环变化

2.周期状态,在1~20,21~25,26~45,46~50进行红绿灯显示变化

3.一整个周期状态1~50,在1~20,21~25,26~45,46~50进行红绿灯显示变化

4.多个周期循环

5.紧急状态和复位状态

四.源程序(注释)

●TRAFFIC.vhd----主程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYTRAFFICIS

PORT(

CLK,RESET,EMERGENCY:

INSTD_LOGIC;----输入时钟信号,复位信号,紧急信号

LIGHT1,LIGHT2:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);----输出东西南北向两个红信号

NUM:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);----输出7端数码管选通信号

CAT_TEMP:

OUTSTD_LOGIC_VECTOR(5DOWNTO0);----输出7端数码管共阴极信号

BELL:

OUTSTD_LOGIC;----输出警铃信号

NUMIN:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);----输出信号(用十进制在波形图显示数字)

COUNTERS:

OUTSTD_LOGIC_VECTOR(5DOWNTO0)----输出信号(用十进制在波形图中显示周期状态)

);

ENDTRAFFIC;

ARCHITECTURETRAFFICSHOWOFTRAFFICIS

SIGNALTEMPCLK:

STD_LOGIC;

SIGNALTEMPCOUNT:

STD_LOGIC_VECTOR(5DOWNTO0);

SIGNALTEMPNUM:

STD_LOGIC_VECTOR(3DOWNTO0);

COMPONENTFREQUENCYIS----组合FREQUENCY模块,以下同

PORT(

CLK:

INSTD_LOGIC;

CLK_OUT:

OUTSTD_LOGIC

);

ENDCOMPONENT;

COMPONENTCOUNTERIS

PORT(

CLK:

INSTD_LOGIC;

RESET:

INSTD_LOGIC;

EMERGENCY:

INSTD_LOGIC;

COUNTER:

OUTSTD_LOGIC_VECTOR(5DOWNTO0);

BELL:

OUTSTD_LOGIC;

COUNTERS:

OUTSTD_LOGIC_VECTOR(5DOWNTO0)

);

ENDCOMPONENT;

COMPONENTLIGHTIS

PORT(

EMERGENCY:

INSTD_LOGIC;

COUNT:

INSTD_LOGIC_VECTOR(5DOWNTO0);

LIGHT1,LIGHT2:

OUTSTD_LOGIC_VECTOR(3DOWNTO0)

);

ENDCOMPONENT;

COMPONENTCOUNTDOWNIS

PORT(

COUNT:

INSTD_LOGIC_VECTOR(5DOWNTO0);

CLK:

INSTD_LOGIC;

NUMIN:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

CAT_TEMP:

OUTSTD_LOGIC_VECTOR(5DOWNTO0);

NUMIN1:

OUTSTD_LOGIC_VECTOR(3DOWNTO0)

);

ENDCOMPONENT;

COMPONENTSHOWIS

PORT(

NUM_IN:

INSTD_LOGIC_VECTOR(3DOWNTO0);

NUM:

OUTSTD_LOGIC_VECTOR(6DOWNTO0)

);

ENDCOMPONENT;

BEGIN----将各个模块接口连接起来

U1:

FREQUENCYPORTMAP(CLK=>CLK,CLK_OUT=>TEMPCLK);

U2:

COUNTERPORTMAP(BELL=>BELL,CLK=>TEMPCLK,RESET=>RESET,EMERGENCY=>EMERGENCY,COUNTER=>TEMPCOUNT,COUNTERS=>COUNTERS);

U3:

LIGHTPORTMAP(EMERGENCY=>EMERGENCY,COUNT=>TEMPCOUNT,LIGHT1=>LIGHT1,LIGHT2=>LIGHT2);

U4:

COUNTDOWNPORTMAP(NUMIN1=>TEMPNUM,CAT_TEMP=>CAT_TEMP,COUNT=>TEMPCOUNT,CLK=>CLK,NUMIN=>NUMIN);

U5:

SHOWPORTMAP(NUM_IN=>TEMPNUM,NUM=>NUM);

ENDTRAFFICSHOW;

●FREQUENCY.vhd----分频器模块,1Hz

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYFREQUENCYIS

PORT(

CLK:

INSTD_LOGIC;

CLK_OUT:

OUTSTD_LOGIC

);

ENDFREQUENCY;

ARCHITECTUREFREQOFFREQUENCYIS

SIGNALTEMP:

INTEGERRANGE0TO4999999;----设置分频999999,则为1Hz

BEGIN

PROCESS(CLK)

BEGIN

IF(CLK'EVENTANDCLK='1')THEN

IF(TEMP=4999999)THEN

TEMP<=0;

ELSE

TEMP<=TEMP+1;

ENDIF;

IFTEMP<4999999THEN

CLK_OUT<='0';

ELSECLK_OUT<='1';

ENDIF;

ENDIF;

ENDPROCESS;

END;

●COUNTER.vhd----计数器模块(主要控制模块),用外部时钟设置了50个状态的一个周期1~50

----由于该交通灯的状态为50种,数码管有50种显示状态

----完全通过控制计数器的停止和复位来控制闪灯和数码管

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYCOUNTERIS

PORT(

CLK:

INSTD_LOGIC;----外部时钟输入

RESET:

INSTD_LOGIC;----复位信号输入

EMERGENCY:

INSTD_LOGIC;----紧急信号输入

COUNTER:

OUTSTD_LOGIC_VECTOR(5DOWNTO0):

="000001";----计数信号输出

BELL:

OUTSTD_LOGIC;----警铃信号输出

COUNTERS:

OUTSTD_LOGIC_VECTOR(5DOWNTO0)----计数信号输出(波形)

);

ENDCOUNTER;

ARCHITECTURECONOFCOUNTERIS

SIGNALTEMPCOUNT:

INTEGERRANGE1TO50:

=1;----定义信号计数,初始状态为1

BEGIN

PROCESS(CLK,RESET,EMERGENCY)

BEGIN

IFCLK'EVENTANDCLK='1'THEN----外部时钟,1Hz

IFEMERGENCY='0'THEN----当不是紧急状态

BELL<='0';

IFRESET='1'THEN----复位状态

TEMPCOUNT<=1;----计数器回到初始状态1

ELSIFTEMPCOUNT=50THEN

TEMPCOUNT<=1;----计数器计数状态,加1

ELSETEMPCOUNT<=TEMPCOUNT+1;

ENDIF;

ELSIFEMERGENCY='1'THEN----当紧急信号为高电平,进入紧急状态

TEMPCOUNT<=TEMPCOUNT;----计数器停止计数

BELL<='1';----警铃为高电平

ENDIF;

ENDIF;

ENDPROCESS;

COUNTER<=CONV_STD_LOGIC_VECTOR(TEMPCOUNT,6);----内部信号转化为输出

COUNTERS<=CONV_STD_LOGIC_VECTOR(TEMPCOUNT,6);----内部信号转化为输出

ENDCON;

●LIGHT.vhd----交通灯显示信号

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYLIGHTIS

PORT(

EMERGENCY:

INSTD_LOGIC;----紧急信号输入,控制紧急状态

COUNT:

INSTD_LOGIC_VECTOR(5DOWNTO0);----计数器输入,控制其它正常状态

LIGHT1,LIGHT2:

OUTSTD_LOGIC_VECTOR(3DOWNTO0)----交通灯信号输出

);

ENDLIGHT;

ARCHITECTURELIGHTSHOWOFLIGHTIS

TYPESTATESIS----设置状态机,控制状态

(S0,S1,S2,S3,S4);

SIGNALSTATE:

STATES;

SIGNALTEMPCOUNT:

INTEGERRANGE1TO50;

BEGIN

P1:

PROCESS(COUNT,EMERGENCY)

BEGIN

TEMPCOUNT<=CONV_INTEGER(COUNT);----将二进制输入转化为十进制计数信号

IFEMERGENCY='1'THEN----EMERGENCY为高电平时为紧急状态

STATE<=S4;

ELSE

CASETEMPCOUNTIS----由计数器控制状态持续时间

WHEN1TO20=>STATE<=S0;----1秒到20秒

WHEN21TO25=>STATE<=S1;----21秒到25秒

WHEN26TO45=>STATE<=S2;----26秒到45秒

WHEN46TO50=>STATE<=S3;----46秒到50秒

ENDCASE;

ENDIF;

ENDPROCESSP1;

P2:

PROCESS(STATE)----状态机

BEGIN

CASESTATEIS

WHENS0=>LIGHT1<="0010";----南北绿灯

LIGHT2<="1001";----东西红灯,且禁止左转

WHENS1=>LIGHT1<="0100";----南北黄灯

LIGHT2<="1001";----东西红灯,且禁止左转

WHENS2=>LIGHT1<="1001";----南北红灯,且禁止左转

LIGHT2<="0010";----东西绿灯

WHENS3=>LIGHT1<="1001";----南北红灯,且禁止左转

LIGHT2<="0100";----东西黄灯

WHENS4=>LIGHT1<="1001";----南北红灯,且禁止左转

LIGHT2<="1001";----东西红灯,且禁止左转

ENDCASE;

ENDPROCESS;

ENDLIGHTSHOW;

●COUNTDOWN.vhd----7段数码管倒计时控制模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYCOUNTDOWNIS

PORT(

COUNT:

INSTD_LOGIC_VECTOR(5DOWNTO0);----计数器输入信号

CLK:

INSTD_LOGIC;----时钟信号

NUMIN:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);----输出7段数码管显示数字信号,输出到译码模块

CAT_TEMP:

OUTSTD_LOGIC_VECTOR(5DOWNTO0);----7端数码管共阴极输出控制信号

NUMIN1:

OUTSTD_LOGIC_VECTOR(3DOWNTO0)----输出7段数码管显示数字信号(波形图观察)

);

ENDCOUNTDOWN;

ARCHITECTURECOUNTSHOWOFCOUNTDOWNIS

SIGNALTEMP:

INTEGERRANGE0TO3;

SIGNALCOUNTER:

INTEGERRANGE1TO50;

SIGNALCAT:

STD_LOGIC_VECTOR(5DOWNTO0):

="011111";

SIGNALNUM_IN:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

P1:

PROCESS(CLK)----内部时钟,控制7段数码管显示扫描内容

BEGIN

COUNTER<=CONV_INTEGER(COUNT);

IF(CLK'EVENTANDCLK='1')THEN

IF(TEMP=3)THEN

TEMP<=0;

ELSE

TEMP<=TEMP+1;

ENDIF;

ENDIF;

ENDPROCESSP1;

P2:

PROCESS(COUNTER,TEMP)

BEGIN

COUNTER<=CONV_INTEGER(COUNT);

CASECOUNTERIS----通过计数器输入信号控制状态

WHEN1=>CASETEMPIS----在每个状态内部设置数码管扫描过程,由于COUNTER和----扫描时钟不同

----则可在数码管上同时显示4个数字,以状态1

----(COUNTER=1)为例

----显示“1924”,并在共阴极上扫描,以下同

----共标记50种状态

WHEN0=>NUM_IN<="0001";CAT<="011111";

WHEN1=>NUM_IN<="1001";CAT<="101111";

WHEN2=>NUM_IN<="0010";CAT<="111101";

WHEN3=>NUM_IN<="0100";CAT<="111110";

ENDCASE;

WHEN2=>CASETEMPIS

WHEN0=>NUM_IN<="0001";CAT<="011111";

WHEN1=>NUM_IN<="1000";CAT<="101111";

WHEN2=>NUM_IN<="0010";CAT<="111101";

WHEN3=>NUM_IN<="0011";CAT<="111110";

ENDCASE;

WHEN3=>CASETEMPIS

WHEN0=>NUM_IN<="0001";CAT<="011111";

WHEN1=>NUM_IN<="0111";CAT<="101111";

WHEN2=>NUM_IN<="0010";CAT<="111101";

WHEN3=>NUM_IN<="0010";CAT<="111110";

ENDCASE;

WHEN4=>CASETEMPIS

WHEN0=>NUM_IN<="0001";CAT<="011111";

WHEN1=>NUM_IN<="0110";CAT<="101111";

WHEN2=>NUM_IN<="0010";CAT<="111101";

WHEN3=>NUM_IN<="0001";CAT<="111110";

ENDCASE;

WHEN5=>CASETEMPIS

WHEN0=>NUM_IN<="0001";CAT<="011111";

WHEN1=>NUM_IN<="0101";CAT<="101111";

WHEN2=>NUM_

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2