Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> VHDL

De Case-When-statement in VHDL onder de knie krijgen: efficiënte multiplexer-ontwerpen

De Case-When-statement stuurt een VHDL-programma langs een van meerdere paden gebaseerd op een signaal, variabele of expressie. Het biedt een schonere, leesbaardere alternatief voor lange if-then-elsif-else-ketens, met name bij het afhandelen van meerdere discrete waarden.

Veel programmeertalen gebruiken constructies als switch of case; in VHDL is de case-construct een vast onderdeel voor het bouwen van multiplexers en andere selectielogica.

Dit artikel is onderdeel van onze Basic VHDL Tutorials-reeks.

Basis-syntax

De canonische structuur van een case-statement is:

case <expression> is when <choice> => -- code voor deze tak when <choice> => -- code voor deze tak ... end case;

De <expression> is typisch een signaal of variabele. Hoewel een case veel when-takken kan bevatten, zal er tijdens simulatie slechts één uitgevoerd worden.

Elke <choice> kan zijn:

  • Een enkele waarde, bijv. when "11" =>
  • Een bereik, bijv. when 5 to 10 =>
  • Een lijst van waarden, bijv. when 1|3|5 =>
  • Het others-sleutelwoord, dat matcht met elke waarde die niet expliciet is opgesomd.

Praktische oefening: Een 4-naar-1 multiplexer bouwen

Hieronder staat de complete VHDL-code die een 4-naar-1 multiplexer demonstreert geïmplementeerd met zowel if-then-elsif als case benaderingen.

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 -- Stimuli voor het selectiesignaal 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 met 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; -- Equivalente MUX met een 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; 

Na het draaien van de simulatie in ModelSim toont de golfform identiek gedrag voor Output1 en Output2. Wanneer de selector Sel een ongedefinieerde waarde aanneemt (bijv. "UU"), geeft de when others =>-clausule 'X' uit, wat een onbekende toestand signaleert.

De console-output bevat de volgende waarschuwing op 50 ns, die een metavalue-vergelijking aangeeft:

VSIM 2> run # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb

Belangrijkste opmerkingen

  • Gebruik case-statements om lange if-then-elsif-ketens te vervangen voor betere leesbaarheid.
  • Implementeer een standaardpad met when others => om onverwachte waarden af te vangen.
  • Multiplexers worden het meest netjes uitgedrukt met case-constructen in VHDL.

Ga door naar de volgende tutorial voor meer geavanceerde VHDL-concepten.

VHDL

  1. Freesmes Slijper Technieken Beheersen: Een Praktische Gids
  2. Hoe molybdeen de moderne industrie vormt: toepassingen, voordelen en leveringsdynamiek
  3. VHDL Procedure Voorbeeld: Een Standard Logic Vector Incrementeren
  4. Dynamische string-lijsten in VHDL: Best Practices & Voorbeeld
  5. Een VHDL-testbench netjes beëindigen: methoden en best practices
  6. Een PWM-controller implementeren in VHDL: Ontwerp, Simulatie en FPGA-demo
  7. Willekeurige getallen genereren in VHDL: Van Uniform naar OSVVM
  8. In-process procedures benutten voor schonere VHDL FSM-ontwerpen
  9. Impure functies in VHDL gebruiken: FSM-leesbaarheid en onderhoudbaarheid verbeteren
  10. VHDL-functies onder de knie krijgen: een praktische gids voor efficiënt ontwerp
  11. Een eindige-toestandsmachine in VHDL ontwerpen: een praktisch verkeerslichtvoorbeeld