Bases de la computación clásica

CPU

La computación cuántica es un campo que está en constante crecimiento y cada vez observamos nuevos entes tecnológicos unirse a la carrera cuántica, además de traer consigo una enorme oleada de jóvenes interesados por este campo. Por ello, comenzaremos nuestra aventura en esta área del conocimiento explicando algunos de los conceptos básicos de nuestra ya conocida computación clásica, de manera que nos coloquemos en el mismo punto de partida en el cual sepamos qué es un bit, cómo hace un computador para interpretarlos, qué es una memoria y como funciona. Tocando cada uno de los puntos esenciales que sirvieron como antecedentes para dar paso a la revolución de la información en la que vivimos hoy en día y adentrarnos dentro del nuevo mundo de la computación cuántica.

Un mundo de bits

Seguramente has escuchado muchas veces que los computadores funcionan procesando la información a través de bits, pero ¿qué es exactamente un bit? Para contestar a esta interrogante primero recordemos lo que es un sistema de numeración. Un sistema de numeración viene de la necesidad del ser humano de contar y es simplemente, una manera de representar cantidades a través del uso de símbolos, por ejemplo, nosotros utilizamos el sistema decimal el cual recibe su nombre ya que disponemos de 10 símbolos (del 0 al 9) y a partir de una combinación de estos podemos construir cualquier cantidad que queramos representar.

Ahora, ¿que tiene que ver esto con la computación? Bueno, pensemos en el reto al que se enfrentaron los pioneros en electrónica y en computación al tratar de codificar las cantidades que estamos acostumbrados a representar en nuestro día a día. ¿De que manera se podría construir un dispositivo capaz de detectar 10 dígitos distintos?, ¿qué materiales nos permitirían llevar esa abstracción matemática a dispositivos de la vida real?

De haber elegido este camino quizá no hubiésemos llegado a ningún lugar ya que, nuestro primer reto a resolver para codificar información en un dispositivo físico estaría en encontrar la manera de que este detecte que esta presente o no una cierta cantidad física medible y, como sabemos, el principio de la electrónica y de la computación se basa en la detección y control de la corriente eléctrica que circula a través de un material conductor. De aquí es donde aparece la necesidad de utilizar un sistema de numeración que tenga dígitos que solo puedan tomar 2 valores distintos (0 y 1), representando la detección o no detección de una corriente eléctrica; y así es como llegamos al uso del famoso sistema binario en el cual, en su implementación en electrónica, le llamaremos bit a cada uno de estos dígitos binarios que pueden tomar uno de dos posibles estados, 0 o 1, verdadero o falso, etc. De esta manera los bits se convertirán en nuestra unidad fundamental de información dentro de la electrónica y la computación.

Manipulando bits

Ya sabemos como representar la información utilizando bits, pero ahora necesitaremos encontrar la forma de manipular esta información. En este punto podemos preguntarnos, ¿Hay una manera de llevar nuestros conceptos de lógica y matemáticas a un equivalente en el mundo de los bits?

Bueno, para nuestra suerte ya se había desarrollado lo que hoy en día conocemos como álgebra de Boole, un método que permite trabajar de manera algebraica con expresiones lógicas y es gracias a esto que, posteriormente, pudimos introducir estos conceptos a nuestros circuitos eléctricos utilizando nuevos dispositivos llamados compuertas lógicas. Estos son dispositivos que realizan una función lógica u otra función como efectuar una suma, multiplicar, invertir el valor de entrada, entre otros. A pesar de ser un concepto muy adoptado en la electrónica no es exclusivo de esta, ya que también podríamos hacer una implementación mecánica, hidráulica o neumática; el reto de esto es encontrar los materiales o dispositivos físicos que nos permitan replicar ese comportamiento.

Por ahora, nos concentraremos en sus aplicaciones en electrónica. Tenemos compuertas muy conocidas como la AND, la cual realiza una conjunción lógica o, el equivalente en el español, el uso de la preposición «Y «; la compuerta OR que realiza una disyunción lógica o un equivalente a nuestra preposición «O«, la compuerta NOT que invierte el valor de entrada, entre otras. Cada una de estas compuertas tiene asociada algo que llamamos tabla de verdad, la cual es una tabla que nos ayuda a visualizar los valores de salida que obtendremos por cada combinación de bits de entrada.

De todas las compuertas lógicas existe una con una propiedad muy particular, siendo esta la compuerta NAND, la cual se puede visualizar como una compuerta AND seguida de una compuerta NOT, o sea, una AND con las salidas invertidas. Podrás preguntarte, ¿qué hace tan interesante a esta compuerta? Bueno, resulta que tiene la maravillosa propiedad de que a partir de una combinación de varias de estas podemos construir cualquiera de las otras compuertas lógicas. A esta propiedad se le suele llamar Functional completeness o de Completitud funcional. Lo que implica que podremos construir cualquier función lógica utilizando únicamente esta compuerta. Y eso no es todo, también implica que solo tenemos que encontrar la forma de construir un dispositivo físico que logre replicar su comportamiento para, posteriormente, replicar dentro de nuestros dispositivos cualquier función lógica que imaginemos.

