交通信号控制器的VHDL的设计1.设计任务模拟十字路口交通信号灯的工作过程,利用实验板上的两组红、黄、绿LED作为交通信号灯,设计一个交通信号灯控制器,示意图如图1-1所示。要求:(1)交通灯从绿变红时,有4秒黄灯亮的间隔时间;(2)交通灯红变绿是直接进行的,没有间隔时间;(3)主干道上的绿灯时间为40秒,支干道的绿灯时间为20秒;(4)在任意时间,显示每个状态到该状态结束所需的时间。支干道主干道图1-1路口交通管理示意图表1-1交通信号灯的4种状态ABCD主干道交通灯绿(40秒)黄(4秒)红(20秒)红(4秒)支干道交通灯红红绿黄2.设计要求采用VHDL语言编写程序,并在QuartusII工具平台中进行开发,下载到EDA实验箱进行验证。编写设计报告,要求包括方案选择、程序清单、调试过程、测试结果及心得体会。3.设计方案CLK时间显示数据输出信号灯输出图3-1交通信号灯控制器程序原理框图进程将CLK信号分频后产生1秒信号,然后构成两个带有预置数功能的十进制计数器,并产生允许十位计数器计数的控制信号。状态寄存器实现状态转换和产生状态转换的控制信号,下个模块产生次态信号和信号灯输出信号,以及每一个状态的时间值。经过五个模块的处理,使时间计数、红绿灯显示能够正常运行。程序原理图如图3-1所示。4.各模块具体设计4.1顶层文件的设计顶层文件的原理图可以依据系统的框图进行,由控制模块JTD_CTRL、计时模块JTD_TIME、译码驱动模块JTD_LIGHT、显示模块JTD_DIS和分频模块JTD_FQU五部分组成,其顶层原理图文件如图3-1所示。秒脉冲信号发生器计数器状态寄存器次态发生器信号灯输出信号图4-1交通灯顶层文件原理图顶层模块的程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYTRAFFICISPORT(CLK1K,CLR:INSTD_LOGIC;M:INSTD_LOGIC_VECTOR(2DOWNTO0);LED:OUTSTD_LOGIC_VECTOR(6DOWNTO0);SEL:OUTSTD_LOGIC_VECTOR(2DOWNTO0);ABL:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDTRAFFIC;ARCHITECTUREBEHAVEOFTRAFFICISCOMPONENTJTD_FQUIS--分频器元件的例化PORT(CLK1K:INSTD_LOGIC;CLK:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTJTD_DISIS--数码显示的元件例化PORT(CLK1K,CLK,CLR:INSTD_LOGIC;M:INSTD_LOGIC_VECTOR(2DOWNTO0);AT,BT:INSTD_LOGIC_VECTOR(7DOWNTO0);LED:OUTSTD_LOGIC_VECTOR(6DOWNTO0);SEL:OUTSTD_LOGIC_VECTOR(2DOWNTO0));ENDCOMPONENT;COMPONENTJTD_LIGHTIS--译码驱动的元件例化PORT(CLR:INSTD_LOGIC;M,S:INSTD_LOGIC_VECTOR(2DOWNTO0);ABL:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDCOMPONENT;COMPONENTJTD_TIMEIS--计时元件的例化PORT(CLK,CLR:INSTD_LOGIC;M,S:INSTD_LOGIC_VECTOR(2DOWNTO0);AT,BT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDCOMPONENT;COMPONENTJTD_CTRLIS--控制模块的元件例化PORT(CLK,CLR:INSTD_LOGIC;AT,BT:INSTD_LOGIC_VECTOR(7DOWNTO0);M:INSTD_LOGIC_VECTOR(2DOWNTO0);S:OUTSTD_LOGIC_VECTOR(2DOWNTO0));ENDCOMPONENT;SIGNALCLK:STD_LOGIC;SIGNALAT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALBT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALS:STD_LOGIC_VECTOR(2DOWNTO0);BEGINU1:JTD_FQUPORTMAP(--名字关联方式赋值CLK1K=CLK1K,CLK=CLK);U2:JTD_TIMEPORTMAP(CLR=CLR,AT=AT,BT=BT,CLK=CLK,M=M,S=S);U3:JTD_CTRLPORTMAP(M=M,S=S,CLK=CLK,CLR=CLR,AT=AT,BT=BT);U4:JTD_DISPORTMAP(CLK1K=CLK1K,CLK=CLK,CLR=CLR,AT=AT,BT=BT,LED=LED,SEL=SEL,M=M);U5:JTD_LIGHTPORTMAP(CLR=CLR,S=S,ABL=ABL,M=M);ENDBEHAVE;4.2控制模块JTD_CTRL的设计控制的模块根据外部输入信号M2~M0和计时模块JTD_TIME的输入信号,产生系统的状态机,控制其他部分协调工作。控制模块的源文件程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYJTD_CTRLISPORT(CLK,CLR:INSTD_LOGIC;M:INSTD_LOGIC_VECTOR(2DOWNTO0);--用M来表示系统的8种工作状态AT,BT:INSTD_LOGIC_VECTOR(7DOWNTO0);S:OUTSTD_LOGIC_VECTOR(2DOWNTO0));ENDJTD_CTRL;ARCHITECTUREJTD_1OFJTD_CTRLISSIGNALQ:STD_LOGIC_VECTOR(2DOWNTO0);BEGINPROCESS(CLR,CLK,M,AT,BT)BEGINIFCLR='1'THENQ=000;--清'0'处理ELSIF(CLK'EVENTANDCLK='1')THEN--时钟上升沿信号一来,M控制系统的8种状态IFM=000THENQ=001;ENDIF;IFM=001THENQ=011;ENDIF;IFM=010THENQ=101;ENDIF;IFM=011THENQ=111;ENDIF;IFM=100THENIF(AT=X01)OR(BT=X01)THENQ=Q+1;ELSEQ=Q;ENDIF;ENDIF;ENDIF;ENDPROCESS;S=Q;--M的控制端转向控制口SENDJTD_1;该模块的时序仿真和功能仿真波形图如图4-2图4-2功能仿真4.3计时模块JTD_TIME的设计计时模块用来设定A和B两个方向计时器的初值,并为显示模块JTD_DIS提供倒计时时间。当正常计时开始后,需要进行定时计数操作,由于东西和南北两个方向上的时间显示器是由两个LED七段显示数码管组成的,因此需要产生两个2位的计时信息:2个十位信号,2个个位信号,这个定时计数操作可以由一个定时计数器来完成,又因为交通灯的状态变化是在计时为0的情况下才能进行的,因此需要一个计时电路来产生使能信号,因此定时计数的功能就是用来产生2个2位计时信息和使能信号。计时模块的源文件程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYJTD_TIMEISPORT(CLK,CLR:INSTD_LOGIC;M,S:INSTD_LOGIC_VECTOR(2DOWNTO0);AT,BT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDJTD_TIME;ARCHITECTUREJTD_2OFJTD_TIMEISSIGNALAT1,BT1:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALART,AGT,ALT,ABYT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALBRT,BGT,BLT:STD_LOGIC_VECTOR(7DOWNTO0);BEGINART=X55;--ART=“01010101”A方向红灯亮AGT=X40;--AGT=“01000000”A方向绿灯亮ALT=X15;--ALT=“00010101”灯间歇闪烁ABYT=X05;--ABYT=“00000101”AB两方向黄灯亮BRT=X65;--BRT=“01100101”B方向红灯亮BGT=X30;--BGT=“00110000”B方向绿灯亮BLT=X15;--BLT=“00010101”B方向灯闪烁PROCESS(CLR,CLK,M,S)BEGINIFCLR='1'THENAT1=X01;BT1=X01;ELSIF(CLK'EVENTANDCLK='1')THENIFM=000THENAT1=X01;BT1=X51;--M=0时,A方向的计时器计时,B方向的红灯亮ENDIF;IFM=001THENAT1=X01;BT1=X06;--M=1时,A方向的计时器计时,B方向绿灯亮ENDIF;IFM=010THENAT1=X41;BT1=X01;--B方向的计时器计时,A方向的黄灯亮ENDIF;IFM=011THENAT1=X06;BT1=X01;--B方向的计时器计时,A方向的红灯亮ENDIF;IFM=100THENIF(AT1=X01)OR(BT1=X01)THENCASESISWHEN000=AT1=ALT;BT1=BRT;--当S=0时,AB两方向的计时器计时,A方向车左转,B方向的红灯亮WHEN001=AT1=ABYT;--当S=1时,A方向计时器计时,A方向黄灯亮WHEN010=AT1=AGT;--当S=2时,A方向计时器计时,A方向绿灯亮WHEN011=AT1=ABYT;--当S=3时,AB两方向黄灯亮,A方向计时器计时WHEN100=AT1=ART;BT1=BLT;--当S=4时,A方向计时,红灯亮,B方向车左转,B方向计时器计时WHEN101=BT1=ABYT;--当S=5时,B方向计时器计时,AB两方向黄灯亮WHEN110=BT1=BGT;--当S=6时,B方向计时器计时,B方向绿灯亮WHEN111=BT1=ABYT;--当S=7时,B方向计时器计时,AB两方向车右转WHENOTHERS=AT1=AT1;BT1=BT1;ENDCASE;ENDIF;IFAT1/=X01THENIFAT1(3DOWNTO0)=0000THENAT1(3DOWNTO0)=1001;--第四位数码管显示AT1(7DOWNTO4)=AT1(7DOWNTO4)-1;高四位数码管减一显示ELSEAT1(3DOWNTO0)=AT1(3DOWNTO0)-1;低四位数码管减一显示AT1(7DOWNTO4)=AT1(7DOWNTO4);高四位数码管显示不变ENDIF;ENDIF;IFBT1=X01THENIFBT1(3DOWNTO0)=0000THENBT1(3DOWNTO0)=1001;--B方向计数器低四位数码管显示‘9’BT1(7DOWNTO4)=BT1(7DOWNTO4)-1;--B方向计数器高四位数码管减一计数ELSEBT1(3DOWNTO0)=BT1(3DOWNTO0)-1;-B方向计数器低四位数码管减一计数BT1(7DOWNTO4)=BT1(7DOWNTO4);ENDIF