北邮数字电路实验报告交通灯控制器VHDL最全的.docx

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

北邮数字电路实验报告交通灯控制器VHDL最全的.docx

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

北邮数字电路实验报告交通灯控制器VHDL最全的.docx

北邮数字电路实验报告交通灯控制器VHDL最全的

 

课题三:

交通灯控制器

 

学院:

信息与通信工程学院

专业:

通信工程

*******

学号:

********

 

课题三:

交通灯控制器

一.设计课题的任务要求

(一)、实验目的

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

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

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

(二)、相关知识

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

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

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

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

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

(三)、实验任务

1.基本任务:

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

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

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

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

2.提高要求:

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

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

3).自拟其它功能。

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

(一)设计思路

利用有限状态机描绘出交通灯的状态转移图,并设置记录东西和南北路口可通行时间的全局变量count,共设置四个正常状态,状态间的转移以count的值作为判断条件。

对于两种特殊情况:

当复位信号reset为高电平时,则回到最初状态;当紧急输入信号emergency为高电平时,则转移到一特殊状态。

(二)总体框图

1.系统结构框图

2.模块划分方框图

 

3.控制模块流程图

4.状态转移图

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

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

◆外部时钟信号:

CLK

◆紧急状态按键:

EMERGENCY

◆南北方向状态灯:

LIGHT1

◆东西方向状态灯:

LIGHT2

◆蜂鸣器控制:

BELL

◆数码管显示信号:

NUM

◆数码管共阴极控制:

CAT_TEMP

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

◆主分频模块:

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

输入端口:

CLK外部时钟信号

输出端口:

CLK_OUT分频后信号

◆次分频模块:

由于主频对于数码管扫描来说频率过高,因而再进行一次分频

输入端口:

CLK外部时钟信号

输出端口:

CLK_OUT1分频后信号

◆计数器模块:

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

输入端口:

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

输出端口:

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

◆数码管计数模块:

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

输入接口:

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

输出接口:

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

◆显示模块:

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

输入接口:

NUMIN输入信号

输出接口:

NUM译码输出

◆信号灯控制模块:

使用状态机控制5个状态

输入接口:

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

输出接口:

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.紧急状态和复位状态

四.源程序(注释)

●TRAFFICILGHT.vhd----主程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYTRAFFICLIGHTIS

PORT(

CLK,RESET,EMERGENCY:

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

LIGHT1,LIGHT2:

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

NUM:

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

CAT_TEMP:

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

BELL:

OUTSTD_LOGIC----输出警铃信号

);

ENDTRAFFICLIGHT;

ARCHITECTUREMAINOFTRAFFICLIGHTIS

SIGNALTEMPCLK:

STD_LOGIC;

SIGNALTEMPCLK2:

STD_LOGIC;

SIGNALTEMPCOUNT:

STD_LOGIC_VECTOR(5DOWNTO0);

SIGNALTEMPNUM:

STD_LOGIC_VECTOR(3DOWNTO0);

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

PORT(

CLK:

INSTD_LOGIC;

CLK_OUT:

OUTSTD_LOGIC

);

ENDCOMPONENT;

COMPONENTDIV2IS

PORT(

CLK:

INSTD_LOGIC;

CLK_OUT:

OUTSTD_LOGIC

);

ENDCOMPONENT;

COMPONENTCOUNTIS

PORT(

CLK:

INSTD_LOGIC;

RESET:

INSTD_LOGIC;

EMERGENCY:

INSTD_LOGIC;

COUNTER:

OUTSTD_LOGIC_VECTOR(5DOWNTO0);

BELL:

OUTSTD_LOGIC

);

ENDCOMPONENT;

COMPONENTLIGHTIS

PORT(

EMERGENCY:

INSTD_LOGIC;

COUNT:

INSTD_LOGIC_VECTOR(5DOWNTO0);

LIGHT1,LIGHT2:

OUTSTD_LOGIC_VECTOR(2DOWNTO0)

);

ENDCOMPONENT;

COMPONENTSHUMAGUANIS

PORT(

COUNT:

INSTD_LOGIC_VECTOR(5DOWNTO0);

CLK:

INSTD_LOGIC;

NUMIN:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

CAT_TEMP:

OUTSTD_LOGIC_VECTOR(5DOWNTO0)

);

ENDCOMPONENT;

COMPONENTSHOWIS

PORT(

NUM_IN:

INSTD_LOGIC_VECTOR(3DOWNTO0);

NUM:

OUTSTD_LOGIC_VECTOR(6DOWNTO0)

);

ENDCOMPONENT;

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

U1:

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

U2:

COUNTPORTMAP

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

U3:

LIGHTPORTMAP

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

U4:

SHUMAGUANPORTMAP

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

U5:

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

U6:

DIV2PORTMAP(CLK=>CLK,CLK_OUT=>TEMPCLK2);

ENDMAIN;

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

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYDIVIS

PORT(

CLK:

INSTD_LOGIC;

CLK_OUT:

OUTSTD_LOGIC

);

ENDDIV;

ARCHITECTUREFREQOFDIVIS

SIGNALTEMP:

INTEGERRANGE0TO49999999;----设置分频49999999,则为1Hz

BEGIN

PROCESS(CLK)

BEGIN

IF(CLK'EVENTANDCLK='1')THEN

IF(TEMP=4999999)THEN

TEMP<=0;

ELSE

TEMP<=TEMP+1;

ENDIF;

IFTEMP=49999999THEN

CLK_OUT<='1';

ELSECLK_OUT<='0';

ENDIF;

ENDIF;

ENDPROCESS;

END;

●DIV2.vhd----次分频器模块,50KHz

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYDIV2IS

PORT(

CLK:

INSTD_LOGIC;

CLK_OUT:

OUTSTD_LOGIC

);

ENDDIV2;

ARCHITECTUREFREQOFDIV2IS

SIGNALTEMP:

INTEGERRANGE0TO4999;

BEGIN

PROCESS(CLK)

BEGIN

IF(CLK'EVENTANDCLK='1')THEN

IF(TEMP=4999)THEN

TEMP<=0;

ELSE

TEMP<=TEMP+1;

ENDIF;

IFTEMP=4999THEN

CLK_OUT<='1';

ELSECLK_OUT<='0';

ENDIF;

ENDIF;

ENDPROCESS;

END;

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

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

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

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYCOUNTIS

PORT(

CLK:

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

RESET:

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

EMERGENCY:

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

COUNTER:

OUTSTD_LOGIC_VECTOR(5DOWNTO0):

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

BELL:

OUTSTD_LOGIC----警铃信号输出

);

ENDCOUNT;

ARCHITECTURECONOFCOUNTIS

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);----内部信号转化为输出

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;

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

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYSHUMAGUANIS

PORT(

COUNT:

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

CLK:

INSTD_LOGIC;----时钟信号

NUMIN:

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

CAT_TEMP:

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

);

ENDSHUMAGUAN;

ARCHITECTURECOUNTEROFSHUMAGUANIS

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_IN<="0010";CAT<="111101";

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

ENDCASE;

WHEN6=>CASETEMPIS

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

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

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

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

ENDCASE;

WHEN7=>CASETEMPIS

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

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

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

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

ENDCASE;

WHEN8=>CASETEMPIS

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

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

WHEN

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

当前位置:首页 > 法律文书 > 调解书

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

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