数字电路交通灯控制器实验报告.docx
- 文档编号:29900420
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:35
- 大小:1.92MB
数字电路交通灯控制器实验报告.docx
《数字电路交通灯控制器实验报告.docx》由会员分享,可在线阅读,更多相关《数字电路交通灯控制器实验报告.docx(35页珍藏版)》请在冰豆网上搜索。
数字电路交通灯控制器实验报告
课题三:
交通灯控制器
课题三:
交通灯控制器
一.设计课题的任务要求
(一)、实验目的
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_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字电路 交通灯 控制器 实验 报告