Forum: FPGA, VHDL & Co. VHDL FSM


von ThomasM (Gast)


Lesenswert?

Hallo Leute,

hat jemand ne Ahnung wie man eine FSM auf steigender und fallender 
reagieren lässt. Ich bräuchte eine FSM die bei steigender und bei 
fallender Taktflanke den Status ändern kann. Gibt es eine einfach 
Lösung, oder muss ich den takt mit  pll verdoppeln.

Das nachfolgende Beispiel (nur als Test gedacht) funktioniert leider 
nicht.

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

ENTITY myEntity IS
  PORT
  (
    clk : IN  std_logic;
    engine :  IN  std_logic;
    detection : OUT  std_logic
  );
END myEntity;

ARCHITECTURE myEntityArch OF myEntity IS
  SIGNAL counter : signed(15 DOWNTO 0);
  TYPE fsmstates IS (stop, starting);
  SIGNAL fsmstate : fsmstates := stop;
  SIGNAL nextfsmstate : fsmstates := stop;
BEGIN
  PROCESS (clk)
  BEGIN
    IF rising_edge(clk) THEN
      fsmstate <= nextfsmstate;
    END IF;

    IF falling_edge (clk) THEN
      fsmstate <= nextfsmstate;
    END IF;

    CASE fsmState IS
      WHEN stop =>
        IF (engine = '1') THEN
          nextfsmstate <= starting;
        ELSE
          nextfsmstate <= stop;
        END IF;
        detection <= '0';

      WHEN starting =>
        IF (engine = '1') THEN
          nextfsmstate <= starting;
        ELSE
          nextfsmstate <= stop;
        END IF;
        detection <= '1';

      WHEN OTHERS =>
        detection <= '0';
    END CASE;

  END PROCESS ;
END myEntityArch;

Danke

von Falk B. (falk)


Lesenswert?

@ ThomasM

>hat jemand ne Ahnung wie man eine FSM auf steigender und fallender
>reagieren lässt.

Geht praktisch so gut wie nicht.

> Ich bräuchte eine FSM die bei steigender und bei
>fallender Taktflanke den Status ändern kann. Gibt es eine einfach

Sicher? Warum? Wie ist die Schaltung?

>Lösung, oder muss ich den takt mit  pll verdoppeln.

Wäre eine Möglichkeit, wenn das mit der steigenden/fallenden Flanke 
WIRKLICH gebraucht wird. Eine andere wäre, die Statemachine auf zwei 
Prozesse aufzuteilen und in jedem eine Flanke auszuwerten.

>Das nachfolgende Beispiel (nur als Test gedacht) funktioniert leider
>nicht.

Logisch, kann gar nicht. So gut wie keine Arhitektur hat FlipFlops, 
welche auf beide Flanken gleichzeitig reagieren können (Ausnahme 
Coolrunner-II von Xilinx). Ausserdem ist deine Beschreibung falsch. Man 
müsste schreiben

if clk'event then   -- reagiert auf beide Flanken

MfG
Falk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.