实验五 交通灯实验.docx
《实验五 交通灯实验.docx》由会员分享,可在线阅读,更多相关《实验五 交通灯实验.docx(21页珍藏版)》请在冰豆网上搜索。
实验五交通灯实验
南昌大学实验报告
学生姓名:
学号:
6100210173专业班级:
中兴101班
实验类型:
□验证□综合■设计□创新实验日期:
2012
实验五十字路口交通灯控制器设计
一、实验目的
1)熟悉状态机的使用;
2)熟悉多进程程序设计;
3)熟悉实验设备和软件,掌握实验操作。
二、实验内容和要求
1、一条主干道,一条乡间公路。
组成十字路口,要求优先保证主干道通行。
有MR(主红)、MY(主黄)、MG(主绿)、BR(乡红)、BY(乡黄)、BG(乡绿)六盏交通灯需要控制;交通灯由绿→红有5秒黄灯亮的间隔时间,由红→绿没有间隔时间;系统有MRBY、MRBG、MYBR、MGBR四个状态;
2、乡间公路右侧埋有一个传感器,当有车辆通过乡间公路时,发出请求信号SB=1,
余时间S=0;主干道也有一个,当有车经过的时候,发出请求信号SM=1;
3、平时系统停留在MGBR(主干道通行)状态,一旦SB信号有效,经MYBR(黄灯状态)转入MRBG(乡间公路通行)状态,但要保证MGBR的状态不得短于45s;一旦SB信号无效,系统脱离MRBG状态。
随即经MRBY(黄灯状态)进入MGBR状态,即使SB信号一直有效,MRBG状态也不得长于25秒钟。
三、设计思想
1、程序部共分为五大模块
1、五秒倒计时
2、二十五秒倒计时
3、四十五秒倒计时
4、状态机设计
5、数码管选择并分配
其中有一个问题,计时时钟和数码管选择不能使用一个时钟,因为数码管选择需要很高频率的时钟,而计时时钟需要1HZ时钟,因此在结构体中还有一个进程,用于把CLKS数码管选择时钟分频后得到CLK,把它用于计时时钟。
2、程序设计所要达到的效果
开始,SM=0、SB=0,处于主绿从红的状态,且这时数码管不计数。
若SM=1(主有车)、SB=0(从无车),状态不变;若SM=0、SB=1,此时主干道由绿变黄再变红,而从干道待主干道变红时即变绿;若SM=1、SB=1,此时数码管进行45s倒计时后,转入主黄从红的状态,计时5s后转入主红从绿的状态,计时25s后,在转入主红从黄的状态,最后计时5s后又从新回到主绿从黄的状态。
若在状态进行转换的时候SM、SB的状态发生了变化,即按上述SM、SB如何变化进行状态转换。
3、状态转移图如下(仅当SM=1时)
SB=0C<5
SB=1C>45s
MGBRMYBR
SB=1
5秒后5秒后
C<5
SB=1C<25
MRBYMRBG
SB=1C>25
四、
试验程序
实验总框图
--1000分频程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcou1IS
GENERIC(N:
INTEGER:
=4);--定义一个generic
PORT(CLK:
INSTD_LOGIC;
CLK1:
OUTSTD_LOGIC);
ENDcou1;
ARCHITECTUREbehavOFcou1IS
SIGNALCNT:
STD_LOGIC_VECTOR(9DOWNTO0);
BEGIN
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN--产生一个占空比为50%的方波
IFCNT>=N/2-1THENCLK1<='1';CNT<=CNT+1;
IFCNT=N-1THENCLK1<='0';CNT<="0000000000";
ENDIF;
ELSECLK1<='0';CNT<=CNT+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREbehav;
--状态控制程序
--JTDKZ.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYJTDKZIS
PORT(CLK,SM,SB:
INSTD_LOGIC;--MR:
主干道红灯MY:
主黄MG:
主绿
MR,MY,MG,BR,BY,BG:
OUTSTD_LOGIC);--BR:
从干道红灯BY:
从黄BG:
从绿
--以上信号为1时点亮相应的灯
ENDENTITYJTDKZ;--SM=1主干道有车SM=0主干道无车
ARCHITECTUREARTOFJTDKZIS--SB=1从干道有车SB=0从干道无车
TYPESTATE_TYPEIS(A,B,C,D);
SIGNALSTATE:
STATE_TYPE;
BEGIN
CNT:
PROCESS(CLK)IS
VARIABLES:
INTEGERRANGE0TO45;
VARIABLECLR,EN:
BIT;
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IFCLR='0'THEn
S:
=0;
ELSIFEN='0'THEN
S:
=S;
ELSE
S:
=S+1;
ENDIF;
CASESTATEIS
WHENA=>MR<='0';MY<='0';MG<='1';--状态一:
主绿从红
BR<='1';BY<='0';BG<='0';
IF(SBANDSM)='1'THEN--主从干道都有车时进行45s倒
IFS=45THEN--计时,计完后转入状态二
STATE<=B;CLR:
='0';EN:
='0';
ELSE
STATE<=A;CLR:
='1';EN:
='1';
ENDIF;
ELSIF(SBAND(NOTSM))='1'THEN--主干道无车,从干道有车转到状态二
STATE<=B;CLR:
='0';EN:
='0';
ELSE
STATE<=A;CLR:
='1';EN:
='1';
ENDIF;
WHENB=>MR<='0';MY<='1';MG<='0';--状态二:
主黄从红
BR<='1';BY<='0';BG<='0';
IFS=5THEN--5s倒计时,计完转入状态三
STATE<=C;CLR:
='0';EN:
='0';
ELSE
STATE<=B;CLR:
='1';EN:
='1';
ENDIF;
WHENC=>MR<='1';MY<='0';MG<='0';--状态三:
主红从绿
BR<='0';BY<='0';BG<='1';
IF(SMANDSB)='1'THEN--主从干道都有车,25s倒计时后转入
IFS=25THEN--状态四
STATE<=D;CLR:
='0';EN:
='0';
ELSE
STATE<=C;CLR:
='1';EN:
='1';
ENDIF;
ELSIFSB='0'THEN--若从干道此时无车,直接转入状态四
STATE<=D;CLR:
='0';EN:
='0';
ELSE
STATE<=C;CLR:
='1';EN:
='1';
ENDIF;
WHEND=>MR<='1';MY<='0';MG<='0';--状态四:
主红从黄
BR<='0';BY<='1';BG<='0';
IFS=5THEN--5s倒计时后转入状态一
STATE<=A;CLR:
='0';EN:
='0';
ELSE
STATE<=D;CLR:
='1';EN:
='1';
ENDIF;
ENDCASE;
ENDIF;
ENDPROCESSCNT;
ENDARCHITECTUREART;
--45s延时
--CNT45S.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT45SIS
PORT(SB,CLK,EN45:
INSTD_LOGIC;
DOUT45M,DOUT45B:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDENTITYCNT45S;
ARCHITECTUREARTOFCNT45SIS
SIGNALCNT6B:
STD_LOGIC_VECTOR(5DOWNTO0);
BEGIN
PROCESS(SB,CLK,EN45)IS
BEGIN
IFSB='0'THENCNT6B<=CNT6B-CNT6B-1;--若从干道无车,不计时
ELSIF(CLK'EVENTANDCLK='1')THEN
IFEN45='1'THENCNT6B<=CNT6B+1;
ELSIFEN45='0'THENCNT6B<=CNT6B-CNT6B-1;--若主干道不是绿灯不计时
ENDIF;
ENDIF;
ENDPROCESS;----将顺序计数转化为倒序45sBCD码计数
PROCESS(CNT6B)IS----DOUT45M从45到0;DOUT45B从50到5,然后从5直接变到0,
BEGIN----因为在状态二的时候有5S黄灯时间需要在从干道上显示,从干道
CASECNT6BIS--上的人累计等待时间50s
WHEN"000000"=>DOUT45M<="01000101";DOUT45B<="01010000";
WHEN"000001"=>DOUT45M<="01000100";DOUT45B<="01001001";
WHEN"000010"=>DOUT45M<="01000011";DOUT45B<="01001000";
WHEN"000011"=>DOUT45M<="01000010";DOUT45B<="01000111";
WHEN"000100"=>DOUT45M<="01000001";DOUT45B<="01000110";
WHEN"000101"=>DOUT45M<="01000000";DOUT45B<="01000101";
WHEN"000110"=>DOUT45M<="00111001";DOUT45B<="01000100";
WHEN"000111"=>DOUT45M<="00111000";DOUT45B<="01000011";
WHEN"001000"=>DOUT45M<="00110111";DOUT45B<="01000010";
WHEN"001001"=>DOUT45M<="00110110";DOUT45B<="01000001";
WHEN"001010"=>DOUT45M<="00110101";DOUT45B<="01000000";
WHEN"001011"=>DOUT45M<="00110100";DOUT45B<="01101001";
WHEN"001100"=>DOUT45M<="00110011";DOUT45B<="00111000";
WHEN"001101"=>DOUT45M<="00110010";DOUT45B<="00110111";
WHEN"001110"=>DOUT45M<="00110001";DOUT45B<="00110110";
WHEN"001111"=>DOUT45M<="00110000";DOUT45B<="00110101";
WHEN"010000"=>DOUT45M<="00101001";DOUT45B<="00110100";
WHEN"010001"=>DOUT45M<="00101000";DOUT45B<="00110011";
WHEN"010010"=>DOUT45M<="00100111";DOUT45B<="00110010";
WHEN"010011"=>DOUT45M<="00100110";DOUT45B<="00110001";
WHEN"010100"=>DOUT45M<="00100101";DOUT45B<="00110000";
WHEN"010101"=>DOUT45M<="00100100";DOUT45B<="00101001";
WHEN"010110"=>DOUT45M<="00100011";DOUT45B<="00101000";
WHEN"010111"=>DOUT45M<="00100010";DOUT45B<="00100111";
WHEN"011000"=>DOUT45M<="00100001";DOUT45B<="00100110";
WHEN"011001"=>DOUT45M<="00100000";DOUT45B<="00100101";
WHEN"011010"=>DOUT45M<="00011001";DOUT45B<="00100100";
WHEN"011011"=>DOUT45M<="00011000";DOUT45B<="00100011";
WHEN"011100"=>DOUT45M<="00010111";DOUT45B<="00100010";
WHEN"011101"=>DOUT45M<="00010110";DOUT45B<="00100001";
WHEN"011110"=>DOUT45M<="00010101";DOUT45B<="00100000";
WHEN"011111"=>DOUT45M<="00010100";DOUT45B<="00011001";
WHEN"100000"=>DOUT45M<="00010011";DOUT45B<="00011000";
WHEN"100001"=>DOUT45M<="00010010";DOUT45B<="00010111";
WHEN"100010"=>DOUT45M<="00010001";DOUT45B<="00010110";
WHEN"100011"=>DOUT45M<="00010000";DOUT45B<="00010101";
WHEN"100100"=>DOUT45M<="00001001";DOUT45B<="00010100";
WHEN"100101"=>DOUT45M<="00001000";DOUT45B<="00010011";
WHEN"100110"=>DOUT45M<="00000111";DOUT45B<="00010010";
WHEN"100111"=>DOUT45M<="00000110";DOUT45B<="00010001";
WHEN"101000"=>DOUT45M<="00000101";DOUT45B<="00010000";
WHEN"101001"=>DOUT45M<="00000100";DOUT45B<="00001001";
WHEN"101010"=>DOUT45M<="00000011";DOUT45B<="00001000";
WHEN"101011"=>DOUT45M<="00000010";DOUT45B<="00000111";
WHEN"101100"=>DOUT45M<="00000001";DOUT45B<="00000110";
WHENOTHERS=>DOUT45M<="00000000";DOUT45B<="00000000";
ENDCASE;
ENDPROCESS;
ENDARCHITECTUREART;
--25s延时(与45s延时编程思想一样,这里不做说明了)
--CNT25S.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT25SIS
PORT(SB,SM,CLK,EN25:
INSTD_LOGIC;
DOUT25M,DOUT25B:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDENTITYCNT25S;
ARCHITECTUREARTOFCNT25SIS
SIGNALCNT5B:
STD_LOGIC_VECTOR(4DOWNTO0);
BEGIN
PROCESS(SB,SM,CLK,EN25)IS
BEGIN
IFSB='0'ORSM='0'THEN
CNT5B<=CNT5B-CNT5B-1;
ELSIF(CLK'EVENTANDCLK='1')THEN
IFEN25='1'THEN
CNT5B<=CNT5B+1;
ELSIFEN25='0'THEN
CNT5B<=CNT5B-CNT5B-1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CNT5B)IS
BEGIN
CASECNT5BIS
WHEN"00000"=>DOUT25B<="00100101";DOUT25M<="00110000";
WHEN"00001"=>DOUT25B<="00100100";DOUT25M<="00101001";
WHEN"00010"=>DOUT25B<="00100011";DOUT25M<="00101000";
WHEN"00011"=>DOUT25B<="00100010";DOUT25M<="00100111";
WHEN"00100"=>DOUT25B<="00100001";DOUT25M<="00100110";
WHEN"00101"=>DOUT25B<="00100000";DOUT25M<="00100101";
WHEN"00110"=>DOUT25B<="00011001";DOUT25M<="00100100";
WHEN"00111"=>DOUT25B<="00011000";DOUT25M<="00100011";
WHEN"01000"=>DOUT25B<="00010111";DOUT25M<="00100010";
WHEN"01001"=>DOUT25B<="00010110";DOUT25M<="00100001";
WHEN"01010"=>DOUT25B<="00010101";DOUT25M<="00100000";
WHEN"01011"=>DOUT25B<="00010100";DOUT25M<="00011001";
WHEN"01100"=>DOUT25B<="00010011";DOUT25M<="00011000";
WHEN"01101"=>DOUT25B<="00010010";DOUT25M<="00010111";
WHEN"01110"=>DOUT25B<="00010001";DOUT25M<="00010110";
WHEN"01111"=>DOUT25B<="00010000";DOUT25M<="00010101";
WHEN"10000"=>DOUT25B<="00001001";DOUT25M<="00010100";
WHEN"10001"=>DOUT25B<="00001000";DOUT25M<="00010011";
WHEN"10010"=>DOUT25B<="00000111";DOUT25M<="00010010";
WHEN"10011"=>DOUT25B<="00000110";DOUT25M<="00010001";
WHEN"10100"=>DOUT25B<="00000101";DOUT25M<="00010000";
WHEN"10101"=>DOUT25B<="00000100";DOUT25M<="00001001";
WHEN"10110"=>DOUT25B<="00000011";DOUT25M<="00001000";
WHEN"10111"=>DOUT25B<="00000010";DOUT25M<="00000111";
WHEN"11000"=>DOUT25B<="00000001";DOUT25M<="00000110";
WHENOTHERS=>DOUT25B<="00000000";DOUT25M<="00000000";
ENDCASE;
ENDPROCESS;
ENDARCHITECTUREART;
--5s延时(与45s类似)
--CNT05S.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT05SIS
PORT(CLK,EN05M,EN05B:
INSTD_LOGIC;
DOUT5:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDENTITYCNT05S;
ARCHITECTUREARTOFCNT05SIS
SIGNALCNT3B:
STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
PROCESS(CLK,EN05M,EN05B)IS
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IFEN05M='1'OREN05B='1'THEN
CNT3B<=CNT3B+1;
ELSE
CNT3B<="000";
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CNT3B)IS
BEGIN
CASECNT3BIS
WHEN"000"=>DOUT5<="00000101";
WHEN"001"=>DOUT5<="00000100";
WHEN"010"=>DOUT5<="00000011";
WHEN"011"=>DOUT5<="00000010";
WHEN"100"=>DOUT5<="00000001";
WHENOTHERS=>--DOUT5<="00000000";
ENDCASE;
ENDPROCESS;
ENDARCHITECTUREART;
--数码管显示控制程序
--XSKZ.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_11