Die case-Anweisung prüft, ob der angegebene Ausdruck mit einem der anderen Ausdrücke in der Liste und den Zweigen übereinstimmt. Es ist normalerweise üblich, ein Gerät zu implementieren.
xd xd Bedeutung
Das if-else-Konstrukt ist möglicherweise nicht anwendbar, wenn die Maßeinheit viele zu überprüfende Bedingungen aufweist und in einen Prioritätsencoder statt in ein Gerät synthetisiert würde.
In Verilog , eine case-Anweisung enthält den gesamten Code zwischen den Verilog-Schlüsselwörtern case („casez“, „casex“) und endcase. Eine Case-Anweisung kann ein Select-One-of-Many-Konstrukt sein, das in etwa der If-Else-If-Anweisung von Associate in der Pflege ähnelt.
Syntax
Eine Verilog-Case-Anweisung beginnt mit dem Schlüsselwort case und endet mit dem Schlüsselwort endcase.
Der in Klammern stehende Ausdruck soll einmalig ausgewertet und mit der Liste der Alternativen in der Reihenfolge verglichen werden, in der sie geschrieben werden.
Und die Aussagen, dass die Auswahl mit der angegebenen Ausdrucksmaßeinheit übereinstimmt, sind tot. Ein Block mit mehreren Anweisungen sollte sortiert sein und innerhalb von Anfang und Ende liegen.
case () case_item1 : case_item2, case_item3 : case_item4 : begin end default: endcase
Wenn keines der Case-Dinge mit dem angegebenen Ausdruck übereinstimmt, sind Anweisungen innerhalb der Standard-Item-Maßeinheit ungültig. Die Standardanweisung ist nicht obligatorisch und es gibt in jeder Case-Anweisung nur eine Standardanweisung. Case-Anweisungen sind verschachtelt.
Wenn keines der Elemente mit dem Ausdruck übereinstimmt und keine Standardanweisung angegeben ist, verlässt die Ausführung den Case-Block, ohne etwas zu tun.
Beispiel
Das folgende Modemodul enthält ein 2-Bit-Optionssignal, um einen der drei verschiedenen 3-Bit-Eingänge an das als out bezeichnete Zeichen weiterzuleiten.
Eine case-Anweisung wird verwendet, um den korrekten Eingang dem Ausgang zuzuweisen, der den Wert von sel unterstützt. Da sel ein 2-Bit-Signal sein kann, gibt es zwanzig 2er-Kombinationen, null bis 3. Die Standardanweisung hilft dabei, die Zeilenausgabe auf Null zu setzen, wenn sel 3 ist.
module my_mux (input [2:0] a, b, c, // three 3-bit inputs [1:0]sel, // 2-bit opt for signal to choose on from a, b, c output reg [2:0] out); // Output 3-bit signal // invariably block is dead whenever a, b, c or sel changes in value invariably @ (a, b, c, sel) begin case(sel) 2'b00 : out = a; // If sel=0, output can be a 2'b01 : out = b; // If sel=1, output is b 2'b10 : out = c; // If sel=2, output is c default : out = 0; // If sel is something, out is commonly zero endcase end endmodule
Kopfzeile der Fallerklärung
Der Header einer Case-Anweisung besteht aus dem Schlüsselwort case („casez“, „casex“), gefolgt vom case-Ausdruck, normalerweise alles in einer Codezeile.
Beim Hinzufügen von full_case- oder parallel_case-Direktiven zu einer case-Anweisung wird die Maßeinheit der Direktive als Kommentar in Echtzeit nach dem case-Ausdruck an der Spitze des case-Anweisungsheaders und vor allen case-Elementen in den folgenden Codezeilen hinzugefügt.
Fallelement
Das Case-Element besteht darin, dass der Bit-, Vektor- oder Verilog-Ausdruck mit dem Case-Ausdruck verglichen wird.
Im Gegensatz zu verschiedenen höheren Programmiersprachen wie „ C ', die Verilog-Case-Anweisung enthält implizite Break-Anweisungen.
Das erste Case-Element, das mit diesem Case-Ausdruck übereinstimmt, führt dazu, dass die entsprechende Case-Item-Anweisung tot ist, sodass alle übrigen für diesen Fall übersprungenen Case-Einheiten der Maßeinheit der Case-Anweisung unterliegen.
Fallelementanweisung
Eine Case-Item-Anweisung ist eine oder mehrere Verilog-Anweisungen, die ungültig sind, wenn das Case-Item mit diesem Case-Ausdruck übereinstimmt. Im Gegensatz zu VHDL können Dinge im Verilog-Fall selbst Ausdrücke sein.
Um die Analyse des Verilog-Codedokuments zu ändern, sollten Verilog-Case-Item-Anweisungen zwischen den Schlüsselwörtern eingeschlossen werden 'beginnen' Und 'Ende' wenn mehr als eine Aussage für ein bestimmtes Fallelement tot sein soll.
Casez
In Verilog gibt es eine casez-Anweisung, eine Variation der case-Anweisung, die „z“ und „?“ ermöglicht. Werte, die während des gesamten Fallvergleichs als „egal“-Werte behandelt werden sollen.
„Z“ und „?“ Maßeinheiten werden als behandelt. Dabei ist es egal, ob sie sich innerhalb des Case-Ausdrucks oder innerhalb des Case-Elements befinden.
Wenn Sie heimlich eine Case-Anweisung mit „Don't Care“ schreiben, verwenden Sie eine Casez-Anweisung und verwenden Sie „?“ Zeichen anstelle von „z“-Zeichen innerhalb der Groß-/Kleinschreibung, um „egal“-Bits zu verwenden.
Casex
In Verilog gibt es eine Casex-Anweisung, eine Variation der Case-Anweisung, die es ermöglicht, die Werte „z“, „?“ und „x“ während des gesamten Vergleichs als „Don't Care“-Werte zu behandeln.
'x', 'z' und '?' Maßeinheiten werden als behandelt. Dabei ist es egal, ob sie sich innerhalb des Case-Ausdrucks oder innerhalb des Case-Elements befinden.
Vollständige Falldarstellung
Eine vollständige Case-Anweisung kann eine Case-Anweisung sein, in der alle abrufbaren Case-Ausdruck-Binärmuster mit einem Case-Element oder einem Case-Standard abgeglichen werden.
Wenn eine Case-Anweisung keinen Case-Standard enthält und es möglich ist, einen binären Case-Ausdruck zu finden, der mit keinem der gedruckten Case-Elemente übereinstimmt, ist die Case-Anweisung nicht vollständig.
Eine vollständige Case-Anweisung kann eine Case-Anweisung sein, in der alle abrufbaren binären, nicht-binären und Mischungen aus binären und nicht-binären Mustern als Case-Element in der Case-Anweisung eingepackt sind.
Verilog möchte nicht, dass Fallanweisungen entweder vollständig synthetisiert oder mit High-Density-Lipoprotein-Simulation gefüllt sind, aber Verilog-Fallanweisungen werden durch Hinzufügen eines Fallstandards vollständig gemacht. VHDL verlangt, dass die Fallbeschreibungen eine vollwertige Lipoproteinsimulation mit hoher Dichte sind, was normalerweise die Klausel „Andere“ von Associate in Nursing erfordert.
Parallele Fallerklärung
Eine parallele Case-Anweisung kann eine Case-Anweisung sein, in der nur ein Case-Ausdruck mit nur einem Case-Element abgeglichen werden kann.
Wenn es möglich ist, einen Case-Ausdruck zu finden, der mit einem Case-Element übereinstimmt, wird die übereinstimmende Case-Maßeinheit als überlappende Case-Dinge angegeben, und die Case-Anweisung ist daher nicht parallel.
Hardware-Schema
Der RTL-Code wird ausgearbeitet, um ein Hardwareschema zu erhalten, das einen 4-zu-1-Multiplexer darstellt.
Nachdem der obige Entwurf ausgeführt wurde, ist die Ausgabe Null, wenn sel 3 ist, und entspricht den zugewiesenen Eingaben für andere Werte.
ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0 [10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5 [20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5 [30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1 [40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
In einer case-Anweisung ist der Vergleich nur dann erfolgreich, wenn jedes Bit des Ausdrucks mit einer der Alternativen einschließlich 0, 1, x und z übereinstimmt. Wenn im obigen Beispiel eines der Bits in sel entweder x oder z ist, ist das Standard Die Anweisung wird ausgeführt, da keine der anderen Alternativen übereinstimmt. In einem solchen Fall besteht die Ausgabe ausschließlich aus Nullen.
ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0 [10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0 [20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0 [30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0 [40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0 [50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0 [60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0 [70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0 [80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0 [90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
Wenn die Case-Anweisung im Design x und z in den Case-Item-Alternativen hat, werden die Ergebnisse unterschiedlich sein.
module mux (input [2:0] a, b, c, output reg [2:0] out); // Case items have x and z, and sel has to match the exact value for // output to be assigned with the corresponding input always @ (a, b, c, sel) begin case(sel) 2'bxz: out = a; 2'bzx: out = b; 2'bxx: out = c; default: out = 0; endcase end endmodule
Unterscheidung zwischen case und if-else
Die case-Anweisung unterscheidet sich in zweierlei Hinsicht von if-else-if, z. B.:
- Ausdrücke in einer ansonsten -Block sind allgemeiner, während in einem Case-Block ein einzelner Ausdruck mit mehreren Elementen abgeglichen wird.