Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> VHDL

Maîtriser l'instruction Case-When en VHDL : Conception efficace de multiplexeur

L'instruction Case-When dirige un programme VHDL le long de l'un de plusieurs chemins basés sur un signal, variable ou expression. Elle offre une alternative plus propre et plus lisible aux longues chaînes if-then-elsif-else, particulièrement lors de la gestion de multiples valeurs discrètes.

De nombreux langages de programmation utilisent des constructs comme switch ou case ; en VHDL, le construct case est un incontournable pour construire des multiplexeurs et d'autres logiques de sélection.

Cet article fait partie de notre série Tutoriels VHDL de Base.

Syntaxe de base

La structure canonique d'une instruction case est :

case <expression> is
  when <choice> => -- code pour cette branche
  when <choice> => -- code pour cette branche
  ...
end case;

Le <expression> est typiquement un signal ou variable. Bien qu'un case puisse contenir de nombreuses branches when, une seule s'exécutera pendant la simulation.

Chaque <choice> peut être :

Exercice pratique : Construction d'un multiplexeur 4-vers-1

Ci-dessous se trouve le code VHDL complet qui démontre un multiplexeur 4-vers-1 implémenté avec les approches if-then-elsif et 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
  -- Stimuli pour le signal sélecteur
  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 utilisant 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;
  
  -- MUX équivalent utilisant une instruction case
  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;

Après l'exécution de la simulation dans ModelSim, la forme d'onde montre un comportement identique pour Output1 et Output2. Quand le sélecteur Sel prend une valeur indéfinie (ex: "UU"), la clause when others => sort 'X', signalant un état inconnu.

La sortie console contient l'avertissement suivant à 50 ns, indiquant une comparaison de métavaleur :

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

Points clés à retenir

Continuez au tutoriel suivant pour des concepts VHDL plus avancés.

VHDL

  1. Exemple de procédure VHDL : incrémenter un std_logic_vector
  2. Comment le molybdène façonne l'industrie moderne : usages, avantages et dynamiques d'approvisionnement
  3. Créer des listes de chaînes en VHDL : Bonnes pratiques et exemple
  4. Terminer proprement une simulation de banc de test VHDL
  5. Implémenter un contrôleur PWM en VHDL : Conception, simulation et démo FPGA
  6. Générer des nombres aléatoires en VHDL : De l'uniforme à OSVVM
  7. Exploiter les procédures in-process pour un design FSM VHDL plus propre
  8. Maîtriser les fonctions VHDL : Guide pratique pour un design efficace
  9. Maîtriser les techniques de la rectifieuse d'outils : guide pratique