Case-When Statement in VHDL meistern: Effizientes Multiplexer-Design
Das Case-When Statement lenkt ein VHDL-Programm basierend auf Signal, Variable oder Ausdruck in einen von mehreren Pfaden. Es bietet eine sauberere, lesbarere Alternative zu langen if-then-elsif-else Ketten, besonders bei vielen diskreten Werten.
Viele Sprachen nutzen switch oder case; in VHDL ist case Standard für Multiplexer und Selektionslogik.
Teil der Basic VHDL Tutorials Serie.
Grundsyntax
case <expression> is when <choice> => -- Code für Zweig when <choice> => -- Code für Zweig ... end case;
<expression> typischerweise Signal/Variable. Nur ein when Zweig führt zur Simulationszeit aus.
Jedes <choice> kann sein:
- Einzelwert:
when "11" => - Bereich:
when 5 to 10 => - Werteliste:
when 1|3|5 => othersKeyword – fängt alle nicht explizit gelisteten Werte ab.
Praxisbeispiel: 4-zu-1 Multiplexer bauen
Vollständiger VHDL-Code demonstriert 4:1 MUX mit if-then-elsif und case.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity T14_CaseWhenTb is
end entity;
architecture sim of T14_CaseWhenTb is
signal Sig1 : unsigned(7 downto 0) := x"AA";
signal Sig2 : unsigned(7 downto 0) := x"BB";
signal Sig3 : unsigned(7 downto 0) := x"CC";
signal Sig4 : unsigned(7 downto 0) := x"DD";
signal Sel : unsigned(1 downto 0) := (others => '0');
signal Output1 : unsigned(7 downto 0);
signal Output2 : unsigned(7 downto 0);
begin
process is
begin
wait for 10 ns; Sel <= Sel + 1;
wait for 10 ns; Sel <= Sel + 1;
wait for 10 ns; Sel <= Sel + 1;
wait for 10 ns; Sel <= Sel + 1;
wait for 10 ns; Sel <= "UU";
wait;
end process;
-- MUX mit if-then-else
process(Sel, Sig1, Sig2, Sig3, Sig4) is
begin
if Sel = "00" then Output1 <= Sig1;
elsif Sel = "01" then Output1 <= Sig2;
elsif Sel = "10" then Output1 <= Sig3;
elsif Sel = "11" then Output1 <= Sig4;
else Output1 <= (others => 'X');
end if;
end process;
-- Äquivalenter MUX mit case Statement
process(Sel, Sig1, Sig2, Sig3, Sig4) is
begin
case Sel is
when "00" => Output2 <= Sig1;
when "01" => Output2 <= Sig2;
when "10" => Output2 <= Sig3;
when "11" => Output2 <= Sig4;
when others => Output2 <= (others => 'X');
end case;
end process;
end architecture;
ModelSim Simulation: Output1 und Output2 verhalten sich identisch. Bei undefiniertem Sel (z. B. "UU") liefert when others => 'X' – Signal für unbekannten Zustand.
Konsolen-Warnung bei 50 ns (Metawert-Vergleich):
VSIM 2> run # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb ...
Merksätze
caseStatements ersetzen langeif-then-elsifKetten für bessere Lesbarkeit.when others =>für Default-Pfad bei unerwarteten Werten nutzen.- Multiplexer werden in VHDL am saubersten mit
caseKonstrukten ausgedrückt.
Nächstes Tutorial für fortgeschrittene VHDL-Konzepte.
VHDL
- VHDL Procedure Beispiel: Inkrementieren eines Standard Logic Vectors
- Wie Molybdän die moderne Industrie formt: Nutzung, Vorteile und Versorgungsdynamik
- String-Listen in VHDL erstellen: Best Practices & Beispiel
- VHDL-Testbench-Simulation sauber beenden
- PWM-Controller in VHDL implementieren: Design, Simulation & FPGA-Demo
- Zufallszahlen in VHDL generieren: Von Uniform zu OSVVM
- In-Prozess-Prozeduren für saubere VHDL-FSM-Entwürfe nutzen
- Impure Functions in VHDL nutzen: FSM-Lesbarkeit und Wartbarkeit steigern
- VHDL-Funktionen meistern: Praktischer Leitfaden für effizientes Design
- Schleiftechniken für Werkzeugschleifmaschinen meistern: Praktischer Leitfaden