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 ...
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.
FSM_ENCODING
und .ENUM_ENCODING
Eugen Sch.
Matt
Matt
Matt
Matt
Das Photon
Matt