Forum: FPGA, VHDL & Co. Generischer Zustandsautomat


von Thomas (Gast)


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:?
1
type state_type is (idle, S1, S2, ..., S[width], end);

Gruß,
Thomas

von Jan M. (mueschel)


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.

von Thomas (Gast)


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
1
label: for i in 1 to 2 generate
 und
1
for i in 1 to 2 loop
?
In beiden Fällen wird doch einfach zusätzliche Hardware erzeugt.

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Was soll das den werden?

von Thomas (Gast)


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?

von Läubi .. (laeubi) Benutzerseite


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).

von Thomas (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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
1
  if     a='1' then q<="01";
2
  elsif  b='1' then q<="10";
3
  else              q<="00";
4
  end if;
Concurrent schreibt sich das so:
1
  q <= "01" when a='1' else
2
       "10" when b='1' else
3
       "00";

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.