交通灯实验报告.docx
- 文档编号:24302703
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:49
- 大小:911.50KB
交通灯实验报告.docx
《交通灯实验报告.docx》由会员分享,可在线阅读,更多相关《交通灯实验报告.docx(49页珍藏版)》请在冰豆网上搜索。
交通灯实验报告
课题三:
交通灯控制器
学院:
信息与通信工程学院
班级:
2009211127班
姓名:
张帆
学号:
09210746
课题三:
交通灯控制器
一、设计课题的任务要求
(一)、实验目的
1.熟练掌握VHDL语言和QuartusII软件的使用;
2.理解状态机的工作原理和设计方法;
3.掌握利用EDA工具进行自顶向下的电子系统设计方法;
(二)、相关知识
本实验要利用CPLD设计实现一个十字路口的交通灯控制系统,与其他控制系统一样,本系统划分为控制器和受控电路两部分。
控制器使整个系统按设定的工作方式交替指挥车辆及行人的通行,并接收受控部分的反馈信号,决定其状态转换方向及输出信号,控制整个系统的工作过程。
路口交通灯控制系统的有东西路和南北路交通灯R(红)、Y(黄)、G(绿)三色,所有灯均为高电平点亮。
设置20s的通行时间和5s转换时间的变模定时电路,用数码管显示剩余时间。
提供系统正常工作/复位和紧急情况两种工作模式。
(三)、实验任务
1.基本任务:
设计制作一个用于十字路口的交通灯控制器。
1).南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20秒、5秒和25秒;
2).当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行;
3).用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间;
2.提高要求:
1).增加左、右转弯显示控制功能;
2).紧急状况时增加声光警告功能;
3).自拟其它功能。
二、系统设计(包括设计思路、总体框图、分块设计)
(一)、设计思路
1.输入接口:
CLK——时钟信号
RESET——复位信号
EMERGENCY——紧急信号
2.输出接口:
LIGHT1——东西向信号灯
LIGHT2——南北向信号灯
CAT_TEMP——数码管共阴极控制信号
NUM——数码管显示输出
BELL——响铃信号
3.程序控制设计:
在本实验中加入左转控制信号,则需要四组红绿灯方可表示,而实验板上只有两组红绿灯,故采用灯亮的位置来表示红绿灯控制:
LIGHT1,LIGHT2分别表示东西向和南北向信号灯,均用四个灯来表示执行和左转控制:
0001代表直行允许,禁止左转
0010代表直行黄灯,禁止左转
0011代表禁止直行,左转允许
0100代表禁止直行,左转黄灯
0101代表禁止直行,禁止左转
实验板上的时钟信号直接提供给CLK,其频率为50MHz,而实验中需要的是1Hz的始终信号,故用分频系数为50M的分频器FREQUENCY将CLK的频率降为1Hz输出作为计时器的输入,采用如下所示的红绿灯亮灭:
当EMERGENCY=1时,BELL=1,蜂鸣器响起,所有信号灯都为红灯;当RESET信号来时,恢复到初始状态
(二)、总体框图
1.状态转移图
2.模块示意图
(三)、分块设计
1.顶层模块中,根据硬件设计,设置如下端口:
外部时钟信号:
CLK
紧急状态按键:
EMERGENCY
东西方向状态灯:
LIGHT1
南北方向状态灯:
LIGHT2
蜂鸣器控制:
BELL
数码管显示信号:
NUM
数码管共阴极控制:
CAT_TEMP
2.在底层中,把不同功能分模块设计。
分频器模块:
ØFREQUENCY:
外部输入时钟为50MHz,而实验中需要频率为1Hz的时钟信号输入,故设置此分频系数为50M的分频器,用以提供计数器模块的时钟信号
✧输入端口:
CLK外部时钟信号
✧输出端口:
CLK_OUT分频后信号
ØFREQUENCY1:
外部输入时钟为50MHz,对于数码管扫描来说,此频率过于高,造成数码管显示不稳定,所以设置此分频系数为100K的分频器,来提供倒计时模块的数码管扫描时钟信号
✧输入端口:
CLK外部时钟信号
✧输出端口:
CLK_OUT分频后信号
计数器模块:
ØCOUNTER:
整个过程的显示周期为100秒,所以设置此计数器的周期为100,并加入紧急信号控制和复位信号控制,当EMERGENCY=1时,BELL=1,计数停止;当RESET信号来时,计数器回到初始状态1
✧输入端口:
CLK时钟信号
EMERGENCY紧急信号
RESET复位信号
✧输出端口:
COUNTER计数状态信号
BELL报警信号
倒计时模块:
ØCOUNTDOWN:
通过输入的计数信号,来控制倒计时信号,并通过输入的经过FREQUENCY1分频的时钟信号来控制数码管共阴极扫描信号
✧输入端口:
CLK时钟信号
COUNT计数器信号
✧输出端口:
CAT_TEMP共阴极控制
NUMIN数字输出
信号灯控制模块
ØLIGHT:
控制东西向南北向信号灯,采用双进程来控制9个状态,当EMERGENCY=1时,所有的红灯均亮起
✧输入端口:
COUNT计数器信号
EMERGENCY紧急状态控制
✧输出端口:
LIGHT1,LIGHT2信号灯输出
译码显示模块
ØSHOW:
通过接收倒计时模块给出的信号,将其译码为数码管可显示的信号
✧输入端口:
NUMIN输入信号
✧输出端口:
NUM译码输出
连接模块
ØTRAFFIC:
将以上各个模块连接起来
三、仿真波形及波形分析(分块仿真波形)
由于分频器的写法已经很成熟且在此实验中分频系数过大,计算机运行存在一定的困难,故不对分频器即总的程序进行仿真,在此只给出分模块的仿真波形。
计数器模块COUNTER
RESET信号来时,计数恢复到初始状态1
EMERGENCY=1时,BELL=1,计时停止
时钟信号控制共阴极扫描信号CAT_TEMP,计数信号COUNT控制倒计时信号NUMIN
倒计时模块COUNTDOWN
当EMERGENCY=1时,进入S8状态,所有红灯都亮起
信号灯控制模块LIGHT
将输入的NUM_IN信号转换为数码管可以显示的NUM信号
译码显示模块SHOW
四、源程序(注释)
TRAFFIC.vhd——主程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYTRAFFICIS
PORT(
CLK1,RESET,EMERGENCY:
INSTD_LOGIC;——输入信号(时钟,复位,紧急)
LIGHT1,LIGHT2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);——输出灯控制信号
NUM:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);——输出倒计时显示信号
CAT_TEMP:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);——输出数码管共阴极扫描信号
BELL:
OUTSTD_LOGIC——输出警铃信号
);
ENDTRAFFIC;
ARCHITECTURETRAFFICSHOWOFTRAFFICIS
SIGNALTEMPCLK1:
STD_LOGIC;——接FREQUENCY输出的1Hz的时钟频率
SIGNALTEMPCLK2:
STD_LOGIC;——接FREQUENCY1输出的500Hz的时钟频率
SIGNALTEMPCOUNT:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALTEMPNUM:
STD_LOGIC_VECTOR(3DOWNTO0);
COMPONENTFREQUENCYIS——分频器模块(分频系数为50M,输出1Hz的频率)
PORT(
CLK:
INSTD_LOGIC;
CLK_OUT:
OUTSTD_LOGIC
);
ENDCOMPONENT;
COMPONENTFREQUENCY1IS——分频器模块(分频系数为100K,输出500Hz的频率,用于数码管共阴极扫描)
PORT(
CLK:
INSTD_LOGIC;
CLK_OUT:
OUTSTD_LOGIC
);
ENDCOMPONENT;
COMPONENTCOUNTERIS——计数器模块
PORT(
CLK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
EMERGENCY:
INSTD_LOGIC;
COUNTER:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
BELL:
OUTSTD_LOGIC
);
ENDCOMPONENT;
COMPONENTLIGHTIS——灯控模块
PORT(
EMERGENCY:
INSTD_LOGIC;
COUNT:
INSTD_LOGIC_VECTOR(6DOWNTO0);
LIGHT1,LIGHT2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDCOMPONENT;
COMPONENTCOUNTDOWNIS——倒计时模块
PORT(
COUNT:
INSTD_LOGIC_VECTOR(6DOWNTO0);
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:
FREQUENCYPORTMAP(CLK=>CLK1,CLK_OUT=>TEMPCLK1);
U2:
FREQUENCY1PORTMAP(CLK=>CLK1,CLK_OUT=>TEMPCLK2);
U3:
COUNTERPORTMAP(BELL=>BELL,CLK=>TEMPCLK1,RESET=>RESET,EMERGENCY=>EMERGENCY,COUNTER=>TEMPCOUNT);
U4:
LIGHTPORTMAP(EMERGENCY=>EMERGENCY,COUNT=>TEMPCOUNT,LIGHT1=>LIGHT1,LIGHT2=>LIGHT2);
U5:
COUNTDOWNPORTMAP(CAT_TEMP=>CAT_TEMP,COUNT=>TEMPCOUNT,CLK=>TEMPCLK2,NUMIN=>TEMPNUM);
U6:
SHOWPORTMAP(NUM_IN=>TEMPNUM,NUM=>NUM);
ENDTRAFFICSHOW;
FREQUENCY.vhd——分频系数为50M的分频器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYFREQUENCYIS
PORT(
CLK:
INSTD_LOGIC;
CLK_OUT:
OUTSTD_LOGIC
);
ENDFREQUENCY;
ARCHITECTUREFREQOFFREQUENCYIS
SIGNALTEMP:
INTEGERRANGE0TO49999999;——设置分频系数为50M
BEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IF(TEMP=49999999)THEN
TEMP<=0;
ELSE
TEMP<=TEMP+1;
ENDIF;
IFTEMP<49999999THEN
CLK_OUT<='0';
ELSECLK_OUT<='1';
ENDIF;
ENDIF;
ENDPROCESS;
END;
FREQUENCY1.vhd——分频系数为100K的分频器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYFREQUENCY1IS
PORT(
CLK:
INSTD_LOGIC;
CLK_OUT:
OUTSTD_LOGIC
);
ENDFREQUENCY1;
ARCHITECTUREFREQOFFREQUENCY1IS
SIGNALTEMP:
INTEGERRANGE0TO99999;——设置分频系数为100K
BEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IF(TEMP=99999)THEN
TEMP<=0;
ELSE
TEMP<=TEMP+1;
ENDIF;
IFTEMP<99999THEN
CLK_OUT<='0';
ELSECLK_OUT<='1';
ENDIF;
ENDIF;
ENDPROCESS;
END;
COUNTER.vhd
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYCOUNTERIS
PORT(
CLK:
INSTD_LOGIC;——输入时钟信号1Hz
RESET:
INSTD_LOGIC;——输入复位信号(高电平有效)
EMERGENCY:
INSTD_LOGIC;——输入紧急信号(高电平有效)
COUNTER:
OUTSTD_LOGIC_VECTOR(6DOWNTO0):
="0000001";——计数输出信号(从1到100的二进制数组)
BELL:
OUTSTD_LOGIC——警铃信号输出
);
ENDCOUNTER;
ARCHITECTURECONOFCOUNTERIS
SIGNALTEMPCOUNT:
INTEGERRANGE1TO100:
=1;
BEGIN
PROCESS(CLK,RESET,EMERGENCY)
BEGIN
IFEMERGENCY='0'THEN——先判断是否有紧急情况出现
BELL<='0';
IFRESET='0'THEN——判断是否有复位信号出现
IFCLK'EVENTANDCLK='1'THEN——时钟到来,TEMPCOUNT加1,到100重新回到初始状态1
IFTEMPCOUNT=100THEN
TEMPCOUNT<=1;
ELSETEMPCOUNT<=TEMPCOUNT+1;
ENDIF;
ENDIF;
ELSIFRESET='1'THEN
TEMPCOUNT<=1;
ENDIF;
ELSIFEMERGENCY='1'THEN
TEMPCOUNT<=TEMPCOUNT;
BELL<='1';
ENDIF;
ENDPROCESS;
COUNTER<=CONV_STD_LOGIC_VECTOR(TEMPCOUNT,7);——为方便仿真时观看效果,将十进制信号转化为二进制数组输出
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(6DOWNTO0);
LIGHT1,LIGHT2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)——LIGHT1代表东西向灯,LIGHT2代表南北向灯
);
ENDLIGHT;
ARCHITECTURELIGHTSHOWOFLIGHTIS
TYPESTATESIS
(S0,S1,S2,S3,S4,S5,S6,S7,S8);——S8为紧急状态
SIGNALSTATE:
STATES;
SIGNALTEMPCOUNT:
INTEGERRANGE1TO100;
BEGIN
P1:
PROCESS(COUNT,EMERGENCY)
BEGIN
TEMPCOUNT<=CONV_INTEGER(COUNT);——将二进制输入转化为十进制计数信号
IFEMERGENCY='1'THEN——EMERGENCY为高电平时为紧急状态
STATE<=S8;
ELSE
CASETEMPCOUNTIS
WHEN1TO20=>STATE<=S0;----1秒到20秒
WHEN21TO25=>STATE<=S1;----21秒到25秒
WHEN26TO45=>STATE<=S2;----26秒到45秒
WHEN46TO50=>STATE<=S3;----46秒到50秒
WHEN51TO70=>STATE<=S4;----51秒到70秒
WHEN71TO75=>STATE<=S5;----71秒到75秒
WHEN76TO95=>STATE<=S6;----76秒到95秒
WHEN96TO100=>STATE<=S7;----96秒到100秒
ENDCASE;
ENDIF;
ENDPROCESSP1;
P2:
PROCESS(STATE)
BEGIN
CASESTATEIS
WHENS0=>LIGHT1<="0001";----南北允许直行,禁止左转
LIGHT2<="0101";----东西既禁止直行,也禁止左转
WHENS1=>LIGHT1<="0010";----南北直行黄灯,禁止左转
LIGHT2<="0101";----东西既禁止直行,也禁止左转
WHENS2=>LIGHT1<="0011";----南北禁止直行,允许左转
LIGHT2<="0101";----东西既禁止直行,也禁止左转
WHENS3=>LIGHT1<="0100";----南北禁止直行,左转黄灯
LIGHT2<="0101";----东西既禁止直行,也禁止左转
WHENS4=>LIGHT1<="0101";----南北既禁止直行,也禁止左转
LIGHT2<="0001";----东西允许直行,禁止左转
WHENS5=>LIGHT1<="0101";----南北既禁止直行,也禁止左转
LIGHT2<="0010";----东西直行黄灯,禁止左转
WHENS6=>LIGHT1<="0101";----南北既禁止直行,也禁止左转
LIGHT2<="0001";----东西禁止直行,允许左转
WHENS7=>LIGHT1<="0101";----南北既禁止直行,也禁止左转
LIGHT2<="0001";----东西禁止直行,左转黄灯
WHENS8=>LIGHT1<="0101";----南北既禁止直行,也禁止左转
LIGHT2<="0101";----东西既禁止直行,也禁止左转
ENDCASE;
ENDPROCESS;
ENDLIGHTSHOW;
COUNTDOWN.vhd
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYCOUNTDOWNIS
PORT(
COUNT:
INSTD_LOGIC_VECTOR(6DOWNTO0);
CLK:
INSTD_LOGIC;——接500Hz时钟信号,控制7段数码管共阴极扫描
NUMIN:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CAT_TEMP:
OUTSTD_LOGIC_VECTOR(5DOWNTO0)——7端数码管共阴极输出控制信号
);
ENDCOUNTDOWN;
ARCHITECTURECOUNTSHOWOFCOUNTDOWNIS
SIGNALTEMP:
INTEGERRANGE0TO3;
SIGNALCOUNTER:
INTEGERRANGE1TO100;
SIGNALCAT:
STD_LOGIC_VECTOR(5DOWNTO0):
="011111";
SIGNALNUM_IN:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
P1:
PROCESS(CLK)----500HZ时钟,控制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----在每个状态内部设置数码管扫描过程
WHEN0=>NUM_IN<="0001";CAT<="011111";
WHEN1=>NUM_IN<="1001";CAT<="101111";
WHEN2=>NUM_IN<="0100";CAT<="111101";
WHEN3=>NUM_IN<="1001";CAT<="111110";
ENDCASE;
WHEN2=>CASETEMPIS
WHEN0=>NUM_IN<="0001";CAT<="011111";
WHEN1=>NUM_IN<="1000";CAT<="101111";
WHEN2=>NUM_IN<="0100";CAT<="111101";
WHEN3=>NUM_IN<="1000";CAT<="111110";
ENDCASE;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 交通灯 实验 报告