Semisumador, Sumador Completo y Sumador de 2 Cifras Binarias

1. Semisumador (1 Bit: A + B)

Tabla de Verdad

Entradas: A, B | Salidas: Acarreo (SemiSuma2) y Suma (SemiSuma1)

Entradas Salidas
A B SemiSuma2 (A·B) SemiSuma1 (A⊕B)
0000
0101
1001
1110

Funciones Lógicas

Forma Canónica:

SemiSuma1 = !A·B + A·!B

SemiSuma2 = A·B

2. Sumador Completo (A, B y Cin)

El sumador completo suma tres bits: A, B y el acarreo de entrada Cin (aquí usamos la entrada C del Arduino como Cin). Genera las salidas SumaComp1 (Suma) y SumaComp2 (Acarreo de salida Cout).

Tabla de Verdad

Entradas Salidas
A B C (Cin) SumaComp2 (Cout) SumaComp1 (S)
00000
00101
01001
01110
10001
10110
11010
11111

Funciones Lógicas

Forma Canónica:

SumaComp1 = !A·!B·C + !A·B·!C + A·!B·!C + A·B·C

SumaComp2 = !A·B·C + A·!B·C + A·B·!C + A·B·C

Forma Simplificada (Puertas XOR / Karnaugh):

SumaComp1 = A ⊕ B ⊕ C

SumaComp2 = A·B + A·C + B·C

3. Sumador de 2 Cifras Binarias (AB + CD)

Tabla de Verdad

Entradas: A, B, C, D (Número 1: AB, Número 2: CD) | Salidas: Suma3 (C2), Suma2 (C1), Suma1 (C0)

Entradas Salidas
ABCD Suma3Suma2Suma1
0000000
0001001
0010010
0011011
0100010
0101011
0110011
0111100
1000010
1001011
1010100
1011101
1100100
1101101
1110110
1111111

Funciones Lógicas

Forma Canónica:

Suma1 = !A·!B·!C·D + !A·!B·C·D + !A·B·!C·!D + !A·B·C·!D + A·!B·!C·D + A·!B·C·D + A·B·!C·!D + A·B·C·!D

Suma2 = !A·!B·C·!D + !A·!B·C·D + !A·B·!C·D + !A·B·C·!D + A·!B·!C·!D + A·!B·!C·D + A·B·!C·!D + A·B·C·D

Suma3 = !A·B·C·D + A·!B·C·!D + A·!B·C·D + A·B·!C·D + A·B·C·!D + A·B·C·D

Funciones Simplificadas (Karnaugh):

Suma1 = !B·D + B·!D

Suma2 = !A·!B·C + !A·C·!D + A·!B·!C + A·!C·!D + !A·B·!C·D + A·B·C·D

Suma3 = !B·C + B·!D + A·B·D

Código Arduino

const int leds[] = {13,12,11,10,9,8,7,6,5};
const int entradas[] = {28,26,24,22};
const int numeroLeds = sizeof(leds) / sizeof(leds[0]);
const int numeroEntradas = sizeof(entradas) / sizeof(entradas[0]);
bool A, B, C, D;
bool SemiSuma1, SemiSuma2;
bool SumaComp1, SumaComp2;
bool Suma1, Suma2, Suma3;

void setup()
{
  Serial.begin(115200);
  for(int i = 0; i < numeroLeds; i++){
    pinMode(leds[i], OUTPUT);
  }
  for(int i = 0; i < numeroEntradas; i++){
    pinMode(entradas[i], INPUT);
  }
}

void loop()
{
  A = digitalRead(entradas[0]); // Leo estado Pin 28
  B = digitalRead(entradas[1]); // Leo estado Pin 26
  C = digitalRead(entradas[2]); // Leo estado Pin 24 (Cin)
  D = digitalRead(entradas[3]); // Leo estado Pin 22

  // FUNCIONES:
  // 1. SEMISUMADOR:
  SemiSuma1 = !A*B + A*!B;
  SemiSuma2 = A*B;

  // 2. SUMADOR COMPLETO (A + B + Cin):
  SumaComp1 = !A*!B*C + !A*B*!C + A*!B*!C + A*B*C; // Suma
  SumaComp2 = !A*B*C + A*!B*C + A*B*!C + A*B*C;     // Acarreo (Cout)
  // Simplificado: SumaComp2 = A*B + A*C + B*C;

  // 3. SUMA 2 CIFRAS (AB + CD):
  Suma1 = !A*!B*!C*D + !A*!B*C*D + !A*B*!C*!D + !A*B*C*!D + A*!B*!C*D + A*!B*C*D + A*B*!C*!D + A*B*C*!D;
  // Simplificado por Karnaugh: Suma1 = !B*D + B*!D;

  Suma2 = !A*!B*C*!D + !A*!B*C*D + !A*B*!C*D + !A*B*C*!D + A*!B*!C*!D + A*!B*!C*D + A*B*!C*!D + A*B*C*D;
  // Simplificado por Karnaugh: Suma2 = !A*!B*C + !A*C*!D + A*!B*!C + A*!C*!D + !A*B*!C*D + A*B*C*D;

  Suma3 = !A*B*C*D + A*!B*C*!D + A*!B*C*D + A*B*!C*D + A*B*C*!D + A*B*C*D;
  // Simplificado por Karnaugh: Suma3 = !B*C + B*!D + A*B*D;
  
  // SALIDA DE LAS SUMAS EN LEDS
  // Semisumador en leds[0] y leds[1]
  digitalWrite(leds[0], SemiSuma2);
  digitalWrite(leds[1], SemiSuma1);

  // Sumador Completo en leds[2] y leds[3]
  digitalWrite(leds[2], SumaComp2); // Acarreo
  digitalWrite(leds[3], SumaComp1); // Suma

  // Sumador 2 Cifras en los últimos 3 leds
  digitalWrite(leds[numeroLeds-3], Suma3);
  digitalWrite(leds[numeroLeds-2], Suma2);
  digitalWrite(leds[numeroLeds-1], Suma1);
}