Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
17 years ago

StateMachine issue

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;

1 Reply

  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    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