Electrónica Digital · Tema 31

Proyecto: calculadora

La cerradura comparaba; la calculadora calcula. Dos dígitos de 0 a 9 entran por interruptores, el circuito los suma y el resultado, de 0 a 18, aparece en un display de dos cifras. Parece un sumador con un display pegado, pero el sumador piensa en base 16 y el display en base 10: unir los dos mundos es el corazón del proyecto. Con él se junta casi todo el curso: sumadores en cascada, BCD, siete segmentos, supresión de ceros y un circuito que avisa cuando le dan datos que no puede procesar.

≈ 75 minutos Se puede armar en un protoboard Incluye simulador con display y Python

01 · Especificación

Dos dígitos, un resultado

Igual que en la cerradura, primero el contrato. La calculadora:

  • Entradas: dos dígitos decimales A y B de 0 a 9, cada uno en cuatro interruptores (código BCD, Tema 5). Lo ideal serían dos ruedas BCD de 0 a 9; con un DIP de 4 posiciones por dígito, pueden llegar combinaciones que no son dígitos (10 a 15).
  • Salida: la suma A + B, de 0 a 18, en dos dígitos de siete segmentos (Tema 21). Sin ceros a la izquierda: 7 + 2 se ve «9», no «09».
  • Operandos inválidos: si un dígito vale más de 9, el display se apaga y un LED rojo avisa. Nunca se muestra un número equivocado sin avisar.
  • Alimentación: 5 V, serie 74HC, desacople y pull-downs como en el Tema 29.

Una escena típica. Armás un sumador de 4 bits con un 74HC283 (Tema 24) y conectás sus salidas a un decodificador de siete segmentos. 3 + 4 muestra 7: perfecto. Probás 7 + 5 y aparece una letra rara; 9 + 9 muestra otro símbolo. El sumador hizo su trabajo: 7 + 5 es 1100 en binario, que vale 12. Pero el decodificador solo entiende dígitos de 0 a 9, y 1100 no es un dígito.

El circuito suma bien y la calculadora suma mal. La diferencia entre las dos cosas es lo que enseña este proyecto.

  • ¿Por qué un sumador binario no alcanza para mostrar una suma decimal?
  • ¿Qué hay que corregir y cuándo?
  • ¿Cómo se muestran dos cifras y se apaga el cero de la izquierda?
  • ¿Qué debe hacer el circuito si un operando no es un dígito?
  • ¿Cuántos chips y cuánta corriente hacen falta?
  • ¿Qué casos borde hay que probar a mano?

02 · El problema decimal

El sumador piensa en base 16

Un sumador de 4 bits (Tema 24) entrega una suma Z de 4 bits y un acarreo C. Es aritmética módulo 16: el acarreo sale cuando la suma llega a 16. Pero un dígito decimal «se pasa» al llegar a 10. Entre 10 y 15 el sumador todavía no llevó nada, aunque en decimal ya habría que llevar uno. Tabla de lo que pasa:

Suma de A + B: lo que entrega el sumador y lo que se necesita.
A + BZ (binario)C¿Corregir?Lo que se quiere
0 a 90000 a 10010NoUnidades = Z, sin decenas
10 a 151010 a 11110Sí: Z + 6Decenas 1, unidades = Z + 6 − 16
16 a 180000 a 00101Sí: Z + 6Decenas 1, unidades = Z + 6

Por ejemplo, 7 + 5 = 12: Z = 1100 (que se ve como un 12, pero no es un dígito BCD). Si le sumamos 0110 (6): 1100 + 0110 = 1 0010. El nibble bajo, 0010, es el 2 de «12»; el 1 que salió de más es justo la decena. Sumar 6 le «regala» al binario los 6 valores que se saltea el BCD (los códigos 10 a 15), y el acarreo del nibble pasa a valer 10.

Por qué esta condición
La suma vale 10 o más en dos casos: hubo acarreo (C = 1, suma de 16 a 18) o el nibble Z está entre 1010 y 1111. Esos códigos son los que tienen Z3 = 1 y alguno de Z2 o Z1 en 1 (1000 y 1001 son los dígitos 8 y 9: no se tocan).
Por qué sumar 6 y no otro número
16 − 10 = 6. Es la distancia entre dónde desborda el binario y dónde desborda el decimal. Se suma exactamente esa diferencia para que el desborde caiga en el lugar correcto.
K es el dígito de las decenas
Con operandos de 0 a 9 la suma llega a 18: las decenas son 0 o 1. K vale 1 exactamente cuando la suma es 10 o más, así que K es el dígito de la izquierda; no hace falta calcular nada más.
Es un sumador BCD
Este esquema (sumar en binario, detectar el desborde decimal, sumar 6) es el clásico sumador BCD de una década. Encadenando décadas con K como acarreo se suman números de varias cifras (Ejercicio 3).

