Electrónica Digital · Tema 20

Decodificadores binarios

En el Tema 19 viste el demultiplexor como repartidor de un dato. Ahora lo mirás desde el otro lado: un número binario entra y una sola línea de salida se activa. Esa conversión de «número» a «línea» parece menor, pero es la base de cómo un procesador elige una memoria, de cómo se encienden los dígitos de un display y, escondido en cada salida, un generador de todas las funciones lógicas posibles.

≈ 55 minutos Sin materiales: solo el navegador Incluye simulador de minterms y Python

01 · Punto de partida

Cuatro chips, un bus

Un microprocesador tiene un bus de direcciones y quiere hablar con cuatro memorias que comparten los mismos cables de datos. Si todas respondieran a la vez, se pisarían (Tema 7). Hace falta un árbitro que, mirando la dirección, habilite una sola memoria por vez. Ese árbitro es un decodificador: recibe un número binario y activa exactamente una de sus líneas de salida.

Una escena típica. Armás una pequeña computadora con una ROM, una RAM, un puerto de entrada/salida y una UART. Cada uno necesita su señal de selección (~CS). Con los tres bits altos de la dirección y un 74HC138 resolvés las ocho regiones del mapa de memoria sin escribir una sola compuerta. Más tarde necesitás una función lógica de tres variables y notás que ese mismo chip, con una NAND, te la da casi gratis.

En software es el despacho por índice, if (dir >> 13 == 5) usar_RAM(), hecho en un nanosegundo y sin CPU. Pero el decodificador es además una pieza matemática: cada una de sus salidas es un minterm de las entradas.

  • ¿Qué ecuación tiene cada salida de un decodificador y cómo está hecho por dentro?
  • ¿Qué chips son (2 a 4, 3 a 8, 4 a 16, BCD a decimal) y qué hacen con los códigos inválidos?
  • ¿Cómo se implementa una función cualquiera con un decodificador?
  • ¿Qué es una decodificación parcial de direcciones y por qué crea «espejos»?
  • ¿Cómo se evita que dos dispositivos se seleccionen a la vez?

02 · El concepto

De número a línea

Un decodificador de N entradas tiene 2N salidas. Las entradas forman un número binario A; la salida de índice A es la única activa. Es lo mismo que el DEMUX del Tema 19 con el dato fijo: misma tabla, otro trabajo.

Decodificador 2:4 (lógica positiva) y 3:8: qué línea se activa.
A1 A0Y0Y1Y2Y3Ecuación de la línea activa
001000Y0 = ~A1·~A0
010100Y1 = ~A1·A0
100010Y2 = A1·~A0
110001Y3 = A1·A0
Estructura interna
Un inversor por cada entrada (para tener A y ~A) y un AND de N entradas por cada salida. Un 2:4 son 4 AND de dos entradas y 2 inversores; un 3:8, 8 AND de tres entradas y 3 inversores. Con enable, cada AND tiene una entrada más.
«Uno entre N» (one-hot)
La salida es una codificación en la que exactamente un bit vale 1 (o 0, si es activa en bajo). Es la forma más cómoda para habilitar dispositivos: no hay que interpretar nada, la línea activa es la dirección.
Lo opuesto: el codificador
Un codificador hace el camino inverso: de N líneas, una activa, saca el número binario (Tema 22). Decodificador y codificador son pares, como serializar y deserializar.
Cómo crece un decodificador con el número de entradas.
EntradasSalidasAND (entradas c/u)InversoresChip
244 (2)2½ × 74HC139
388 (3)374HC138
41616 (4)474HC154
53232 (5)54 × 138 + 139
8256256 (8)8Predecodificado (ver abajo)

Predecodificar: cómo se hacen los decodificadores grandes

Un AND de 8 entradas para cada una de las 256 salidas sería lento y grande. Los decodificadores de las memorias lo resuelven en dos etapas: dos decodificadores chicos (de 4 bits cada uno, 16 líneas cada uno) y 256 AND de solo dos entradas, una por cada par de líneas. Se usan más puertas en total pero todas con pocas entradas, que es más rápido y compacto. Es la misma idea de armar un MUX grande con MUX chicos (Tema 18).

03 · Chips

138, 139, 154, 42 y compañía

