基于EDA十字路口交通灯控制器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
十字路口交通灯控制器设计
一、实验目的
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:jtdSTA TE;
BEGIN
PROCESS(RESET,STA TE,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
STA TE<=mycr;MY<='1';CR<='1';MG<='0';MR<='0';CG<='0';CY<='0';
ELSE
STA TE<=mgcr;MG<='1';CR<='1';MY<='0';MR<='0';CG<='0';CY<='0';
END IF;
WHEN mycr=>IF COUNT="00000001" THEN
STA TE<=mrcg;MR<='1';CG<='1';MG<='0';MY<='0';CR<='0';CY<='0';
ELSE
STA TE<=mycr;MY<='1';CR<='1';MG<='0';MR<='0';CG<='0';CY<='0';
END IF;
WHEN mrcg=>IF COUNT="00000001" OR S='0'THEN
STA TE<=mrcy;MR<='1';CY<='1';MY<='0';MG<='0';CR<='0';CG<='0';
ELSE
STA TE<=mrcg;MR<='1';CG<='1';MG<='0';MY<='0';CR<='0';CY<='0';
END IF;
WHEN mrcy=>IF COUNT="00000001" THEN
STA TE<=mgcr;MG<='1';CR<='1';MR<='0';MY<='0';CY<='0';CG<='0';
ELSE
STA TE<=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)
V ARIABLE b:STD_LOGIC:='0';
V ARIABLE a:STD_LOGIC:='0';
V ARIABLE 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 STA TE<=mycr;a:='0';th:="0000";tl:="0100";b:='0';
ELSIF S='0' AND b='1' THEN STA TE<=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盏灯的模块:
clk
RESET
S
COUNT[7..0]MG MY MR CG CY CR
jtd inst1
2)控制数码管显示倒计时数的模块:
clk S
tim[7..0]
JISHU
inst
4、建立新的工程,将各个模块的元器件用原理图连接,进行编译。
原理图如下:
clk
RESET S
COUNT[7..0]
MG MY MR CG CY CR
jtd
inst1
clk S
tim[7..0]
JISHU
inst
5、系统仿真
1)建立新的波形激励文件
2)在波形编辑器窗口添加节点
3)通过Edit->End Time 来设定仿真结束时间 4)在CLOCK 窗口中设置clk 的时钟周期为1us 5)点击save 保存
6) 通过Tools 下的Simulator Tools 项进行仿真,然后观察输出波形。
仿真波形如下:
当没有完成模60计数,即使S=1,状态也不发生改变
6、引脚设定
60秒过后,若S=1主道进入黄灯状态并保持4秒
20秒过后,不论S=1或0乡道进入黄灯状态并保持4秒
当S 一旦为0,乡道立刻进入黄灯状态,并持续四秒
六、实验现象及验证
1、当“电平1”不按时(S为0),数码管一直保持60秒倒计时,计数结束后数码管保持000001状态,LED灯保持001100;
2、当按下“电平1”(S为1),数码管倒计时4秒,LED灯011100;随后倒计时20秒,LED灯100001,此后倒计时4秒,LED灯001011;最后进入倒计时60秒;
3、当倒计时20秒时,若灭掉“电平1”(S变为0),数码管倒计时4秒,LED 灯001011;最后进入倒计时60秒。
(6个led分别对应主红黄绿、乡红黄绿)
七、实验心得
1、学会了模可变倒计时计数器
2、熟悉了IF NOT语句
3、这次试验用了两个模块,总体思路比较清晰,明白了主绿乡红、主黄乡红、主红乡绿、主红乡黄4个状态之间的循环。