Forum: FPGA, VHDL & Co. Grosse Statemachine


von Dimi S. (ilovespeccy)


Lesenswert?

Hallo,

Gibt es Geschwindigkeits- oder andere Nachteile
bei grossen Statemachinen??? (60 States meinem Fall)

MfG

von fragender (Gast)


Lesenswert?

wird ja wohl immer nur ein state behandelt...

von Klaus (Gast)


Lesenswert?

Ja, es gibt das Problem, dass es ein write-only-code wird.

Niemand wird den Code nachher noch lesen oder verstehen können. Auch du 
nicht!

von Peter II (Gast)


Lesenswert?

Klaus schrieb:
> Ja, es gibt das Problem, dass es ein write-only-code wird.
>
> Niemand wird den Code nachher noch lesen oder verstehen können. Auch du
> nicht!

muss nicht sein.

int state = 1;

while(1) {
   if ( taster == 1 ) {
     state++;
   }

   if ( state == 60 ) {
     state = 0;
   }

   PORTC= state;
}

Das ist eine Statemachine mit 60 zuständen und sie ist wunderbar lesbar.

von Klaus (Gast)


Lesenswert?

Peter II schrieb:
> muss nicht sein.
>
> int state = 1;
> while(1) {
>    if ( taster == 1 ) {
>      state++;
>    }
>    if ( state == 60 ) {
>      state = 0;
>    }
>    PORTC= state;
> }
>
> Das ist eine Statemachine mit 60 zuständen und sie ist wunderbar lesbar.

Ich hab so im Urin, dass die Statemachine von Dimi S. anders aussieht 
;-)

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


Lesenswert?

Dimi S. schrieb:
> Gibt es Geschwindigkeits- oder andere Nachteile
> bei grossen Statemachinen???
Jein. Das kommt drauf an, wie was wann wo warum weitergeschaltet wird.

> (60 States meinem Fall)
Wenn ud diese Frage stellst und eine FSM mit 60 Zuständen hast, dann 
tippe ich auf eine umständliche Codierung. Und das kann dann durchaus 
Ressourcen und Geschwindigkeit kosten...

von (prx) A. K. (prx)


Lesenswert?

Wenn die Statemachine nicht wie die Peter'sche Version linear 
fortschaltet, sondern wild zwischen den Zuständen hin und her springt, 
dann leidet nicht so sehr die Lesbarkeit des Codes, als vielmehr die 
Nachvollziehbarkeit des Ablaufs. Bei 60 solchen springenden Zuständen 
blickt rein aus Lektüre des Codes heraus niemand mehr durch, irgendwann 
auch nicht mehr der Urheber. Da muss sauber dokumentiert werden.

von Christian R. (supachris)


Lesenswert?

Da kommt dann sowas wie die XAPP424 von Xilinx raus....da kann man sich 
mal angucken, wie man möglichst unübersichtlichen Code schreibt.

von Andi (chefdesigner)


Lesenswert?

Na Xilinx bringt doch jede Woche eine App heraus, die zeigt, wie man 
Chaos produziert.

Die 60 states sind im Übrigen nicht viel. Das geht noch schlimmer.

von Dimi S. (ilovespeccy)


Lesenswert?

Klaus schrieb:
> Ja, es gibt das Problem, dass es ein write-only-code wird.
>
> Niemand wird den Code nachher noch lesen oder verstehen können. Auch du
> nicht!

Das merke ich jetzt schon.

An sich ist die Statemachine noch zu verstehen. Die liest/schreibt
Speicher und I/O-Ports. Mein Design bestehr aus T80, 3 x i8055, i8059,
i8053 und noch ein Paar andere Dinge.
Ich habe auch versucht es zu teilen, dann verliere ich aber immer Takte,
die ich in meinem Fall brauche.
Ich meine das hier.
1
process1 : process(clk)
2
begin
3
...
4
case STATE1 is
5
...
6
   when WRITE_TO_SRAM =>
7
      WRSRAM_REQ <= '1';
8
      STATE1 <= WRITE_TO_SRAM_DONE;
9
10
   when WRITE_TO_SRAM_DONE =>
11
      if WRSRAM_ACK = '1' then
12
         STATE1 <= IDLE;
13
      end if;
14
...
15
end process;
16
17
process2 : process(clk)
18
begin
19
...
20
case STATE2 is
21
...
22
   when IDLE =>
23
      if WRSRA_REQ = '1' then
24
      ...
25
      ...
26
      HIER MEHRERE STATES, ES WIRD INS SRAM GESCHRIEBEN
27
      ...
28
      ...
29
   when XXX =>
30
      WRSRAM_ACK <= '1';
