Styles de codages
1. Un style trop structurel nuit à la synthèse
Décrivez un multiplexeur
MUX2 à deux entrées et à une sortie.
A l'aide de ce composant, décrivez un multiplexeur
MUX3 à trois entrées et à une sortie.
Synthétisez et notez la taille de l'implémentation.
Donnez une nouvelle architecture à
MUX3, sous forme
comportementale, et non plus
hiérarchique, cette fois-ci.
Synthétisez et comparez la surface obtenue.
Cet exemple simpliste montre que le style de codage à préférer est celui de plus
haut-niveau ou
abstrait possible.
2. Petit mais costaud
Décrivez un multiplieur
n x n vers
2 x n,
pour une valeur de
n qui vous semble compatible avec une application de votre choix.
Comment calculer la division euclidienne ?
On rappelle que ce calcul revient à trouver
q et
r tels que
a x q = b + r.
Comparer la taille d'un diviseur combinatoire à celle d'un multiplieur.
3. Une machine à états synchrone
Nous étudions notre premier circuit séquentiel (il y a des états) synchone (l'état est global).
Il s'agit d'un contrôleur de bus.
La spécification est donnée dans les deux pages web suivantes :
- Le contexte est résumé dans cette page.
- Le corrigé, avec la machine à état de Moore du contrôleur de bus, est disponible à cette adresse.
Le code du contrôleur ainsi que le script de synthèse ont déjà été écrits :
Analysez le style de codage de la machine à états finis (ou
Finite State Machine, alias
FSM).
Le script de synthèse impose une horloge à 667 MHz.
L'optimisation est faite en surface préférentiellement.
Les résultats obtenus par le synthétiseur sont consignés dans les fichiers :
bus_ctrl.area et
bus_ctrl.timing.
En laissant le choix à
pks_shell de l'encodage des états,
nous obtenons :
- une surface de 169 microns carrés et
- un chemin de critique de 1.5 - 0.02 ns
(un slack positif signifie que pks_shell a su tenir la contrainte de timing,
slack = le mou).
Cependant, avec un recodage manuel des états, on peut obtenir mieux.
Décommentez les lignes
--+ dans
bus_ctrl.vhd et relancez la synthèse.
On tombe cette fois-ci sur :
- une surface de 161 microns carrés et
- un chemin de critique de 1.5 - 0.15 ns.
Cette solution est donc préférable à tous points de vue.
Nous venons de mettre le synthétiseur en défaut.
En réalité, celui-ci choisit pas un encodage d'état particulier :
il se contente d'associer à chaque valeur du type énuméré son indice.
Cependant, notre gain n'est pas extraordinaire.
Généralement, on perd plus à vouloir faire des choix qu'à laisser le synthétiseur optimiser,
sauf si l'on a une très bonne raison.
4. Synthèse d'une RAM
Ce fichier décrit une RAM asynchrone :
N'ayant pas accès à un générateur de RAM, nous souhaitons la synthétiser.
Comment
pks_shell s'en sort-il ?
Comment en faire une ROM ?
On détaillera en particulier la question de l'initialisation.