Piezas que no saben contar
El terminal de pago de una gasolinera suma 40 euros de gasóleo y 3 de un café casi al instante. Sin embargo, ninguna pieza de su procesador sabe contar.
Cada pieza solo contesta sí o no a una pregunta sobre dos bits. En esta lección construyes la suma a partir de esas preguntas.
Al final de esta lección
Nota
Puedo construir un sumador con puertas lógicas.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Puerta lógica | un circuito que convierte uno o dos bits de entrada en un bit de salida |
| Tabla de verdad | la lista de todas las entradas con la salida de cada una |
| Acarreo | el bit que pasa a la posición siguiente cuando la suma no cabe |
| Semisumador | dos puertas que suman dos bits |
| Sumador completo | puertas que suman dos bits y un acarreo |
| Desbordamiento | un resultado que no cabe en los bits disponibles |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cuatro puertas responden sobre bits
Una puerta lógica recibe bits y da un solo bit. AND da 1 solo si las dos entradas son 1. OR da 1 si alguna de las entradas es 1. XOR, el o exclusivo, da 1 cuando las entradas son distintas. NOT tiene una sola entrada y la invierte.
Una tabla de verdad recoge cada entrada con su salida. Con dos entradas solo hay cuatro casos, así que la tabla es corta.
Tabla de verdad: tres puertas
| A | B | A AND B | A OR B | A XOR B |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Entra en la carpeta de arquitectura
cd ~/archSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Aplica las puertas a 12 y 10
python3 -c "print(12 & 10, 12 | 10, 12 ^ 10)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: las puertas, bit a bit
| Bits | Número | |
|---|---|---|
| A | 1100 | 12 |
| B | 1010 | 10 |
| A AND B | 1000 | 8 |
| A OR B | 1110 | 14 |
| A XOR B | 0110 | 6 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Dos puertas suman dos bits
Sumar dos bits tiene cuatro casos. 0 + 0 es 0, y tanto 0 + 1 como 1 + 0 dan 1. Pero 1 + 1 es 2, que en binario se escribe 10.
El bit de la derecha del resultado es A XOR B. El de la izquierda, el acarreo, es A AND B. Así que una puerta XOR y una puerta AND forman un semisumador.
Tabla de verdad: un semisumador
| A | B | Suma (XOR) | Acarreo (AND) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
XOR suma sin los acarreos
python3 -c "print(12 + 10, 12 ^ 10, (12 & 10) << 1)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un sumador completo recibe el acarreo
Cada posición, menos la primera, también debe sumar el acarreo que llega de su derecha. Por tanto suma tres bits.
Un sumador completo lo hace con dos semisumadores y una puerta OR. Con cuatro en cadena sumas números de 4 bits. El acarreo viaja de derecha a izquierda, de un sumador al siguiente. Por eso este diseño se llama sumador con propagación de acarreo.
Ejemplo resuelto: 0101 + 0111, de derecha a izquierda
| Posición | A | B | Acarreo de entrada | Suma | Acarreo de salida |
|---|---|---|---|---|---|
| Vale 1 | 1 | 1 | 0 | 0 | 1 |
| Vale 2 | 0 | 1 | 1 | 0 | 1 |
| Vale 4 | 1 | 1 | 1 | 1 | 1 |
| Vale 8 | 0 | 0 | 1 | 1 | 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cuando el resultado no cabe
Un sumador guarda un número fijo de bits. Con números sin signo, el acarreo que sale de la posición de arriba se pierde y el resultado da la vuelta.
Con signo, la prueba es otra. 0101 + 0011 es 8, pero en complemento a dos de 4 bits 1000 se lee como -8. Dos positivos han dado un negativo. Eso también es desbordamiento, aunque no haya salido ningún acarreo.
Escribe un programa que suma 180 y 90
printf '.globl _start\n_start:\n li a0, 180\n li a1, 90\n add a0, a0, a1\n li a7, 93\n ecall\n' > suma.sSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ensámblalo
riscv64-linux-gnu-as suma.s -o suma.oSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Enlázalo
riscv64-linux-gnu-ld suma.o -o sumaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecútalo en el emulador
qemu-riscv64 ./sumaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lee el estado de salida
echo $?Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que desbordar siempre significa que sale un acarreo por arriba. Eso solo vale sin signo. En complemento a dos, 1111 + 0001 saca un acarreo y, aun así, -1 + 1 = 0 es correcto. Con signo hay desbordamiento cuando las dos entradas tienen el mismo signo y el resultado tiene el contrario.
Para ir más lejos: restar con un sumador
El procesador no tiene un circuito aparte para restar. Calcula a - b como a + (NOT b) + 1, porque NOT b + 1 es -b en complemento a dos.
Escribe subtract(a, b) con tu add_bits: invierte cada bit de b, súmalo a a y después suma 0001. Prueba 0110 - 0010 y 0010 - 0110. Luego piensa cómo podría el circuito ahorrarse la segunda suma.