11 / 37 · Concept
Encodeurs et priorité : choisir une requête parmi plusieurs
Distinguer les hypothèses de l'encodeur one-hot et les résultats valid et index d'un encodeur prioritaire.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
Le sens inverse du décodage exige aussi des conditions
Un décodeurDécodeur Circuit activant la ligne correspondant à un code binaire. Avec enable, toutes les sorties peuvent être mises à 0 lorsqu'il est désactivé. En savoir plus transforme une adresse en sélection one-hotOne-hot Représentation où exactement un bit vaut 1. Si le motif tout à zéro est aussi autorisé, on parle de one-hot-or-zero. En savoir plus. Un encodeur transforme la position d'une entrée active en adresse. Un encodeur one-hot ordinaire suppose toutefois une seule entrée active. Plusieurs entrées simultanées exigent une règle supplémentaire pour choisir la position rapportée.
Pour , donnons priorité au numéro le plus élevé. Si toutes les entrées valent 0, fixons valid=0 et index=00. L'index 00 seul ne distingue pas l'absence de requête de la requête r0.
| Entrée r3r2r1r0 | valid | index |
|---|---|---|
| 1--- | 1 | 11 |
| 01-- | 1 | 10 |
| 001- | 1 | 01 |
| 0001 | 1 | 00 |
| 0000 | 0 | 00 |
Le tiret signifie même résultat pour 0 ou 1 ; il n'autorise pas une entrée X de simulation. Les motifs de haut en bas sont mutuellement exclusifs.
1011 donne index=11. Pour 0110, r2 passe avant r1, donc index=10.
Voir les données du chronogramme
| Signal | Forme d'onde | Valeurs du bus |
|---|---|---|
| requests | 234523 | 0000 → 0001 → 0011 → 0110 → 1011 → 1000 |
| valid | 01.... | |
| index | 2.345. | 00 → 01 → 10 → 11 |
Le RTL doit rendre la priorité visible
always_comb begin
valid = |request;
index = 2'b00;
if (request[3]) index = 2'd3;
else if (request[2]) index = 2'd2;
else if (request[1]) index = 2'd1;
endSi seul request[0] vaut 1, l'index par défaut reste 0 et valid=1. Donnez des valeurs par défaut sur tous les chemins pour éviter toute mémorisation combinatoire. Testez les seize entrées : lorsque valid=1, le bit sélectionné doit être 1 et tous les bits de numéro supérieur doivent être 0.
Sélection et équité sont deux problèmes distincts
Si r3 reste à 1, r0 n'est jamais choisi. Ce circuit ne réalise qu'une priorité fixe. Un traitement équitable exige un arbitre mémorisant les sélections précédentes, donc un circuit séquentiel.
Manipulation · Observer requêtes, index et grant
r3r2r1r0=1011; valid=1; index=11; grant=1000. Les requêtes de numéro supérieur sont prioritaires. Lorsque valid=0, index ne désigne aucune requête sélectionnée.
Avec la requête initiale 1011, r3 est choisi. Désactivez r3 : r1 est choisi, index=01 et grant=0010. Tant que r1 vaut 1, activer ou désactiver r0 ne doit rien changer.
Comparez « Tout désactiver » avec r0 seul actif. Dans les deux cas index=00, mais valid et grant diffèrent. Un circuit en aval lisant seulement index peut traiter une requête inexistante.
grant, où seule la requête retenue vaut 1, est obtenu en redécodant index avec valid.
Trois invariants sont à vérifier : au plus un bit de grant vaut 1 ; ce bit correspond à une requête réelle ; toutes les requêtes de numéro supérieur valent 0. La manipulation ne consomme aucune requête et ne mémorise pas la sélection précédente. L'attente des requêtes basses lorsque r3 reste actif est une propriété de la priorité fixe.
Essayez vous-même
Donnez index, valid et grant pour 0101 puis 0001. Pourquoi ne faut-il pas traiter r0 pour 0000 sous prétexte que index=00 ?
Lire l’explication
0101 donne index=10, valid=1, grant=0100. 0001 donne index=00, valid=1, grant=0001. Pour 0000, index=00 n'est qu'une valeur par défaut : valid=0 et grant=0000 indiquent qu'il n'y a rien à traiter.