31
      STATE2 <= IDLE;
32
...
33
end process;

Wenn ich aber beide Statemachines zusammenpacke, spare ich
schon 2 Takte. Ich mene die Anfrage SRAM zu schreiben (WRSRAM_REQ),
und die Fertigmeldung (WRSRAM_ACK). Dann sieht es aber
entsprechend groß aus.

MfG

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

FSMs designen wir immer per Graph - dafür haben wir passende Programme, 
die das nachher in entsprechenden C-Code gießen.

Da gibt es sicherlich auch etwas für Windows.

Per Hand wird das beliebig fehleranfällig.

Graphen und Zustandsbeschreibungen noch als PDF dazulegen und schon 
versteht jeder, was wo gemacht wurde.

Chris D.

von Matthias (Gast)


Lesenswert?

Ich hab da auch schon eine recht umfangreiche, die auch immer wieder 
Erweiterungen bzw Änderungen braucht, weil alles hier ein wenig, naja, 
experimentell ist ;) . Die Semantik ist, dass Kommandos abgearbeitet 
werden, dh kann man immer wieder eine Reihe von States für sich 
abgeschlossen betrachten und mit einem Kommandonamen assoziieren. 
Inzwischen ziehe ich ein einheitliches Namensschema durch, wo jeder 
State "st_cmd_<Kommando_name>_<State_Nummer>" heißt. Damit kriegt man 
zwar immer noch nicht einen kompletten Kommandoablauf auf eine Seite 
aber man weiß wenigstens, wo man den Anfang und das Ende der Aktion zu 
suchen hat und hat eine gewisse Abstraktion, zu welchem Ablauf der State 
gehört.

Damit hab ich ganz gute Übersicht.

von Duke Scarring (Gast)


Lesenswert?

Chris D. schrieb:
> Graphen und Zustandsbeschreibungen noch als PDF dazulegen und schon
> versteht jeder, was wo gemacht wurde.
Aha. Du meinst ungefähr sowas, oder?!
http://doc.gold.ac.uk/~ma503am/images/dot/bag.png

Matthias schrieb:
> Die Semantik ist, dass Kommandos abgearbeitet
> werden, dh kann man immer wieder eine Reihe von States für sich
> abgeschlossen betrachten und mit einem Kommandonamen assoziieren.
Vielleicht wollt Ihr das ganze mal in mehrere State-Machines zerlegen? 
Das könnte übersichtlicher werden. Oder Ihr verwendet eine 
programmierbare State-Machine (aka Prozessor)...

Duke

von Matthias (Gast)


Lesenswert?

Naja, es ist eigentlich schon die zerlegte Variante ;) . Die zentrale 
State Machine hat zu diversen anderen State Machines auch nur mehr so 
mehr oder weniger Kommandointerfaces mit  Abstraktionen der Art "Lade 
den Datensatz Nummer x vom DDR2 in den Zwischenpuffer" oder "Stelle 
diese Elektrodengruppe mit diesen Parametern nach".

Es geht halt zum einen um die Steuerung einer recht komplexen Maschine 
wo vieles im Experimentalbereich ist und wo man auch viel ausprobieren 
muss. Zum anderen will man dann doch auch mal über einen bestimmten 
Vorgang sehr exakte Kontrolle haben, zb weil man einen bestimmten Fehler 
ausmessen will und dafür den Jitter beim Ansteuern einer Elektrode gegen 
0 bringen möchte (gibt genug andere Effekte, die für Messungen störend 
hineinspielen).

lg
Matthias

von Georg A. (Gast)


Lesenswert?

Wäre evtl. Mikroprogrammierung was? Wenn viele Übergänge von denselben 
Bedingungen abhängen und es mehr lineare Abläufe als Verzweigungen gibt, 
hilft diesse Art der Entwicklung ziemlich. Jeder Schritt des Programms 
besteht dann aus den Kommandos an die anderen Einheiten und die 
Fortschaltung bzw. Verzweigung wird über ein Extra-Feld geregelt. Man 
kann das ganze dann zB. als Textfile schreiben (jeder Tabstop ein 
Kommando) und per Mini-C/Perl-Programm in Initdaten für Distributed RAMs 
umwandeln. Dann besteht das ganze Ding im wesentlichen aus RAMs und 
etwas Logik für den Sequencer.

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Duke Scarring schrieb:
> Chris D. schrieb:
>> Graphen und Zustandsbeschreibungen noch als PDF dazulegen und schon
>> versteht jeder, was wo gemacht wurde.
> Aha. Du meinst ungefähr sowas, oder?!
> http://doc.gold.ac.uk/~ma503am/images/dot/bag.png

