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.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
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 , 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 r3r2r1r0 | valid | index |
|---|---|---|
| 1--- | 1 | 11 |
| 01-- | 1 | 10 |
| 001- | 1 | 01 |
| 0001 | 1 | 00 |
| 0000 | 0 | 00 |
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.
Con 1011, index=11. Con 0110, r2 tiene prioridad sobre r1 y produce index=10.
Ver los datos de la forma de onda
| Señal | Forma de onda | Valores del bus |
|---|---|---|
| solicitudes | 234523 | 0000 → 0001 → 0011 → 0110 → 1011 → 1000 |
| valid | 01.... | |
| index | 2.345. | 00 → 01 → 10 → 11 |
El RTL debe mostrar la prioridad
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 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
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:
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.