Electrónica Digital · Tema 15

Simplificación

Menos puertas, mismo resultado: agrupar minterms vecinos hasta que no quede nada que podar.

01 · Punto de partida

Cada puerta cuesta

Σm(1,2,3) directo pide 3 AND + 1 OR (+ NOTs): 6 puertas. Simplificado es un OR. Menos chips, menos retardo, menos puntos de falla. La herramienta: adyacencia (minterms que difieren en 1 bit se fusionan).

  • ¿Cuándo se fusionan dos minterms?
  • ¿Se puede reusar un minterm?
  • ¿Cómo queda la mayoría simplificada?
  • ¿Cuánto se ahorra en cada caso?

02 · Adyacencia

Difieren en 1, se va 1

A·~B + A·B = A·(~B+B) = A: B se va porque cambia. m1+m3 = ~A·B+A·B = B; m2+m3 = A·~B+A·B = A. Entonces Σm(1,2,3) = A+B (m3 usado dos veces: legal y necesario).

minterms → buscar vecinos →fusionar →repetir

03 · Tres casos

Antes y después

Ahorro por función.
FunciónDirectoMínimo
Σm(1,2,3)3 AND + 1 OR (+2 NOT)1 OR
Σm(0,1,2)3 AND + 1 OR (+2 NOT)1 NAND
Mayoría Σm(3,5,6,7)4 AND-3 + 1 OR-4 (+3 NOT)3 AND + 1 OR

Mayoría mínima: AB+AC+BC (verificar por tabla: el laboratorio lo comprueba en vivo).

04 · Reglas de poda

Lo permitido

Grupos de 1, 2, 4, 8…
Solo potencias de 2: 3 minterms no fusionan de una (se hace de a pares).
Reusar vale
Un minterm en varios grupos: m3 arma B con m1 y A con m2. Sin reuso no hay mínimo.
2 niveles
AND-OR (o NAND-NAND) es lo ideal: cada nivel suma retardo. Simplificar también es aplanar.
XOR no poda
A⊕B no tiene forma AND/OR más corta: es su propio mínimo. No todo se achica.

05 · Poda en código

Vecinos y verificación

Buscar adyacencias y comprobar mínimos por fuerza bruta.

Python en tu navegador. Pedile los vecinos de tus minterms.

def vecinos(m1, m2, n=2):
    d = m1 ^ m2
    return d != 0 and (d & (d - 1)) == 0


def adyacencias(mins, n=2):
    pares = [(a, b) for i, a in enumerate(mins) for b in mins[i+1:] if vecinos(a, b, n)]
    print(f"{mins} -> vecinos: {pares}")
    return pares


adyacencias([1, 2, 3])
adyacencias([3, 5, 6, 7], n=3)

[1,2,3] → (1,3) y (2,3): m3 con todos. Mayoría → 3 pares: (3,7), (5,7) y (6,7). ¿Por qué (3,5) no aparece?

Verificar mínimos

def check(orig, simp, n=2):
    ok = all(orig(*[(i >> (n-1-k)) & 1 for k in range(n)]) ==
             simp(*[(i >> (n-1-k)) & 1 for k in range(n)]) for i in range(2**n))
    print("minimo valido" if ok else "MAL simplificado")
    return ok


check(lambda a, b: (a, b) in [(0,1),(1,0),(1,1)], lambda a, b: a or b)
check(lambda a, b: (a, b) in [(0,0),(0,1),(1,0)], lambda a, b: (not a) or (not b))

06 · Analogía programador

DRY en silicio

  1. 1
    Fusionar = factorizar.

    Código común afuera del if: (a&&!b)||(a&&b) → a. Igualito.

  2. 2
    Reusar minterm = reutilizar test.

    Un caso que prueba dos ramas: coverage compartido, menos tests.

  3. 3
    2 niveles = flat.

    Código sin anidar de más: legible y rápido. Profundidad = latencia.

07 · Taller

Laboratorio: podar en vivo

Elegí función y mové entradas: el laboratorio evalúa original vs mínimo y cuenta el ahorro.

TALLER 15

Podadora

Σm(1,2,3) → A+B

Original1
Mínimo1
Ahorro6 → 1 puertas
EstadoIguales ✓

Σm(1,2,3) en 1,1: original 1, mínimo 1.

Preguntas para explorar

  1. Recorré las 4 filas en Σm(0,1,2). ¿Original y mínimo coinciden siempre?
  2. En mayoría con A=1,B=1,C=0: ¿original? ¿AB+AC+BC? ¿Qué términos dan 1?
  3. ¿Por qué el ahorro cuenta NOTs? ¿Qué pasa si los ignorás?
Ver respuestas sugeridas
  1. Sí: 1-1-1-0 ambos (~A+~B). El NAND verificado.
  2. 1 y 1: AB=1 (los otros 0). Un solo producto alcanza a veces.
  3. Porque existen en silicio (pines, chips): ignorarlos subestima el costo real.

08 · Comprensión

Confusiones frecuentes

«Simplificar = menos niveles siempre»

Casi: a veces el mínimo usa más niveles (multiplexores, Tema 18). Mínimo en literales ≠ mínimo en retardo.

«Agrupo 3 minterms juntos»

Solo potencias de 2 (1, 2, 4, 8): de a pares, reusando. Grupo de 3 = dos grupos de 2.

«Cada minterm una sola vez»

Al contrario: reusar es la clave (m3 en dos grupos). Sin reuso, Σm(1,2,3) no llega a A+B.

«XOR se simplifica a AND/OR»

No hay forma más corta: A⊕B es mínimo. Algunos circuitos nacen óptimos.

09 · Práctica guiada

Ejercicios de poda

Ejercicio 1: Σm(0,1,2) a mano

Fusioná (0,1) y (0,2): ¿qué se va en cada par? Escribí el resultado y verificá con check().

Ver solución razonada

(0,1): se va B → ~A. (0,2): se va A → ~B. F = ~A+~B = NAND. m0 reusado.

Ejercicio 2: mayoría mínima

Con pares (3,7), (5,7), (6,7): ¿qué producto da cada uno? Sumalos y verificá las 8 filas.

Ver solución

(3,7): BC; (5,7): AC; (6,7): AB. F = AB+AC+BC ✓ 8/8 filas.

Ejercicio 3: contar de verdad

Mayoría directa vs mínima, contando NOTs (3), ANDs y OR. ¿Puertas? ¿Chips HC?

Ver solución

Directa: 3 NOT + 4 AND-3 + 1 OR-4 (2 chips + NOTs). Mínima: 3 AND-2 + 1 OR-2 (+2 NOT si faltan): 1 HC08 + 1 HC32. Mitad de silicio.

10 · Síntesis

Ideas para recordar

  • Vecinos (1 bit) fusionan; el que cambia se va.
  • Reusar minterms es legal y necesario.
  • Σm(1,2,3) = A+B; Σm(0,1,2) = NAND; mayoría = AB+AC+BC.
  • Contar NOTs también; 2 niveles ideal.
  • XOR ya es mínimo.

Poda algebraica dominada. Ahora visual: en el próximo tema, Karnaugh.