www.mikrocontroller.net

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


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

reicht es speziell bei Xilinx XST safe *implementation* Schalter
einzuschalten oder muss dazu noch
type states is (a,b,c); -- 2 FFs
signal state, next_state: states := a;

case state is
   when a => ...
   when b => ...
   when c => ...
   when others => next_state <= a;
end case;

dieses Template angewandt werden?

oder reicht so ein Template
type states is (a,b,c); -- 2 FFs
signal state, next_state: states := a;

next_state <= a;
case state is
   when a => ...
   when b => ...
   when c => ...
end case;

oder muss man gar selber die Hand an die Zustände anlegen und
das ganze auf die Art machen
signal state: std_logic_vector(1 downto 0) := "00";

case state is
   when "00" => ...
   when "01" => ...
   when "10" => ...
   when others => next_state <= "00";
end case;

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

grüsse

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, wurde in Beitrag "Typedefinition mit 3 Zustaenden" schon mal 
diskutiert.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.