01 · Punto de partida
«Si pasa esto, sale esto»
Un cliente te pide: «que suene la alarma si hay humo, o si hace calor y la puerta está cerrada». Suena razonable hasta que alguien pregunta: ¿y si hay humo y calor? ¿Y si la puerta está abierta y hay calor? El lenguaje natural deja huecos. Un circuito digital no puede tener huecos: para cada combinación posible de sus entradas, la salida es 0 o es 1.
Una escena típica. Escribís una función con tres banderas de entrada y cuatro if anidados. Seis meses después alguien descubre que cuando dos banderas valen true y la tercera false, el resultado depende de qué if se evalúa primero. La función tenía un caso sin cubrir y nadie lo notó.
La tabla de verdad es la herramienta que evita eso: enumera todas las combinaciones, una por fila, y obliga a decidir cada una. Con tres entradas son 8 filas; con N entradas, 2N. Si la tabla está completa, la función está completamente definida.
- ¿Cómo se arma una tabla y en qué orden van las filas?
- ¿Cómo se lee la función que describe, y qué son los minterms y maxterms?
- ¿Cuántas funciones distintas existen con dos entradas?
- ¿Qué se hace con las combinaciones que nunca ocurren?
- ¿Cómo se pasa de un enunciado en palabras a una tabla sin errores?
02 · Anatomía
Entradas, filas y una salida
Una tabla de verdad tiene una columna por cada entrada, una columna por cada salida y una fila por cada combinación de entradas. Las filas siempre van en orden binario: la primera es todo ceros y se cuenta hacia arriba como en el Tema 4, con la primera entrada como bit más significativo. Así el número de la fila es literalmente el número binario que forman las entradas.
| Fila | A | B | C | Y | Minterm |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | – |
| 1 | 0 | 0 | 1 | 0 | – |
| 2 | 0 | 1 | 0 | 0 | – |
| 3 | 0 | 1 | 1 | 1 | m3 |
| 4 | 1 | 0 | 0 | 0 | – |
| 5 | 1 | 0 | 1 | 1 | m5 |
| 6 | 1 | 1 | 0 | 1 | m6 |
| 7 | 1 | 1 | 1 | 1 | m7 |
Para armar el orden sin pensar: la última columna alterna 0, 1, 0, 1…; la anterior alterna de a dos; la anterior de a cuatro. Es la misma observación del Tema 4 sobre cómo cambia cada bit al contar.
| Entradas (N) | Filas (2N) | Funciones posibles (22N) | Cómo se trabaja |
|---|---|---|---|
| 1 | 2 | 4 | Constante 0, constante 1, buffer, NOT |
| 2 | 4 | 16 | Las puertas conocidas, de memoria |
| 3 | 8 | 256 | Tabla a mano, cómoda |
| 4 | 16 | 65 536 | Tabla a mano, con paciencia (Karnaugh) |
| 6 | 64 | ≈ 1,8 × 1019 | Con herramientas |
| 8 | 256 | Astronómico | Se diseña por bloques, no por tabla |
La segunda cuenta es la que sorprende: con cada entrada nueva las filas se duplican y las funciones posibles se elevan al cuadrado. Por eso las tablas son la herramienta para pocas variables; los circuitos grandes se arman combinando bloques chicos (multiplexores, sumadores, comparadores en los Temas 18 a 27), cada uno con su tabla pequeña.
03 · Minterms y maxterms
De la tabla a la función
Mirar la tabla ya es «saber» la función. Pero para construir el circuito hace falta una expresión. Hay un método mecánico que sirve siempre, sin ingenio, y tiene dos versiones simétricas.
Suma de productos: mirar los 1
Cada fila con salida 1 se convierte en un minterm: un AND de todas las entradas, donde cada entrada aparece directa si vale 1 en esa fila y negada si vale 0. Ese producto vale 1 solo en esa fila. La función es el OR de todos los minterms.
La notación Σm(3, 5, 6, 7) es la firma compacta de la función: la lista de filas donde vale 1. La fila 3 es 011, es decir A = 0, B = 1, C = 1, de ahí el minterm ~A·B·C.
Producto de sumas: mirar los 0
La versión simétrica parte de las filas con salida 0. Cada una se convierte en un maxterm: un OR de todas las entradas, donde cada entrada aparece directa si vale 0 en esa fila y negada si vale 1 (al revés que el minterm). Ese OR vale 0 solo en esa fila. La función es el AND de todos los maxterms.
Suma de productos (SOP)
Un AND por cada 1
Σm(3, 5, 6, 7). Cómoda cuando la función tiene pocos unos. Es la forma natural con AND y OR, y la que usan los mapas de Karnaugh.
Producto de sumas (POS)
Un OR por cada 0
ΠM(0, 1, 2, 4). Cómoda cuando la función tiene pocos ceros. Mismo circuito lógico, dibujado desde el otro lado.
Las dos expresiones describen la misma función: todas las filas que no son minterms son maxterms. Con N variables, (cantidad de minterms) + (cantidad de maxterms) = 2N. Una función con 6 unos y 2 ceros se escribe más corto como producto de sumas.
04 · Las puertas como tablas
Las firmas de dos entradas
Las puertas lógicas que vas a conocer en los Temas 8 a 10 no son más que tablas de dos entradas con nombre. Leerlas como cuatro bits (las salidas para 00, 01, 10 y 11) las convierte en algo que se memoriza de un vistazo:
| Puerta | 00 | 01 | 10 | 11 | Firma | Minterms | En palabras |
|---|---|---|---|---|---|---|---|
| AND | 0 | 0 | 0 | 1 | 0001 | Σm(3) | Las dos a la vez |
| OR | 0 | 1 | 1 | 1 | 0111 | Σm(1,2,3) | Al menos una |
| NAND | 1 | 1 | 1 | 0 | 1110 | Σm(0,1,2) | No las dos a la vez |
| NOR | 1 | 0 | 0 | 0 | 1000 | Σm(0) | Ninguna |
| XOR | 0 | 1 | 1 | 0 | 0110 | Σm(1,2) | Distintas |
| XNOR | 1 | 0 | 0 | 1 | 1001 | Σm(0,3) | Iguales |
NAND es exactamente lo opuesto de AND (todos los bits cambiados), igual que NOR de OR y XNOR de XOR. Y XOR tiene una firma que se ve en el espejo: 0110.
Las 16 funciones de dos entradas
Con cuatro filas hay 24 = 16 maneras de elegir las salidas. Las seis puertas de arriba son solo una parte; el resto también existe, aunque algunas parezcan triviales.
| Firma | Nombre | Expresión | Firma | Nombre | Expresión |
|---|---|---|---|---|---|
| 0000 | Constante 0 | 0 | 1000 | NOR | ~(A+B) |
| 0001 | AND | A·B | 1001 | XNOR | A⊙B |
| 0010 | A y no B | A·~B | 1010 | NOT B | ~B |
| 0011 | Buffer de A | A | 1011 | B implica A | A+~B |
| 0100 | No A y B | ~A·B | 1100 | NOT A | ~A |
| 0101 | Buffer de B | B | 1101 | A implica B | ~A+B |
| 0110 | XOR | A⊕B | 1110 | NAND | ~(A·B) |
| 0111 | OR | A+B | 1111 | Constante 1 | 1 |
Dos son constantes (ignoran las entradas), cuatro dependen de una sola (buffers y NOT) y las diez restantes dependen de las dos. No toda función útil tiene nombre propio: «A y no B» (habilitar con inhibición) aparece seguido en la práctica sin que haya una puerta comercial para ella.
05 · No importa
La X que simplifica
A veces hay filas cuya salida no importa, ya sea porque la combinación de entradas es imposible o porque el sistema nunca mira la salida en ese caso. Esas filas se marcan con X (don't care) y le dan libertad al diseñador: puede elegir 0 o 1 en cada X, según le salga más barato el circuito.
- No es un tercer valor
- El circuito real siempre da 0 o 1. La X no existe en el silicio: existe en la tabla, como permiso. Cada X es una decisión que se toma al diseñar.
- Combinaciones imposibles
- Un tanque con dos flotadores (alto y bajo) no puede tener el alto mojado y el bajo seco. Esa fila nunca ocurre, así que su salida es X.
- Códigos sin uso
- Un dígito BCD usa 10 de las 16 combinaciones de un nibble (Tema 5). Las seis restantes (1010 a 1111) nunca llegan a un decodificador de display bien alimentado: seis filas con X.
- Cuánto vale la libertad
- Con k filas en X hay 2k funciones que cumplen la especificación. Los mapas de Karnaugh (Tema 16) las aprovechan para armar grupos más grandes y, por lo tanto, circuitos más chicos.
| Dígito | D C B A | a | Dígito | D C B A | a |
|---|---|---|---|---|---|
| 0 | 0000 | 1 | 8 | 1000 | 1 |
| 1 | 0001 | 0 | 9 | 1001 | 1 |
| 2 | 0010 | 1 | – | 1010 | X |
| 3 | 0011 | 1 | – | 1011 | X |
| 4 | 0100 | 0 | – | 1100 | X |
| 5 | 0101 | 1 | – | 1101 | X |
| 6 | 0110 | 1 | – | 1110 | X |
| 7 | 0111 | 1 | – | 1111 | X |
Para el segmento «a» hay 8 unos, 2 ceros y 6 X: la función es Σm(0, 2, 3, 5, 6, 7, 8, 9) + d(10…15). Cada X que se resuelva a 1 puede completar un grupo; cada una que se resuelva a 0 puede cerrarlo. El Tema 21 usa esto para armar el decodificador de siete segmentos completo.
06 · Método
Del enunciado a la tabla
Casi nunca te dan la tabla: te dan un enunciado en palabras. El trabajo de ingeniería es traducirlo sin perder casos. Este método tiene cuatro pasos y evita la mayoría de los errores.
- 1Nombrar las entradas y fijar qué significa 1.
H = hay humo; T = temperatura alta; P = puerta cerrada. Importa la polaridad: un botón con resistencia pull-up da 0 al pulsarlo (Tema 11). Escribí «1 = pulsado» solo después de resolver eso.
- 2Dibujar las 2N filas en orden binario.
Sin mirar todavía el enunciado. Con tres entradas, ocho filas, de 000 a 111.
- 3Llenar la salida fila por fila.
Para cada fila, leé el enunciado y decidí. Cuando dudes («¿y si hay humo y calor?»), esa duda es una pregunta al cliente, no un detalle de implementación.
- 4Extraer la función y verificar.
Minterms, maxterms o simplificación. Después, probá con casos concretos del enunciado: si la tabla contradice un ejemplo, la tabla (o el enunciado) tiene un error.
| Fila | H | T | P | Alarma | Por qué |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | Nada pasa |
| 1 | 0 | 0 | 1 | 0 | Solo puerta cerrada: normal |
| 2 | 0 | 1 | 0 | 0 | Calor, pero la puerta está abierta |
| 3 | 0 | 1 | 1 | 1 | Calor con puerta cerrada |
| 4 | 1 | 0 | 0 | 1 | Humo |
| 5 | 1 | 0 | 1 | 1 | Humo |
| 6 | 1 | 1 | 0 | 1 | Humo |
| 7 | 1 | 1 | 1 | 1 | Humo (y todo lo demás) |
La función es Σm(3, 4, 5, 6, 7): cinco unos de ocho filas. Los cuatro unos de abajo (H = 1) se agrupan en un solo término, y queda Alarma = H + T·P, que es exactamente el enunciado. Fijate lo que hizo la tabla: obligó a decidir las filas 2 («calor con puerta abierta») y 1 («puerta cerrada sola»), que el enunciado original no mencionaba.
07 · Simulador
Laboratorio: inventar funciones
El simulador te deja armar cualquier tabla de dos o tres entradas, fila por fila, y te devuelve su firma, sus minterms y maxterms, su nombre si lo tiene y una expresión. Cada fila es un botón que alterna entre 0, 1 y X.
- Filas amarillas: las que valen 1, con su minterm a la derecha.
- Filas turquesa: las que valen 0, con su maxterm.
- Filas naranjas: las que valen X (no importa).
- Resultados: la firma de la función, Σm, ΠM y una expresión (simplificada si la función tiene nombre conocido).
Una tabla, muchas funciones
0110 · XOR
0110: XOR, Σm(1, 2).
Recorrido guiado (6 minutos)
- 1Mirá la tabla inicial (XOR de 2 entradas).
Firma 0110, Σm(1, 2): solo valen 1 las filas 01 y 10. Fijate en el maxterm de las filas 00 y 11: son las filas donde las dos entradas coinciden.
- 2Apretá «AND» y después «NAND».
Las dos firmas son opuestas bit a bit: 0001 y 1110. Los minterms de una son los maxterms de la otra. Lo mismo vale para OR y NOR.
- 3Pasá a 3 entradas y apretá «Mayoría».
Los unos aparecen en 011, 101, 110 y 111: Σm(3, 5, 6, 7). A la derecha de cada fila amarilla se ve el producto que la identifica.
- 4Cambiá la fila 000 de la mayoría a 1.
La función deja de tener nombre y pasa a «función a medida». Con un solo bit de la tabla cambiado, es otra función: la tabla es la definición completa.
- 5Poné una X en alguna fila.
Aparece d(…) junto a los minterms y el estado te informa cuántas formas de completar la tabla existen (2k). Con una sola X ya hay dos funciones válidas.
- 6Volvé a 2 entradas y apretá «Aleatoria» varias veces.
Salen las 16 funciones posibles. Contá cuántas tienen nombre popular (AND, OR, NAND, NOR, XOR, XNOR) y cuántas son un buffer, un NOT, una constante o una combinación como «A y no B».
Preguntas para pensar
- Con 2 entradas, programá 0001. ¿Qué puerta es? ¿Y 1001?
- Con 3 entradas, armá la paridad (XOR de 3). ¿Cuántos unos tiene? ¿En qué filas?
- Armá una tabla con solo la fila 10 en 1. ¿Tiene nombre? ¿Qué significa en palabras?
- Partiendo de AND de 3, poné X en la fila 110. ¿Cuántas funciones distintas cumplen esa tabla?
Ver respuestas sugeridas
- 0001 es AND (Σm(3)): solo el 11 da 1. 1001 es XNOR (Σm(0,3)): la salida es 1 cuando las entradas son iguales.
- Cuatro unos, en las filas 001, 010, 100 y 111: Σm(1, 2, 4, 7). Es 1 cuando la cantidad de entradas en 1 es impar.
- «A y no B» (A·~B): es 1 solo con A = 1 y B = 0. No es una puerta estándar, pero se arma con un AND y un NOT.
- Dos: con X = 0 es AND de 3, y con X = 1 es AND de 3 más la fila 110 (A·B). Una X da 21 = 2 formas de completar.
08 · Tablas en código
Generar, leer y comprobar tablas
Una tabla es un objeto que la computadora maneja con comodidad. Estos bloques la generan, extraen las dos formas canónicas, comprueban equivalencias, enumeran las 16 funciones de dos entradas y usan una tabla como test de una implementación.
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: tabla completa de cualquier función
def bits_de(i, n):
return [(i >> (n - 1 - k)) & 1 for k in range(n)]
def tabla(f, n=2, nombres="ABC"):
print(" ".join(nombres[:n]), "| Y")
mins = []
for i in range(2 ** n):
bits = bits_de(i, n)
y = int(bool(f(*bits)))
if y:
mins.append(i)
print(" ".join(map(str, bits)), "|", y, f" (fila {i})")
print(f"Y = Σm({', '.join(map(str, mins))})")
return mins
tabla(lambda a, b: a & b)
tabla(lambda a, b, c: a + b + c >= 2, n=3)
AND → Σm(3). Mayoría → Σm(3, 5, 6, 7). ¿Qué sale con a ^ b ^ c?
Paso 2: suma de productos y producto de sumas
def bits_de(i, n):
return [(i >> (n - 1 - k)) & 1 for k in range(n)]
def formas(mins, n, nombres="ABC"):
v = nombres[:n]
def minterm(i):
b = bits_de(i, n)
return "·".join(v[k] if b[k] else "~" + v[k] for k in range(n))
def maxterm(i):
b = bits_de(i, n)
return "(" + "+".join("~" + v[k] if b[k] else v[k] for k in range(n)) + ")"
ceros = [i for i in range(2 ** n) if i not in mins]
print("SOP:", " + ".join(minterm(i) for i in mins) or "0")
print("POS:", "".join(maxterm(i) for i in ceros) or "1")
print(f"Σm({', '.join(map(str, mins))}) = ΠM({', '.join(map(str, ceros))})")
formas([3, 5, 6, 7], 3)
formas([1, 2], 2)
Mayoría: cuatro productos de tres variables o cuatro sumas de tres variables. Fijate que los números de Σm y ΠM no se repiten: juntos suman las 2N filas.
Paso 3: equivalencias a prueba (De Morgan)
def bits_de(i, n):
return [(i >> (n - 1 - k)) & 1 for k in range(n)]
def equivalentes(f1, f2, n=2):
for i in range(2 ** n):
b = bits_de(i, n)
if bool(f1(*b)) != bool(f2(*b)):
print(f"DISTINTAS en la fila {i} {b}: {bool(f1(*b))} vs {bool(f2(*b))}")
return False
print("equivalentes en las", 2 ** n, "filas")
return True
equivalentes(lambda a, b: not (a and b), lambda a, b: (not a) or (not b))
equivalentes(lambda a, b: not (a or b), lambda a, b: (not a) and (not b))
equivalentes(lambda a, b: not (a and b), lambda a, b: (not a) and (not b))
Las dos primeras son las leyes de De Morgan y son equivalentes. La tercera mezcla NAND con NOR y falla en la fila 1. Demostrar una equivalencia = verificar sus 2N filas.
Paso 4: de los minterms de vuelta a una función
def bits_de(i, n):
return [(i >> (n - 1 - k)) & 1 for k in range(n)]
def desde_minterms(mins, n):
def f(*bits):
fila = sum(b << (n - 1 - k) for k, b in enumerate(bits))
return int(fila in mins)
return f
def igual(f1, f2, n):
return all(f1(*bits_de(i, n)) == f2(*bits_de(i, n)) for i in range(2 ** n))
xor = desde_minterms([1, 2], 2)
print([xor(*bits_de(i, 2)) for i in range(4)])
paridad = desde_minterms([1, 2, 4, 7], 3)
print("paridad == a^b^c:", igual(paridad, lambda a, b, c: a ^ b ^ c, 3))
print("paridad == mayoria:", igual(paridad, lambda a, b, c: int(a + b + c >= 2), 3))
Σm(1, 2) reconstruye el XOR: [0, 1, 1, 0]. La paridad coincide con a ^ b ^ c y no con la mayoría. Σm y la tabla son la misma información.
Paso 5: las 16 funciones de dos entradas
NOMBRES = {
"0000": "constante 0", "0001": "AND", "0010": "A·~B", "0011": "A",
"0100": "~A·B", "0101": "B", "0110": "XOR", "0111": "OR",
"1000": "NOR", "1001": "XNOR", "1010": "~B", "1011": "A+~B",
"1100": "~A", "1101": "~A+B", "1110": "NAND", "1111": "constante 1",
}
for codigo in range(16):
firma = format(codigo, "04b")
mins = [i for i in range(4) if firma[i] == "1"]
print(f"{codigo:>2} {firma} {NOMBRES[firma]:<12} Σm({', '.join(map(str, mins))})")
print()
for n in range(1, 7):
print(f"{n} entradas: {2 ** n:>3} filas, {2 ** (2 ** n):,} funciones")
Las 16 firmas, de 0000 a 1111, se recorren contando en binario. Con 6 entradas ya hay más funciones que granos de arena en una playa grande.
Paso 6: las X de un display BCD
ENCENDIDO = {0, 2, 3, 5, 6, 7, 8, 9} # segmento «a» encendido
NO_IMPORTA = set(range(10, 16)) # códigos BCD que nunca llegan
def seg_a(i):
if i in ENCENDIDO:
return "1"
return "X" if i in NO_IMPORTA else "0"
print("D C B A | a")
for i in range(16):
print(f"{i:04b} | {seg_a(i)}")
unos = len(ENCENDIDO)
equis = len(NO_IMPORTA)
print(f"{unos} unos, {16 - unos - equis} ceros, {equis} X")
print(f"formas de completar la tabla: 2 ** {equis} = {2 ** equis}")
8 unos, 2 ceros y 6 X: hay 64 funciones que cumplen la especificación. Karnaugh elegirá la más barata (Tema 16).
Paso 7: la tabla como test de una implementación
def bits_de(i, n):
return [(i >> (n - 1 - k)) & 1 for k in range(n)]
ESPEC = [0, 0, 0, 1, 1, 1, 1, 1] # filas H T P = 000 .. 111
def alarma(h, t, p):
if h:
return 1
return int(t and p)
def alarma_con_bug(h, t, p):
return int(h or t or p)
def verificar(impl, espec, n):
malas = [i for i in range(2 ** n) if int(impl(*bits_de(i, n))) != espec[i]]
if malas:
print(f"{impl.__name__}: FALLA en las filas {malas} {[bits_de(i, n) for i in malas]}")
else:
print(f"{impl.__name__}: cumple las {2 ** n} filas")
verificar(alarma, ESPEC, 3)
verificar(alarma_con_bug, ESPEC, 3)
La primera cumple las 8 filas. La segunda confunde «alguno de los tres» con «humo, o calor con puerta cerrada» y falla en las filas 1 y 2: sin mirar el código, la tabla encontró el bug.
09 · Analogía de programador
Tests exhaustivos y lookup tables
La tabla de verdad es una vieja conocida de quien programa, pero con una propiedad rara en el software: aquí el espacio de entradas es tan chico que se puede probar todo.
| En software | En electrónica digital |
|---|---|
| Un test parametrizado con todos los casos | La tabla de verdad: cada fila es un caso con su salida esperada |
itertools.product([0, 1], repeat=n) | Las 2N filas en orden binario |
match / switch exhaustivo (el compilador exige cubrir todo) | Tabla completa: ninguna fila sin salida |
| Una tabla de búsqueda (lookup table) | Una ROM o la LUT de una FPGA: entradas = dirección, salida = contenido |
| N banderas booleanas ⇒ 2N estados posibles | N entradas ⇒ 2N filas |
Un caso unreachable() o assert False | Una fila con X: no puede ocurrir, así que la salida no importa |
NULL en SQL (lógica de tres valores) | Ninguna: la X no es un valor, es un permiso del diseñador |
| Refactorizar y volver a correr los tests | Simplificar la expresión y comprobar que la tabla no cambió |
- 1Tabla = suite de tests completa.
Si la tabla es el contrato, probar un diseño es recorrer todas las filas, algo imposible para un programa con entradas de 32 bits pero trivial aquí.
- 2Cualquier función cabe en una memoria.
Una ROM con N líneas de dirección y 1 bit de salida es una tabla de verdad física. Las FPGA hacen casi toda su lógica así: LUT de 4 a 6 entradas programadas con las 16 a 64 salidas.
- 3X = código inalcanzable.
Marcar una fila como «no importa» es la versión de hardware de decirle al compilador que un caso no ocurre, para que optimice sin cubrirlo.
La diferencia con el software es el costo del error. En un programa, un caso sin cubrir da una excepción o un else silencioso; en un circuito, lo que no pensaste lo decide el cableado. Por eso se escribe la tabla antes de dibujar una sola puerta.
10 · Comprensión
Confusiones frecuentes
«El orden de las filas da igual»
Las filas van en orden binario por convención, y la notación Σm(1, 2) depende de eso: «fila 1» solo significa 01 si la primera entrada es el bit más significativo. Cambiar el orden sin avisarlo rompe los minterms. (Los mapas de Karnaugh usan otro orden a propósito: Gray, Tema 5.)
«X es un tercer valor, como NULL»
X es libertad del diseñador. El circuito real da 0 o 1 en esa fila; solo que vos elegís cuál. No existe una línea con «estado desconocido» en la lógica de dos niveles (la zona de voltaje entre los niveles válidos es un problema analógico, no un tercer valor lógico).
«Un minterm es una fila con 0»
Un minterm corresponde a una fila con salida 1; un maxterm, a una con salida 0. Y la polaridad de las entradas es opuesta: en el minterm entra directa la que vale 1; en el maxterm entra directa la que vale 0.
«La tabla dice cómo está construido el circuito»
La tabla dice qué hace, no cómo. Muchos circuitos distintos (con otras puertas, de otro tamaño) tienen exactamente la misma tabla; elegir el más barato es simplificar.
«Con 8 entradas armo la tabla a mano»
256 filas. A partir de cuatro o cinco variables la tabla se genera con herramientas, y los circuitos grandes se diseñan por bloques (multiplexores, sumadores) con tablas chicas cada uno.
«Una tabla con dos salidas es una función»
Son dos funciones que comparten entradas. Se extraen los minterms de cada columna por separado (aunque después se pueden optimizar juntas, compartiendo puertas: Tema 17).
«Si falta una fila, vale 0»
Una fila que no decidiste no es 0: es una decisión pendiente. En hardware el cableado igual le asigna un valor, y puede ser el peor. Completá siempre las 2N filas, con 0, 1 o X justificada.
11 · Práctica guiada
Ejercicios de tablas
Ejercicio 1: alarma de dos sensores
Suena si hay humo (H) O (temperatura alta (T) Y puerta cerrada (P)). Armá la tabla de 8 filas y sacá los minterms. Verificá con tabla().
Ver solución razonada
Y = H + T·P: las filas con H = 1 (4 a 7) más las de T·P (3 y 7): Σm(3, 4, 5, 6, 7). Cinco filas de ocho valen 1; los maxterms son 0, 1 y 2.
Ejercicio 2: paridad de 3 bits
Y = 1 si hay una cantidad impar de unos entre A, B y C. ¿Cuáles son los minterms? Verificá con desde_minterms() y a ^ b ^ c.
Ver solución razonada
Σm(1, 2, 4, 7): las filas 001, 010, 100 y 111. Cambiar una entrada siempre invierte la salida, propiedad que se aprovecha en la detección de errores (Tema 26).
Ejercicio 3: De Morgan a prueba
Verificá con equivalentes() que NOT(A OR B) = (NOT A) AND (NOT B). ¿Y que NOT(A AND B) es (NOT A) AND (NOT B)?
Ver solución razonada
La primera es equivalente (es una de las leyes de De Morgan: NOR = producto de negados). La segunda falla en la fila 01: NAND da 1 y NOR da 0. La ley correcta es NOT(A·B) = ~A + ~B, con OR. Se desarrolla en el Tema 14.
Ejercicio 4: luz de pasillo
Una luz se controla desde dos interruptores conmutados (uno en cada extremo del pasillo): cada vez que se cambia cualquiera, la luz cambia. Con ambos abajo está apagada. Armá la tabla. Después, ¿qué pasa con un tercer interruptor?
Ver solución razonada
Con ambos en 0 la luz está apagada, y cada cambio de un interruptor la invierte: queda Σm(1, 2) = XOR. Con un tercer interruptor la regla «cada cambio invierte» da la paridad de 3 (Σm(1, 2, 4, 7)), el ejercicio anterior. Por eso las instalaciones de tres puntos usan interruptores de cruce.
Ejercicio 5: tanque con X
Un tanque tiene dos flotadores: HI (alto, mojado = 1) y LO (bajo, mojado = 1). Hay que llenarlo (Y = 1) cuando está vacío, es decir con ambos secos. La combinación HI = 1, LO = 0 es físicamente imposible. Armá la tabla de 4 filas con la X y proponé la expresión más simple.
Ver solución razonada
Filas HI LO: 00 → 1 (vacío), 01 → 0, 10 → X (imposible), 11 → 0. Si la X se completa con 0, queda Y = ~HI·~LO (una puerta NOR). Si se completa con 1, queda Y = ~LO, que es un simple inversor sobre el flotador bajo. La X permitió ahorrar una puerta.
Ejercicio 6: contar libertades
Una especificación de 4 entradas tiene 5 filas en X. ¿Cuántas funciones distintas la cumplen? ¿Cuántas funciones de 4 entradas existen en total?
Ver solución razonada
Cada X se resuelve a 0 o a 1: 25 = 32 funciones cumplen la especificación. En total existen 216 = 65 536 funciones de 4 entradas. La especificación redujo el universo de candidatas de 65 536 a 32, y entre esas 32 se elige la más barata.
12 · Síntesis
Ideas para recordar
- Una tabla tiene 2N filas, en orden binario, y una salida decidida por fila.
- Con N entradas hay 22N funciones posibles: 16 con dos, 256 con tres.
- Minterm: un AND por cada fila con 1. Maxterm: un OR por cada fila con 0. Σm y ΠM describen la misma función.
- Las firmas de dos entradas se memorizan: AND 0001, OR 0111, XOR 0110, y sus opuestas NAND 1110, NOR 1000, XNOR 1001.
- X = «no importa»: libertad del diseñador, no un tercer valor; k X dan 2k formas de completar.
- Del enunciado a la tabla: nombrar entradas, dibujar las filas, llenar fila por fila y verificar con ejemplos.
- La tabla es especificación, documentación y test a la vez; solo sirve para circuitos sin memoria.
¿Listo para el Tema 7?
Podés avanzar si sos capaz de responder esto sin mirar:
- Decir cuántas filas tiene la tabla de 5 entradas.
- Escribir de memoria las firmas de AND, OR, XOR, NAND y NOR.
- Sacar los minterms de una tabla de 3 entradas con cuatro unos.
- Explicar la diferencia entre un minterm y un maxterm.
- Dar un ejemplo de combinación que justifique una X.
- Traducir «A o B pero no ambos» a una tabla y nombrar la puerta.
Ya tenés el lenguaje con el que se describe cualquier decisión. Ahora las piezas con las que se construye: en el próximo tema, empezamos por las más simples, NOT, buffer y tri-estado.