11 / 37 · Concetto
Encoder e priorità: scegliere fra più richieste
Distinguere l’ipotesi one-hot dagli esiti valid e selezione di un encoder prioritario.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Anche la direzione inversa del decoder richiede condizioni
Il decoderDecoder Attiva la linea corrispondente a un codice binario. Con enable disattivato può portare tutte le uscite a 0. Approfondisci converte un indirizzo in selezioni one-hotOne-hot Rappresentazione con esattamente un bit a 1. La condizione che ammette anche tutti 0 si chiama one-hot-or-zero. Approfondisci. L'encoder converte la posizione di un ingresso attivo in un indirizzo. Un encoder one-hot ordinario presuppone però un solo ingresso acceso. Con più 1 simultanei occorre specificare quale posizione riportare.
Per diamo priorità al numero più alto. Con tutti gli ingressi a 0 poniamo valid=0 e index=00. Usare il solo index=00 per riconoscere l'assenza di richieste la confonderebbe con r0.
| Ingresso r3r2r1r0 | valid | index |
|---|---|---|
| 1--- | 1 | 11 |
| 01-- | 1 | 10 |
| 001- | 1 | 01 |
| 0001 | 1 | 00 |
| 0000 | 0 | 00 |
Il simbolo - significa stesso risultato sia con 0 sia con 1, non autorizza un ingresso X di simulazione. Gli schemi sono definiti dall'alto in modo mutuamente esclusivo.
1011 produce index=11. Con 0110, r2 precede r1 e index=10.
Mostra i dati della forma d’onda
| Segnale | Forma d’onda | Valori del bus |
|---|---|---|
| requests | 234523 | 0000 → 0001 → 0011 → 0110 → 1011 → 1000 |
| valid | 01.... | |
| index | 2.345. | 00 → 01 → 10 → 11 |
L'RTL deve rendere esplicita la priorità
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;
endSe è attivo solo request[0], index resta al valore predefinito 0 e valid=1. I valori predefiniti in ogni percorso evitano memoria nel circuito combinatorio. Provate tutti i 16 ingressi: con valid=1 il bit selezionato deve essere 1 e tutti quelli superiori devono essere 0.
Selezione ed equità sono problemi distinti
Se r3 resta sempre 1, r0 non viene mai scelto. Questo circuito realizza solo una priorità fissa. Un arbitraggio equo deve ricordare le scelte precedenti e diventa quindi sequenziale.
Laboratorio · Osservare richieste, indirizzo e grant insieme
r3r2r1r0=1011; valid=1; index=11; grant=1000. Le richieste con numero maggiore hanno priorità. Con valid=0, index non identifica una richiesta selezionata.
La richiesta iniziale 1011 seleziona r3. Spegnendo r3 si seleziona r1, con index=01 e grant=0010. Accendere o spegnere r0 non deve cambiare la selezione finché r1 resta 1.
Confrontate «Spegni tutto» con il solo r0 acceso. index=00 in entrambi i casi, ma valid e grant differiscono. Un circuito successivo che legge solo index potrebbe elaborare una richiesta inesistente.
grant attiva soltanto la richiesta scelta e si ottiene decodificando nuovamente index e valid.
Verificate tre invarianti: grant contiene al massimo un 1; nella posizione concessa esiste una richiesta; tutte le richieste con numero superiore sono 0. Il laboratorio non consuma richieste né ricorda scelte precedenti. L'attesa delle richieste basse mentre r3 resta acceso è propria della priorità fissa.
Prova tu
Calcolate index, valid e grant per 0101 e 0001. Perché con 0000 non si deve elaborare r0 solo perché index=00?
Leggi la spiegazione
0101: index=10, valid=1, grant=0100. 0001: index=00, valid=1, grant=0001. Con 0000, index=00 è solo il valore predefinito; valid=0 e grant=0000 indicano che non esiste alcuna richiesta.