交通灯程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交通灯程序设计
一、设计任务及要求:
设计任务:模拟十字路口交通信号灯的工作过程,利用开发板上的两组红、黄、绿LED作为交通信号灯,设计一个交通信号灯控制器。要求:
(1)交通灯从绿变红时,有4秒黄灯亮的间隔时间;
(2)交通灯红变绿是直接进行的,没有间隔时间;
(3)主干道上的绿灯时间为40秒,支干道的绿灯时间为20秒;(4)在任意时间,显示每个状态到该状态结束所需的时间。
图1 路口交通管理示意图
表1 交通信号灯的4种状态
二、程序清单:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TrafficLight IS
PORT ( CLK: IN std_logic;
led7s: OUT std_logic_vector(3 downto 0);
led7s1: OUT std_logic_vector(3 downto 0);
R,Y,G,R1,Y1,G1: OUT std_logic);
END;
ARCHITECTURE one OF TrafficLight IS
TYPE dm IS (s0,s1,s2,s3);
SIGNAL current_state,next_state:dm;
SIGNAL FOUT: STD_LOGIC;
SIGNAL tl :STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL th :STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL tm :STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL time :STD_LOGIC_VECTOR(6 DOWNTO 0); BEGIN
P1: PROCESS(CLK) -------秒脉冲发生器 VARIABLE CNT8:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF CNT8 = "01111111" THEN
CNT8:="00000000"; FOUT<='1';
ELSE CNT8 := CNT8+1;
FOUT <= '0';
END IF;
END IF;
END PROCESS P1;
P2:PROCESS(FOUT) -------负责对秒脉冲进行计数
BEGIN
IF FOUT'EVENT AND FOUT='1' THEN
IF time<"1000011" THEN
time<=time+1;
ELSE time <="0000000";
END IF;
END IF;
END PROCESS P2;
P3: PROCESS (FOUT,current_state)
--- P3负责当前状态和下一状态的转换 BEGIN
IF FOUT'EVENT AND FOUT='1' THEN
current_state<=next_state;
END IF;
END PROCESS P3;
P4:PROCESS(current_state, time)
-- P4负责各状态下交通灯的显示及时间值的赋值BEGIN
CASE current_state IS
WHEN s0=>R<='0';Y<='0';G<='1'; R1<='1';Y1<='0';G1<='0'; tm<=39-time;
IF time=39 THEN
next_state<=s1;
ELSE next_state<=s0;
END IF;
WHEN s1=>R<='0';Y<='1';G<='0'; R1<='1';Y1<='0';G1<='0'; tm<=43-time;
IF time=43 THEN
next_state<=s2;
ELSE next_state<=s1;
END IF;
WHEN s2=>R<='1';Y<='0';G<='0'; R1<='0';Y1<='0';G1<='1'; tm<=63-time;
IF time=63 THEN
next_state<=s3;
ELSE next_state<=s2;
END IF;
WHEN s3=>R<='1';Y<='0';G<='0'; R1<='0';Y1<='1';G1<='0'; tm<=67-time;
IF time=67 THEN
next_state<=s0;
ELSE next_state<=s3;
END IF;
END CASE;
END PROCESS P4;
P5:PROCESS(tm) ---- 进行对交通灯的时间值的显示BEGIN
IF tm>=30 THEN th<="11";tl<=tm-30; ELSIF tm>=20 THEN th<="10";tl<=tm-20; ELSIF tm>=10 THEN th<="01";tl<=tm-10; ELSE th<="00";tl<=tm;
END IF;
END PROCESS P5;
P6: PROCESS (th,tl)
BEGIN
CASE th IS
WHEN "00"=>led7s<="0000";
WHEN "01"=>led7s<="0001";
WHEN "10"=>led7s<="0010";
WHEN "11"=>led7s<="0011";
WHEN others=>null;
END CASE;
CASE tl IS
WHEN "0000000"=>led7s1<="0000"; WHEN "0000001"=>led7s1<="0001"; WHEN "0000010"=>led7s1<="0010"; WHEN "0000011"=>led7s1<="0011"; WHEN "0000100"=>led7s1<="0100"; WHEN "0000101"=>led7s1<="0101"; WHEN "0000110"=>led7s1<="0110"; WHEN "0000111"=>led7s1<="0111"; WHEN "0001000"=>led7s1<="1000";