Forum Discussion
Altera_Forum
Honored Contributor
18 years agoI'm not really sure what you mean by that but I did some cleaning up, the problem is that there are random blips that seem to pop up for no reason. Here's my code and a waveform to show what I'm talkin about.
http://img209.imageshack.us/img209/2018/samplelq6.jpgLIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all ;
ENTITY TrafficLight2 IS
PORT(NS,EW,NSL,EWL: IN STD_LOGIC_VECTOR(1 DOWNTO 0);--cars that want to go in those directions
Clk,Reset,EmNS,EmEW,EmNSL,EmEWL,PEW,PNS: IN STD_LOGIC;
GNS,GEW,RNS,REW,GNSL,GEWL,YNS,YEW: OUT STD_LOGIC);--GNS = greens for North and South, GEW = greens for East and West, GNSL = greens for North and South left lanes, GEWL = greens for East and Weset left lanes
END TrafficLight2;
ARCHITECTURE Behavior OF TrafficLight2 IS
TYPE State_type IS(NSStart,EWStart,GoNS,GoEW,GoNSL,GoEWL,Em);--GoNS=North and South green,GoEW=East and West green,GoNSL=North Left and South Left green,GoEWL=East Left and South Left green
SIGNAL state: State_type;
SIGNAL count: INTEGER RANGE 0 to 31;
BEGIN
PROCESS(Clk)
BEGIN
IF Reset = '1' THEN
state<=NSStart;
ELSIF(Clk'EVENT AND Clk='1') THEN
CASE state IS
WHEN NSStart =>
count <= (TO_INTEGER(UNSIGNED(NS))+TO_INTEGER(UNSIGNED(NSL)))*4+4;
state <= GoNS;
WHEN EWStart =>
count <= (TO_INTEGER(UNSIGNED(EW))+TO_INTEGER(UNSIGNED(EWL)))*4+4;
state <= GoEW;
WHEN GoNS =>
IF EmNS ='1' OR EmEW ='1' OR EmEWL ='1' OR EmNSL = '1' THEN
state<=Em;
ELSIF count= TO_INTEGER(UNSIGNED(NS))*2+2 THEN
state <=GoNSL;
ELSIF PEW='1' THEN
count <= count - 2;
ELSE
count <= count - 1;
END IF;
WHEN GoEW =>
IF EmNS ='1' OR EmEW ='1' OR EmEWL ='1' OR EmNSL = '1' THEN
state<=Em;
ELSIF count=TO_INTEGER(UNSIGNED(EW))*2+2 THEN
state <=GoEWL;
ELSIF PNS='1' THEN
count <= count - 2;
ELSE
count <= count - 1;
END IF;
WHEN GoNSL =>
IF EmNS ='1' OR EmEW ='1' OR EmEWL ='1' OR EmNSL = '1' THEN
state<=Em;
ELSIF count=0 THEN
state<=EWStart;
ELSIF PEW='1' THEN
count <= count - 2;
ELSE
count <= count -1;
END IF;
WHEN GoEWL =>
IF EmNS ='1' OR EmEW ='1' OR EmEWL ='1' OR EmNSL = '1' THEN
state<=Em;
ELSIF count=0 THEN
state<=NSStart;
ELSIF PNS='1' THEN
count <= count - 2;
ELSE
count <=count-1;
END IF;
WHEN Em=>
IF EmNS ='1' OR EmEW ='1' OR EmEWL ='1' OR EmNSL = '1' THEN
state<=Em;
ELSE
state<=NSStart;
END IF;
END CASE;
END IF;
END PROCESS;
GNS<='1' WHEN (state = GoNS OR EmNS ='1') ELSE '0';
GEW<='1' WHEN (state = GoEW OR EmEW ='1') ELSE '0';
--YNS<='1' WHEN (count = 1 OR count = 2) AND (state = GoNS or state = GoNSL or state=Em) ELSE '0';
--YEW<='1' WHEN (count = 1 OR count = 2) AND (state = GoEW or state = GoEWL or state=Em) ELSE '0';
RNS<='1' WHEN (state = GoEW OR state = GoEWL OR count = 0 OR EmEW ='1' OR EmEWL='1') ELSE '0';
REW<='1' WHEN (state = GoNS OR state = GoNSL OR count = 0 OR EmNS ='1' OR EmNSL='1') ELSE '0';
GNSL<='1' WHEN (state = GoNSL OR EmNSL ='1') ELSE '0';
GEWL<='1' WHEN (state = GoEWL OR EmEWL ='1') ELSE '0';
END Behavior;