Construcción del resto de compuertas lógicas utilizando compuertas NAND. (Imagen tomada de: electronics-tutorials.ws)

Construyendo operaciones matemáticas

Podríamos decir que encontramos la manera de codificar el concepto de número y los conceptos básicos de lógica dentro de nuestros circuitos. Ahora, podemos pensar en dar el siguiente paso para llevar nuestras abstracciones matemáticas al mundo digital, en concreto, en trasladar los conceptos básicos de la aritmética como la suma, resta y multiplicación.

Gracias al esfuerzo de todas las personas que trabajaron en esta área se lograron desarrollar conceptos como el de sumador, restador, decodificador, etc. Los cuales son circuitos construidos a través de compuertas lógicas que permiten replicar comportamientos más complejos, entre ellos, el de algunas de nuestras operaciones aritméticas básicas.

En un medio sumador por ejemplo, se trata de replicar el comportamiento de una suma binaria en principio de 2 bits donde, para los casos donde solo uno de los bits tenga el valor 1 el resultado de nuestra suma será 1, pero en el caso donde ambos sean 1 necesitaremos de la ayuda de otro bit para poder representar el numero 2 en binario (10), a este bit auxiliar le llamaremos bit de acarreo o carry.

medsum
Construcción de un medio sumador usando compuertas lógicas. (Imagen tomada de: compilandoconocimiento.com)

Otro ejemplo sería el medio restador que, cómo su nombre lo indica, es un circuito que replica el comportamiento de una resta binaria entre 2 bits (X y Y), donde queremos encontrar la diferencia resultante entre estos. Podemos visualizar en la figura de abajo y en la tabla de verdad que es un circuito muy similar al medio sumador, con la diferencia de que una de las entradas del carry anterior está negada usando una compuerta NOT, esto nos permite convertir nuestro carry en un bit que almacene los «prestamos» de la substracción y le llamaremos borrow.

Construcción de un medio restador usando compuertas lógicas.(Imagen tomada de: compilandoconocimiento.com)

Hecho esto, ya podemos operar con bits de una manera muy similar a como operamos con números. Estamos haciendo operaciones matemáticas manipulando la corriente eléctrica o, en su nivel más fundamental, manipulando electrones.

Después de esto, surgió la idea de crear un circuito que se dedicara únicamente de realizar estas operaciones lógicas y matemáticas, funcionando como la pieza fundamental de nuestro «cerebro electrónico«. Y a este circuito se le dio el nombre de ALU (por sus siglas en inglés de Arithmetic Logic Unit).

Memorizando bits

Hasta este punto ya disponemos de los elementos básicos que nos permitirán refinar nuestros circuitos a tal grado de que ya podamos darle solución a una gran cantidad de problemas, permitiéndonos hacer nuestros primeros cómputos de manera digital, pero seguimos teniendo un inconveniente y es que, aún no tenemos un dispositivo capaz de mantener o almacenar esa información en algún sitio. Producto de esa búsqueda se desarrolló lo que hoy en día conocemos como flip-flop o biestable, pero antes de hablar de ellos expliquemos un concepto muy importante para entenderlos, el concepto de clock o señal de reloj.

Un clock sigue siendo una señal binaria que solo puede tener un valor de 0 o 1, pero con la peculiaridad de que, cambiará sus estados de 0 a 1 y de 1 a 0 de forma periódica. Imaginemos que queremos que nuestra señal se active en 1 siempre y cuando, la señal rebase una barrera mínima de 5 volts, entonces, si tenemos 4.9 volts o menos recibiremos un 0 y si tenemos 5 volts o más recibiremos un 1. Ahora, imaginemos que nuestra señal cambiará de estado cada segundo, así que decimos que tenemos un ancho de pulso de 1 segundo (dura un segundo en 1 y otro segundo en 0).

Representación de una señal de reloj.
(Imagen tomada de: set-up.es)

A las transiciones de estados de 0 a 1 le llamaremos flanco de subida y a las transiciones de 1 a 0 le llamaremos flanco de bajada, posteriormente podremos configurar nuestros dispositivos para que funcionen detectando una u otra.

D Type Flip-flops
Construcción de un flip-flop tipo D. (Imagen tomada de: learnabout-electronics.org)

Ahora sí, podemos pasar a explicar qué es un flip-flop. Estos siguen siendo dispositivos construidos a partir de compuertas lógicas, pero tienen un detalle especial ya que recibe una retroalimentación en su construcción interna, lo que condiciona sus salidas y mantiene su valor anterior. Veamos primero el caso más sencillo que es el flip flop tipo D, este flip flop es muy sencillo, pero muy importante ya que a partir de este concepto se construyeron otros más complejos.

