mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL FSM


Autor: ThomasM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.