Conception combinatoire
Passer d'un besoin logique à une table de vérité, une expression simplifiée et une implémentation VHDL.
Le rôle de la logique combinatoire
Un circuit combinatoire produit une sortie qui dépend uniquement de ses entrées actuelles. Il ne mémorise rien. Dès que les entrées changent, les signaux se propagent à travers les portes, puis la sortie se stabilise après un délai fini.
Exemples classiques :
- multiplexeur ;
- décodeur ;
- comparateur ;
- additionneur ;
- calcul de flags ;
- logique de sélection d'un bus.
La méthode de conception reste la même, du petit circuit au bloc VHDL plus réaliste.
Méthode de conception
- Définir précisément les entrées et sorties.
- Écrire la table de vérité ou les cas utiles.
- Déduire une expression logique.
- Simplifier si cela clarifie le circuit.
- Écrire le VHDL.
- Simuler les cas importants.
Sur FPGA, le synthétiseur simplifie déjà beaucoup d'expressions. La simplification manuelle sert surtout à comprendre, documenter et éviter les conditions ambiguës.
Exemple : détecteur de majorité
On veut une sortie Y à 1 si au moins deux entrées parmi A, B, C valent 1.
| A | B | C | Y |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 |
Expression en somme de produits :
Y = A·B + A·C + B·CImplémentation VHDL :
o_y <= (i_a AND i_b) OR
(i_a AND i_c) OR
(i_b AND i_c);Cette expression correspond à trois conditions simples : chaque paire d'entrées peut suffire à activer la sortie.
Multiplexeur
Un multiplexeur choisit une entrée parmi plusieurs. Pour un MUX 2 vers 1 :
| SEL | Y |
|---|---|
| 0 | A |
| 1 | B |
Expression :
Y = (NOT SEL AND A) OR (SEL AND B)VHDL lisible :
o_y <= i_b when i_sel = '1' else i_a;Le style conditionnel est généralement plus clair qu'une expression de portes lorsque l'intention est une sélection.
Décodeur
Un décodeur active une sortie selon une valeur d'entrée. Exemple : décoder deux bits vers quatre lignes.
with i_sel select
o_y <= "0001" when "00",
"0010" when "01",
"0100" when "10",
"1000" when others;Ce type de bloc est fréquent pour sélectionner un registre, générer des enables ou construire une interface simple.
Conditions indifférentes
Certaines combinaisons d'entrée peuvent ne jamais arriver. On les appelle souvent don't care. Elles peuvent aider à simplifier une fonction, mais elles doivent être utilisées avec prudence.
Exemple : un chiffre BCD valide va de 0000 à 1001. Les valeurs 1010 à 1111 peuvent être considérées comme invalides si le circuit garantit qu'elles n'arrivent jamais.
Bon réflexe :
- utiliser les conditions indifférentes pour raisonner ;
- écrire un comportement VHDL défini pour toutes les valeurs ;
- vérifier en simulation ce qui se passe en cas de valeur invalide.
with i_bcd select
o_valid <= '1' when "0000" | "0001" | "0010" | "0011" | "0100" |
"0101" | "0110" | "0111" | "1000" | "1001",
'0' when others;Attention aux latches involontaires
Dans un process combinatoire, chaque sortie doit recevoir une valeur dans tous les chemins. Sinon, le synthétiseur peut inférer une mémoire non voulue.
process(all)
begin
o_y <= '0';
if i_enable = '1' then
o_y <= i_a AND i_b;
end if;
end process;La valeur par défaut rend le comportement complet et évite une dépendance implicite à l'ancienne valeur de o_y.
À retenir
- Une table de vérité transforme un besoin logique en cas vérifiables.
- Une expression de portes doit rester lisible, pas seulement minimale.
- Les multiplexeurs, décodeurs et comparateurs sont les briques combinatoires les plus fréquentes.
- En VHDL combinatoire, couvrir tous les cas évite les mémoires involontaires.
📝 Tester mes connaissances - Quiz du chapitre