实验五十字路口交通灯控制器设计一.实验目的1.进一步加强经典状态机的设计2.学会设计模可变倒计时计数器二.实验要求一条主干道,一条乡间公路。
组成十字路口,要求优先保证主干道通行。
有MR(主红)、MY(主黄)、MG(主绿)、CR(乡红)、CY(乡黄)、CG(乡绿)六盏交通灯需要控制;交通灯由绿→红有4秒黄灯亮的间隔时间,由红→绿没有间隔时间;系统有MRCY、MRCG、MYCR、MGCR四个状态;乡间公路右侧各埋有一个传感器,当有车辆通过乡间公路时,发出请求信号S=1,其余时间S=0;平时系统停留在MGCR(主干道通行)状态,一旦S信号有效,经MYCR(黄灯状态)转入MRCG(乡间公路通行)状态,但要保证MGCR的状态不得短于一分钟;一旦S信号无效,系统脱离MRCG状态。
随即经MRCY(黄灯状态)进入MGCR 状态,即使S信号一直有效,MRCG状态也不得长于20秒钟。
三.实验设计:1.一条主道,一条乡道,组成十字路口,要求优先保证主道通行。
2.当主道没有车通行,且乡道友车要通行时,并且此时主道通行时间大于1分钟,则主道变黄灯,乡道保持红灯,经过4秒倒计时时间进入主道为红灯乡道为绿灯的状态。
再倒计时20秒钟。
在倒计时过程中,若乡道突然没有车通行,马上进入主道红灯,乡道黄灯状态,倒计时4秒。
3.之后主道变为绿灯,乡道为红灯,这时无论乡道有无车通行都要倒计时60秒,然后若乡道有车通行则主道为黄灯,乡道为红灯,若乡道一直没有车要通行则保持主道通行,若乡道友车通行则按照上面的状态依次进行转换。
按照以上的思路,设计两个底层文件和一个顶层文件:1.模块1是状态改变控制6盏灯的亮与灭。
2.模块2是控制数码管显示倒计时数并且输出作为模块1的输入控制状态改变3.将两个模块连接成顶层文件,即可完成设计。
四.实验步骤1.分别将两个模块的代码输入,两个模块的代码如下:1)控制6盏灯的模块代码LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY jtd ISPORT(clk,RESET,S:IN STD_LOGIC;COUNT:IN STD_LOGIC_VECTOR(7 DOWNTO 0);MG,MY,MR,CG,CY,CR:OUT STD_LOGIC);END jtd;ARCHITECTURE behav OF jtd ISTYPE jtdSTATE IS(mgcr,mycr,mrcg,mrcy);SIGNAL STATE:jtdSTATE;BEGINPROCESS(RESET,STATE,clk, S)BEGINIF RESET='1' THEN STATE<=mgcr;MG<='1';CR<='1';MY<='0';MR<='0';CG<='0';CY<='0';ELSIF clk'EVENT AND clk='1' thenCASE STATE ISWHEN mgcr=>IF COUNT="00000000" AND S='1'THENSTATE<=mycr;MY<='1';CR<='1';MG<='0';MR<='0';CG<='0';CY<='0';ELSESTATE<=mgcr;MG<='1';CR<='1';MY<='0';MR<='0';CG<='0';CY<='0';END IF;WHEN mycr=>IF COUNT="00000000" THENSTATE<=mrcg;MR<='1';CG<='1';MG<='0';MY<='0';CR<='0';CY<='0';ELSESTATE<=mycr;MY<='1';CR<='1';MG<='0';MR<='0';CG<='0';CY<='0';END IF;WHEN mrcg=>IF COUNT="00000000" OR S='0'THENSTATE<=mrcy;MR<='1';CY<='1';MY<='0';MG<='0';CR<='0';CG<='0';ELSESTATE<=mrcg;MR<='1';CG<='1';MG<='0';MY<='0';CR<='0';CY<='0';END IF;WHEN mrcy=>IF COUNT="00000000" THENSTATE<=mgcr;MG<='1';CR<='1';MR<='0';MY<='0';CY<='0';CG<='0';ELSESTATE<=mrcy;MR<='1';CY<='1';MY<='0';MG<='0';CR<='0';CG<='0';END IF;END CASE;END IF;END PROCESS;END behav;2)控制数码管显示倒计时数并且输出:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY JISHU ISPORT(clk,S:IN STD_LOGIC;tim:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END JISHU;ARCHITECTURE behav OF JISHU ISTYPE RGY IS(mgcr,mycr,mrcg,mrcy);SIGNAL STATE:RGY;BEGINPROCESS(clk)VARIABLE b:STD_LOGIC:='0';VARIABLE a:STD_LOGIC:='0';VARIABLE th,tl:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN--IF RESET='1' THEN STATE<=mgcr; th:="0000" ;tl:="0000";a:='0';b:='0';IF clk'EVENT AND clk='1' THENCASE STATE ISWHEN mgcr => IF S='1' AND b='1' THEN STATE<=mycr;a:='0';th:="0000";tl:="0100";b:='0';ELSIF S='0' AND b='1' THEN STATE<=mgcr;a:='1';th:="0000";tl:="0001";ELSEIF a='0' THENth:="0110";tl:="0000";a:='1';elseIF NOT(th="0000" AND tl="0010") thenIF tl="0000" thentl:="1001";th:=th-1;else tl:=tl-1;END IF;ELSEth:="0000";tl:="0001";a:='0';b:='1';END IF;END IF;END IF;WHEN mycr => IF a='0' THENth:="0000";tl:="0100";a:='1';elseIF NOT(th="0000" AND tl="0010") thentl:=tl-1;ELSEth:="0000";tl:="0001";a:='0';STATE<=mrcg;END IF;END IF;WHEN mrcg =>IF S='1' THENIF a='0' THENth:="0010";tl:="0000";a:='1';elseIF NOT(th="0000" AND tl="0010") thenIF tl="0000" thentl:="1001";th:=th-1;else tl:=tl-1;END IF;ELSEth:="0000";tl:="0001";a:='0';STATE<=mrcy;END IF;END IF;ELSE a:='0';STATE<=mrcy;th:="0000";tl:="0100"; END IF;WHEN mrcy =>IF a='0' THENth:="0000";tl:="0100";a:='1';elseIF NOT(th="0000" AND tl="0010") thentl:=tl-1;ELSEth:="0000";tl:="0001";a:='0';STATE<=mgcr;END IF;END IF;END CASE;tim <= th & tl;END IF;end process;END behav;2.对各模块进行仿真:6盏灯颜色变化控制:倒计时60计数:倒计时20计数:3.顶层文件设计:顶层文件原理图如下:主道绿灯乡道红灯模60倒计时:主道红灯乡道黄灯模4倒计时:4.引脚锁定:时钟信号CLK接CLK3,78号引脚,选择2HZ脉冲。