Forum: FPGA, VHDL & Co. Sicherstellen, dass eine FSM sich nicht verfängt.


von Martin (Gast)


Lesenswert?

Hallo,

reicht es speziell bei Xilinx XST safe *implementation* Schalter
einzuschalten oder muss dazu noch
1
type states is (a,b,c); -- 2 FFs
2
signal state, next_state: states := a;
3
4
case state is
5
   when a => ...
6
   when b => ...
7
   when c => ...
8
   when others => next_state <= a;
9
end case;

dieses Template angewandt werden?

oder reicht so ein Template
1
type states is (a,b,c); -- 2 FFs
2
signal state, next_state: states := a;
3
4
next_state <= a;
5
case state is
6
   when a => ...
7
   when b => ...
8
   when c => ...
9
end case;

oder muss man gar selber die Hand an die Zustände anlegen und
das ganze auf die Art machen
1
signal state: std_logic_vector(1 downto 0) := "00";
2
3
case state is
4
   when "00" => ...
5
   when "01" => ...
6
   when "10" => ...
7
   when others => next_state <= "00";
8
end case;

Mich würde das insgesamt interessieren, also ob es toolübergreifend
funktioniert.

grüsse

von SuperWilly (Gast)


Lesenswert?

Der "when others =>" Zweig sollte bei vollständig beschriebener 
Zustandsmaschine vom Syntheseprogramm ignoriert werden. Falls Du einen
RTL-Viewer hast, solltest du dies sehen können.

Gruß,
SuperWilly

von Klaus F. (kfalser)


Lesenswert?

Es genügt, den Safe-Implementation schalter einzuschalten.
Der Others-Pfad hat keine Wirkung.
Eventuell muss man auch noch den Zustand angeben, der im Fall eines 
ungültigen Zustands angesprungen werden soll (SAVE_RECOVERY_STATE).

Das ist in der XST User Guide beschrieben.

von Gast (Gast)


Lesenswert?

> Eventuell muss man auch noch den Zustand angeben, der im Fall eines
> ungültigen Zustands angesprungen werden soll (SAVE_RECOVERY_STATE).

Mein VHDL ist etwas eingerostet, aber ist nicht genau hierfür die "when 
others" Zeile verantwortlich? Jedenfalls genau dann wenn in den 
Tool-Einstellungen sichere Statemachines aktiviert sind?

von Klaus F. (kfalser)


Lesenswert?

Nein, wurde in Beitrag "Typedefinition mit 3 Zustaenden" schon mal 
diskutiert.

von Gast (Gast)


Lesenswert?

So, jetzt hab ich mir mal die Mühe gemacht und nachgeschaut. XST und 
Quartus ignorieren tatsächlich die "when others" bzw "default" 
Statements und setzen eine "Safe" Statemachine zurück auf den Reset Wert 
oder den per Attribut vorgegebenen.

Zumindest bei Quartus gibt es aber eine Option, die eine FSM genau so 
implementiert wie sie beschrieben ist. In diesem Fall sollte "when 
others" genau zu der gewünschten Implementierung einer Statemachine 
führen, die voll auscodiert ist und aus fehlerhaften Zuständen selbst 
zurückfindet. Dafür gibts halt keine automatische Optimierung. Wie das 
andere Synthesesoftware macht weiss ich nicht.

Fakt bleibt aber, dass eine Statemachine ohne den "others" Zweig (meist) 
nicht vollständig beschrieben ist. Dass Xilinx und Altera die 
beschriebene Funktion einfach ignorieren und nicht vollständig wie 
gewünscht implementieren, dafür kann VHDL/Verilog nichts. Ich werde 
jedenfalls dabei bleiben und meine Statemachines immer mit einem 
default-Statement ausstatten. Wer weiss wie das in Zukunft oder bei 
anderer Software implementiert ist. So hab ich mir einmal Gedanken und 
die Hardware tut hoffentlich was ich will :-)

von Klaus F. (kfalser)


Lesenswert?

@Gast
Leider hast Du unrecht.
Bei einer state machine mit 3 Zuständen und 3  Zweigen in der case 
anweisung bleibt für das others nichts übrig -> es ist überflüssig.
Das hat mit der safe implementierung nichts zu tun und die state machine 
ist eben schon vollständig beschrieben.
Die Umsetzung des abstrakten Zustandvektors auf einen binären Vektor ist 
erst ein zweiter Schritt. Erst dort treten die überschüssigen Zustände 
auf, und erst dort macht es Sinn diese auf einen Reset-Zustand 
zurückzuführen.
Und eben das macht die Synthese wenn man sie mit der entsprechenden 
Option dazu anweist.

von Gast (Gast)


Lesenswert?

Zumindest meine Statemachines sind immer mit Zustandsvariablen der 
Grösse 2^n beschrieben. So mag others in deinem Fall überflüssig sein, 
in meinem jedoch oft nicht.

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


Lesenswert?

> Zumindest meine Statemachines sind immer mit Zustandsvariablen der
> Grösse 2^n beschrieben.
Und wie implementiert? One-Hot?
Dann hast du (2^n)-n-1 undefinierte Zustände.
Wie du eine SM beschreibst hat gar nichts damit zu tun, wie diese SM 
in Hardware realisiert wird.

> So mag others in deinem Fall überflüssig sein, in meinem jedoch oft nicht.
Den Design-Tools ist es schlichtweg schnuppe, wenn du eine 
Zustandsmaschine mit 7 Zuständen hast, alle verwendest, und dann /when 
others/ am Schluss dazuschreibst. Das when others wird einfach 
ignoriert und dazu verwendet, die Kombinatorik zum Umschalten zu 
vereinfachen.

Ich hab genau das ausprobiert, lasse mir aber gern das Gegenteil 
beweisen ;-)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich habe ab und an mal das "Problem" das er mir anmeckert ich würde 
nicht alles cases abdecken, dann aber ein schrit später wieder das er 
den Defaultzweig weggenommen hat weil alle Zustände bschrieben sind, da 
macht XST mich echt manchmal verrückt :D

von Klaus F. (kfalser)


Lesenswert?

@Läubi
Manche Zustände sind nicht oft nicht unmittelbar erkennbar :
Wenn man z.B. eine case-Anweisung von std_logic Vektoren schreibt, dann 
gibt nicht nur die Kombinationen mit '1' und '0', sondern auch mit 'X', 
'-', 'L' usw.
Für die Synthese machen natürlich nur '1' und '0' Sinn, und XST mag 
vielleicht der Genauigkeit halber meckern, aber zumindest bei der 
Simulation braucht es den "others" Pfad, will man nicht alle Varianten 
selbst hinschreiben.

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.