Decodificadores de la serie 74HC y la serie 4000.
ChipQué haceSalidasHabilitación
74HC139Doble 2 a 4Activas en bajo~E por cada mitad
74HC1383 a 8Activas en bajoG1 (alto), ~G2A y ~G2B (bajo)
74HC2383 a 8Activas en altoIgual que el 138
74HC1544 a 16 (24 pines)Activas en bajoDos habilitaciones activas en bajo
74HC42BCD a decimal (4 a 10)Activas en bajoSin habilitación
CD4028BCD a decimal (serie 4000)Activas en altoSin habilitación
CD4514 / CD45154 a 16 con memoria (latch) en la entradaAlto (4514) o bajo (4515)Strobe: retiene la dirección
Por qué activas en bajo
Herencia de la lógica TTL, y conveniencia: las señales de selección de chip (~CS) de casi todos los integrados son activas en bajo, así que la salida del decodificador va directa. Con salidas activas en alto (238, 4028) se necesitan inversores o se usan dispositivos activos en alto.
74HC42: el decodificador BCD
Cuatro entradas (D C B A, con D la más significativa) y diez salidas ~Y0 a ~Y9. Con los códigos inválidos 1010 a 1111 (Tema 5) ninguna salida se activa: todas valen 1. Es un decodificador con condiciones «no importa» resueltas como «todo apagado».
Las habilitaciones
Sirven para dos cosas: apagar el decodificador cuando no corresponde (por ejemplo, durante un ciclo de reloj) y para crecer combinando varios chips (Tema 19: 138 más 138 para 16 salidas).
Pines del 74HC42 (16 pines). Verificalo en la hoja de datos del fabricante.
PinSeñalPinSeñal
1~Y016VCC
2~Y115A (LSB)
3~Y214B
4~Y313C
5~Y412D (MSB)
6~Y511~Y9
7~Y610~Y8
8GND9~Y7

04 · Generador de funciones

Un decodificador es una fábrica de minterms

Cada salida de un decodificador de N entradas vale 1 exactamente en un minterm de las N variables. Eso significa que cualquier función de esas variables es el OR de algunas de sus salidas: la suma de minterms del Tema 6, sin dibujar una sola puerta AND. Se conectan al OR las salidas cuyos números son los unos de la tabla de verdad.

variables → decodificador (minterms)→ puerta que junta las líneas elegidas →función F

Con salidas activas en bajo: una NAND

El 74HC138 entrega los minterms negados (~Yi = ~mi). Por De Morgan (Tema 14), el OR de minterms es la NAND de las líneas negadas:

El sumador completo con un 74HC138 y dos NAND de cuatro entradas.
SalidaMintermsConexiónChip
SumaΣm(1, 2, 4, 7)NAND(~Y1, ~Y2, ~Y4, ~Y7)½ × 74HC20 (dos NAND de 4 entradas)
Acarreo de salidaΣm(3, 5, 6, 7)NAND(~Y3, ~Y5, ~Y6, ~Y7)la otra mitad del 74HC20

Con A B C como entradas del 138 (A y B los sumandos, C el acarreo de entrada), el sumador completo del Tema 23 sale con dos chips: un 138 y un 74HC20. Ninguna ecuación minimizada, ningún mapa: solo se leen los unos de la tabla.

Elegir entre NAND de los unos y AND de los ceros

Hay un segundo camino con las mismas líneas negadas. Si la función tiene más unos que ceros, conviene tomar los ceros: F = ~(Σ minterms de los ceros) = AND(~Y de los ceros). Se elige el camino que usa menos líneas:

Cómo elegir según la cantidad de unos (3 variables, 8 líneas).
UnosCerosCaminoEjemplo
3 a 45 a 4NAND de los unosMayoría: NAND(~Y3, ~Y5, ~Y6, ~Y7)
71AND de 1 cero = la línea sola«Al menos uno»: F = ~Y0 (sin puertas)
62AND de los 2 cerosF = ~Y0 · ~Y7
17NAND de 1 línea = inversorF = Y5 (invertir ~Y5)

¿Cuándo conviene y cuándo no?

Un decodificador con puertas frente a la suma de productos mínima.
SituaciónDecodificador + puertasMapa de Karnaugh (Tema 16)
Una función sencilla (se simplifica mucho)Gasta un chip entero para algo chicoMejor: pocos literales
Varias funciones de las mismas variablesMejor: un solo decodificador sirve a todasCada salida se minimiza por separado
Función irregular (paridad, primos)Mejor: no se simplifica en AND-ORMuchos términos de máximo tamaño
Cambios frecuentes de especificaciónMejor: se recablean líneasHay que rediseñar
Retardo mínimoDos niveles (decodificador + puerta)Dos niveles también, pero con puertas más chicas

05 · Direcciones

Decodificación de direcciones y chip select

Cada dispositivo de un sistema con procesador ocupa un rango del mapa de memoria. El decodificador mira los bits altos de la dirección y genera la señal ~CS de cada uno; los bits bajos llegan directamente a los dispositivos para elegir una posición dentro de ellos.

Un mapa de memoria de 64 KiB con un 74HC138 (decodificación completa de A15 a A13).
A15 A14 A13LíneaRangoDispositivo
000~Y00x0000 a 0x1FFFROM (8 KiB)
001~Y10x2000 a 0x3FFFRAM (8 KiB)
010~Y20x4000 a 0x5FFFUART
011~Y30x6000 a 0x7FFFPuerto de E/S
100 a 111~Y4 a ~Y70x8000 a 0xFFFFLibres

Decodificación completa y parcial

Completa
Se usan todos los bits de dirección que el dispositivo no recibe directamente. Cada posición de cada dispositivo tiene una única dirección en el mapa.
Parcial
Se ignoran algunos bits altos para ahorrar puertas. El dispositivo responde entonces a varias direcciones: aparecen espejos (mirrors) del mismo contenido. Es válido y se usa mucho, siempre que no haya otro dispositivo en la zona espejada.
Espejos, un ejemplo
Una RAM de 4 KiB (12 líneas de dirección propias) seleccionada por A15 A14 A13 = 001 aparece en 0x2000 a 0x2FFF y también en 0x3000 a 0x3FFF, porque A12 no se decodifica. Si además se decodifica A12, solo aparece una vez.
Problemas típicos de un mapa mal decodificado.
ProblemaQué pasaCómo se detecta
Solapamiento (contención)Dos dispositivos se seleccionan a la vez y ambos manejan el bus de datos: lecturas corruptas y chips calientesAlguna dirección activa dos ~CS (Python, paso 4)
HuecoNinguno responde: el bus flota y devuelve basuraAlguna dirección sin ~CS activo
Espejo no deseadoEl mismo dispositivo en varios lugares; ocupa espacio y puede pisar a otroComparar el rango esperado con el real
Glitch al cambiar la direcciónUn ~CS se activa un instante por error y puede escribir donde no debeOsciloscopio; por diseño, sincronizar con el reloj (Tema 28)

06 · Aplicaciones

Secuenciadores y otras aplicaciones

Contador + decodificador = secuenciador
Un contador binario de 3 bits que cuenta de 0 a 7, conectado a un 74HC138, enciende un LED por vez y los recorre en orden: una luz que se desplaza (la «luz del auto fantástico»). Con un contador que sube y baja, va y vuelve. Es la base de un temporizador de pasos.
Contador de décadas
Un contador BCD (0 a 9) más un 74HC42 da diez líneas que se activan en secuencia: un contador con salida decimal «uno entre diez» (el 74HC4017 trae ambos en un chip). Con un contador de 4 bits que llegue hasta 15, las seis cuentas finales dejarían todas las líneas apagadas.
Selección de un multiplexor o un display
El decodificador elige qué dígito de un display (Tema 21) o qué canal analógico se activa en cada momento, a una velocidad que el ojo no percibe.
Barrido de un teclado matricial
Un decodificador activa una fila por vez; las columnas se leen y se sabe qué tecla se pulsó. Con un codificador (Tema 22) se hace el camino inverso.
Máquinas de estados «one-hot»
En el curso siguiente vas a representar el estado de un sistema con una línea por estado. El decodificador convierte una codificación binaria compacta en esa representación.
Cuántos pasos con una línea activa en un secuenciador de 4 bits.
DecodificadorPasos de 16 con línea activaPasos sin ningunaSolución
74HC154 (4 a 16)160Ninguna necesaria
74HC42 (BCD a decimal)106 (códigos 10 a 15)Contador de décadas o reinicio al llegar a 10
74HC138 con el 4º bit como habilitación8 (mitad)8 (otra mitad)Segundo 138 con el bit invertido

07 · Simulador

Laboratorio: funciones con un decodificador

El simulador conecta un decodificador de 2, 3 o 4 entradas con salidas activas en bajo (como el 74HC139, 138 y 154) y dos puertas que juntan las líneas que vos elijas, F1 y F2. Tocá los cuadrados de la tabla para conectar o desconectar cada línea a F1 (amarillo) o F2 (turquesa). El programa calcula el tipo de puerta, cuenta chips, compara con la suma de productos mínima y verifica cada dirección.

  • Líneas ~Y: la activa (valor 0) se dibuja gruesa y amarilla. Es la dirección actual de las entradas.
  • Cuadrados F1 y F2: una línea conectada a una función suma ese minterm a la función. El simulador decide solo si conviene una NAND de los unos o un AND de los ceros.
  • Entradas: los botones de abajo fijan la dirección. La función vale 1 cuando la línea activa está conectada a ella.
SIMULADOR 20

Decodificador como generador de minterms

Sumador completo con un 74HC138

Decodificador con dos funciones conectadas Una columna de líneas de salida activas en bajo, con dos columnas de cuadrados clicables para conectarlas a las funciones F1 y F2, y a la derecha el tipo de puerta necesario para cada función. CLIC EN UN CUADRADO: CONECTAR LA LÍNEA A F1 O F2
Funciones realizadasF1 = suma · F2 = acarreo
Puertas necesarias—
Frente a suma de productos mínima—
Dirección actual—

Sumador completo con un decodificador.

Recorrido guiado (8 minutos)

  1. 1
    Mirá el sumador completo (estado inicial).

    F1 está conectada a las líneas 1, 2, 4 y 7 (la suma) y F2 a la 3, 5, 6 y 7 (el acarreo). Cada una es una NAND de 4 líneas: un 74HC20 entero, más el decodificador. Probá las direcciones: con A B C = 011 baja la línea 3 y solo F2 vale 1.

  2. 2
    Fijate en la línea 7.

    Está conectada a las dos funciones: un minterm compartido entre salidas. El decodificador lo genera una vez y sirve a las dos; con puertas separadas habría que construirlo dos veces.

  3. 3
    Apretá «Al menos uno».

    Siete líneas conectadas a F1. El simulador cambia solo de camino: en lugar de una NAND de 7 entradas, usa el cero (la línea 0) y F1 sale directo de ~Y0, sin ninguna puerta. Es la regla de elegir el camino con menos líneas.

  4. 4
    Apretá «XOR y XNOR de 2».

    Con dos entradas son dos NAND de dos líneas cada una. Compará con la columna de la derecha: una XOR con puertas también cuesta poco. Con 2 variables el decodificador no tiene ventaja.

  5. 5
    Apretá «¿Primo? y BCD válido (4 bits)».

    Seis minterms para los primos y diez para los dígitos BCD. El primero usa una NAND de seis líneas; el segundo, un AND de los seis ceros (10 a 15). La suma de productos del BCD válido se simplifica muchísimo (A3 negada o A2 y A1 negadas), y se nota en la comparación.

  6. 6
    Armá una función propia.

    Desconectá todo y tocá las líneas que quieras conectar a F1. El nombre de la función (si la reconoce) y el costo se actualizan al instante.

  7. 7
    Conectá una sola línea.

    Si la línea elegida va a F1, la función es un minterm: una NAND de una entrada (un inversor). La función vale 1 solo cuando la dirección coincide. Es exactamente el detector de dirección del Tema 17.

  8. 8
    Recorré todas las direcciones.

    Para cualquier función conectada, el estado dice «verificado»: la puerta devuelve 1 en las direcciones elegidas y 0 en las demás. Si conectaste dos funciones iguales, comparten puerta.

Preguntas para pensar

  1. En el sumador completo, ¿qué líneas comparten F1 y F2 y qué ahorra eso?
  2. ¿Por qué «al menos uno» no necesita puerta con un decodificador de salidas activas en bajo?
  3. ¿Cuándo conviene un decodificador con puertas frente al mapa de Karnaugh?
  4. ¿Qué pasa con la función si conectás todas las líneas a F1?
Ver respuestas sugeridas
  1. Comparten la línea 7 (111). El decodificador la genera una vez y se reparte, mientras que con puertas independientes haría falta un AND de tres entradas para cada función.
  2. Porque tiene un solo cero (la fila 000) y F = ~(m0) = ~Y0: la propia salida activa en bajo del decodificador ya es la función.
  3. Cuando hay varias funciones de las mismas variables, cuando la función es irregular y no se simplifica en AND-OR, o cuando la especificación cambia seguido. Para una función sencilla, el mapa gana.
  4. F1 es la constante 1: siempre alguna línea está activa, así que la NAND siempre da 1. No hace falta puerta: un cable a VCC.

08 · Decodificar en código

Minterms, costos, BCD, mapas de memoria y secuenciadores

Los bloques implementan funciones con un decodificador (eligiendo NAND de unos o AND de ceros), comparan el costo de un decodificador directo y uno predecodificado, modelan el 74HC42 con los códigos inválidos, detectan solapamientos, huecos y espejos en mapas de memoria y generan la secuencia de un contador con decodificador.

Python en tu navegador. Los bloques son editables: cambiá las funciones y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.

Paso 1: una función con un decodificador activo en bajo

def decodificador(n, addr, en=True):
    # salidas activas en bajo, como el 74HC138 y sus parientes
    return [0 if (en and i == addr) else 1 for i in range(2 ** n)]


def realizar(n, unos, addr):
    ys = decodificador(n, addr)
    ceros = [i for i in range(2 ** n) if i not in unos]
    if len(unos) <= len(ceros):
        return 1 - int(all(ys[i] for i in unos)), f"NAND de {len(unos)} líneas"
    return int(all(ys[i] for i in ceros)), f"AND de {len(ceros)} líneas"


CASOS = {
    "suma (paridad de 3)":  (3, [1, 2, 4, 7]),
    "acarreo (mayoría)":    (3, [3, 5, 6, 7]),
    "exactamente dos":      (3, [3, 5, 6]),
    "al menos uno":         (3, [1, 2, 3, 4, 5, 6, 7]),
    "un solo minterm (5)":  (3, [5]),
    "números primos":       (4, [2, 3, 5, 7, 11, 13]),
    "dígito BCD válido":    (4, list(range(10))),
}
for nombre, (n, unos) in CASOS.items():
    ok = True
    for a in range(2 ** n):
        f, metodo = realizar(n, unos, a)
        if f != int(a in unos):
            ok = False
    print(f"{nombre:<22} {metodo:<18} {'ok' if ok else 'FALLA'}")

La suma y el acarreo usan una NAND de 4 líneas; «al menos uno» y el BCD válido usan el camino de los ceros (1 línea y 6 líneas); un solo minterm es una NAND de 1 línea (un inversor). Todas verifican en todas las direcciones.

Paso 2: decodificador directo frente a predecodificado

def directo(n):
    return {"AND": 2 ** n, "entradas por AND": n, "inversores": n}


def predecodificado(n):
    a, b = n // 2, n - n // 2
    sub = (2 ** a) + (2 ** b)                       # AND de los dos subdecodificadores
    return {"AND": sub + 2 ** n, "entradas por AND": max(a, b, 2), "inversores": a + b}


print(" n  salidas   directo (AND / fan-in)   predecodificado (AND / fan-in)")
for n in range(2, 9):
    d, p = directo(n), predecodificado(n)
    print(f"{n:>2}  {2 ** n:>7}   {d['AND']:>6} / {d['entradas por AND']}              "
          f"{p['AND']:>6} / {p['entradas por AND']}")

El predecodificado usa un poco más de puertas en total, pero con entre 2 y 4 entradas cada una en lugar de n: por eso lo usan las memorias, donde la rapidez y el tamaño de cada puerta importan más que el conteo.

Paso 3: el 74HC42 y los códigos inválidos

def hc42(d, c, b, a):
    n = 8 * d + 4 * c + 2 * b + a
    return [0 if i == n else 1 for i in range(10)]      # fuera de 0..9 queda todo en 1


print("código  DCBA   línea activa")
invalidos_ok = True
for n in range(16):
    d, c, b, a = (n >> 3) & 1, (n >> 2) & 1, (n >> 1) & 1, n & 1
    ys = hc42(d, c, b, a)
    linea = ys.index(0) if 0 in ys else None
    print(f"  {n:>2}    {d}{c}{b}{a}   {'~Y' + str(linea) if linea is not None else 'ninguna (código inválido)'}")
    # detector de código inválido: A3·(A2 + A1) es 1 justo cuando no hay línea activa
    invalido = d & (c | b)
    if invalido != int(linea is None):
        invalidos_ok = False
print("detector A3·(A2+A1) coincide con «ninguna línea activa»:", invalidos_ok)

Del 0 al 9 se activa una línea; del 10 al 15 ninguna. El detector de códigos inválidos A3·(A2 + A1) (el mapa de Karnaugh de «mayor que 9») coincide con «todas las salidas en 1», con apenas dos puertas.

Paso 4: mapas de memoria: solapamientos, huecos y espejos

def seleccionados(addr, dispositivos):
    return [nombre for nombre, (mascara, valor) in dispositivos.items() if (addr & mascara) == valor]


def analizar(titulo, dispositivos):
    contencion = huecos = 0
    ejemplo = None
    for addr in range(0x10000):
        k = len(seleccionados(addr, dispositivos))
        if k > 1:
            contencion += 1
            if ejemplo is None:
                ejemplo = addr
        elif k == 0:
            huecos += 1
    print(f"{titulo}: contención en {contencion} direcciones" + (f" (primera 0x{ejemplo:04X})" if ejemplo is not None else "")
          + f", huecos en {huecos}")


bien = {"ROM": (0x8000, 0x0000), "RAM": (0xC000, 0x8000), "E/S": (0xC000, 0xC000)}
mal = {"ROM": (0x8000, 0x0000), "RAM": (0x4000, 0x4000), "E/S": (0xC000, 0xC000)}
analizar("diseño correcto", bien)
analizar("diseño con RAM mal decodificada", mal)


def espejos(mascara, valor, bits_chip):
    paso = 2 ** bits_chip
    return [a for a in range(0x10000) if (a & mascara) == valor and a % paso == 0]


print()
print("RAM de 4 KiB, A15..A13 = 001 (decodificación parcial):", [f"0x{a:04X}" for a in espejos(0xE000, 0x2000, 12)])
print("RAM de 4 KiB, A15..A12 = 0010 (decodificación completa):", [f"0x{a:04X}" for a in espejos(0xF000, 0x2000, 12)])

En el diseño correcto no hay contención ni huecos. Con la RAM decodificada solo por A14 se solapa con la ROM y con el puerto de E/S: dos dispositivos a la vez en miles de direcciones. Y decodificar A15 a A13 para un chip de 4 KiB lo duplica (espejo) en 0x2000 y 0x3000.

Paso 5: contador más decodificador = secuenciador

def una_linea(n, addr):
    return [1 if i == addr else 0 for i in range(2 ** n)]


print("barrido ascendente (contador de 3 bits + 74HC138):")
for t in range(10):
    print(f"  t={t:>2} contador={t % 8:03b}  " + "".join("●" if x else "○" for x in una_linea(3, t % 8)))

print()
print("ida y vuelta (contador ascendente/descendente):")
secuencia = list(range(8)) + list(range(6, 0, -1))
for t, pos in enumerate(secuencia):
    print(f"  t={t:>2} posición={pos}  " + "".join("●" if x else "○" for x in una_linea(3, pos)))

En cada paso del contador se enciende una sola luz, la de su índice. Con un contador ascendente-descendente la luz va y vuelve. Con un 74HC42 y un contador de 4 bits (que cuenta hasta 15) las seis últimas cuentas dejarían todo apagado.

09 · Analogía de programador

Router de direcciones

El mismo concepto, en dos mundos.
En softwareEn el decodificador
if (dir >> 13 == 5) usar_RAM(): elegir un destino por prefijoDecodificar A15..A13 para generar el ~CS de una región
Un conmutador de red que envía por un puerto según la direcciónUn decodificador: el número elige un único puerto de salida
Una codificación one-hot de un enum (1 << i)La salida del decodificador: una línea por valor
Un mutex: un solo hablante en el busEl ~CS único: solo un dispositivo está seleccionado
Una tabla de consulta con las respuestas precalculadasUn decodificador con puertas: los minterms precalculados y elegidos
Un 404: nadie atiende esa URLUn código BCD inválido: ninguna línea se activa, o un hueco en el mapa
Rutas que se solapan (dos manejadores para la misma ruta)Contención: dos ~CS activos a la vez
Alias o symlink: el mismo archivo en dos rutasLos espejos de la decodificación parcial
Un enum de estados, convertido a un bit por estadoDe un contador binario a líneas «uno entre N»
  1. 1
    Decodificador = router por prefijo.

    Un prefijo de dirección elige un puerto, sin intervención de la CPU. Es ruteo hecho de puertas.

  2. 2
    Chip select = mutex.

    Un solo hablante en el bus de datos: el decodificador reparte la palabra y garantiza que nadie más la tenga.

  3. 3
    BCD inválido = 404.

    Una dirección que no existe y nadie atiende. Decidir qué pasa en esos casos (apagar todo, señalar un error) es parte del diseño.

Una diferencia con el software: en un router los destinos pueden solaparse y se resuelve con prioridades; en el hardware, un solapamiento en el bus se resuelve con humo. El decodificador no tiene prioridad ni memoria: su única garantía es «una sola activa», y es responsabilidad del diseñador que el mapa no se pise.

10 · Comprensión

Confusiones frecuentes

«Un decodificador decodifica texto o protocolos»

Convierte un número binario en una línea activa entre N. No interpreta ASCII ni protocolos: «decodificar» se refiere a traducir un código (binario) a otro (uno entre N).

«Pueden quedar dos salidas activas»

En régimen estable, nunca: la garantía es «una sola activa». Si ves dos, revisá el enable, la dirección y las conexiones; o es un transitorio. Dos selecciones simultáneas en un bus de datos son contención.

«El 138 es un 139 más grande»

Son chips distintos: el 138 es un 3 a 8 con tres habilitaciones pensadas para crecer; el 139 son dos 2 a 4 independientes. Se elige según la necesidad.

«El 74HC42 hace algo útil con los códigos 10 a 15»

Con las entradas inválidas apaga todas las salidas. Si necesitás señalar el error, hay que detectar el código inválido con puertas (A3·(A2 + A1)).

«Con decodificación parcial no pasa nada»

Pasa: aparecen espejos. Es válido mientras la zona espejada no la use otro dispositivo; si lo hace, hay contención. Ignorar bits altos de dirección ahorra puertas, pero hay que anotarlo en el mapa.

«La salida de un decodificador activa en bajo prende un LED con un 1»

Se activa con un 0. Un LED entre VCC y la salida enciende cuando la salida baja; todos los demás quedan apagados. Cableado al revés, vas a ver siete encendidos y uno apagado.

«Un decodificador más una puerta siempre es mejor que simplificar»

Solo cuando hay varias salidas de las mismas variables, la función no se simplifica o va a cambiar. Para una función sencilla, el mapa de Karnaugh da menos puertas y ningún decodificador.

11 · Práctica guiada

Ejercicios de decodificación

Ejercicio 1: el sumador completo con un 74HC138

Implementá la suma Σm(1, 2, 4, 7) y el acarreo Σm(3, 5, 6, 7) con un 74HC138 y puertas NAND. ¿Qué chips usás y cuántos?

Ver solución razonada

Con A B C en las entradas del 138: suma = NAND(~Y1, ~Y2, ~Y4, ~Y7) y acarreo = NAND(~Y3, ~Y5, ~Y6, ~Y7). Dos NAND de 4 entradas caben en un 74HC20. Total: dos chips (74HC138 y 74HC20). La línea ~Y7 alimenta las dos NAND. Verificalo con el simulador.

Ejercicio 2: «al menos uno»

Con un 74HC138, ¿cómo se obtiene F = 1 cuando alguna de las tres entradas vale 1, sin usar ninguna puerta?

Ver solución razonada

F = 1 en las filas 1 a 7 y vale 0 solo en la 0. Entonces F = ~m0 = ~Y0: la salida ~Y0, tal cual sale del decodificador, ya es F (activa en bajo en la fila 000, 1 en todas las demás). Una puerta de menos: ninguna.

Ejercicio 3: dígito BCD válido

Detectá con puertas que un código de 4 bits es un dígito BCD válido (0 a 9). Comparalo con usar un 74HC42 más una puerta que junte sus diez salidas.

Ver solución razonada

Las filas 10 a 15 son los inválidos: inválido = A3·(A2 + A1) (por Karnaugh), así que válido = ~(A3·(A2 + A1)): un OR, un AND y una NOT (o una NAND y un OR si se arma con NAND). Con el 74HC42, hay que juntar diez líneas: un chip más una puerta de diez entradas (dos puertas): peor. Un decodificador no siempre es la mejor opción para una función que se simplifica.

Ejercicio 4: espejos

Una RAM de 2 KiB (11 líneas de dirección propias) se selecciona con A15 A14 A13 = 010 en un 74HC138. ¿Cuántas copias aparecen y dónde empiezan?

Ver solución razonada

La región de 0x4000 a 0x5FFF tiene 8 KiB y el chip solo 2 KiB: aparece 4 veces (8 / 2), porque los bits A12 y A11 no se decodifican. Los espejos empiezan en 0x4000, 0x4800, 0x5000 y 0x5800. Decodificando también A12 y A11 (con puertas adicionales o un decodificador más) quedaría una sola copia.

Ejercicio 5: contención

La ROM se selecciona con A15 = 0 y la RAM con A14 = 1 (sin mirar A15). ¿Qué direcciones activan a los dos? ¿Cómo se corrige?

Ver solución razonada

A15 = 0 y A14 = 1: las direcciones 0x4000 a 0x7FFF activan a la vez la ROM y la RAM, y ambas manejarían el bus de datos. Se corrige decodificando A15 también para la RAM (RAM = A15·~A14, o con un decodificador de A15 y A14) y dejando la ROM en A15 = 0, A14 = 0 si se quiere que ocupen regiones separadas.

Ejercicio 6: el secuenciador de 10 pasos

Un contador binario de 4 bits (0 a 15) maneja un 74HC42 que enciende diez LED en secuencia. ¿Cuántos pasos de los 16 quedan con todos los LED apagados? ¿Cómo se evita?

Ver solución razonada

6 de 16 (los códigos 10 a 15 no activan ninguna salida). Se evita reiniciando el contador cuando llega a 10 (detectado con A3·A1, que es 1 en 10, 11, 14 y 15, pero el primero que se alcanza en la cuenta es el 10) o usando un contador de décadas, que ya salta de 9 a 0 (74HC160 o el 74HC4017, con decodificador incluido).

12 · Síntesis

Ideas para recordar

  • Un decodificador convierte N bits en 2N líneas, de las que exactamente una se activa. Cada salida es un minterm de las entradas.
  • Por dentro: N inversores y 2N AND de N entradas; los grandes se hacen predecodificados (dos decodificadores chicos y AND de 2 entradas).
  • Chips: 74HC139 (dos 2 a 4), 74HC138 (3 a 8), 74HC154 (4 a 16), 74HC42 (BCD a decimal), 74HC238 (salidas activas en alto). Casi todos son activos en bajo.
  • 74HC42 con códigos inválidos 10 a 15: ninguna salida activa. El detector de inválidos es A3·(A2 + A1).
  • Función con un decodificador: NAND de las líneas de los unos (o AND de las de los ceros, lo que use menos líneas). Gana con varias salidas, funciones irregulares o especificaciones que cambian.
  • Decodificación de direcciones: los bits altos eligen el chip. Completa = una dirección por posición; parcial = espejos. Hay que evitar solapamientos (contención) y huecos.
  • Contador + decodificador = secuenciador (luz que se desplaza, contador de décadas, barrido de teclado).
  • El decodificador no tiene memoria: puede producir glitches al cambiar la dirección; se sincroniza con el reloj (Tema 28).

¿Listo para el Tema 21?

Podés avanzar si sos capaz de responder esto sin mirar:

  • Escribir la ecuación de cada salida de un decodificador 2 a 4.
  • Armar con un 74HC138 y una NAND una función de tres variables a partir de sus minterms.
  • Decir qué salida baja con A15 A14 A13 = 011 y qué rango de direcciones cubre.
  • Explicar qué es un espejo y cuándo aparece.
  • Decir qué hace un 74HC42 con el código 1100.
  • Elegir entre un decodificador con puertas y un mapa de Karnaugh para una función dada.

Ya podés convertir números en líneas. Falta mostrar los números a una persona: en el próximo tema, display de 7 segmentos, donde un decodificador (con siete funciones lógicas) transforma un dígito BCD en los segmentos que hay que encender.