VHDL语言的十字路口交通灯控制器设计
- 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,交通灯工作原理分析:
根据交通灯控制器的功能与要求,将其总体电路分为状态控制,倒计时,数码管显示,信号灯显示模块。
外部两路脉冲振荡器的频率选为1 kHz和1 Hz的信号,1khz信号用于显示模块的扫描,1 Hz信号用做倒计时模块的计数脉冲。
由于实验箱只能接一个信号源故加入分频模块。
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、顶层文件的设计
顶层原理图设计可以依据系统框图进行,由状态控制计数模块,数码管显示分频模块和交通灯显示模块(jtdjs,jtdfp,jtdxs)三部分组成。
2,各模块设计文件
①jtdjs:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY JTDJS IS
PORT(CLK1,S,RESET:IN STD_LOGIC;
b:BUFFER STD_LOGIC;
tim:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END JTDJS;
ARCHITECTURE behav OF JTDJS IS
TYPE STA IS(mgcr,mycr,mrcg,mrcy);
SIGNAL STA TE:STA;
BEGIN
PROCESS(CLK1)
-- VARIABLE b:STD_LOGIC:='0';
VARIABLE a:STD_LOGIC:='0';
VARIABLE th,tl:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF RESET='0' THEN STA TE<=mgcr; th:="0000" ;tl:="0000";a:='0';b<='0';
ELSIF CLK1'EVENT AND CLK1='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:='0';--th:="0110";tl:="0000";
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;
②JTDFP
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY JTDFP IS
PORT (CLK : IN STD_LOGIC;
JIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
SG : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
sel0,sel1,sel2 : OUT STD_LOGIC;
CLK1:buffer STD_LOGIC );
END JTDFP;
ARCHITECTURE behav OF JTDFP IS
SIGNAL Q : STD_LOGIC_VECTOR(11 DOWNTO 0);
SIGNAL P,R: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL CONT8: STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL CONT : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL YM : STD_LOGIC_VECTOR(11 DOWNTO 0);
SIGNAL A : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
F:PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK = '1' THEN CONT<=CONT+1;
IF CONT=100 THEN CLK1<='1';CONT<="00000000";
ELSE CLK1<='0';
END IF;
END IF;
END PROCESS;
C:PROCESS( CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF CONT8<"001" THEN CONT8 <=CONT8+1;
ELSE CONT8<=(OTHERS=>'0');
END IF;
END IF;
CASE CONT8 IS
WHEN "000" => sel0<='0';sel1<='1';sel2<='0';A<=JIN(3 downto 0);
WHEN "001" => sel0<='1';sel1<='0';sel2<='0';A<=JIN(7 downto 4);
WHEN OTHERS =>NULL;
END CASE;
END PROCESS ;
D:PROCESS(A)
BEGIN
CASE A IS
WHEN "0000" =>SG<="00111111" ;WHEN "0001" =>SG<="00000110" ;
WHEN "0010" =>SG<="01011011"; WHEN "0011" =>SG<="01001111";
WHEN "0100"=>SG<="01100110"; WHEN "0101" =>SG<="01101101";
WHEN "0110" =>SG<="01111101"; WHEN "0111" =>SG<="00000111";
WHEN "1000" =>SG<="01111111"; WHEN "1001" =>SG<="01101111";
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
END behav;
③JTDXS
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY JTDXS IS
PORT(CLK1,S,B,RESET:IN STD_LOGIC;
COUNT: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
MG,MY,MR,CG,CY,CR:OUT STD_LOGIC);
END JTDXS ;
ARCHITECTURE behav OF JTDXS IS
TYPE STATES IS(mgcr,mycr,mrcg,mrcy);
SIGNAL STA TE:STATES;
BEGIN
PROCESS(STATE,CLK1, S,RESET)
BEGIN
IF RESET='0' THEN STATE<=mgcr;MG<='1';CR<='1';MY<='0';MR<='0';CG<='0';CY<='0'; ELSIF CLK1'EVENT AND CLK1='1' then
CASE STATE IS
WHEN mgcr=>IF B='1' 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;
3、编译
1)输入完程序之后逐个编译
2)逐个编译无错之后进行全程编译
4、将以上模块生成元器件
计数控制数码管显示分频交通灯显示
5,将以上各器件连接成实验原理图
6、系统仿真
1)建立新的波形激励文件
2)在波形编辑器窗口添加节点
3)通过Edit->End Time 来设定仿真结束时间
4)在CLOCK窗口中设置clk的时钟周期为1us
5)点击save保存
6) 通过Tools下的Simulator Tools项进行仿真,然后观察输出波形。
仿真波形如下:
S=1乡间公路状态(既MGCR60S-MYCG4S-MRCG20S-MGCY4S-MGCR60S)
S=0转S=1立即进入MYCR4S-MRCG20S
7,引脚锁定
8,连接到实验箱下载程序观察实验结果:
有开关K1控制S的值,当K1断开时实验箱交通灯处于MGCR状态,数码管在倒数60计数。
合上K1后S由0转入1状态,数码管继续倒数60计数且交通灯仍处于MGCR状态,60计数完成后随即转入MYCG4S-MRCG20S-MGCY4S-MGCR60S 的循环状态直到S再次由1变成0,数码管立即停止计数进入倒数4S的黄灯状态,4S结束后交通灯进入MGCR状态
按下reset键数码管从顶端重新开始计时不清楚交通灯状态。