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 :
- Une valeur unique, ex:
when "11" => - Une plage, ex:
when 5 to 10 => - Une liste de valeurs, ex:
when 1|3|5 => - Le mot-clé
others, qui correspond à toute valeur non explicitement listée.
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
- Utilisez les instructions
casepour remplacer les longues chaînesif-then-elsifpour une meilleure lisibilité. - Implémentez un chemin par défaut avec
when others =>pour gérer les valeurs inattendues. - Les multiplexeurs sont le plus proprement exprimés avec les constructs
caseen VHDL.
Continuez au tutoriel suivant pour des concepts VHDL plus avancés.
VHDL
- Exemple de procédure VHDL : incrémenter un std_logic_vector
- Comment le molybdène façonne l'industrie moderne : usages, avantages et dynamiques d'approvisionnement
- Créer des listes de chaînes en VHDL : Bonnes pratiques et exemple
- Terminer proprement une simulation de banc de test VHDL
- Implémenter un contrôleur PWM en VHDL : Conception, simulation et démo FPGA
- Générer des nombres aléatoires en VHDL : De l'uniforme à OSVVM
- Exploiter les procédures in-process pour un design FSM VHDL plus propre
- Maîtriser les fonctions VHDL : Guide pratique pour un design efficace
- Maîtriser les techniques de la rectifieuse d'outils : guide pratique