1课题三:交通灯控制器学院:信息与通信工程学院专业:通信工程姓名:马赛克学号:092102462课题三:交通灯控制器一.设计课题的任务要求(一)、实验目的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为高电平时,则转移到一特殊状态。3(二)总体框图1.系统结构框图2.模块划分方框图3.控制模块流程图44.状态转移图(三)分块设计-------在VHDL设计中,采用自顶向下的设计思路。51.顶层模块中,根据硬件设计,设置如下端口:外部时钟信号:CLK紧急状态按键:EMERGENCY南北方向状态灯:LIGHT1东西方向状态灯:LIGHT2蜂鸣器控制:BELL数码管显示信号:NUM数码管共阴极控制:CAT_TEMP2.在底层中,把不同功能分模块设计。主分频模块:由于外部时钟信号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个状态6输入接口:COUNT计数器信号,EMERGENCY紧急状态控制,RESET复位信号输出接口:LIGHT1,LIGHT2信号灯输出三.仿真波形及波形分析仿真波形-------由于时钟为50MHz,故在仿真时为了波形图更易读,将分频器设为20分频1.状态周期为1~50,在每个状态内,数码管共阴极进行扫描,且扫描同时数码管显示进行循环变化2.周期状态,在1~20,21~25,26~45,46~50进行红绿灯显示变化73.一整个周期状态1~50,在1~20,21~25,26~45,46~50进行红绿灯显示变化4.多个周期循环85.紧急状态和复位状态四.源程序(注释)TRAFFICILGHT.vhd----主程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;9ENTITYTRAFFICLIGHTISPORT(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;ARCHITECTUREMAINOFTRAFFICLIGHTISSIGNALTEMPCLK: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;COMPONENTDIV2ISPORT(CLK:INSTD_LOGIC;CLK_OUT:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTCOUNTISPORT(CLK:INSTD_LOGIC;RESET:INSTD_LOGIC;EMERGENCY:INSTD_LOGIC;COUNTER:OUTSTD_LOGIC_VECTOR(5DOWNTO0);BELL:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTLIGHTISPORT(EMERGENCY:INSTD_LOGIC;10COUNT:INSTD_LOGIC_VECTOR(5DOWNTO0);LIGHT1,LIGHT2:OUTSTD_LOGIC_VECTOR(2DOWNTO0));ENDCOMPONENT;COMPONENTSHUMAGUANISPORT(COUNT:INSTD_LOGIC_VECTOR(5DOWNTO0);CLK:INSTD_LOGIC;NUMIN:OUTSTD_LOGIC_VECTOR(3DOWNTO0);CAT_TEMP:OUTSTD_LOGIC_VECTOR(5DOWNTO0));ENDCOMPONENT;COMPONENTSHOWISPORT(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----分频器模块,1HzLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDIVISPORT(CLK:INSTD_LOGIC;CLK_OUT:OUTSTD_LOGIC);ENDDIV;11ARCHITECTUREFREQOFDIVISSIGNALTEMP:INTEGERRANGE0TO49999999;----设置分频49999999,则为1HzBEGINPROCESS(CLK)BEGINIF(CLK'EVENTANDCLK='1')THENIF(TEMP=4999999)THENTEMP=0;ELSETEMP=TEMP+1;ENDIF;IFTEMP=49999999THENCLK_OUT='1';ELSECLK_OUT='0';ENDIF;ENDIF;ENDPROCESS;END;DIV2.vhd----次分频器模块,50KHzLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDIV2ISPORT(CLK:INSTD_LOGIC;CLK_OUT:OUTSTD_LOGIC);ENDDIV2;ARCHITECTUREFREQOFDIV2ISSIGNALTEMP:INTEGERRANGE0TO4999;BEGINPROCESS(CLK)BEGINIF(CLK'EVENTANDCLK='1')THENIF(TEMP=4999)THENTEMP=0;ELSETEMP=TEMP+1;ENDIF;IFTEMP=4999THENCLK_OUT='1';ELSECLK_OUT='0';ENDIF;ENDIF;ENDPROCESS;END;12COUNT.vhd----计数器模块(主要控制模块),用外部时钟设置了50个状态的一个周期1~50----由于该交通灯的状态为50种,数码管有50种显示状态----完全通过控制计数器的停止和复位来控制闪灯和数码管LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYCOUNTISPORT(CLK:INSTD_LOGIC;----外部时钟输入RESET:INSTD_LOGIC;----复位信号输入EMERGENCY:INSTD_LOGIC;----紧急信号输入COUNTER:OUTSTD_LOGIC_VECTOR(5DOWNTO0):=000001;----计数信号输出BELL:OUTSTD_LOGIC----警铃信号输出);ENDCOUNT;ARCHITECTURECONOFCOUNTISSIGNALTEMPCOUNT:INTEGERRANGE1TO50:=1;----定义信号计数,初始状态为1BEGINPROCESS(CLK,RESET,EMERGENCY)BEGINIFCLK'EVENTANDCLK='1'THEN----外部时钟,1HzIFEMERGENCY='0'THEN----当不是紧急状态BELL='0';IFRESET='1'THEN----复位状态TEMPCOUNT=1;----计数器回到初始状态1ELSIFTEMPCOUNT=50