Ja, so ungefähr ;-)

Allerdings mit umgekehrtem Weg: man malt das Programm quasi. Da kann man 
dann natürlich auch vernünftig gruppieren und zurechtschieben, so dass 
der spätere Graph übersichtlich bleibt :-)

Chris D.

von Rene B. (themason) Benutzerseite


Lesenswert?

Ich weiß zwar nicht ob ich mich nu in die Nesseln setze, aber ich 
versuchs mal :

Wäre es möglich die Statemachine vllt über ein Blockram zu realisieren ?
Ob das machbar ist oder nicht hängt dann davon ab wieviele effektive 
Signale den Zustand ändern können. Man kann es dann evtl auch so machen 
das man nur die Signale durchschaltet die in dem jeweiligen State bzw 
State-Gruppe Zustandswechsel erzeugen können. Damit verringert man dann 
die Anzahl der Eingangsvariablen und auch die Anzahl der benötigten 
Worte.

von zachso (Gast)


Lesenswert?

@myfairtux: darf man erfahren was fuer tools ihr da einsetzt? ist ja 
vllt. doch mal interessant fuer den einen oder anderen

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

zachso schrieb:
> @myfairtux: darf man erfahren was fuer tools ihr da einsetzt? ist ja
> vllt. doch mal interessant fuer den einen oder anderen

Bis zum März hatten wir ein selbstgeschriebenes Tool dafür. Seitdem 
benutzen wir (bzw. mein Mitarbeiter) ein leicht modifiziertes Qfsm. Das 
generiert Ragel-Code, den man dann in die entsprechende Zielsprache 
überführt.

Das Schöne dabei ist, dass man den Programmablauf dann direkt visuell 
hat und eigentlich gar keinen Code mehr schreibt. So etwas reduziert die 
Anfälligkeit für Fehler (zumindest hier).
Außerdem sieht man wortwörtlich, was das Programm macht - so etwas spart 
viel Kommentararbeit.

Es kann natürlich sein, dass die gesamte Maschine dann ausgedruckt gerne 
mal A2 oder A1-Größe hat ;-)

Ich selbst arbeite damit allerdings kaum - das ist einer der Bereiche, 
die mein MA besetzt und besser kann als ich :-)

Chris D.

von Harald F. (hfl)


Lesenswert?

Jetzt geb ich doch noch meinen Senf dazu, habs mir ja lange überlegt. 
Zustandsautomaten mit vielen Zuständen sind IMHO nicht mehr oder weniger 
anfällig dafür, unübersichtlich zu werden, also solche mit wenigen 
Zuständen. Ich durfte schonmal einen Automat mit über 200 Zuständen 
modellieren, inklusive Änderungen nach einem halben Jahr. Wenn man das 
anständig hinschreibt und korrekt kommentiert, dann sollte das schon 
gehen. Eine sinnvolle Bezeichnung der Zustände und der E/A-Signale ist 
logischerweise Voraussetzung. Aber genau genommen, war das nicht die 
Frage des Treadstarters.

Dimi S. schrieb:
> Gibt es Geschwindigkeits- oder andere Nachteile
> bei grossen Statemachinen??? (60 States meinem Fall)

Es gibt sehr wohl die Möglichkeit, dass ein Synthesetool das 
Zustandsregister eines solchen Automaten aus 60 Flipflops baut und dann 
für die Berechnung der Gatterschaltung die Eingangssignale und alle 60 
Bits des Zustandsregisters verwendet. Alles schon mal da gewesen. Das 
führt dann zu einer großen und langsamen FSM. Es muss sicher gestellt 
sein, dass das nicht passiert, sonst gibt es die vom TS angefragten 
Geschwindigkeitsnachteile.

Grüße,
Harald

von Dimi S. (ilovespeccy)


Lesenswert?

Guten Morgen!

Danke für Eure Hilfe!
Ich habe meine Statemachine ein wenig optimiert und jetzt
sieht die einigermaßen gut aus. Die erledigt 18 einzelne Aufgaben.
Jede Aufgabe besteht aus 1 bis 12 States. Jede Aufgabe hat eigene
Name bekommen. Direkt dahinter steht die State-Nummer.
z.B. Daten zum Interruptcontroller senden besteht aus folgenden
Schritten: PIC_WR_1, PIC_WR_2. u.s.w.

Harald Flügel schrieb:
> Es muss sicher gestellt
>
> sein, dass das nicht passiert, sonst gibt es die vom TS angefragten
>
> Geschwindigkeitsnachteile.

Ich werde heute Abend RTL meines Designs angucken.

MfG aus Westerwald

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.