Unterschied zwischen If-else- und Case-Anweisung in VHDL

11

Ich möchte verstehen, wie verschiedene Konstrukte in VHDL-Code in RTL synthetisiert werden.

  • Kann mir jemand den Unterschied zwischen If-Else- Konstrukt- und Case-Anweisungskonstrukten eines Prozesses in VHDL hinsichtlich der Art und Weise erklären, wie der Code vom Synthesetool in die RTL-Schaltung abgeleitet wird?
  • Betrachten Sie den Fall mehrerer verschachtelter if-else und das Mischen von case-Anweisungen mit dem if-else- Konstrukt innerhalb eines Prozesses.
  • Auch wann welches Konstrukt zu verwenden ist?

PS: Ich habe eine verwandte Frage "Mehrere if-Anweisungen in vhdl in Bearbeitung" gesehen, aber das beantwortet meine Frage sowieso nicht.

nurabha
quelle
Ich kann nicht kommentieren, wie die physischen Gates konfiguriert werden würden, aber in den meisten Compilern, die eine x86-Assembly ausgeben, existiert ein if-else normalerweise als einzelne Prüfung mit einem bedingten Sprung (z. B. jg, jl, jz, jnz usw.). Während switch die Fälle in numerischer Reihenfolge organisiert und iterative dec/ jzAnweisungen ausführt , ist dies viel effizienter. Möglicherweise wird hier eine ähnliche Optimierung angewendet.
Polynom
@Polynomial Das Verhalten von If-else und case unterscheidet sich in Hardwaresprachen erheblich von Ihrer typischen linearen Programmierung. Op-Code-Optimierungen sind nicht sehr relevant, da die HDL-Anweisung "sofort" ausgeführt wird.
W5VO

Antworten:

10

Kann mir jemand den Unterschied zwischen If-Else-Konstrukt- und Case-Anweisungskonstrukten eines Prozesses in VHDL hinsichtlich der Art und Weise erklären, wie der Code vom Synthesetool in die RTL-Schaltung abgeleitet wird?

Das if-elsif-elseKonstrukt leitet ein Prioritäts-Routing-Netzwerk ab:

schematisch

simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab

Dies entspricht

if bool_expr_1 then
    sig <= val_expr_1;
elsif bool_expr_2 then
    sig <= val_expr_2;
elsif bool_expr_3 then
    sig <= val_expr_3;
else
    sig <= val_expr_4;
end if;

Das caseKonstrukt hingegen leitet einen großen alten Mux ab:

Geben Sie hier die Bildbeschreibung ein

Dies entspricht

case case_expr is
  when c0 =>
    sig <= val_expr_0;
  when c1 =>
    sig <= val_expr_1;
  when c2 =>
    sig <= val_expr_2;
      ...
  when others =>
    sig <= val_expr_N;
end case;

Offensichtlich handelt es sich hierbei um sehr vereinfachte Designs mit nur einem Werteausdruck, was zu einer Ausgabe führt.

Betrachten Sie den Fall mehrerer verschachtelter if-else und das Mischen von case-Anweisungen mit dem if-else-Konstrukt innerhalb eines Prozesses.

Wie oben können Sie sehen, wie sie verschachteln / mischen würden.

Auch wann welches Konstrukt zu verwenden ist?

Da die if-elsePriorität abgeleitet wird, sollte sie verwendet werden, wenn mehr als eine Eingabebedingung auftreten kann. Die Verwendung caseist andererseits angemessen, wenn sich die Eingaben gegenseitig ausschließen.

Angelo Stavrow
quelle
Ich verstehe, dass die Fallanweisung nur für eine einzelne Eingabebedingung funktioniert und if-else für mehrere Eingabebedingungen. Beide Konstrukte erzeugen jedoch im Wesentlichen Muxe (in Abwesenheit von clk). Ist es nicht möglich, dass die Logiksynthese den Einzeleingang optimiert, wenn dies auf einen einzelnen großen Mux anstelle einer Kette von Muxes zurückzuführen ist? Was ist ein Priority-Routing-Netzwerk? Ist das nicht einfach eine Kette von Muxes anstelle von 1 großen Mux?
Nurabha
Wenn wir einen Prozess haben, der für eine Uhr empfindlich ist, kann if-else außerdem sequentielle Elemente wie Register, Latches usw. erzeugen. Kann eine case-Anweisung auch sequentielle Logik erzeugen?
Nurabha
Ja, ein Priority-Routing-Netzwerk ist genau das - eine Kette von Muxes. In der Natur des if-elseKonstrukts entsteht jedoch diese Kette. Die erste Bedingung muss fehlschlagen, damit die zweite Bedingung getestet werden kann. Dies ist für das caseKonstrukt nicht der Fall , und deshalb konnte eine if-elseAussage nicht als einzelner großer Mux synthetisiert werden.
Angelo Stavrow
1
Und ja, eine caseAnweisung kann auch sequentielle Logik erzeugen. Ich habe "Real World VHDL" gefunden , eine Reihe von Vorlesungsfolien der University of Glasgow, die für Sie hilfreich sein können.
Angelo Stavrow
Dies ist eine gute Referenz.
Nurabha
4

In diesem alten Blog-Beitrag hat der Autor zwei funktional äquivalente Versionen von VHDL-Code geschrieben und synthetisiert. Einer mit if-else, der andere mit case. Das Ergebnis:

Ich habe diesen Code synthetisiert und die genauen Ergebnisse erhalten. Auch das RTL-Schema war für beide Programme genau gleich.

Und sein Fazit:

Dies zeigt, dass die Anweisungen 'case' und 'if ... elsif ... else' beide gleich effizient sind. Wenn Sie jedoch einen klaren Code schreiben möchten, verwenden Sie besser 'case'. 'Case' ist sehr nützlich, wenn die Anweisungen Die Ausgabe hängt von einer großen Anzahl von Bedingungen ab. Wenn die Anzahl der Bedingungen jedoch sehr gering ist (2 oder 3), können Sie 'if..elseif..else' verwenden.

Es gibt auch Dutzende von Posts zu diesem Thema auf Stack Overflow für jede denkbare Sprache. Die Schlussfolgerung ist im Allgemeinen dieselbe, dass es keinen Leistungsunterschied gibt. Gelegentlich kann ein Compiler bei einer großen Anzahl von Fällen intelligent genug sein, um eine Nachschlagetabelle zu erstellen, die eine etwas bessere Leistung liefert.

Ein VHDL-Synthesizer kann möglicherweise etwas Ähnliches tun. Aber Sie würden immer noch eine große Anzahl von Fällen benötigen. In diesem Fall (Wortspiel beabsichtigt) möchten Sie wahrscheinlich trotzdem eine case-Anweisung verwenden, da sie eine bessere Lesbarkeit bietet, wenn es eine große Anzahl von Optionen gibt.

embedded.kyle
quelle