Dans la partie
précédente, on a vu différentes approches et
les conséquences. On
doit toujours avoir un raisonnement général pour obtenir des solutions
réutilisables. Verilog ne déroge pas à ce principe.
A nous d'exploiter.
Soit l’exercice suivant :
Une association est constituée
de quatre membres, dont un président. Face à
un problème épineux, ils décident de
voter à bulletin secret. Etant donné leur
nombre, il est décidé qu'en cas d'égalité
des suffrages, le vote du président (A ou L.S.B.)
sera prépondérant et comptera double, les
autres membres (B, C et D ou M.S.B.) intervenant pour une
seule voix chacun.
L'un des membres, étant électronicien,
leur propose alors une machine à voter de sa fabrication,
comportant :
- en entrée : quatre
boîtiers contenant chacun un interrupteur à disposition
des intéressés (ouvert ? état "0"= NON;
fermé ? état "1"= OUI),
- en sortie : une lampe L s'allume seulement si la
majorité des OUI est obtenue (lampe L allumée
= 1).
En établissant la table de vérité,
on obtient, pour la sortie L, l’équation sans
simplification suivante :
Doit-on la simplifier ?
- oui pour diminuer le temps de frappe du programme,
- pas nécessaire, la solution ne sera pas meilleure,
- non, ce serait gaspiller son temps.
Si on la programme telle quelle :
module MachineAVoter (A, B, C, D, L) ;
input A, B, C, D ;
output L ;
assign L =
(A & B & !C & !D) |
(A & !B & C & !D) |
(A & B & C & !D) |
(A & !B & !C & D) |
(A & B & !C & D) |
(A & !B & C & D) | (
!A & B & C & D) |
(A & B & C & D) ;
endmodule
On peut aussi prendre du recul avec le problème. La lampe s’allumera lorsque le président
est favorable avec au moins un des autres membres ou alors
que les 3 autres membres sont favorables. Ce qui se traduit
par l’équation suivante :
L = A . (B + C + D) + B .
C . D
On obtient alors :
module MachineAVoter (A, B, C, D, L) ;
input A, B, C, D ;
output L ;
assign L = A & (B | C | D) | (B
& C & D) ;
endmodule
On peut mettre le président
à part des autres électeurs. On distingue le président
et les membres. Ainsi une solution utilisant les opérateurs
unaires peut se montrer très efficace :
module MachineAVoter (President, Membres,
L) ;
input President ;
input [2 : 0] Membres ;
output L ;
assign L = (President & |Membres)
| &Membres ;
endmodule