03 · Diseño

Bloques, ecuaciones y conexionado

DIP A y B → 283 #1 →K → 283 #2 (+6) →4511 unidades y 4511 decenas → display
Los cinco bloques y sus ecuaciones.
BloqueEntradasSalidasQué hace
74HC283 n.º 1A3..A0, B3..B0, Cin = 0Z3..Z0, CZ = A + B (módulo 16) y acarreo
Lógica de correcciónC, Z3, Z2, Z1KK = C + Z3·(Z2 + Z1)
74HC283 n.º 2Z3..Z0 y (0, K, K, 0), Cin = 0U3..U0U = Z + 6·K (se descarta su acarreo)
74HC4511 de unidadesU3..U0Segmentos a..gDecodifica a siete segmentos (cátodo común)
74HC4511 de decenasD = C = B = 0, A = KSegmentos a..gMuestra un «1» cuando K = 1; ~BI = K apaga el cero
La segunda entrada del 283 n.º 2
Los bits B3..B0 del segundo sumador valen 0, K, K, 0: es decir, 0000 o 0110. Entonces U = Z cuando K = 0 y U = Z + 6 cuando K = 1. Un mismo chip suma «nada» o «seis» según K.
Supresión del cero a la izquierda
El decodificador de decenas recibe 0000 o 0001, pero el 0 no se quiere ver. Su entrada ~BI (apagado, activa en bajo) se conecta directamente a K: con K = 0 el dígito se apaga; con K = 1 muestra el «1». Es el blanking del Tema 21, ahora con un fin útil.
Pines de control del 4511
~LT (prueba de lámpara) va a +5 V; LE (latch) va a masa para que las salidas sigan a las entradas. No se dejan al aire (Tema 29). En las unidades, ~BI va a la señal de «operandos válidos» (siguiente sección). Un 4511 apaga solo los códigos 1010 a 1111, que no pueden aparecer en las unidades si los operandos son válidos.
Display de cátodo común
Los dos dígitos son de cátodo común, con una resistencia por segmento (Tema 21): 680 Ω da 4,4 mA por segmento, una corriente razonable para un pin HC. El 4511 entrega la corriente (salidas activas en alto).
Los 283 y los pines
Cada 283 conecta A3..A0 y B3..B0 a sus entradas, S3..S0 a las salidas, el acarreo de entrada a masa (Cin = 0) y Vcc/GND con 100 nF pegado. Los números de pin exactos, en la hoja de datos del fabricante; lo importante acá es la lógica de la conexión.

04 · Entradas inválidas

Fallar con ruido, no en silencio

Un DIP de cuatro posiciones tiene 16 combinaciones y solo diez son dígitos. Para A o B entre 10 y 15 el circuito, sin protección, seguirá sumando y mostrará algo. Las consecuencias, calculadas con el gemelo digital:

Los 256 pares posibles: 100 válidos y 156 con algún operando de 10 a 15.
CasoCantidadQué pasa sin detección
Operandos válidos (0 a 9)100Los 100 resultados son correctos
Inválidos, resultado con unidades 10 a 1551El 4511 apaga el display (casualmente)
Inválidos, se muestra un número105Sin aviso; en 15 casos el valor es distinto de A + B (por ejemplo 15 + 15 muestra «14»)

Es un fallo silencioso: la calculadora «responde» con seguridad un número equivocado. Es el peor tipo de falla, porque nadie sabe que hay que desconfiar (el Tema 30 lo llamó fail-closed). La detección es barata: un operando es inválido si el bit 3 está en 1 y alguno de los bits 2 o 1 también:

Qué cuesta
Dos OR, dos AND y un NOR (cinco puertas en tres chips que ya están en la placa o cuestan centavos). Es una versión chica del comparador «mayor que 9» del Tema 25.
Qué hace ERR_n
Vale 1 si todo está bien y 0 si algún operando es inválido. Va al ~BI del decodificador de unidades (apaga el dígito) y, junto con K, al ~BI del de decenas (K · ERR_n). Con ERR_n = 0 el display queda en blanco.
El LED de error
Se conecta de +5 V a ERR_n a través de 1 kΩ: se enciende cuando ERR_n baja a 0 (la compuerta absorbe unos 3 mA, dentro de lo que garantiza el HC; Tema 30).
Alternativa de hardware
Reemplazar el DIP por ruedas BCD hace imposible el error de entrada: cada rueda solo da 0 a 9. Pero el diseño sigue sin protegerse de un cable suelto o de una rueda mal armada; la detección es defensa en profundidad.

05 · Materiales y consumo

Lista de compras y presupuesto de corriente

