VHDL语言知识的十字路口交通灯控制器设计.doc
南昌大学实验报告 学生姓名: 学 号: 专业班级: 实验类型: 验证 综合 设计 创新 实验日期: 实验成绩: 实验五 十字路口交通灯控制器设计 一、实验目的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 STATE: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 STATE<=mgcr; th:="0000" ;tl:="0000"a:=0;b<=0; ELSIF CLK1EVENT AND CLK1=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:=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; JTDFPLIBRARY 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 CLKEVENT 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 CLKEVENT 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; JTDXSLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY JTDXS ISPORT(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 STATE: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 CLK1EVENT AND CLK1=1 then CASE STATE IS WHEN mgcr=>IF B=1 AND S=1THEN 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=0THEN 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;3、编译1)输入完程序之后逐个编译2)逐个编译无错之后进行全程编译4、将以上模块生成元器件 计数控制 数码管显示分频 交通灯显示 5,将以上各器件连接成实验原理图 6、系统仿真 1)建立新的波形激励文件 2)在波形编辑器窗口添加节点 3)通过Edit->End Time 来设定仿真结束时间 4)在CLOCK窗口中设置clk的时钟周期为1us5)点击save保存6) 通过Tools下的Simulator Tools项进行仿真,然后观察输出波形。仿真波形如下: S=1乡间公路状态(既MGCR60S-MYCG4S-MRCG20S-MGCY4S-MGCR60S) S=0转S=1立即进入MYCR4S-MRCG20S7,引脚锁定8,连接到实验箱下载程序观察实验结果:有开关K1控制S的值,当K1断开时实验箱交通灯处于MGCR状态,数码管在倒数60计数。合上K1后S由0转入1状态,数码管继续倒数60计数且交通灯仍处于MGCR状态,60计数完成后随即转入MYCG4S-MRCG20S-MGCY4S-MGCR60S的循环状态直到S再次由1变成0,数码管立即停止计数进入倒数4S的黄灯状态,4S结束后交通灯进入MGCR状态按下reset键数码管从顶端重新开始计时不清楚交通灯状态