Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> VHDL

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:

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

Nächstes Tutorial für fortgeschrittene VHDL-Konzepte.

VHDL

  1. VHDL Procedure Beispiel: Inkrementieren eines Standard Logic Vectors
  2. Wie Molybdän die moderne Industrie formt: Nutzung, Vorteile und Versorgungsdynamik
  3. String-Listen in VHDL erstellen: Best Practices & Beispiel
  4. VHDL-Testbench-Simulation sauber beenden
  5. PWM-Controller in VHDL implementieren: Design, Simulation & FPGA-Demo
  6. Zufallszahlen in VHDL generieren: Von Uniform zu OSVVM
  7. In-Prozess-Prozeduren für saubere VHDL-FSM-Entwürfe nutzen
  8. Impure Functions in VHDL nutzen: FSM-Lesbarkeit und Wartbarkeit steigern
  9. VHDL-Funktionen meistern: Praktischer Leitfaden für effizientes Design
  10. Schleiftechniken für Werkzeugschleifmaschinen meistern: Praktischer Leitfaden