Lista de materiales (BOM).
Cant.ÍtemDetalle
2DIP de 4 posiciones (o ruedas BCD)Dígitos A y B
8Resistencia 10 kΩPull-down de cada interruptor (Tema 11)
274HC283Sumador de 4 bits
274HC4511Decodificador BCD a siete segmentos, cátodo común
174HC084 AND (K: 1; error: 2; ~BI de decenas: 1)
174HC324 OR (K: 2; error: 2)
174HC021 NOR (ERR_n); las otras 3 con las entradas a masa
2Display de 7 segmentos, cátodo comúnDecenas y unidades
14Resistencia 680 ΩUna por segmento
1 + 1LED rojo y resistencia 1 kΩAviso de error
7Condensador 100 nFUno por chip, pegado a Vcc y GND
1Alimentación de 5 VUSB o fuente regulada

Son 7 chips con detección de errores (6 sin ella: se saca el 74HC02 y el ~BI de decenas va directo a K). Todas las puertas sobrantes llevan sus entradas a masa, como en el Tema 29.

Corriente por segmento según la resistencia (5 V, LED de ≈ 2 V).
ResistenciaPor segmentoUn «8» (7 segmentos)Veredicto
220 Ω13,6 mA95 mASe pasa de los 50 mA por patita de alimentación del HC y de lo que entrega cada pin
330 Ω9,1 mA64 mASe pasa
470 Ω6,4 mA45 mAJusto; sin margen
680 Ω4,4 mA31 mACómodo y bien visible
1 kΩ3,0 mA21 mAVisible, con mucho margen

La corriente depende de qué número se muestra: cada segmento encendido cuesta lo mismo. El peor caso entre 0 y 18 es la suma «18» (un «1» más un «8»: 9 segmentos, 39,7 mA con 680 Ω) y, con los ocho interruptores cerrados (8 × 0,5 mA = 4 mA), el total ronda 44 mA. Con 2000 mAh de pilas serían unas 46 horas: es un proyecto de banco, no de batería.

06 · Puesta en marcha

Orden de pruebas y casos borde

Con 7 chips, probar al final es una receta para no saber dónde está el error. Se prueba por etapas, y en cada una se mide el nodo intermedio, no solo el display:

1. Alimentación y reposo
5 V en cada chip, con el 100 nF puesto. Con A = B = 0000: Z = 0000, K = 0, display de unidades en «0», decenas apagadas, LED de error apagado.
2. El primer sumador solo
Con el segundo todavía sin conectar: A = 0011, B = 0100 debe dar Z = 0111, C = 0. Probar algunas sumas y también un acarreo: 8 + 8 debe dar Z = 0000, C = 1.
3. La señal K
Medir K con sumas de 0 a 18: debe valer 0 hasta 9 y 1 desde 10. El borde es el caso crítico: 4 + 5 = 9 (K = 0) y 5 + 5 = 10 (K = 1).
4. El segundo sumador
Con K = 1: U = Z + 0110. Comprobar 5 + 5: Z = 1010, U = 0000. Y 9 + 9: Z = 0010, U = 1000.
5. Los displays
Recorrer los diez dígitos en las unidades. Probar 1 (dos segmentos) y 8 (siete): el 8 no debe verse más opaco que el 1.
6. Entradas inválidas
Poner A = 1100: el display se apaga y el LED rojo se enciende. Repetir con B = 1111 y con A = 1010: todas deben avisar. Con 1001 (el 9) no debe avisar.
7. Toda la matriz
Anotar las 100 combinaciones válidas contra una tabla hecha en Python (Paso 3). Son 100 pruebas, pero se hacen en media hora.
Casos borde que conviene probar siempre (A + B → Z, C, K → display).
A + BZCKUnidadesDisplay
0 + 000000000000
4 + 510010010019 (último sin corregir)
5 + 5101001000010 (primer corregido)
7 + 5110001001012
8 + 8000011011016 (K por acarreo)
9 + 9001011100018 (máximo)
12 + 3111101—apagado + LED de error
Sospechoso: 8 + 8
Es el caso que corrige por acarreo (C = 1) y no por el rango de Z. Si da «10» en lugar de «16», K no está recibiendo C.
Sospechoso: 5 + 5
Es el primero que corrige. Si muestra «16», la corrección suma de más; si muestra «A» o nada, K no activó.
Rebotes y destellos
Al mover los interruptores, el display pasa por números intermedios durante unos cientos de nanosegundos (hazards de función, Tema 28): no se ven. Si la calculadora se usara para accionar algo, se leería con un pulsador, como en la cerradura; acá basta con que el LE del 4511 pueda congelar la lectura.

07 · Simulador

Laboratorio: la calculadora con display

