Příkaz case kontroluje, zda daný výraz odpovídá jednomu z ostatních výrazů v seznamu a větvích. Obvykle je zvykem implementovat zařízení.
Konstrukt if-else nemusí být použitelný, pokud existuje mnoho podmínek, které je třeba zkontrolovat, a pokud by se syntetizovaly do prioritního kodéru namísto zařízení.
v Verilog , příkaz case obsahuje veškerý kód mezi klíčovými slovy Verilog, case ('casez', 'casex') a endcase. Příkaz case může být konstrukt select-one-of-many, který je zhruba jako Associate v ošetřovatelském příkazu if-else-if.
Syntax
Příkaz Verilog case začíná klíčovým slovem case a končí klíčovým slovem endcase.
Plošná jednotka výrazu v závorkách, která má být vyhodnocena specificky jednou, je porovnána se seznamem alternativ v pořadí, v jakém jsou zapsány.
A tvrzení, že výběr odpovídá dané výrazové měrné jednotce mrtvý. Blok více příkazů by měl být seřazen a měl by být v rámci začátku a konce.
case () case_item1 : case_item2, case_item3 : case_item4 : begin end default: endcase
Pokud se žádná z věcí neshoduje s daným výrazem, příkazy v rámci výchozí jednotky měření jsou mrtvé. Výchozí příkaz není povinný a v celém příkazu case existuje pouze jeden výchozí příkaz. Případové příkazy jsou vnořené.
Provedení ukončí blok velkých písmen, zatímco neprovede jednu věc, pokud žádná z položek neodpovídá výrazu a není zadán výchozí příkaz.
Příklad
Následující modul Vogue obsahuje 2bitový signál pro směrování jednoho ze tří různých 3bitových vstupů do znaménka označeného jako out.
Příkaz case se používá k přiřazení správného vstupu k výstupu s podporou hodnoty sel. Protože sel může být 2bitový signál, bude mít dvacet 2 komba, nula až 3. Výchozí příkaz pomáhá seřadit výstup na nulu, pokud je sel 3.
jak převést řetězec na int
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
Záhlaví prohlášení o případu
Hlavička příkazu case se skládá z klíčového slova case ('casez', 'casex') následovaného výrazem case, obvykle vše na jednom řádku kódu.
Při přidávání direktiv full_case nebo parallel_case do příkazu case se jednotka měření direktivy přidá jako komentář v reálném čase za výraz case na konci hlavičky příkazu case a před jakoukoli z věcí case na následujících řádcích kódu.
Položka případu
Položka případu je, že bit, vektor nebo výraz Verilog, který je zvyklý, se porovnávají s výrazem případu.
Na rozdíl od různých programovacích jazyků na vysoké úrovni, jako je ' C ', příkaz Verilog case obsahuje implicitní příkazy přerušení.
První případová položka, která se shoduje s tímto výrazem případu, způsobí, že odpovídající příkaz případové položky je mrtvý, takže všechny ostatní případové měrné jednotky, které byly kvůli tomuto přeskočeny, podléhají příkazu případu.
Výpis položky případu
Příkaz případové položky je jeden nebo mnoho příkazů Verilog mrtvých, pokud položka případu odpovídá tomuto výrazu případu. Ne jako VHDL, Verilog věci mohou být samy o sobě výrazy.
Chcete-li změnit analýzu dokumentu s kódem Verilog, mezi klíčová slova by měly být uzavřeny příkazy o položkách případu Verilog 'začít' a 'konec' pokud má být více než jeden příkaz mrtvý pro konkrétní položku případu.
Casez
Ve Verilog existuje příkaz casez, variace příkazu case, který umožňuje 'z' a '?' s hodnotami, které mají být v průběhu porovnávání případů považovány za hodnoty „nezajímá mě to“.
'Z' a '?' měrná jednotka považována za lhostejno, zda jsou uvnitř výrazu případu nebo zda jsou uvnitř položky případu.
Když tajně píšete případové prohlášení s 'je mi to jedno', použijte příkaz casez a použijte '?' znaky namísto znaků 'z' uvnitř případu věci k účelu 'nezajímají' bity.
vypnutí vývojářského režimu androidu
Casex
Ve Verilog existuje příkaz casex, variace příkazu case, který umožňuje, aby hodnoty 'z', '?' a 'x' byly v celém srovnání považovány za hodnoty 'nezajímá mě'.
'x', 'z' a '?' měrná jednotka považována za lhostejno, zda jsou uvnitř výrazu případu nebo zda jsou uvnitř položky případu.
Kompletní prohlášení o případu
Příkaz s plným případem může být příkazem případu uvnitř, že všechny dosažitelné binární vzory výrazů velkých a malých písmen odpovídají položce případu nebo výchozímu případu.
Pokud příkaz case nezahrnuje výchozí případ a je možné vyhledat binární výraz případu, který se neshoduje s žádným z tištěných případů, příkaz případu není úplný.
Příkaz s úplným případem může být příkazem případu uvnitř příkazu, že každý dosažitelný binární, nebinární a směs binárních a nebinárních vzorů je zabalen jako položka případu uvnitř příkazu case.
Verilog si nepřeje, aby byla případová prohlášení plná buď syntézy nebo simulace lipoproteinů s vysokou hustotou, ale případová prohlášení Verilog se plní přidáním výchozího případu. VHDL si přeje, aby prohlášení o případu byla plná simulace lipoproteinů s vysokou hustotou, což obvykle vyžaduje klauzuli Associate in Nursing „ostatní“.
Paralelní případ prohlášení
Paralelní příkaz případu může být příkazem případu uvnitř, že je možné pouze přiřadit výraz případu pouze k jedné položce případu.
Pokud je možné hledat výraz případu, který se může shodovat s jednou položkou případu, jednotka měření odpovídající případu je uvedena jako překrývající se případ případu, takže příkaz případu není paralelní.
Hardwarové schéma
RTL kód je vypracován tak, aby získal hardwarové schéma, které představuje 4:1 multiplexer.
Po provedení výše uvedeného návrhu je výstup nulový, když sel je 3 a odpovídá přiřazeným vstupům pro jiné hodnoty.
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.
V příkazu case je porovnání úspěšné pouze tehdy, když každý bit výrazu odpovídá jedné z alternativ včetně 0, 1, x a z. Pokud je ve výše uvedeném příkladu některý z bitů v sel buď x nebo z, je výchozí příkaz bude proveden, protože žádná z ostatních alternativ neodpovídá. V takovém případě budou na výstupu samé nuly.
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.
Pokud má výraz případ v návrhu x a z v alternativách položky případu, výsledky se budou lišit.
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
Rozdíl mezi case a if-others
Příkaz případu se liší od if-else-if dvěma způsoby, například:
- Výrazy uvedené v an pokud-jinak block jsou obecnější, zatímco v bloku case je jeden výraz porovnáván s více položkami.