Altifigence Academy

11 / 37 · Concepto

Codificadores y prioridad: elija una entre varias peticiones

Distinga la hipótesis one-hot del codificador de los resultados valid y selección de un codificador con prioridad.

La dirección inversa al decodificador también necesita condiciones

Un decodificadorDecodificador Circuito que activa la línea de salida correspondiente a un código binario. Con enable, puede llevar todas las salidas a 0 cuando está deshabilitado. Más información convierte una dirección en una selección one-hotOne-hot Representación en la que exactamente un bit vale 1. Si también se permite que todos sean 0, la condición se denomina one-hot-or-zero. Más información; un codificador convierte la posición activa en una dirección. Un codificador one-hot simple supone una única entrada activa. Con varias entradas en 1, debe especificarse cuál se informa.

Para r3r2r1r0r_3r_2r_1r_0, demos prioridad al número mayor. Con todas las entradas a 0, fijamos valid=0 e index=00. Usar solo index=00 para detectar ausencia de petición confundiría ese caso con r0.

Entrada r3r2r1r0validindex
1---111
01--110
001-101
0001100
0000000

El guion significa el mismo resultado tanto con 0 como con 1, no permiso para aplicar X de simulación. Los patrones definidos de arriba abajo son mutuamente excluyentes.

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

Con 1011, index=11. Con 0110, r2 tiene prioridad sobre r1 y produce index=10.

Cada columna es una combinación independiente de peticiones
Ver los datos de la forma de onda
Datos de la forma de onda: cada carácter es un intervalo; un punto conserva el estado anterior; p representa un ciclo de reloj.
SeñalForma de ondaValores del bus
solicitudes2345230000 → 0001 → 0011 → 0110 → 1011 → 1000
valid01....
index2.345.00 → 01 → 10 → 11

El RTL debe mostrar la prioridad

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

Si solo request[0] vale 1, queda el index=0 predeterminado y valid=1. Los valores predeterminados cubren todos los caminos y evitan memoria en el circuito combinacional. Pruebe las 16 entradas; con valid=1, compruebe que el bit elegido está activo y todos los superiores están a 0.

Selección y equidad son problemas distintos

Si r3 permanece en 1, r0 nunca será elegida. Este circuito implementa prioridad fija. Un arbitraje equitativo necesita recordar selecciones anteriores, por lo que pasa a ser secuencial.

Práctica · Observe peticiones, dirección y grant

Elija una sola petición entre varias simultáneas

r3r2r1r0=1011; valid=1; index=11; grant=1000. Las solicitudes de número mayor tienen prioridad. Cuando valid=0, index no identifica ninguna solicitud seleccionada.

La petición inicial 1011 selecciona r3. Al apagar r3 se selecciona r1: index=01, grant=0010. Mientras r1 permanezca en 1, activar o desactivar r0 no debe alterar el resultado.

Compare «Apagar todo» con activar únicamente r0. Ambos casos dan index=00, pero valid y grant difieren. Un circuito posterior que lea solo index podría atender una petición inexistente.

grant, con 1 solo en la petición elegida, se obtiene decodificando index y valid:

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

Verifique tres invariantes: como máximo un 1 en grant; una petición real en toda posición concedida; y todos los números superiores al elegido en 0. Esta práctica no consume peticiones ni recuerda selecciones. La espera de las inferiores mientras r3 siga activa es propia de la prioridad fija.

Inténtalo tú

Indique index, valid y grant para 0101 y 0001. ¿Por qué no puede atenderse r0 en 0000 solo porque index=00?

Leer la explicación

Para 0101: index=10, valid=1 y grant=0100. Para 0001: index=00, valid=1 y grant=0001. En 0000, index=00 es solo el valor predeterminado: valid=0 y grant=0000 indican que no hay petición.

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.