El simulador reproduce el circuito etapa por etapa: los dígitos A y B de 0 a 15, el primer sumador (Z y C), la señal de corrección K, el segundo sumador (U) y los dos displays de siete segmentos que dibuja el 4511. El interruptor «Detección de errores» agrega o saca la protección contra operandos inválidos.

  • Deslizadores A y B: de 0 a 15; los valores de 10 a 15 no son dígitos y sirven para ver qué pasa.
  • Display: dos dígitos de siete segmentos. El cero de la izquierda está apagado y los códigos mayores de 9 los apaga el 4511.
  • Resultados: Z con su acarreo, K, la lectura del display y un veredicto: correcto, error avisado o fallo silencioso.
SIMULADOR 31

Calculadora BCD

7 + 5 = 12

Etapas de la calculadora y su display Cuatro bloques en fila: los dígitos de entrada, el primer sumador con Z y C, la corrección K, el segundo sumador con las unidades; a la derecha, dos dígitos de siete segmentos con el resultado. Debajo, un indicador de error. ETAPAS → DISPLAY
Z / C (primer sumador)1100 / 0
K (corregir)1
Display12
VeredictoCorrecto ✓

7 + 5: Z = 1100, K = 1, unidades 0010, display 12.

Recorrido guiado (10 minutos)

  1. 1
    Mirá el estado inicial: 7 + 5.

    El primer sumador entrega Z = 1100 (12 en binario). K vale 1 porque Z3 = 1 y Z2 = 1. El segundo sumador hace 1100 + 0110 = 1 0010: unidades 0010 y el display dice 12.

  2. 2
    Bajá B a 2 (7 + 2).

    Z = 1001 (9). K = 0: no se corrige, el segundo sumador suma 0000 y las decenas se apagan. El display dice «9», no «09».

  3. 3
    Subí B a 3 (7 + 3 = 10).

    Es el primer caso corregido: Z = 1010, K = 1, U = 0000. El display pasa de «9» a «10»: aparece la decena.

  4. 4
    Probá 8 + 8.

    Z = 0000 pero C = 1: el sumador desbordó. K se activa por el acarreo (no por el rango de Z) y U = 0110. Display 16.

  5. 5
    Probá 9 + 9.

    El máximo: Z = 0010, C = 1, K = 1, U = 1000. Display 18. Es el número que más segmentos enciende (9).

  6. 6
    Subí A a 10 con la detección activada.

    Display apagado y ERR encendido. A = 1010 no es un dígito: el circuito se niega a mostrar nada.

  7. 7
    Pasá a «Sin detección» con el mismo A = 10.

    Ahora el display muestra algo. Con B = 0 dice «10» (coincide por casualidad); con otros valores puede dar un número que no es la suma de dos dígitos, sin ninguna señal.

  8. 8
    Probá 15 + 15 sin detección.

    La suma real es 30, pero el circuito muestra «14» sin avisar. Es el fallo silencioso: la calculadora «responde» con seguridad.

  9. 9
    Buscá un caso con el display apagado sin detección.

    Por ejemplo, 15 + 6 (suma 21): Z = 0101, C = 1, K = 1 y las unidades salen 1011 (mayor de 9), así que el 4511 las apaga. Es un apagado casual y no un diseño: no avisa ni distingue de otros casos.

  10. 10
    Volvé a activar la detección y barrido rápido de A.

    Con A de 0 a 9, todo bien; con A de 10 a 15, siempre ERR. Los dígitos inválidos siempre se avisan, sin excepciones.

Preguntas para pensar

  1. ¿Cuánto valen Z, C y K en 6 + 4? ¿Y en 6 + 3?
  2. En 8 + 8, ¿por qué K vale 1 si Z vale 0000?
  3. Con A = 10 y B = 0, sin detección, el display dice «10». ¿Es una suma correcta?
  4. ¿Qué diferencia práctica hay entre «apagado por el 4511» y «apagado por la detección»?
Ver respuestas sugeridas
  1. 6 + 4: Z = 1010, C = 0, K = 1 (Z3 = 1 y Z1 = 1) → 10. 6 + 3: Z = 1001, C = 0, K = 0 → 9.
  2. Porque K = C + Z3·(Z2 + Z1) y C = 1: el sumador desbordó (16) y en decimal eso ya es 10 o más. El caso se corrige por el acarreo, no por el rango del nibble.
  3. Es un acierto por coincidencia: el valor 1010 no es un dígito BCD. El circuito no «entendió» la entrada; solo ocurre que el resultado se parece a 10 + 0. Lo importante es que no hay forma de distinguirlo de un caso erróneo sin la detección.
  4. El apagado del 4511 es un efecto lateral, no una decisión: depende de qué código llegue a las unidades y no enciende ningún LED. La detección es explícita: cubre todos los casos inválidos y avisa con ERR.

08 · La calculadora en código

Gemelo digital, tabla de corrección, barrido, retardo y consumo

