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