One-hot fsm in vhdl

Ich möchte ein One-Hot-fsm in vhdl codieren. Ich habe viele in Verilog gemacht, aber mein aktueller Arbeitgeber bevorzugt vhdl. In Verilog würde ich die "inverse Case-Anweisung" (Fall 1'b1) verwenden, um jedes Bit im Zustandsvektor parallel zu vergleichen. Dann synthetisieren wir mit einem Parallel-Case-Pragma oder einer "eindeutigen" Deklaration im System Verilog das richtige Ergebnis.

Aber ... Vhdl scheint keine umgekehrte Fallaussage zuzulassen. Parallel_case ist nicht erforderlich, da case in vhdl immer parallel ist. Das beste Beispiel, das ich aus Steve Golsons Artikel (1994!) gefunden habe, verwendet kaskadierte if-Anweisungen. Es gibt kein "sonst", aber es scheint mir, dass diese Prioritätscodierer und keine parallele Zustandsprüfung werden sollten. Ich bin also etwas ratlos.

Kollegen zu fragen wird nicht helfen, niemand verwendet diesen Programmierstil und ich versuche ihnen zu zeigen, wie gut es funktioniert. Aber vielleicht gibt es einen Grund, warum diese VHDL-Typen es nicht verwenden ...

Synthesewerkzeuge sind (meistens) in der Lage, das Zustandsmaschinenmuster zu erkennen und die optimale Kodierungsmethode auszuwählen. In VHDL verwenden Sie also normalerweise Aufzählungen für Zustände, ohne die Codierung explizit anzugeben. Und lassen Sie das Tool es für Sie optimieren. Dies würde wahrscheinlich auch für Verilog gelten.
Guter Punkt über Synthesizer-Tools. Ich denke, ich werde unserem AE eine E-Mail schicken, um zu sehen, was sie empfehlen.
Ich bin mir auch nicht ganz sicher, wie Enumerationen mit Logiktypen in vhdl funktionieren. In System Verilog können Sie eine Aufzählung vom Typ Logik deklarieren. Das funktioniert in vhdl nicht, also verlieren Sie die Z- und X-Zustände. Vielleicht ist diese Modellierung bei aufgezählten Zuständen unnötig.
Wäre die formale Äquivalenz auch in der Lage, tooloptimierte Codierungen zu vergleichen? Es ist interessant, wie sehr einige der High-End-Chipdesigns in Bezug auf Werkzeugabläufe sehr regressiv sind, wahrscheinlich weil sie wissen, was funktioniert hat, und Angst haben, Änderungen vorzunehmen.
Bei weiterem Nachdenken wird kein Prioritätscodierer abgeleitet. Dies erfasst vollständig die beabsichtigte Logik, die ich erst erkannte, nachdem ich eine lange Nachricht an mein AE geschrieben hatte, bevor ich auf „Senden“ klickte. Ich werde darüber noch ein bisschen nachdenken, aber es scheint kein Problem zu sein.
Enthält die Dokumentation Ihres Synthesetools Beispiele für die Codierung einer One-Hot-Zustandsmaschine in VHDL? Wenn Sie diese Muster verwenden, wissen Sie, dass das Synthesetool sie erkennen wird.
Kein Beispiel, das ich in der Dokumentation finden kann.

Antworten (1)

In VHDL beschreiben Sie die FSM-Zustände mit einem Aufzählungstyp wie diesem:

type T_STATE is (ST_IDLE, ST_READING, ST_WRITING, ST_FINISHED, ST_ERROR);

Dieser Typ hat keine Bedeutung dafür, wie die Aufzählungsliterale (die Zustandsnamen) als Binärwerte in Ihrem Zielgerät dargestellt werden. Es kann sein: * sequentiell * Gray-Code * Johnson-Code * One-Hot-Code * ...

Sie können sogar Ihre eigene benutzerdefinierte Kodierung angeben.

Das Synthesetool wählt basierend auf: * Anzahl der Zustände * Anzahl der Übergänge * Übergangsmuster, z. B. parallele Pfade in Ihrem FSM * benötigtes Ausgabeformat * Timing-Anforderungen * Optimierungsstrategie

Was wird die beste Codierung sein. Wenn Sie beispielsweise die Geschwindigkeitsoptimierung aktivieren, wird möglicherweise häufiger One-Hot ausgewählt, da dies einfacher zu überprüfen ist und höhere Frequenzen verarbeiten kann. Wenn Sie für die Fläche optimieren, entscheidet es sich für kompaktere Codes wie Gray oder sequentielle (Binärzahlen).

Ich habe One-Hot-codierte FSM mit bis zu 31 Registern (Zuständen) in Xilinx-Synthesewerkzeugen gesehen.

Sie können eine Standard-FSM-Codierung global durch Synthesizer-Optionen oder pro FSM oder pro Aufzählungstyp mit VHDL-Attributen angeben.


Ein Aufzählungstyp ist ein diskreter Typ. Alle Aufzählungsliterale haben eine Positionsnummer ( T_STATE'pos(ST_ERROR)ist 4). Aus diesem Grund können die Tools Aufzählungsliterale intern als ganze Zahlen behandeln, da eine Position auf der Zahlenskala ein ganzzahliger Wert ist. Aber diese Tatsache bedeutet nicht, dass jeder Zustand als das Binärformat seiner Positionsnummer codiert wird.

Aber das ist nicht so gut, wenn Sie wissen, dass Sie One-Hot wollen (zum Beispiel aus Gründen der Umweltfreundlichkeit und der Tatsache, dass wir Hochfrequenz, Niederspannung sind und jede Pikosekunde zählt) und es anscheinend nicht gibt eine werkzeugunabhängige Möglichkeit, die Kodierung anzugeben. Leider bin ich den Weg gegangen, den ich in meinem ersten Beitrag erwähnt habe, wie in der Arbeit von 1994 beschrieben. Andererseits erlaubt mein Team normalerweise keinen "Prozess" für kombinatorische Logik, also könnte es trotzdem abgeschossen werden ...
Zunächst kennt das Tool Ihre Timing-Einschränkungen (deshalb haben Sie SDC/XDC/LDC, ... Dateien). Zweitens können Sie globale Optionen für alle FSMs festlegen, um eine bestimmte Codierung (Synthesizer-Option) zu verwenden. Und schließlich können Sie die Codierung mit Designeinschränkungen oder VHDL-Attributen definieren. Suchen Sie in den Benutzerhandbüchern Ihrer Anbieter nach den Attributen FSM_ENCODINGund .ENUM_ENCODING
Wie übertragbar ist ENUM_ENCODING? Wenn wir den Anbieter wechseln, muss es neu geschrieben werden? Und wenn ich es auf diese Weise mache, würde ich beim Vergleichen, ob wir uns in einem bestimmten Zustand befinden, mit dem Aufzählungswert vergleichen ... er würde zu einem einzigen Bitvergleich synthetisiert (wenn eins heiß)?
Die Anbieter haben den VHDL-Synthesestandard schon vor längerer Zeit abgelehnt. Aber soweit ich mich erinnere, ist der Attributname derselbe, während einige Codierungsnamen unterschiedlich sind. Xilinx nennt es „sequentiell“, Intel nennt es „binär“. Sie können eine Funktion schreiben (die in Attributanweisungen aufgerufen werden kann), um dies zu handhaben.