Los bloques modelan el circuito etapa por etapa: dos sumadores de 4 bits y la lógica de corrección; construyen la tabla de todas las sumas de 0 a 18 con K y el +6; barren los 256 pares de entrada para contar cuántos fallan sin detección; estiman el camino crítico y la cantidad de chips; y calculan la corriente de los segmentos según la resistencia y el número mostrado.

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

Paso 1: el gemelo digital con dos sumadores

def sum4(a, b, cin=0):
    t = a + b + cin                                   # 74HC283: 4 bits + acarreo
    return t & 0xF, t >> 4


def calculadora(a, b):
    z, c = sum4(a, b)                                 # sumador 1: A + B
    z3, z2, z1 = (z >> 3) & 1, (z >> 2) & 1, (z >> 1) & 1
    k = c | (z3 & (z2 | z1))                          # suma >= 10: hay que corregir
    u, _ = sum4(z, 0b0110 if k else 0)                # sumador 2: Z + 6K
    return k, u


for a, b in ((3, 4), (7, 5), (9, 9), (0, 0), (8, 8)):
    k, u = calculadora(a, b)
    print(f"{a} + {b}: Z = {(a + b) & 15:04b} C = {(a + b) >> 4} -> K = {k}, unidades = {u:04b} ({u}) -> display {'' if not k else k}{u}   (esperado {a + b})")

Las cinco sumas coinciden con el resultado esperado. En 7 + 5, Z = 1100 con K = 1 produce unidades 0010 y el display «12»; en 8 + 8, Z = 0000 pero C = 1 activa K y las unidades salen 0110 («16»); en 9 + 9, Z = 0010, C = 1 y unidades 1000 («18»).

Paso 2: la tabla de corrección de 0 a 18

def sum4(a, b, cin=0):
    t = a + b + cin
    return t & 0xF, t >> 4


def correccion(valor):
    z, c = valor & 0xF, valor >> 4
    z3, z2, z1 = (z >> 3) & 1, (z >> 2) & 1, (z >> 1) & 1
    k = c | (z3 & (z2 | z1))
    u, _ = sum4(z, 0b0110 if k else 0)
    return z, c, k, u


print("suma   Z     C  K   Z+6K   unidades  display")
bien = True
for v in range(19):
    z, c, k, u = correccion(v)
    print(f"{v:4d}  {z:04b}  {c}  {k}   {z + 6 * k:5d}   {u:04b} ({u})    {10 * k + u}")
    bien = bien and (10 * k + u == v)
print()
print("todas las sumas 0..18 correctas:", bien, "| se suma 6 porque 16 - 10 = 6: el acarreo binario (16) vale 10 en decimal")

Las 19 filas salen correctas. K vale 0 de 0 a 9 y 1 de 10 a 18; de 10 a 15 el sumador no tiene acarreo pero la corrección suma 6 y desborda el nibble (el 16 de Z + 6 se descarta, quedando las unidades); de 16 a 18 el acarreo ya está y Z + 6 no desborda. La constante 6 es la diferencia 16 − 10.

Paso 3: barrido de los 256 pares, con y sin detección

def sum4(a, b, cin=0):
    t = a + b + cin
    return t & 0xF, t >> 4


def maquina(a, b, con_deteccion=True):
    z, c = sum4(a, b)
    z3, z2, z1 = (z >> 3) & 1, (z >> 2) & 1, (z >> 1) & 1
    k = c | (z3 & (z2 | z1))
    u, _ = sum4(z, 0b0110 if k else 0)
    ea = ((a >> 3) & 1) & (((a >> 2) & 1) | ((a >> 1) & 1))
    eb = ((b >> 3) & 1) & (((b >> 2) & 1) | ((b >> 1) & 1))
    err = ea | eb
    ok = 0 if (err and con_deteccion) else 1          # ~BI de los decodificadores
    unidades = u if (ok and u <= 9) else None         # el 4511 apaga 10..15
    decenas = 1 if (k and ok) else 0
    return decenas, unidades, err


validos_ok = 0
for a in range(10):
    for b in range(10):
        d, u, e = maquina(a, b)
        validos_ok += (10 * d + u == a + b and e == 0)
print(f"pares validos (0-9 + 0-9): {validos_ok} de 100 correctos")

invalidos = [(a, b) for a in range(16) for b in range(16) if a > 9 or b > 9]
print(f"pares invalidos: {len(invalidos)} de 256")
con = sum(1 for a, b in invalidos if maquina(a, b, True)[1] is None and maquina(a, b, True)[2] == 1)
print(f"  con deteccion: {con} apagan el display y encienden ERR")

