Sicherstellen, dass eine FSM sich nicht verfängt.

Gast #1267827
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
Gast #1268245
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
#1268393
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.
Gast #1268649
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?
Gast #1268849
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 :-)
#1268861
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.
Moderator (Firma: Titel) Persönliche Seite #1269185
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 ;-)
#1269481
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren