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.
| A1 A0 | Y0 | Y1 | Y2 | Y3 | Ecuación de la línea activa |
|---|---|---|---|---|---|
| 00 | 1 | 0 | 0 | 0 | Y0 = ~A1·~A0 |
| 01 | 0 | 1 | 0 | 0 | Y1 = ~A1·A0 |
| 10 | 0 | 0 | 1 | 0 | Y2 = A1·~A0 |
| 11 | 0 | 0 | 0 | 1 | Y3 = 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.
| Entradas | Salidas | AND (entradas c/u) | Inversores | Chip |
|---|---|---|---|---|
| 2 | 4 | 4 (2) | 2 | ½ × 74HC139 |
| 3 | 8 | 8 (3) | 3 | 74HC138 |
| 4 | 16 | 16 (4) | 4 | 74HC154 |
| 5 | 32 | 32 (5) | 5 | 4 × 138 + 139 |
| 8 | 256 | 256 (8) | 8 | Predecodificado (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
| Chip | Qué hace | Salidas | Habilitación |
|---|---|---|---|
| 74HC139 | Doble 2 a 4 | Activas en bajo | ~E por cada mitad |
| 74HC138 | 3 a 8 | Activas en bajo | G1 (alto), ~G2A y ~G2B (bajo) |
| 74HC238 | 3 a 8 | Activas en alto | Igual que el 138 |
| 74HC154 | 4 a 16 (24 pines) | Activas en bajo | Dos habilitaciones activas en bajo |
| 74HC42 | BCD a decimal (4 a 10) | Activas en bajo | Sin habilitación |
| CD4028 | BCD a decimal (serie 4000) | Activas en alto | Sin habilitación |
| CD4514 / CD4515 | 4 a 16 con memoria (latch) en la entrada | Alto (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).
| Pin | Señal | Pin | Señal |
|---|---|---|---|
| 1 | ~Y0 | 16 | VCC |
| 2 | ~Y1 | 15 | A (LSB) |
| 3 | ~Y2 | 14 | B |
| 4 | ~Y3 | 13 | C |
| 5 | ~Y4 | 12 | D (MSB) |
| 6 | ~Y5 | 11 | ~Y9 |
| 7 | ~Y6 | 10 | ~Y8 |
| 8 | GND | 9 | ~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.
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:
| Salida | Minterms | Conexión | Chip |
|---|---|---|---|
| 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:
| Unos | Ceros | Camino | Ejemplo |
|---|---|---|---|
| 3 a 4 | 5 a 4 | NAND de los unos | Mayoría: NAND(~Y3, ~Y5, ~Y6, ~Y7) |
| 7 | 1 | AND de 1 cero = la línea sola | «Al menos uno»: F = ~Y0 (sin puertas) |
| 6 | 2 | AND de los 2 ceros | F = ~Y0 · ~Y7 |
| 1 | 7 | NAND de 1 línea = inversor | F = Y5 (invertir ~Y5) |
¿Cuándo conviene y cuándo no?
| Situación | Decodificador + puertas | Mapa de Karnaugh (Tema 16) |
|---|---|---|
| Una función sencilla (se simplifica mucho) | Gasta un chip entero para algo chico | Mejor: pocos literales |
| Varias funciones de las mismas variables | Mejor: un solo decodificador sirve a todas | Cada salida se minimiza por separado |
| Función irregular (paridad, primos) | Mejor: no se simplifica en AND-OR | Muchos términos de máximo tamaño |
| Cambios frecuentes de especificación | Mejor: se recablean líneas | Hay que rediseñar |
| Retardo mínimo | Dos 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.
| A15 A14 A13 | Línea | Rango | Dispositivo |
|---|---|---|---|
| 000 | ~Y0 | 0x0000 a 0x1FFF | ROM (8 KiB) |
| 001 | ~Y1 | 0x2000 a 0x3FFF | RAM (8 KiB) |
| 010 | ~Y2 | 0x4000 a 0x5FFF | UART |
| 011 | ~Y3 | 0x6000 a 0x7FFF | Puerto de E/S |
| 100 a 111 | ~Y4 a ~Y7 | 0x8000 a 0xFFFF | Libres |
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.
| Problema | Qué pasa | Cómo se detecta |
|---|---|---|
| Solapamiento (contención) | Dos dispositivos se seleccionan a la vez y ambos manejan el bus de datos: lecturas corruptas y chips calientes | Alguna dirección activa dos ~CS (Python, paso 4) |
| Hueco | Ninguno responde: el bus flota y devuelve basura | Alguna dirección sin ~CS activo |
| Espejo no deseado | El mismo dispositivo en varios lugares; ocupa espacio y puede pisar a otro | Comparar el rango esperado con el real |
| Glitch al cambiar la dirección | Un ~CS se activa un instante por error y puede escribir donde no debe | Osciloscopio; 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.
| Decodificador | Pasos de 16 con línea activa | Pasos sin ninguna | Solución |
|---|---|---|---|
| 74HC154 (4 a 16) | 16 | 0 | Ninguna necesaria |
| 74HC42 (BCD a decimal) | 10 | 6 (códigos 10 a 15) | Contador de décadas o reinicio al llegar a 10 |
| 74HC138 con el 4º bit como habilitación | 8 (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.
Decodificador como generador de minterms
Sumador completo con un 74HC138
Sumador completo con un decodificador.
Recorrido guiado (8 minutos)
- 1Mirá 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.
- 2Fijate 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.
- 3Apretá «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.
- 4Apretá «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.
- 5Apretá «¿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.
- 6Armá 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.
- 7Conectá 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.
- 8Recorré 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
- En el sumador completo, ¿qué líneas comparten F1 y F2 y qué ahorra eso?
- ¿Por qué «al menos uno» no necesita puerta con un decodificador de salidas activas en bajo?
- ¿Cuándo conviene un decodificador con puertas frente al mapa de Karnaugh?
- ¿Qué pasa con la función si conectás todas las líneas a F1?
Ver respuestas sugeridas
- 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.
- 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.
- 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.
- 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
| En software | En el decodificador |
|---|---|
if (dir >> 13 == 5) usar_RAM(): elegir un destino por prefijo | Decodificar A15..A13 para generar el ~CS de una región |
| Un conmutador de red que envía por un puerto según la dirección | Un 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 bus | El ~CS único: solo un dispositivo está seleccionado |
| Una tabla de consulta con las respuestas precalculadas | Un decodificador con puertas: los minterms precalculados y elegidos |
| Un 404: nadie atiende esa URL | Un 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 rutas | Los espejos de la decodificación parcial |
Un enum de estados, convertido a un bit por estado | De un contador binario a líneas «uno entre N» |
- 1Decodificador = router por prefijo.
Un prefijo de dirección elige un puerto, sin intervención de la CPU. Es ruteo hecho de puertas.
- 2Chip select = mutex.
Un solo hablante en el bus de datos: el decodificador reparte la palabra y garantiza que nadie más la tenga.
- 3BCD 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.