|
- LIBRARY ieee;
- USE ieee.std_logic_1164.all;
- USE IEEE.STD_LOGIC_UNSIGNED.ALL;
- ENTITY TrafficLight IS
- PORT (Clk : IN STD_LOGIC;
- S,Reset : IN STD_LOGIC;
- mg,my,mr,cg,cy,cr : OUT STD_LOGIC );
- END TrafficLight ;
- ARCHITECTURE rtl OF TrafficLight IS
- TYPE TrafficState IS (mgcr, mycr, mrcg, mrcy);
- SIGNAL ps,ns : TrafficState ;
- SIGNAL Count : STD_LOGIC_VECTOR(5 DOWNTO 0);
- SIGNAL Clrn : STD_LOGIC ;
- BEGIN
- Counter : PROCESS(clk)
- BEGIN
- IF Reset = '1' OR (Clrn = '1' AND NOT(Count = "000000")) THEN Count <= "000000";
- ELSIF clk'EVENT AND clk = '1' THEN
- IF NOT(Count = "000001" AND ps = mgcr) THEN Count <= Count + 1;
- END IF;
- END IF;
- END PROCESS Counter;
- StateTransition : PROCESS(clk,Count,ps)
- BEGIN
- IF Reset = '1' THEN ns <= mgcr;Clrn <= '0';
- ELSIF clk'EVENT AND clk = '1' THEN
- CASE ps IS
- WHEN mgcr => mr<='0';mg<='1';my<='0';cr<='1';cg<='0';cy<='0';
- IF Count >= "000001" AND S = '1' THEN ns <= mycr;Clrn <= '1';
- ELSE Clrn <= '0';
- END IF;
- WHEN mycr => mr<='0';mg<='0';my<='1';cr<='1';cg<='0';cy<='0';
- IF Count >= "000011" THEN ns <= mrcg;Clrn <= '1';
- ELSE Clrn <= '0';
- END IF;
- WHEN mrcg => mr<='1';mg<='0';my<='0';cr<='0';cg<='1';cy<='0';
- IF Count >= "010011" OR S = '0' THEN ns <= mrcy;Clrn <= '1';
- ELSE Clrn <= '0';
- END IF;
- WHEN mrcy => mr<='1';mg<='0';my<='0';cr<='0';cg<='0';cy<='1';
- IF Count >= "000011" THEN ns <= mgcr;Clrn <= '1';
- ELSE Clrn <= '0';
- END IF;
- WHEN OTHERS => NULL;
- END CASE;
- END IF;
- END PROCESS StateTransition;
- PROCESS(clk)
- BEGIN
- IF clk'EVENT AND clk='1' THEN
- ps<=ns;
- END IF;
- END PROCESS;
- END rtl;
复制代码
目的和要求:
1.有MR(主红)、MY(主黄)、MG(主绿)、CR(乡红)、CY(乡黄)、CG(乡绿)六盏交通灯需要控制;
2.交通灯由绿→红有4秒黄灯亮的间隔时间,由红→绿没有间隔时间;
3.系统有MRCY、MRCG、MYCR、MGCR四个状态;
4.相间公路右侧各埋有一个传感器,当有车辆通过相间公路时,发出请求信号S;
5.平时系统停留在MGCR状态,一旦S信号有效,经MRCY转入MRCG状态,但要保证MRCG状态也不得短于一分钟;
6.一旦S信号无效,系统脱离MRCG状态。随即经MRCY转入进入MGCR状态,计时S信号一直有效,MRCG状态也不得长于20秒钟。
麻烦那位帮我看看我的程序到底问题出在哪里?或者给出能运行解决此题的程序。我用XILINX+SIM。
PS:网上有一段类似的程序,但看不懂,没有注释。麻烦也注释一下。
|
|