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
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.
> 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?
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 :-)
@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.
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.
> 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 ;-)
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
@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.