sin_aviso = [(a, b) for a, b in invalidos if maquina(a, b, False)[1] is not None]
mal = [(a, b) for a, b in sin_aviso if 10 * maquina(a, b, False)[0] + maquina(a, b, False)[1] != a + b]
print(f"  sin deteccion: {len(sin_aviso)} muestran un numero sin aviso; {len(mal)} de ellos con un valor distinto de A + B")
for a, b in ((15, 15), (12, 3), (10, 0)):
    d, u, e = maquina(a, b, False)
    print(f"    {a:2d} + {b:2d} = {a + b:2d}: sin deteccion muestra {'' if not d else d}{u}")

Los 100 pares válidos dan el resultado correcto. De los 156 pares inválidos, la detección apaga el display y enciende ERR en los 156. Sin detección, 105 muestran un número sin aviso (en los otros 51 el 4511 apaga el display por casualidad) y 15 de esos muestran un valor distinto de A + B: 15 + 15 muestra «14» en lugar de 30.

Paso 4: camino crítico y cantidad de chips

TPD_NS = {"283": 30, "compuerta": 10, "4511": 40}      # orientativo, confirmar en la hoja de datos
camino = [("283 #1 (A+B)", "283"), ("OR (Z2+Z1)", "compuerta"), ("AND con Z3", "compuerta"),
          ("OR con C -> K", "compuerta"), ("283 #2 (Z+6K)", "283"), ("4511 (decodifica)", "4511")]
total = 0
print("camino critico (orientativo, 5 V):")
for nombre, tipo in camino:
    total += TPD_NS[tipo]
    print(f"  {nombre:20s} {TPD_NS[tipo]:3d} ns   acumulado {total:3d} ns")
print(f"retardo total ~ {total} ns: millones de veces menos que el tiempo que tarda un ojo en ver el cambio")
print()
chips = {"74HC283": 2, "74HC4511": 2, "74HC08": 1, "74HC32": 1, "74HC02": 1}
print("chips con deteccion de error:", sum(chips.values()), chips)
print("chips sin deteccion:", sum(chips.values()) - 1, "(sin el 74HC02; el BI de decenas es K)")
puertas = {"AND": 4, "OR": 4, "NOR": 1}
print("puertas sueltas:", sum(puertas.values()), puertas, "+ 2 sumadores de 4 bits + 2 decodificadores")

El camino crítico tiene seis etapas y suma unos 130 ns (orientativos): para un ojo humano, instantáneo. Hacen falta 7 chips con detección de errores y 6 sin ella; las puertas sueltas son 9 (4 AND, 4 OR y 1 NOR). Para otra serie de chips los tiempos cambian: medilos en la hoja de datos.

Paso 5: corriente de los segmentos

VCC, V_SEG = 5.0, 2.0
SEGMENTOS = {0: 6, 1: 2, 2: 5, 3: 5, 4: 4, 5: 5, 6: 6, 7: 3, 8: 7, 9: 6}


def i_seg_ma(r_ohm):
    return (VCC - V_SEG) / r_ohm * 1000


print("R por segmento   I por segmento   peor digito (8)   limite de 50 mA por patita Vcc del chip")
for r in (220, 330, 470, 680, 1000):
    i = i_seg_ma(r)
    peor = 7 * i
    print(f"{r:10d} ohm   {i:10.1f} mA   {peor:10.1f} mA   {'se pasa' if peor > 50 else 'ok'}")
print()
r = 680
print(f"con {r} ohm: corriente del display segun el numero mostrado (decenas + unidades)")
for suma in (0, 1, 8, 11, 18):
    d, u = divmod(suma, 10)
    segs = SEGMENTOS[u] + (SEGMENTOS[d] if d else 0)
    print(f"  {suma:2d}: {segs:2d} segmentos -> {segs * i_seg_ma(r):5.1f} mA")
peor = max(SEGMENTOS[u] + (SEGMENTOS[1] if d else 0) for s in range(19) for d, u in [divmod(s, 10)])
i_pull = 8 * VCC / 10.0                                    # ocho interruptores cerrados con pull-down de 10k
total_ma = peor * i_seg_ma(r) + i_pull
print(f"peor caso entre 0..18: {peor} segmentos = {peor * i_seg_ma(r):.1f} mA; DIP: {i_pull:.1f} mA; total ~ {total_ma:.0f} mA")
print(f"con 2000 mAh: {2000 / total_ma:.0f} h")

Con 220 Ω un «8» pediría 95 mA (más de los 50 mA por patita de alimentación); con 680 Ω, 31 mA. Según el número mostrado la corriente va de 8,8 mA (el «1») a 39,7 mA (el «18»). Sumando 4 mA de los interruptores, el peor caso es de unos 44 mA: 46 horas con 2000 mAh.

09 · Analogía de programador

Pipeline, normalización y validación de entrada

El mismo concepto, en dos mundos.
En softwareEn la calculadora
Un pipeline: calcular, normalizar, presentarSumador, corrección BCD, decodificador de display
Convertir entre bases (de binario a decimal para mostrar)Sumar 6 cuando se pasa de 9: la diferencia 16 − 10
Desbordamiento de un entero y acarreoC del primer sumador: la suma pasó de 15
Separar el cálculo de la vista (modelo y vista)La suma no sabe del display; los 4511 solo dibujan
Un tipo restringido (un dígito, no cualquier entero)El contrato: A y B entre 0 y 9; el DIP permite 16 valores
Validar en la frontera del sistemaERR detecta operandos inválidos antes de calcular nada
Fallar con ruido (excepción) frente a corromper datos en silencioERR y display apagado frente a «14» como 15 + 15
Un caso borde (off-by-one)4 + 5 = 9 (sin corregir) frente a 5 + 5 = 10 (corregido)
Un test exhaustivo de un dominio chico256 pares recorridos en Python y 100 en el banco
Quitar ceros a la izquierda al formatear~BI del decodificador de decenas conectado a K
Un número mágico explicado (6 = 16 − 10)La constante 0110 del segundo sumador
  1. 1
    La representación importa.

    El mismo número, doce, es 1100 en binario y 0001 0010 en BCD. Convertir entre representaciones es donde viven los bugs; acá se hace con una suma y una condición.

  2. 2
    Validar en el borde.

    Un sistema serio no asume que la entrada cumple el contrato: lo comprueba. Cuesta cinco puertas y evita el peor tipo de falla, la que parece funcionar.

  3. 3
    Probar los casos borde primero.

    Los errores viven en los bordes: 9 → 10, 15 → 16, 18. Una tabla de siete casos bien elegidos detecta más que cien sumas al azar.

Una diferencia con el software: en hardware, «agregar una excepción» no existe. Si un caso no está cubierto por una compuerta, el circuito hace algo igual. Cubrir los casos que no deberían ocurrir es parte del diseño, no un lujo.

10 · Comprensión

Confusiones frecuentes

«Un sumador y un decodificador alcanzan»

Solo hasta 9. De 10 a 15 el sumador entrega códigos que el BCD no usa y el acarreo recién sale en 16. Hace falta la corrección: detectar «≥ 10» y sumar 6.

«Siempre hay que sumar 6»

Solo cuando la suma llega a 10 o más (K = 1). Si se suma siempre, 3 + 4 daría 13. El segundo sumador recibe 0000 cuando no hay corrección.

«El acarreo del primer sumador no importa»

Es esencial: 8 + 8 da Z = 0000 con C = 1. Sin C en K, mostraría «0». El acarreo es la mitad de la condición de corrección.

«El 4511 muestra A a F»

Apaga todo para los códigos 1010 a 1111 (Tema 21). Ese apagado no es una protección: depende de cuál código llegue a las unidades y no avisa.

«Si anda con los dígitos de 0 a 9, está listo»

Un DIP de 4 bits tiene 16 valores. Sin detección, los 156 pares con un operando inválido producen displays sin sentido, y 105 de ellos no se apagan: la calculadora responde con seguridad algo falso.

«Los pines de control del 4511 pueden quedar al aire»

~LT, ~BI y LE son entradas: flotantes, el display parpadea, se apaga o se congela al azar (Tema 29). ~LT va a Vcc, LE a masa y ~BI a la señal que corresponda.

«Una resistencia común para todo el display»

Con una sola, el brillo depende de cuántos segmentos estén encendidos (el 1 brilla de más). Una resistencia por segmento: 680 Ω en este montaje.

«Se pueden manejar los segmentos con puertas»

Una puerta HC entrega pocos miliamperios. Los segmentos van con el decodificador pensado para eso y resistencias dimensionadas con el presupuesto de corriente.

11 · Práctica guiada

Ejercicios de cálculo

Ejercicio 1: 7 + 8 a mano

Calculá Z, C, K, la segunda suma, las unidades y lo que muestra el display. Verificalo con el Paso 1.

Ver solución razonada

Z = 0111 + 1000 = 1111, C = 0. K = C + Z3·(Z2 + Z1) = 0 + 1·(1 + 1) = 1. Segundo sumador: 1111 + 0110 = 1 0101, o sea unidades 0101 (5) y el acarreo del nibble se descarta. Decenas = K = 1. El display muestra 15 ✓.

Ejercicio 2: la condición de K

¿Por qué K = C + Z3·(Z2 + Z1) y no simplemente Z3 + C? ¿Qué casos distingue?

Ver solución razonada

