- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
just started AHDL programming for a uni project. Now I have encoutered an issue that I just cant solve. The StateMachine should switch states on an alterning Signal "Track.Pulse". Somehow it seems to run through the states on a stable Signal though. The HEX[0] jumpes from 2 to 9 (state indicator), q (indicated by LEDs) seems to stay in another state (or flicker through). Two things which make the issue even more mysterious to me: - works fine with a KEY as clock instead of 24MHz-Clock - worked when I changed the State "START = B"0000"" to "START = B"1111"" Edit: I guess its connected to these warnings, but cant make anything out of em. Warnings: - Info: Found 5 Registers with very high hold time requirements Info: Node "Scan:Scanner|WAIT2" Info: Node "Scan:Scanner|WAIT3" Info: Node "Scan:Scanner|WAIT1" Info: Node "Scan:Scanner|START" Info: Node "Scan:Scanner|ENDSCAN" - Found 51 node(s) in clock paths which may be acting as ripple and/or gated clocks -- node(s) analyzed as buffer(s) resulting in clock skew Happy for any help or suggestions. Cheers The Code is kind of long, but I am really lost of where to locate the issue.
FUNCTION DEBOUNCE (Clk, Signal) RETURNS (Pulse);
SUBDESIGN Scan
(
IRTrack, IRSignal, MSwitch, Clock, Reset :INPUT;
LastBrick, HEX3, HEX2, HEX1, HEX0, q :OUTPUT;
)
--
VARIABLE
LastBrickTemp : DFF;
Track : Debounce;
ScanState : MACHINE OF BITS (q)
WITH STATES (
START = B"0000",
INIT = B"0001",
BIT3 = B"0010",
WAIT3 = B"0011",
BIT2 = B"0100",
WAIT2 = B"0101",
BIT1 = B"0110",
WAIT1 = B"0111",
BIT0 = B"1000",
ENDSCAN = B"1001",
ERR = B"1010"
);
BEGIN
DEFAULTS
LastBrickTemp.clk = GND;
LastBrickTemp = GND;
HEX0 = B"1000000"; -- 0
END DEFAULTS;
LastBrick = LastBrickTemp;
ScanState.reset = Reset;
ScanState.clk = Clock;
Track.Clk = Clock;
Track.Signal = IRTrack;
CASE ScanState IS
WHEN START =>
LastBrickTemp.clk = GND;
HEX0 = B"1000000"; -- 0
If (!Track.Pulse & !MSwitch) Then -- CounterWhite
ScanState = INIT;
end if;
WHEN INIT =>
HEX0 = B"1111001"; -- 1
LastBrickTemp = VCC;
LastBrickTemp.clk = VCC;
If !MSwitch Then -- MSwitch not
ScanState = BIT3;
else
ScanState = ERR;
end if;
WHEN BIT3 =>
LastBrickTemp.clk = GND;
HEX0 = B"0100100"; -- 2
If !MSwitch Then -- MSwitch not
If Track.Pulse Then -- CounterBlack
LastBrickTemp = IRSignal;
LastBrickTemp.clk = VCC;
ScanState = WAIT3;
end if;
else
ScanState = ERR;
end if;
WHEN WAIT3 =>
LastBrickTemp.clk = GND;
HEX0 = B"0110000"; -- 3
If !MSwitch Then -- MSwitch not
If !Track.Pulse Then -- CounterWhite
ScanState = BIT2;
end if;
else
ScanState = ERR;
end if;
WHEN BIT2 =>
HEX0 = B"0011001"; -- 4
If !MSwitch Then -- MSwitch not
If Track.Pulse Then -- CounterBlack
LastBrickTemp = IRSignal;
LastBrickTemp.clk = VCC;
ScanState = WAIT2;
end if;
else
ScanState = ERR;
end if;
WHEN WAIT2 =>
LastBrickTemp.clk = GND;
HEX0 = B"0010010"; -- 5
If !MSwitch Then -- MSwitch not
If !Track.Pulse Then -- CounterWhite
ScanState = BIT1;
end if;
else
ScanState = ERR;
end if;
WHEN BIT1 =>
HEX0 = B"0000010"; -- 6
If !MSwitch Then -- MSwitch not
If Track.Pulse Then -- CounterBlack
LastBrickTemp = IRSignal;
LastBrickTemp.clk = VCC;
ScanState = WAIT1;
end if;
else
ScanState = ERR;
end if;
WHEN WAIT1 =>
LastBrickTemp.clk = GND;
HEX0 = B"1111000"; -- 7
If !MSwitch Then -- MSwitch not
If !Track.Pulse Then -- CounterWhite
ScanState = BIT0;
end if;
else
ScanState = ERR;
end if;
WHEN BIT0 =>
HEX0 = B"0000000"; -- 8
If !MSwitch Then -- MSwitch not
If Track.Pulse Then -- CounterBlack
LastBrickTemp = IRSignal;
LastBrickTemp.clk = VCC;
ScanState = ENDSCAN;
end if;
else
ScanState = ERR;
end if;
WHEN ENDSCAN =>
HEX0 = B"0010000"; -- 9
LastBrickTemp.clk = GND;
If MSwitch Then -- MSwitch
ScanState = START;
end if;
WHEN ERR => -- Error
HEX3 = B"0010010"; -- S
HEX2 = B"1000110"; -- C
HEX1 = B"1001000"; -- N
HEX0 = B"0000110"; -- E
LastBrickTemp = GND;
LastBrickTemp.clk = VCC;
If Reset Then
ScanState = START;
end if;
WHEN OTHERS => -- BUGS !!
HEX0 = B"0010010"; -- S
END CASE;
END;
Link Copied
1 Reply
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Found this thread and I looks like my problem is of this kind:
http://www.alteraforum.com/forum/showthread.php?p=8500 Well, this article is above my knowledge. Followed Guideline#4 and got less warnings, but I still have got these: Info: Minimum slack time is -8.105 ns for clock "CLOCK_24" between source register "SCN" and destination register "Scan:Scanner|LastBrickTemp[2]" Info: Minimum slack time is -7.876 ns for clock "CLOCK_24" between source register "SCN" and destination register "Scan:Scanner|LastBrickTemp[3]" Info: Minimum slack time is -7.681 ns for clock "CLOCK_24" between source register "SCN" and destination register "Scan:Scanner|LastBrickTemp[1]" Info: Minimum slack time is -6.995 ns for clock "CLOCK_24" between source register "Scan:Scanner|BIT0" and destination register "Scan:Scanner|LastBrickTemp[0]" Info: Minimum slack time is -4.697 ns for clock "CLOCK_24" between source register "Scan:Scanner|INIT" and destination register "Scan:Scanner|LastBrickTemp[0]" Happy for any kind of answer. Cheers
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page