当前位置:文档之家› 基于EDA十字路口交通灯控制器设计

基于EDA十字路口交通灯控制器设计

十字路口交通灯控制器设计

一、实验目的

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)当S=1,且计数器已完成60计数时,计数器进入模4计数,随后进入模

20计数,再进入模4计数,再回到模60计数

2)当计数器进行摸20计数时,一旦S变为0,计数器立马进入模4计数,

再进入模60计数

3)完成模20计数后,不论S为0或1,计数器进入模4计数,再进入模60

计数

4)若计数器未完成模60计数,不论S如何变话,计数器将继续进行模60

计数

3、使用文本设计底层文件,并生成相应元器件,再使用原理图设计顶层文件

四、实验步骤

1、建立工作库文件夹和编辑设计文件

1)建立一个文件夹保存工程文件;

2)打开QuartusII,建立新的VHDL文件,再打开的页面下输入以下程序

控制6盏灯的模块代码:

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY jtd IS

PORT(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 IS

TYPE jtdSTATE IS(mgcr,mycr,mrcg,mrcy);

SIGNAL STATE:jtdSTATE;

BEGIN

PROCESS(RESET,STATE,clk, S)

BEGIN

IF RESET='1' THEN STATE<=mgcr;MG<='1';CR<='1';MY<='0';MR<='0';CG<='0';CY<='0';

ELSIF clk'EVENT AND clk='1' then

CASE STATE IS

WHEN mgcr=>IF COUNT="00000001" AND S='1'THEN

STATE<=mycr;MY<='1';CR<='1';MG<='0';MR<='0';CG<='0';CY<='0';

ELSE

STATE<=mgcr;MG<='1';CR<='1';MY<='0';MR<='0';CG<='0';CY<='0';

END IF;

WHEN mycr=>IF COUNT="00000001" THEN

STATE<=mrcg;MR<='1';CG<='1';MG<='0';MY<='0';CR<='0';CY<='0';

ELSE

STATE<=mycr;MY<='1';CR<='1';MG<='0';MR<='0';CG<='0';CY<='0';

END IF;

WHEN mrcg=>IF COUNT="00000001" OR S='0'THEN

STATE<=mrcy;MR<='1';CY<='1';MY<='0';MG<='0';CR<='0';CG<='0';

ELSE

STATE<=mrcg;MR<='1';CG<='1';MG<='0';MY<='0';CR<='0';CY<='0';

END IF;

WHEN mrcy=>IF COUNT="00000001" THEN

STATE<=mgcr;MG<='1';CR<='1';MR<='0';MY<='0';CY<='0';CG<='0';

ELSE

STATE<=mrcy;MR<='1';CY<='1';MY<='0';MG<='0';CR<='0';CG<='0';

END IF;

END CASE;

END IF;

END PROCESS;

END behav;

控制数码管显示倒计时数并且输出:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY JISHU IS

PORT(clk,S:IN STD_LOGIC;

tim:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

END JISHU;

ARCHITECTURE behav OF JISHU IS

TYPE RGY IS(mgcr,mycr,mrcg,mrcy);

SIGNAL STATE:RGY;

BEGIN

PROCESS(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' THEN

CASE STATE IS

WHEN 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";

ELSE

IF a='0' THEN

th:="0110";tl:="0000";a:='1';

else

IF NOT(th="0000" AND tl="0010") then

IF tl="0000" then

tl:="1001";th:=th-1;

else tl:=tl-1;

END IF;

ELSE th:="0000";tl:="0001";a:='0';b:='1';

END IF;

END IF;

END IF;

WHEN mycr => IF a='0' THEN

th:="0000";tl:="0100";a:='1';

else

IF NOT(th="0000" AND tl="0010") then

tl:=tl-1;

ELSE th:="0000";tl:="0001";a:='0';STATE<=mrcg; END IF;

END IF;

WHEN mrcg =>IF S='1' THEN

IF a='0' THEN

th:="0010";tl:="0000";a:='1';

else

IF NOT(th="0000" AND tl="0010") then

IF tl="0000" then

tl:="1001";th:=th-1;

else tl:=tl-1;

END IF;

ELSE th:="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' THEN

th:="0000";tl:="0100";a:='1';

else

IF NOT(th="0000" AND tl="0010") then

tl:=tl-1;

ELSE th:="0000";tl:="0001";a:='0';STATE<=mgcr;

END IF;

END IF;

END CASE;

tim <= th & tl;

END IF;

end process;

END behav;

2、编译过程

1)输入完程序之后逐个编译

2)逐个编译无错之后进行全程编译

3、将以上模块生成元器件

1)控制6盏灯的模块:

clkRESETSCOUNT[7..0]MGMYMRCGCYCRjtdinst1

相关主题