www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Zustandsautomat mit Subautomaten


Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man einen Zustansautomaten mit "Subautomaten" über mehrere Prozesse 
verteilen ?
Das "Standardmodell" mit einem, zwei oder drei Prozessen ist hier nicht 
gemeint.
Ein grösserer Zustandsautomat soll zwecks Übersichtlichkeit in mehrere 
kleine aufgeteilt werden die jeweils in einem eigenen Prozess ablaufen.
Das "Zusammenspiel" soll von einem Kontrollprozess geregelt werden.
Ist so etwas überhaupt realisierbar und wenn ja wie müsste die 
Grobstruktur aussehen ?

Danke

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ja nichts anderes, als wenn in einem Zustand deiner Statemachine 
(Haupt-Statemachine HSM) eine andere Statemachine (SM2) angeschubst 
wird, und dann auf das Abarbeiten dieser SM2 gewartet wird?

Falls ja, dann z.B. so
HauptSM:  process (clk) 
      if rising_edge(clk) then
        StartSM2<='0';
        case (StateHSM) is

          when IDLE =>
            if (Losgehts = '1') then
              StartSM2<='1';             -- Starten SM2
              StateHSM<=HS1;
            end if;

          when HS1 =>
            if (StateSM2 = SM2S4)  then  -- warten, bis SM2 fertig
              StateHSM<=HS2;             -- wenn fertig : weiter gehts in HSM
            end if;

          when HS2 =>
            :
            StateHSM<=HS3;

          when HS3 =>
            StateHSM<=IDLE;

         :
         :
         end case;
      end if;
   end process;

SM2:  process (clk) 
      if rising_edge(clk) then
        case (StateSM2) is

          when IDLE =>
            if StartSM2 = '1' then
              StateSM2<=SM2S1 ;
            end if;

          when SM2S1 =>
            :
            StartSM2<=SM2S2 ;

          when SM2S2 =>
            :
            StartSM2<=SM2S3 ;

          when SM2S3 =>
            :
            StartSM2<=SM2S4 ;

          when SM2S4 =>
            :
            if(StateHSM=HS2) then
               StartSM2<=IDLE ;
            end if;

         :
         :
         end case;
     end if;
   end process;


Autor: Level up (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Etwas übersichtlicher wirds schon durch die verwendung von procedure 
aufrufen mit griffigen Namen.
dann steht dort when state23 => fetch_new_data;

oder so.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Level up
>...procedure...
Ja, ich weiß und kann das.
Aber Hans-Werner hilft das nicht weiter, hier gehts um das Prinzip,
nicht um die schönste und kompakteste Schreibweise.

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lothar,

soweit verstanden benutzt du zwei Signale StartSM2 für die Zustände der 
Zustandsmaschine SM2 und StateHSM für die Zustände der Zustandsmaschine 
HauptSM. Der Start von SM2 erfolgt durch StartSM2 = '1'; die Beendigung 
durch StateHSM = HS2. Für mich etwas verwirrend. Warum erfolgt der Start 
bei einem bestimmten Wert von StartSM2 und die Beendigung durch Abfrage 
eines Zustandes ?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mann, da hats mich selber zerlegt:
StartSM2 = '1' ist ein Flag, das die SM2 anstösst/startet.
StateHSM sind die Zustände der Haupt-SM
StateSM2 sind die Zustände der Sub-SM
(Achtung: StateSM2 sieht fast aus wie StartSM2)
Das
>StartSM2<=IDLE ;
ist ein doofer Tippfehler
richtig ist
>StateSM2<=IDLE ;

StartSM2 = '1' startet die SM2.
In der HSM wird im Zustand HS1 gewartet, bis die SM2 fertig ist.
Wenn die SM2 durch ist, dann wartet die SM2,
bis die HSM auf den nächsten Zustand weitergeschaltet hat.

Dieses letzte Warten (ein Handshake) wäre eigentlich nicht nötig, aber 
es definiert eine klare Abhängigkeit der beiden SM. Die SM2 kann hier 
erst dann weitermachen, wenn die HSM erkannt hat, dass die SM2 fertig 
ist.

Ohne Synchronisation der beiden SM sparst du dir diese Abhängigkeit.
Dann wird SM2 nur gestartet und rennt einmal durch:
(restlicher Code s.o.)
:
:
        case (StateSM2) is

          when IDLE =>
            if StartSM2 = '1' then  -- SM2 wird gestartet
              StateSM2<=SM2S1 ;
            end if;
:
:
          when SM2S4 =>             -- SM2 ist fertig
            :
            StateSM2<=IDLE ;        -- hier war der Teppfihler StartSM2
         :
         :
         end case;
:
:

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.