Tenemos 2 entradas, una para nuestro dato (D) y otra para la señal de reloj (CK). El funcionamiento, que podemos leer de su tabla de verdad, es el siguiente; si la señal de reloj no esta activada, no importa que dato este en la entrada ya que todo permanecerá sin cambios y en caso de recibir una señal de reloj, «copia» el valor de D en la salida Q. A pesar de parecer un poco trivial el funcionamiento de este dispositivo realmente tenemos un concepto muy importante frente a nuestros ojos, y es que, mientras la señal de reloj no se active de nuevo, mantendremos el estado anterior, es decir, ¡estamos memorizando el dato anterior!

¿Y qué pasa si quiero almacenar más de un solo bit? Para ello podemos juntar varios flip-flops en una configuración que se conoce como un registro. Estos registros irán variando dependiendo de que tipo de flip-flops implementemos y de la forma en que los conectemos entre si, permitiéndonos trabajar con los bits uno por uno (en serie) o con todos al mismo tiempo procesándolos como una cadena de bits (en paralelo), pero cualquiera de las implementaciones parte del concepto fundamental que vimos anteriormente.

Recordemos que los bits en principio no significan nada, solo representan el paso o no de una corriente, somos nosotros quienes los dotamos de significado según la configuración en la que los disponemos; así que podemos guardar estos bits en registros y dividirlos según su función o según lo que representen para nosotros. Lo primero que puede pasar por nuestra mente es crear un registro en donde guardaremos nuestros datos, aquellos bits que representen por ejemplo, números enteros, nuestros caracteres, etc. Todos aquellos bits que representen información importante para nosotros y que se vinculan entre si dentro de nuestros mecanismos digitales, los alojaremos en un registro que llamaremos el Registro de Datos. Después, podemos pensar en crear un registro especial donde guardaremos nuestras instrucciones de cómo vamos a operar con los datos y que vamos a hacer con ellos, básicamente el lugar donde guardaremos aquellos bits que controlen las ejecución a realizar dentro de nuestro circuito, por ello le llamaremos registro de Instrucciones. Sin olvidar que necesitaremos de un registro que almacene aquellas direcciones a seguir para llegar al lugar correcto de nuestro circuito y efectuar las instrucciones correctas con los datos correctos, una especie de via de conexión entre ambos, a este registro le llamaremos registro de direcciones de memoria.

Estos solo son unos pocos ejemplos de los registros que se implementan, pero por ahora mencionaremos solo esos 3 para explicar el concepto esencial.

Ensamblando todas las piezas

Recordemos que uno de los motivos principales del desarrollo de la electrónica y, posteriormente, el de la computación; fue el automatizar nuestros cómputos o cálculos y además, encontrar la manera de codificar de alguna forma las capacidades de la mente humana. Así que era válido preguntarse si existía alguna manera de plasmar algo similar a nuestro cerebro llevado al ambiente digital, algo así como un cerebro a base de bits. Todo parecía indicar a que ya teníamos todas las piezas necesarias, comenzábamos a plasmar nuestras abstracciones matemáticas en dispositivos electrónicos, encontramos la forma de llevar el concepto de la memoria al mundo digital y comenzábamos a trabajar realmente con información. ¿Qué era lo que nos faltaba?

Una forma de conectar y controlar todo. De aquí es de donde nace el concepto de la unidad de control. Esta pieza de lo que se encarga es de buscar las instrucciones que nos indicarán como manipular la información y a continuación, se encargará de decodificarlas e interpretarlas asegurándose de que nuestro sistema ejecute dicha instrucción, algo así como el supervisor de nuestra maquinaria digital. Esto se puede lograr creando circuitos eléctricos que describan una secuencia o proceso a realizar con los datos una vez que se presenten las instrucciones o señales requeridas. (circuitos secuenciales).

Ahora, ya tenemos nuestras piezas fundamentales de nuestro «cerebro digital», disponemos de una unidad que se encarga de realizar todas las operaciones lógicas y aritméticas (ALU), de otra unidad que se encarga de almacenar la información en forma de bits y retenerla hasta que la requiramos (Registros) y tenemos a nuestro elemento principal que se encargará de supervisar que todas las piezas de nuestro mecanismo funcionan correctamente y logren comunicarse entre si (Unidad de Control) y juntando todo esto, tenemos los 3 pilares fundamentales de lo que hoy en día conocemos como CPU, por sus siglas en inglés de Central Processing Unit.

Esta pieza en su conjunto es la encargada de realizar todo el trabajo duro, realiza todos nuestros cálculos y nos brinda la posibilidad de experimentar con aquel poder computacional con el que nuestras mentes humanas y limitadas solo podían soñar.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *