www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Generischer Zustandsautomat


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich würde gerne einen generischen Zustandsautomaten bauen, bei dem die 
Anzahl der Zustände von einer Generic "width" abhängt.
Kann mir jemand sagen, wie ich sowas implementiere:?
type state_type is (idle, S1, S2, ..., S[width], end);

Gruß,
Thomas

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Über einen type / enum wirst du das nicht erreichen können, außer du 
definierst dir alle jemals möglichen Zustände und benutzt dann einfach 
einige nicht.

Statt benannten Zuständen könntest du aber auch einen normalen 
std_logic_vector oder integer nehmen, der dir durch die einzelnen 
Zustände zählt. Damit dürftest du etwas flexibler sein, hast allerdings 
auch mehr zu tun, die einzelnen Zustände auseinander zu halten.

Das Implementieren der State Machine selber ist wegen der flexiblen 
Anzahl an Zuständen aber auch nicht ganz einfach.

Vielleicht gibt es aber auch besser Lösungen für das was du vorhast? 
Erzähl mal genauer.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jan,

an Integer hatte ich auch schon gedacht, aber das macht es natürlich 
unübersichtlich. Kann der Fitter dann eigentlich noch optimieren 
(one-hot)?

Das ganze scheint eh nicht zu funktionieren.
Ich dache eigentlich, man könnte mit generate an jeder Stelle beliebige 
Codefragmente erzeugen.
Das währen bei mir die States S1 bis S[width] gewesen.
Aber das geht wohl so nicht (Illegal sequential statement).

Wo ist eigentlich der Unterschied zwischen
label: for i in 1 to 2 generate
 und
for i in 1 to 2 loop
?
In beiden Fällen wird doch einfach zusätzliche Hardware erzeugt.

Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ach ja, hier mein gescheiterter Versuch.
Die erste for-Schleife war auch erst ein generate. Diese meckert er 
jetzt so nicht mehr an.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll das den werden?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Moment geht es nur ums Prinzip, wie man sowas macht.
Deswegen ist das auch nur ein ganz simpler Automat ohne besondere 
Funktion.
Macht ja keinen Sinn solche Dinge direkt an komplexen Objekten zu 
testen.
Das Problem ist halt, dass es hier nicht reicht einfach nur alle 
Vektoren entsprechend anzupassen, wenn man die Schaltung erweitert.
Zusätzlich muss man auch noch den Code erweitern, was ja auch ziemlich 
einfach ginge, wenn VHDL mich denn nur lassen würde.

Hast du denn eine Idee, wie man das verwirklichen kann?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:
> Hast du denn eine Idee, wie man das verwirklichen kann?
In VHDL vermutlich nicht, es gibt aber für Java ein VHDL Framework mit 
dem man sich eine Art Core-Generator zusammenbauen kann.

Generics sind für diese Art Aufgabe einfach nicht geschaffen, vor allem 
hat man auch eigentlich nie einen Automaten dessen Zustände sich 
generieren lassen (außer vieleicht nen Zähler der sich aber in VHDL viel 
einfacher beschreiben läßt ohne Automat).

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schade...

Der Unterschied zwischen "for ... loop" und "for ... generate" ist 
übrigens, dass ersteres sequentiellen Code erzeugt und daher nur in 
Prozessen verwendet werden darf. Zweiteres erzeugt gleichläufigen Code 
außerhalb von Prozessen. Wozu es dafür allerdings verschiedene 
Konstrukte benötigt erschließt sich mir nicht ganz.

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

Bewertung
0 lesenswert
nicht lesenswert
> dass ersteres sequentiellen Code erzeugt
Aber keine sequentielle Hardware.

> Wozu es dafür allerdings verschiedene
> Konstrukte benötigt erschließt sich mir nicht ganz.
Es gibt in VHDL unterschiedliche Syntaxelemente für Prozess- und 
Concurrent-Schreibweise.
Z.B. im Prozess ein
  if     a='1' then q<="01";
  elsif  b='1' then q<="10";
  else              q<="00";
  end if;
Concurrent schreibt sich das so:
  q <= "01" when a='1' else
       "10" when b='1' else
       "00";

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.