Con Z3 + C, las sumas 8 y 9 (Z = 1000, 1001) se corregirían de más: darían 14 y 15. Los códigos con Z3 = 1 que sí hay que corregir son 1010 a 1111, que tienen Z2 = 1 o Z1 = 1. Por eso el factor (Z2 + Z1). Con C = 1 (sumas de 16 a 18) siempre hay que corregir, sea cual sea Z. Se puede verificar con la tabla del Paso 2.

Ejercicio 3: dos décadas

Extendé la calculadora a números de dos cifras (0 a 99). ¿Qué hay que duplicar y cómo se conectan las décadas?

Ver solución razonada

Cada década repite el bloque completo: dos 283, la lógica de K y un decodificador. La década de las unidades produce Ku, que entra como acarreo de entrada (Cin) del primer 283 de las decenas: la suma de decenas es Ad + Bd + Ku (de 0 a 19) y se corrige igual. El K de la segunda década es el dígito de las centenas. Con ese esquema se suman números de cualquier cantidad de cifras; cada década cuesta 2 sumadores, 3 compuertas y un 4511.

Ejercicio 4: contar los fallos silenciosos

Sin la detección, ¿cuántos pares de operandos producen un display encendido? ¿En cuántos el valor mostrado es distinto de A + B? Citá un ejemplo.

Ver solución razonada

De los 156 pares inválidos, 105 muestran un número (en los otros 51 el 4511 apaga por casualidad) y en 15 ese número no coincide con A + B. Ejemplo: 15 + 15 = 30 se muestra como 14, porque K solo agrega una decena y el sumador desborda dos veces. Es la prueba del Paso 3 y el argumento para la detección de errores.

Ejercicio 5: presupuesto del display

Con 680 Ω el peor caso es de 44 mA. Si el proyecto fuera a pilas, ¿qué cambiarías para estirar la autonomía y cuánto ganarías?

Ver solución razonada

Dos palancas. Primera: segmentos con 1 kΩ (3 mA cada uno): 9 segmentos × 3 mA = 27 mA, un 32 % menos de brillo pero todavía visible. Segunda: pull-downs de 100 kΩ en el DIP: 8 × 0,05 = 0,4 mA en lugar de 4 mA. El total baja a unos 27,4 mA y las pilas pasan de 46 h a unas 73 h. Mejor aún: encender el display solo mientras se lee (un pulsador que alimenta o habilita el 4511 con ~BI): el consumo en reposo queda en microamperios.

Ejercicio 6: congelar la lectura

Querés que, al soltar un pulsador «HOLD», el display retenga el resultado aunque se muevan los interruptores. ¿Qué pin del 4511 lo permite?

Ver solución razonada

El LE (latch enable) de cada 4511: con LE = 0 las salidas siguen a las entradas; al pasar a 1 se retiene el último dígito. Se conecta el pulsador HOLD (con anti-rebote, Tema 11) a los dos LE y se saca de masa. Es el mismo principio que ENTER en la cerradura: no mostrar mientras las entradas se mueven.

12 · Síntesis

Ideas para recordar

  • El sumador binario desborda en 16 y el dígito decimal en 10: la diferencia (6) es la corrección. Sumar en binario y, si la suma es ≥ 10, sumar 6.
  • K = C + Z3·(Z2 + Z1) detecta «≥ 10». K activa el +6 (segundo 283 con B = 0, K, K, 0) y es además el dígito de las decenas.
  • El cero de la izquierda se apaga conectando ~BI del decodificador de decenas a K.
  • Con un DIP de 4 bits llegan 16 valores y solo 10 son dígitos: 156 de 256 pares son inválidos. Sin detección, 105 muestran un número sin aviso y 15 uno falso.
  • ERR = A3·(A2 + A1) + B3·(B2 + B1) apaga el display y enciende un LED: se falla con ruido, no en silencio.
  • Una resistencia por segmento (680 Ω, 4,4 mA); la corriente depende del número mostrado y el peor caso es la suma 18.
  • Los pines de control del 4511 se atan (~LT a Vcc, LE a masa); desacople de 100 nF por chip y pull-downs en cada interruptor.
  • Probar por etapas y los casos borde: 4 + 5, 5 + 5, 8 + 8 y 9 + 9, además de operandos inválidos.

¿Listo para el cierre?

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

  • Explicar por qué se suma 6 y cuándo, con un ejemplo numérico.
  • Escribir K y justificar cada término de su ecuación.
  • Dibujar los bloques y decir qué recibe cada entrada del segundo sumador.
  • Describir qué pasa con un operando inválido con y sin detección, y por qué lo segundo es peor.
  • Dimensionar la resistencia de un segmento y calcular el consumo del peor número.
  • Elegir los casos borde para probar el circuito armado.

Con la cerradura y la calculadora andando, el curso está completo. En el último tema hacemos el balance de todo lo recorrido: cierre y puente al curso 6, donde aparece lo que a este circuito le falta, la memoria.