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 #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