Altifigence Academy

11 / 37 · Concetto

Encoder e priorità: scegliere fra più richieste

Distinguere l’ipotesi one-hot dagli esiti valid e selezione di un encoder prioritario.

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 r3r2r1r0r_3r_2r_1r_0 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 r3r2r1r0validindex
1---111
01--110
001-101
0001100
0000000

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.

valid=r3+r2+r1+r0,index1=r3+r2,index0=r3+r2‾r1valid=r_3+r_2+r_1+r_0,\quad index_1=r_3+r_2,\quad index_0=r_3+\overline{r_2}r_1

1011 produce index=11. Con 0110, r2 precede r1 e index=10.

Ogni colonna è una combinazione indipendente di richieste
Mostra i dati della forma d’onda
Dati della forma d’onda: ogni carattere è un intervallo; il punto mantiene lo stato precedente; p è un ciclo di clock.
SegnaleForma d’ondaValori del bus
requests2345230000 → 0001 → 0011 → 0110 → 1011 → 1000
valid01....
index2.345.00 → 01 → 10 → 11

L'RTL deve rendere esplicita la priorità

SystemVerilog
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;
end

Se è 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

Selezionare una sola richiesta fra quelle simultanee

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.

granti=valid∧(index=i)grant_i=valid\land(index=i)

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.

La scelta vale per questo browser. Puoi modificarla in qualsiasi momento dal piè di pagina.