01 · Punto de partida
Manual o automático, por cable
Un termostato tiene una consigna que puede venir de un potenciómetro (manual) o de un programa horario (automático). Un interruptor decide cuál de las dos manda. Eso es un multiplexor (MUX): varias entradas de datos, unas pocas entradas de selección, y una única salida que copia la entrada elegida. Con N entradas de datos hacen falta log2 N líneas de selección.
Una escena típica. Un instrumento tiene ocho sensores digitales y una sola entrada libre en el microcontrolador. O un display de cuatro dígitos con un solo decodificador de 7 segmentos. O un panel con un conmutador de fuente (manual, automático, remoto, prueba) que debe elegir cuál señal alimenta el circuito. En los tres casos, la solución es un multiplexor.
En software lo escribís sin pensar: y = datos[i], y = s ? b : a, un switch. El multiplexor es esa misma línea de código, hecha de silicio y ejecutada en nanosegundos.
- ¿Qué ecuación tiene un MUX 2:1, y de dónde sale?
- ¿Qué chips son el 4:1 y el 8:1, y cómo se crece más?
- ¿Cómo se implementa una función cualquiera con un MUX?
- ¿Qué hace la entrada enable?
- ¿Qué problema aparece al cambiar el selector?
02 · MUX 2:1
El if con patas
El multiplexor más simple tiene dos datos (D0 y D1), un selector S y una salida Y. Si S = 0 la salida es D0; si S = 1 es D1. El símbolo es un trapecio: ancho del lado de las entradas, angosto del lado de la salida.
| S | Y | Lectura |
|---|---|---|
| 0 | D0 | Selecciona la entrada 0 (manual) |
| 1 | D1 | Selecciona la entrada 1 (automático) |
- De dónde sale la ecuación
- Es la expansión de Shannon del Tema 13: f = S·f(S=1) + ~S·f(S=0). Cualquier función se puede partir según una de sus variables en dos funciones más simples, y un MUX 2:1 las junta. Por eso el MUX es la pieza natural para construir funciones.
- Con puertas
- Un inversor, dos AND y un OR: 4 puertas. Con NAND (Tema 14): 3 NAND de dos entradas más un inversor (que también es una NAND): 4 NAND. Es un circuito de tres niveles de retardo.
- Chip
- El 74HC157 trae cuatro MUX 2:1 con un selector común y una entrada de habilitación (strobe), pensado para elegir entre dos grupos de 4 bits a la vez. Existe también el 74HC158, que invierte la salida.
- Enable (habilitación)
- Una entrada extra que apaga el bloque. En el 157 la entrada de strobe es activa en bajo: con ella en 1, las salidas quedan en 0 sin importar los datos. Sirve para combinar varios MUX (sección 04) y, como toda entrada, no se deja al aire.
03 · 4:1 y 8:1
Más datos, más selectores
Con dos selectores se elige entre cuatro datos; con tres, entre ocho. Los selectores forman un número binario que es el índice de la entrada elegida, igual que el índice de un arreglo:
| S1 | S0 | Índice | Y |
|---|---|---|---|
| 0 | 0 | 0 | D0 |
| 0 | 1 | 1 | D1 |
| 1 | 0 | 2 | D2 |
| 1 | 1 | 3 | D3 |
| Chip | Qué trae | Selección | Salida |
|---|---|---|---|
| 74HC157 | 4 MUX 2:1 | 1 selector común, 1 strobe (activo en bajo) | Normal |
| 74HC158 | 4 MUX 2:1 | Igual al 157 | Invertida |
| 74HC257 | 4 MUX 2:1 | Selector común y habilitación de salida | Tri-estado |
| 74HC153 | 2 MUX 4:1 | S1, S0 comunes; una habilitación (activa en bajo) por cada MUX | Normal |
| 74HC151 | 1 MUX 8:1 | S2, S1, S0 y habilitación activa en bajo | Y y su complemento W |
| 74HC251 | 1 MUX 8:1 | Como el 151 | Tri-estado |
| 74HC4051 | MUX/DEMUX analógico 8:1 | 3 selectores | Interruptores analógicos |
| Pin | Señal | Pin | Señal |
|---|---|---|---|
| 1 | D3 | 16 | VCC |
| 2 | D2 | 15 | D4 |
| 3 | D1 | 14 | D5 |
| 4 | D0 | 13 | D6 |
| 5 | Y (salida) | 12 | D7 |
| 6 | W (~Y) | 11 | S0 (LSB) |
| 7 | ~E (habilitación, activa en bajo) | 10 | S1 |
| 8 | GND | 9 | S2 (MSB) |
04 · Crecer
Expansión y enable
Un MUX más grande se arma con MUX más chicos, de dos maneras.
- En árbol de 2:1
- Un 4:1 son tres 2:1 (dos en la primera capa, comparten S0, y uno en la segunda, con S1). Un 8:1 son siete 2:1 en tres capas. En general un MUX de N entradas son N − 1 multiplexores 2:1 y log2 N niveles.
- Con el enable
- Para pasar de 8 a 16 entradas se usan dos 74HC151. El selector más significativo (S3) habilita uno u otro: ~E1 = S3 y ~E2 = ~S3. Cuando un 151 está deshabilitado su salida Y vale 0, así que alcanza con un OR para juntar las dos salidas: Y = Y1 + Y2.
- Con salida tri-estado
- Los 74HC251 tienen salida de tres estados (Tema 7): cuando están deshabilitados quedan en alta impedancia y se pueden unir las salidas directamente al mismo cable, sin la compuerta OR.
| MUX | Selectores | Con 2:1 (árbol) | Con chips |
|---|---|---|---|
| 2:1 | 1 | 1 | ¼ de 74HC157 |
| 4:1 | 2 | 3 | ½ de 74HC153 |
| 8:1 | 3 | 7 | 1 × 74HC151 |
| 16:1 | 4 | 15 | 2 × 74HC151 + OR + 1 inversor |
| 32:1 | 5 | 31 | 4 × 74HC151 + decodificador de habilitaciones + OR de 4 |
05 · Funciones
El MUX como generador de funciones
Un MUX 8:1 con las ocho entradas de datos atadas a 0 o a 1 es una tabla de verdad física: los selectores son las variables, y cada dato es la salida de la fila correspondiente. Cualquier función de tres variables se obtiene sin pensar en puertas, solo cableando.
| S2 S1 S0 = A B C | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
|---|---|---|---|---|---|---|---|---|
| Dato | D0 = 0 | D1 = 0 | D2 = 0 | D3 = 1 | D4 = 0 | D5 = 1 | D6 = 1 | D7 = 1 |
Un truco: usar la última variable como dato
Un MUX de 2k entradas se usa también para funciones de k + 1 variables: los selectores toman las primeras k variables y las entradas de datos reciben, según el caso, 0, 1, la última variable o su complemento. Es la expansión de Shannon aplicada a la última variable.
La receta: agrupar la tabla de verdad de a pares de filas (las que difieren solo en la última variable) y mirar cada par:
| Par (C = 0, C = 1) | La salida vale… | Dato |
|---|---|---|
| (0, 0) | siempre 0 | 0 (a masa) |
| (1, 1) | siempre 1 | 1 (a VCC) |
| (0, 1) | igual a C | C |
| (1, 0) | igual a ~C | ~C (con un inversor) |
| A B | Filas | Par (C=0, C=1) | Dato |
|---|---|---|---|
| 00 | m0, m1 | (0, 0) | D0 = 0 |
| 01 | m2, m3 | (0, 1) | D1 = C |
| 10 | m4, m5 | (0, 1) | D2 = C |
| 11 | m6, m7 | (1, 1) | D3 = 1 |
Mayoría = MUX 4:1 con D = (0, C, C, 1): medio chip 74HC153 y ninguna puerta más. Y la paridad de tres variables con un 4:1 y un inversor: D = (C, ~C, ~C, C).
Un ejemplo de cuatro variables con un 8:1
La función del Tema 15, Σm(0, 1, 3, 7, 8, 9, 11, 15), con un 74HC151 y selectores A, B, C:
| A B C | Filas | Par (D=0, D=1) | Dato |
|---|---|---|---|
| 000 | m0, m1 | (1, 1) | D0 = 1 |
| 001 | m2, m3 | (0, 1) | D1 = D |
| 010 | m4, m5 | (0, 0) | D2 = 0 |
| 011 | m6, m7 | (0, 1) | D3 = D |
| 100 | m8, m9 | (1, 1) | D4 = 1 |
| 101 | m10, m11 | (0, 1) | D5 = D |
| 110 | m12, m13 | (0, 0) | D6 = 0 |
| 111 | m14, m15 | (0, 1) | D7 = D |
Un solo chip, sin inversores, para una función de cuatro variables. Con puertas, la versión mínima del Tema 15 necesitaba 5. Es la misma idea que usan las FPGA: su unidad básica es una LUT (lookup table), una memoria pequeña indexada por las entradas, que hace de «MUX con datos programables».
06 · Aplicaciones
Para qué se usa un multiplexor
- Elegir entre fuentes
- Consigna manual o automática, reloj interno o externo, dato local o remoto. Con un 74HC157 se conmutan 4 bits a la vez con un único selector.
- Compartir un recurso
- Un solo decodificador de 7 segmentos para cuatro dígitos: un MUX elige qué dígito presentar mientras otro circuito enciende el display correspondiente, a una velocidad que el ojo no percibe (multiplexado de display, Tema 21).
- Serializar un dato
- Un MUX 8:1 con un contador de 3 bits en los selectores convierte un byte en un flujo de bits: en cada ciclo sale uno distinto. Es la base de un transmisor serie. Con el bit de inicio y el de parada, una trama UART (Tema 2) es un 10:1.
- Leer muchas entradas con pocos pines
- Ocho sensores digitales, tres pines de selección y uno de lectura en lugar de ocho pines de lectura. El teclado matricial usa un principio parecido.
- Entradas analógicas
- El 74HC4051 es un multiplexor analógico de 8 canales: deja pasar una señal analógica elegida hacia un único conversor. Sus interruptores tienen una resistencia en conducción de decenas a cientos de ohmios, y no son intercambiables con un MUX digital.
- Implementar lógica
- Una función de tres o cuatro variables con un solo chip, como en la sección anterior.
| Camino | Retardo | Comentario |
|---|---|---|
| Dato → salida | ≈ 10 a 20 ns | La más rápida |
| Selector → salida | ≈ 15 a 30 ns | Pasa por más puertas internas |
| Habilitación → salida | ≈ 10 a 20 ns | Apagar o encender el MUX |
07 · Simulador
Laboratorio: sintetizar una función con un MUX
Elegí una función (de 2, 3 o 4 variables) y cuántas variables van a los selectores. El simulador calcula qué debe ir en cada entrada de datos (0, 1, una variable, su complemento, o una función de las variables restantes), dibuja el multiplexor con el camino elegido resaltado y comprueba que reproduce la función en todas las combinaciones de entrada.
- Trapecio: el multiplexor. A la izquierda, cada entrada de datos con su etiqueta (0, 1, C, ~C…) y su valor actual. La línea elegida se dibuja gruesa y amarilla.
- Variables: los botones de abajo fijan los valores de A, B, C, D. Las primeras k van a los selectores; el resto alimenta los datos.
- Selectores: la cantidad k decide el tamaño: con k = n usás una LUT pura (solo constantes); con menos selectores, algunos datos pasan a ser variables y el MUX es más chico.
De la tabla al multiplexor
Mayoría de 3 · MUX 4:1
Mayoría de 3 con un 4:1: A y B seleccionan; C va a los datos.
Recorrido guiado (7 minutos)
- 1Mirá el estado inicial: la mayoría con un 4:1.
Los datos son 0, C, C, 1. Con A = 0 y B = 0 sale D0 = 0 siempre; con A = 1 y B = 1 sale D3 = 1 siempre; en los dos casos intermedios la salida copia a C. Fijá C y recorré A y B con los botones.
- 2Subí a k = 3 (un 8:1 con constantes).
Ahora los ocho datos son 0 y 1: la columna Y de la tabla de verdad. Es una LUT pura. Todos los datos son constantes y no hacen falta inversores.
- 3Bajá a k = 1 (un 2:1).
Con un solo selector (A), cada dato es una función de B y C: con la mayoría, «B·C» (cuando A = 0) y «B+C» (cuando A = 1). Esos datos necesitan puertas: el MUX más chico traslada la complejidad a los datos.
- 4Elegí «Paridad de 3» con k = 2.
Los datos son C, ~C, ~C, C: hace falta un solo inversor. La paridad de tres variables sale de un medio 74HC153 y un inversor.
- 5Elegí «Función del Tema 15 (4 var)» con k = 3.
Datos: 1, D, 0, D, 1, D, 0, D. Una función de cuatro variables con un solo 74HC151, sin una sola compuerta. Compará con las 5 puertas de la forma mínima.
- 6Elegí «¿Es primo? (4 bits)» con k = 3.
Ahora los datos son 0, 1, D, D, 0, D, D, 0. Una función «de teoría de números» resuelta sin ecuación. Probá k = 2: aparecen datos como C, D y C·D, y alguno que ya no es ni constante ni una variable sola.
- 7Verificá la tabla completa.
La última tarjeta dice «N/N ✓» cuando el MUX reproduce la función en todas las combinaciones. Probá cambiar de función y de k varias veces: siempre debe dar ✓. Si no, la síntesis tendría un error.
Preguntas para pensar
- Con la mayoría y k = 2, ¿por qué D1 y D2 valen C y D0 y D3 son constantes?
- ¿Cuántos datos tiene un MUX con k = 3? ¿Y cuántos selectores necesita uno de 16 datos?
- ¿Qué diferencia hay entre usar las variables en los selectores y usarlas en los datos?
- ¿Por qué un MUX con todos los datos en 0 y uno en 1 funciona como un decodificador?
Ver respuestas sugeridas
- Con A = B = 0 hay a lo sumo un voto (solo C): la mayoría vale siempre 0. Con A = B = 1 ya hay dos: siempre 1. Con un solo voto fijo entre A y B, la mayoría depende de C: es C.
- Con k = 3, 8 datos. Para 16 datos hacen falta 4 selectores (24 = 16).
- Las variables de los selectores eligen una de las entradas; las de los datos viajan por la entrada elegida. Poner más variables en los datos achica el MUX pero agrega lógica en los datos.
- Porque solo la combinación de selectores que corresponde a ese dato da salida 1: el MUX «reconoce» una combinación. Es el decodificador del Tema 20 visto desde el otro lado.
08 · Multiplexores en código
Elegir, sintetizar, serializar y detectar glitches
Los bloques construyen multiplexores grandes a partir de otros chicos y verifican que se comportan como un arreglo indexado, sintetizan funciones con la receta de los pares de filas, simulan un serializador y un MUX de 16 entradas con dos 74HC151 y su enable, y reproducen el glitch del selector con un inversor lento, junto con su cura.
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: de 2:1 a 8:1, con puertas y con índice
from itertools import product
from math import log2
def mux21(d0, d1, s):
return d1 if s else d0
def mux21_puertas(d0, d1, s):
return ((1 - s) & d0) | (s & d1)
def mux41(d, s1, s0): # tres 2:1: dos comparten S0 y uno usa S1
return mux21(mux21(d[0], d[1], s0), mux21(d[2], d[3], s0), s1)
def mux81(d, s2, s1, s0):
return mux21(mux41(d[:4], s1, s0), mux41(d[4:], s1, s0), s2)
ok21 = all(mux21(a, b, s) == mux21_puertas(a, b, s) for a, b, s in product((0, 1), repeat=3))
ok41 = all(mux41(d, s1, s0) == d[2 * s1 + s0] for d in product((0, 1), repeat=4) for s1, s0 in product((0, 1), repeat=2))
ok81 = all(mux81(d, a, b, c) == d[4 * a + 2 * b + c] for d in product((0, 1), repeat=8) for a, b, c in product((0, 1), repeat=3))
print("2:1 con índice == 2:1 con puertas:", ok21)
print("4:1 hecho con tres 2:1 == d[índice]:", ok41)
print("8:1 hecho con siete 2:1 == d[índice]:", ok81)
print()
for n in (2, 4, 8, 16, 64):
print(f"{n:>2}:1 -> {n - 1:>2} multiplexores 2:1, {log2(n):.0f} niveles de retardo")
Los tres MUX se comportan como un arreglo indexado. Un MUX de N entradas son N − 1 multiplexores 2:1 y log2 N niveles: duplicar las entradas suma un solo nivel.
Paso 2: sintetizar una función con un MUX
from itertools import product
def sintetizar(unos, n, k):
vs = "ABCD"[:n]
r = n - k
por = 2 ** r
tabla = [1 if i in unos else 0 for i in range(2 ** n)]
datos = []
for s in range(2 ** k):
t = tabla[s * por:(s + 1) * por]
if not any(t):
datos.append(("0",))
elif all(t):
datos.append(("1",))
elif r == 1:
datos.append(("var", 0, t == [1, 0])) # variable restante, negada o no
else:
datos.append(("f", t))
return tabla, datos
def etiqueta(d, n, k):
vs = "ABCD"[k:n]
if d[0] in ("0", "1"):
return d[0]
if d[0] == "var":
return ("~" if d[2] else "") + vs[d[1]]
return f"f({vs})=Σm{[i for i, x in enumerate(d[1]) if x]}"
def evaluar(datos, n, k, bits):
s = int("".join(map(str, bits[:k])), 2)
rem = bits[k:]
d = datos[s]
if d[0] == "0":
return 0
if d[0] == "1":
return 1
if d[0] == "var":
return 1 - rem[d[1]] if d[2] else rem[d[1]]
return d[1][int("".join(map(str, rem)), 2)]
CASOS = {
"mayoría de 3, k=2": ([3, 5, 6, 7], 3, 2),
"paridad de 3, k=2": ([1, 2, 4, 7], 3, 2),
"mayoría de 3, k=3 (LUT)": ([3, 5, 6, 7], 3, 3),
"Tema 15 (4 var), k=3": ([0, 1, 3, 7, 8, 9, 11, 15], 4, 3),
"¿es primo?, k=3": ([2, 3, 5, 7, 11, 13], 4, 3),
"Tema 15 (4 var), k=2": ([0, 1, 3, 7, 8, 9, 11, 15], 4, 2),
}
for nombre, (unos, n, k) in CASOS.items():
tabla, datos = sintetizar(unos, n, k)
ok = all(evaluar(datos, n, k, list(b)) == tabla[int("".join(map(str, b)), 2)] for b in product((0, 1), repeat=n))
print(f"{nombre:<26} MUX {2 ** k}:1 datos = {[etiqueta(d, n, k) for d in datos]} {'ok' if ok else 'FALLA'}")
La mayoría con k = 2 da (0, C, C, 1) y la paridad (C, ~C, ~C, C); la función del Tema 15 con k = 3 da (1, D, 0, D, 1, D, 0, D). Con k = 2 los datos ya son funciones de C y D. Cada síntesis se comprueba contra la tabla en todas las filas.
Paso 3: un serializador con un MUX 8:1 y un contador
def serializar(byte, msb_primero):
if msb_primero:
d = [(byte >> (7 - i)) & 1 for i in range(8)]
else:
d = [(byte >> i) & 1 for i in range(8)]
flujo = []
for ciclo in range(8): # un contador de 3 bits maneja S2 S1 S0
flujo.append(d[ciclo]) # el MUX 8:1 elige D[ciclo]
return d, flujo
byte = 0x4B
print(f"byte = 0x{byte:02X} = {byte:08b}")
for orden in (True, False):
d, flujo = serializar(byte, orden)
print(f"{'MSB primero' if orden else 'LSB primero'}: D0..D7 = {d} salida = {''.join(map(str, flujo))}")
# una trama UART: bit de inicio, 8 datos LSB primero, bit de parada (un MUX de 10 entradas)
car = ord("A")
trama = [0] + [(car >> i) & 1 for i in range(8)] + [1]
print(f"trama de 'A' (0x{car:02X}):", "".join(map(str, trama)), "(inicio=0, 8 datos LSB primero, parada=1)")
El mismo byte sale en dos órdenes distintos según cómo se cableen los datos a las entradas. La trama UART de la «A» es un MUX de 10 entradas (inicio, 8 datos y parada) recorrido por un contador.
Paso 4: bus de 4 bits con un 74HC157 y un 16:1 con dos 74HC151
from itertools import product
def mux157(a, b, s, e_n=0):
# a y b: nibbles. Con el strobe (activo en bajo) en 1 las salidas valen 0
if e_n:
return 0
return b if s else a
def mux151(d, s, e_n=0):
y = 0 if e_n else d[s]
return y, 1 - y # salidas Y y W (= ~Y)
def mux16(d, s):
s3, s210 = s >> 3, s & 7
y1, _ = mux151(d[:8], s210, e_n=s3) # habilitado cuando S3 = 0
y2, _ = mux151(d[8:], s210, e_n=1 - s3) # habilitado cuando S3 = 1
return y1 | y2 # el deshabilitado entrega 0
a, b = 0b1010, 0b0101
print("157: S=0 ->", format(mux157(a, b, 0), "04b"), " S=1 ->", format(mux157(a, b, 1), "04b"),
" strobe=1 ->", format(mux157(a, b, 1, e_n=1), "04b"))
patrones = [[(i * 7 + k) % 2 for i in range(16)] for k in range(4)] + [[1] * 16, [0] * 16, [i >= 8 for i in range(16)]]
ok = all(mux16(list(map(int, d)), s) == int(d[s]) for d in patrones for s in range(16))
print("16:1 con dos 151, S3 en los enables y un OR:", ok)
Con el strobe en 1 todas las salidas del 157 caen a 0. El 16:1 hecho con dos 74HC151 funciona porque el chip deshabilitado entrega 0: se juntan con un OR. Con los 251 (tri-estado) alcanzaría un cable.
Paso 5: el glitch del selector, y su cura
def simular(d0, d1, sube, consenso, retardo=2, pasos=14, t_cambio=6):
if sube:
S = [0 if t < t_cambio else 1 for t in range(pasos)]
else:
S = [1 if t < t_cambio else 0 for t in range(pasos)]
nS = [1 - S[max(0, t - retardo)] for t in range(pasos)] # el inversor tarda 'retardo' pasos
Y = []
for t in range(pasos):
y = (nS[t] & d0) | (S[t] & d1)
if consenso:
y |= d0 & d1 # término de consenso del Tema 14
Y.append(y)
return S, nS, Y
for sube in (True, False):
for consenso in (False, True):
S, nS, Y = simular(1, 1, sube, consenso)
print(f"S {'sube' if sube else 'baja'}, consenso={consenso!s:<5} "
f"S={''.join(map(str, S))} ~S={''.join(map(str, nS))} Y={''.join(map(str, Y))}"
f" {'GLITCH' if 0 in Y else 'limpio'}")
Con D0 = D1 = 1 la salida debería valer 1 siempre. Cuando S baja (1 → 0), el término S·D1 se apaga enseguida pero el ~S tarda en subir por el inversor: durante dos pasos Y cae a 0. Cuando S sube no hay glitch. Con el término de consenso D0·D1 la salida queda limpia en ambos sentidos.
09 · Analogía de programador
Un switch con cables
| En software | En el multiplexor |
|---|---|
y = datos[i] (indexar un arreglo) | Un MUX: los selectores son el índice, las entradas son el arreglo |
y = s ? b : a (operador ternario) | Un MUX 2:1 |
switch (i) { case 0: ... } | Un MUX 4:1 o 8:1 |
Selección sin salto (cmov, aritmética branchless) | Los dos datos existen siempre; el selector solo decide cuál se ve |
| Una tabla de consulta (lookup table) precalculada | Un MUX con datos constantes: la tabla de verdad cableada |
Un diccionario de funciones (despacho[op]) | Datos que son variables o funciones de otras variables |
Un parámetro enable o una guarda if (en) | La entrada de habilitación del MUX |
| Serializar una estructura byte por byte | Un MUX 8:1 con un contador en los selectores |
| Cambiar un puntero a mitad de lectura: lectura «rasgada» | El glitch del selector: durante la transición, la salida es inválida |
- 1MUX =
datos[sel].Ejecutado por silicio, en un nanosegundo, sin saltos ni ramas: todas las entradas están presentes, solo se ve una.
- 2MUX 8:1 = un arreglo de 8 bits.
La función vive en los ceros y unos que cableás a las entradas, no en las puertas. Cambiar la función es recablear los datos.
- 3Enable = guarda.
Sin habilitación, el bloque no habla, igual que un
if (en)alrededor de toda la operación.
La diferencia con el software: en el hardware todas las entradas existen y se calculan a la vez; el MUX no «evita» ejecutar las otras ramas, simplemente no las mira. Por eso un MUX con datos costosos de generar los genera todos, aunque solo use uno.
10 · Comprensión
Confusiones frecuentes
«El MUX mezcla las entradas»
Elige una e ignora las demás: un camino, no un promedio. No es un mezclador (eso era el sumador analógico de otro curso).
«S0 es el selector más significativo»
El más significativo es el último (S1 en un 4:1, S2 en un 8:1). Con S1 S0 = 10 se elige D2. Invertir el orden en el cableado reordena todos los datos.
«Un MUX de N entradas necesita N selectores»
Necesita log2 N: 2 para 4 entradas, 3 para 8, 4 para 16. Los selectores son un número binario.
«Las entradas no elegidas pueden quedar al aire»
Todas las entradas CMOS se atan, incluso las que no se usan: una entrada flotante oscila, consume y puede inducir ruido en el MUX. Atalas a masa o a VCC (Tema 12).
«Enable al aire»
Una habilitación flotante apaga o enciende el MUX al azar. Si es activa en bajo (como en el 151 y el 157), se ata a masa cuando no se usa.
«Un MUX digital sirve para señales analógicas»
Un 74HC151 recibe y entrega niveles lógicos; no deja pasar un voltaje intermedio sin degradarlo. Para señales analógicas existen multiplexores analógicos (74HC4051), con interruptores y resistencia en conducción.
«El MUX sirve para todo»
Para pocas variables es excelente; con muchas, el tamaño crece exponencialmente (2k entradas). A partir de unas cinco variables conviene una ROM o un microcontrolador.
11 · Práctica guiada
Ejercicios de selección
Ejercicio 1: manual o automático
Una consigna de 4 bits puede venir de un conmutador manual (M) o de un programa (A) según una señal S. Dibujá con MUX y escribí la ecuación. ¿Qué chip usás?
Ver solución razonada
Y = ~S·M + S·A en cada bit, con D0 = M y D1 = A. Un 74HC157 (cuatro MUX 2:1 con selector común) resuelve los cuatro bits con un solo chip y cero puertas extra. El strobe va a masa.
Ejercicio 2: mayoría con un 74HC151
Armá la mayoría de 3 con un 8:1: ¿qué se conecta a cada dato? Verificá con el simulador.
Ver solución razonada
Los datos son la columna de la función: D0..D7 = 0, 0, 0, 1, 0, 1, 1, 1 (unos en los minterms 3, 5, 6, 7). Selectores: S2 = A, S1 = B, S0 = C. La salida Y es la mayoría. Ninguna puerta lógica: solo cables a masa y a VCC.
Ejercicio 3: XOR con un MUX 2:1
Implementá A⊕B con un MUX 2:1 y a lo sumo un inversor. ¿Qué va en cada pata?
Ver solución razonada
Selector = A, D0 = B, D1 = ~B: con A = 0 sale B, con A = 1 sale ~B. Es A⊕B. Se usa un MUX 2:1 y un inversor (74HC157 más un NOT del 74HC04). Con un 4:1 (selectores A y B y datos 0, 1, 1, 0) no hace falta inversor.
Ejercicio 4: ¿es primo?
Una entrada de 4 bits (A B C D) debe dar 1 si el número es primo (2, 3, 5, 7, 11, 13). Implementala con un 74HC151 usando A, B, C de selectores y D como dato.
Ver solución razonada
Pares de filas: ABC = 000 (m0, m1): (0, 0) → 0; 001 (m2, m3): (1, 1) → 1; 010 (m4, m5): (0, 1) → D; 011 (m6, m7): (0, 1) → D; 100 (m8, m9): (0, 0) → 0; 101 (m10, m11): (0, 1) → D; 110 (m12, m13): (0, 1) → D; 111 (m14, m15): (0, 0) → 0. Datos: D0..D7 = 0, 1, D, D, 0, D, D, 0. Un chip y cuatro cables a D.
Ejercicio 5: un 16:1 con dos 74HC151
Armá un MUX de 16 entradas con dos 74HC151. ¿Cómo se conectan los enables y las salidas? ¿Qué cambia con 74HC251?
Ver solución razonada
S2 S1 S0 van a los dos chips en paralelo. S3 va a ~E del primero (habilitado con S3 = 0) y, invertido, a ~E del segundo (habilitado con S3 = 1). Como el 151 deshabilitado entrega Y = 0, se juntan con un OR (74HC32). Con 74HC251 (salida de tres estados) se unen las salidas directamente, porque el deshabilitado queda en alta impedancia (Tema 7).
Ejercicio 6: serializar y el glitch
Un 74HC151 con un contador de 3 bits en los selectores serializa un byte. ¿Cuántos ciclos de reloj dura? ¿Qué entrada sale con S = 101? ¿Qué problema puede aparecer al pasar de 011 a 100?
Ver solución razonada
8 ciclos, uno por bit. Con S = 101 sale D5. Del 011 al 100 cambian los tres selectores a la vez, pero no exactamente en el mismo instante: por un momento la combinación puede ser, por ejemplo, 111 o 000, y la salida muestra D7 o D0. Ese bit espurio dura nanosegundos; se evita muestreando la salida con un flip-flop un poco después de cada cambio (Tema 28).
12 · Síntesis
Ideas para recordar
- Un multiplexor elige una entrada de datos y la copia a la salida: Y = ~S·D0 + S·D1 en 2:1; N datos necesitan log2 N selectores.
- Es la expansión de Shannon cableada: f = S·f(1) + ~S·f(0).
- Chips: 74HC157 (cuatro 2:1), 74HC153 (dos 4:1), 74HC151 (8:1). El selector más significativo es el último (S2 en el 8:1). Las habilitaciones activas en bajo se atan a masa si no se usan.
- Crecer: un MUX de N entradas son N − 1 multiplexores 2:1 en log2 N niveles; para pasar de 8 a 16 se usan dos 151 y el selector más alto como enable.
- Con constantes en los datos, un MUX 2k:1 es una tabla de verdad de k variables; con la última variable (o su complemento) en los datos, hace funciones de k + 1 variables.
- Aplicaciones: elegir fuentes, compartir recursos (display), serializar, leer muchas entradas con pocos pines, implementar lógica.
- Al cambiar el selector puede aparecer un glitch; el término de consenso D0·D1 o un flip-flop de muestreo lo evitan.
- Para muchas variables, memoria o microcontrolador: el MUX brilla hasta 8:1.
¿Listo para el Tema 19?
Podés avanzar si sos capaz de responder esto sin mirar:
- Escribir la ecuación de un MUX 2:1 y de uno 4:1.
- Decir cuántos selectores necesita un MUX de 16 entradas y qué dato se elige con S3 S2 S1 S0 = 0110.
- Implementar la mayoría de 3 con un 4:1 diciendo qué va en cada dato.
- Armar un 16:1 con dos 74HC151.
- Explicar qué le pasa a la salida si el selector cambia con D0 = D1 = 1.
- Distinguir un MUX digital de uno analógico.
Un multiplexor junta muchos caminos en uno. El camino inverso es repartir un dato entre varios destinos: en el próximo tema, demultiplexores.