mikrocontroller.net

Forum: FPGA, VHDL & Co. Final State Machine


Autor: jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin moin

bin grad auf der Suche nach einer final state machine, aber ich hab ned 
wirklich den Peil. Hat jemand ein gutes Tutorial oder sogar ein fertigen 
code für eine fsm?


danke

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiers mal mit Google mit dem Begriff "Finite State Machine" statt 
"Final State Machine"

Autor: jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja des hab ich nach dem absenden auch gemerkt das ich final geschrieben 
hab. eigentlich sollte es finite state machine heißen

Autor: Markus Schnell (m_schnell)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Finite State Machine == Automat)

Versuch's doch mal so:
typedef enum { STATE_1, STATE_2 } State;
typedef enum { EVENT_1, EVENT_2 } Event;

State state = STATE_1; /* Initial state */

void state_1_handler(Event event)
{
    switch (event)
    {
         case EVENT_1: xyz(); state = STATE_1; break;
         case EVENT_2: abc(); state = STATE_2; break;
         default: ASSERT_FAIL("unknown event"); break;
    }
}

void state_2_handler(Event event)
{
    switch (event)
    {
         case EVENT_1: foo(); state = STATE_2; break;
         case EVENT_2: bar(); state = STATE_1; break;
         default: ASSERT_FAIL("unknown event"); break;
    }
}

void main(void)
{
    Event event;

    while (1)
    {
        event = get_event();
        switch (state)
        {
            case STATE_1: state_1_handler(event); break;
            case STATE_2: state_2_handler(event); break;
            default: ASSERT_FAIL("unknown state"); break;
        }
    }
}


Man kann das in tausend Varianten implementieren.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eine statemachine in vhdl wird dann z.b. so beschrieben :

...

signal state : std_logic_vector (3 downto 0);

...

process (clk, res)
begin
  if res = '1' then
    state <= X"0";

    ...
    ... weitere signale die resettet werden und in
    ... diesem prozess verwendet werden
    ...

  elsif clk'event and clk = '1' then
    case state is
      when X"0" => if .... then
                     ...
                     state <= X"..";
                   else
                     ...
                     state <= X"..";
                   end if;
      when X"1" => if .... then
                     state <= X"..";
                     ...
                   else
                     state <= X"..";
                     ...
                   end if;
      when X"." => if .... then
                     state <= X"..";
                     ...
                   else
                     state <= X"..";
                     ...
                   end if;
      when X"." => if .... then
                     state <= X"..";
                     ...
                   else
                     state <= X"..";
                     ...
                   end if;
      when others => NULL;
    end case;
  end if;
end process;


so beschreibe ich immer statemachines in vhdl (wobei ich nicht bei 
jedem-state ein if oder gar if-else statement habe. aber das ist ja die 
implementierung der states selbst.

Autor: B. Bremer (bib)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Solltest Du eine State Machine beschreiben wollen, welche besonders 
sicher gegen Störungen ist möchte ich Dir noch das Schlagwort "one hot 
encoding" ans Herz legen.

Gruß

B.B.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> welche besonders sicher gegen Störungen ist möchte ich Dir noch das
> Schlagwort "one hot encoding" ans Herz legen.
Das Ziel von One-Hot codierten FSM ist nicht die Störfestigkeit. 
Besonders in dieser Disziplin sieht die One-Hot FSM ganz schlecht aus, 
denn es gibt (2^n)-n undefinierte Zustände. One-Hot wird auf FPGAs 
deshalb ganz gern implementiert, weil dann keine zusätzliche Logik zum 
ausdecodieren des aktuellen Zustands nötig ist. Denn jeder Zustand wird 
bereits durch ein einziges FF repräsentiert.

Wie eine FSM implementiert wird, kann ich idR. einfach in den 
Syntheseeinstellungen der Toolchain auswählen. Ob undefinierte Zustände 
abgefangen werden, wird dann mit der Option Safe Implementation 
ausgewählt (Screenshot).


Interessanter dürfte aber das Thema Ein- oder Zwei- (oder noch mehr) 
Prozess-Schreibweise von FSM sein. Das habe ich dort mal 
zusammengefasst: 
http://www.lothar-miller.de/s9y/categories/37-FSM-...

EDIT: Siehe auch Beitrag "Typedefinition mit 3 Zustaenden"

Autor: Chris D. (myfairtux) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier klinke ich mich mal ein:

Mir wäre es am liebsten, wenn man z.B. grafisch mit Knoten und Kanten 
die komplette FSM beschreiben (und vielleicht auch testen) könnte und 
dann daraus der passende Code (z.B. in C) generieren könnte.

Das Ganze sollte also möglichst abstrahiert ablaufen.

So etwas gibt es doch sicherlich.
Vermutlich suche ich nur mit den falschen Begriffen :-(

Chris D.

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, sowas gibt es. Z.B. den FSM-Designer.
Mehrere solcher Tools werden auf der englischen Wikipedia-Seite zu FSM 
verlinkt.
http://en.wikipedia.org/wiki/Finite_state_machine

Autor: Chris D. (myfairtux) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arghh, da habe ich natürlich nicht gesucht.

Vielen Dank für den Hinweis - das ist genau das, was ich gesucht habe 
:-D

Chris D.

Autor: B. Bremer (bib)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Das Ziel von One-Hot codierten FSM ist nicht die Störfestigkeit.

Habe mich diesbezüglich noch mal belesen - merci für die Info man lernt 
nie aus....

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.