Story Transcript
ELECTRÓNICA
La inteligencia digital Juan Manuel Andrade Morales
La inteligencia de todas las máquinas actuales radica en la inteligencia digital, cuya base se intenta revelar en el presente artículo. A lo largo de él, usted podrá saber dónde está la magia, podrá entender que con un pin el procesador piensa, con una pata el procesador toma la decisión de hacer el proceso A o el proceso B. Podría pensarse que los Microprocesadores piensan con las patas y aunque esto es parcialmente cierto, se han requerido por lo menos 150 años de pensamientos humanos para lograr que estos pensamientos digitales, que aunque elementales, lleguen a tener utilidad y de que manera, mire a su alrededor y encontrará: teléfonos celulares, Internet, robots, tomografía axial computarizada, resonancia magnética, satélites, refinerías de petróleo automatizadas, toda la industria química farmacéutica automatizada, máquinas para hacer billetes etc. Se trata del invento del siglo. Con él se pueden hacer todos los juguetes que se imaginen y de paso se puede ganar mucho dinero; pueden hacerse juguetes de unos dólares hasta juguetes de millones de dólares (miren la exploración espacial), con ellos se puede mejorar el aparato productivo y recreativo de cualquier país y por lo tanto solucionados algunos problemas sociales, obtener la riqueza y la paz necesaria para vivir mejor. Luego de leerlo cuidadosamente, usted entenderá las bases de la Inteligencia Electrónica. Las redes neuronales y la lógica fuzzy serán tema de próximos artículos, ya que éstas representan desarrollos de matemáticas y software que deben ser tratados primero en su abstracción lógico-matemática y después compilados para su tratamiento digital. Ingeniero electricista. Especialista en electrónica. Magister en sistemas. Estudios de maestría en telecomunicaciones e informática
Este artículo está escrito con el deseo de explicar de la mejor manera posible el fenómeno de la inteligencia de los computadores; sin embargo, se requiere que el lector haya tomado un curso previo de sistemas electrónicos digitales donde se hayan tratado los siguientes temas: lógica combinatoria: decodificadores, codificadores, multiplexer, demultiplexer, unidades aritmeticológicas, memorias ROM; lógica secuencial: registros, memoria RAM, registros de desplazamiento, contadores, contadores con carga en paralelo, máquinas generadoras de secuencias, máquinas generadoras de secuencias condicionales con base en contador, ROM, MUX. La aproximación a la inteligencia que han hecho los sistemas digitales está ligada a la interpretación de abstracciones mentales tipo: SI PASA TAL CONTIGENCIA, ENTONCES haga este proceso; SI NO, haga este otro proceso. Al mirar cualquier lenguaje de alto nivel, estructurado o no, se encuentran instrucciones como IFTHEN- ELSE, DO- WHILE-, REPEAT-UNTIL-; o en los lenguajes de máquina en donde se hallan las instrucciones BRANCH. Estas instrucciones representan las abstracciones mentales en la toma de decisiones, dependiendo de condiciones o contingencias que suceden al azar. En el gráfico 1 se explica esta estrategia de pensamiento digital.
32 / Revista Escuela Colombiana de Ingeniería No. 40
Como se puede observar en la figura 1, vemos una representación de la solución de un problema que consiste en ejecutar el proceso 1, luego el 2 y luego el 3; sin embargo, después de ejecutar este último no se puede seguir con el proceso 4 si suceden algunas contingencias o condiciones. Si se cumplen algunas condiciones que puede arrojar el proceso 3 se debe volver al proceso 2 y sólo en el caso de que éstas no se cumplan se puede pasar al proceso 4, luego al 5 y acabar. Esto representa lo más
Figura 1
Octubre-Diciembre 2000
ELECTRÓNICA
Figura 2. RAM o ROM del usuario.
clásico en rutas de pensamiento para solucionar problemas cotidianos en las oficinas, en las fábricas y aun en la vida afectiva (en casos simples); no se incluye aquí un procesamiento paralelo, pero éste se puede subdividir en varios procesamientos secuenciales interconectados. La inteligencia digital está representada en la capacidad que tienen los procesadores de interpretar la instrucción IF, THEN, ELSE la más importante de cualquier sistema de desarrollo computacional. Con ella un programador le dice al computador que verifique el cumplimiento de una condición. Después de verificar la condición, el procesador debe estar en capacidad de tomar decisiones: si se cumple la condición debe hacer el proceso A; si no, debe realizar el proceso B. La sintaxis básica en un lenguaje de alto nivel es la siguiente: IF, una condición. THEN, haga el proceso A. ELSE, haga el proceso B. Compilada esa instrucción, termina en un grupo de códigos de máquina ejecutables por el procesador. Las condiciones clásicas verificadas después de hecha la compilación son, entre otras, si hubo CARRY o no Octubre-Diciembre 2000
lo hubo, si Z vale 1 o si Z vale 0, si hubo interrupción o no la hubo, si hubo half carry o no. Para explicar en detalle cómo se puede construir una máquina que tenga la capacidad de ejecutar este tipo de instrucciones, el estudiante se debe introducir en los sistemas electrónicos digitales. Lo primero que hay que pensar es cómo se va a disponer la máquina para que un diseñador de software la pueda programar, partiendo del hecho de que éste implemente un algoritmo en un lenguaje de alto nivel desde un teclado, y el programa compilador deposite el código binario ejecutable en una memoria RAM como la mostrada en la figura 2. Existe también la opción de programar directamente en lenguaje de máquina. En ambos casos la instrucción por ejecutar queda como lo muestra la figura 2, en las localizaciones n y n+1. Como observamos en la memoria, el compilador deja en localizaciones consecutivas un código de operación, una dirección y otro código de operación. Considérese este tipo de estructuras de códigos, para efectos de la explicación, de la siguiente manera: El código de operación COD.OP X localizado en n, que representa el tipo de instrucción que pregunta por una condición. El código localizado en n+1, llamado dirección, representa una dirección de la memoria a partir de la cual está el proceso 2 por ejecutar en caso de que se cumpla la condición. Consideremos que el código COD.OP Y, grabado en n+2, representa el proceso 4. Las posibilidades de que un sistema físico diferente del cerebro humano tenga inteligencia son muy remotas; sin embargo, si construimos una máquina capaz de procesar
las instrucciones grabadas en la memoria de la figura 2, podría ser muy útil aunque, hay que aceptar, esta es una aproximación minúscula al cerebro humano. Con este artículo tan sólo se pretende explicar la posibilidad que tiene un microprocesador, un microcontrolador o un DSP, de tomar decisiones dependiendo de contingencias no predecibles. Los fenómenos de aprendizaje en redes neuronales y el procesamiento en paralelo serán tema de otro artículo. Las operaciones clásicas en los sistemas digitales siguen siendo la suma, la resta, la división, la multiplicación, la comparación, la traslación y la rotación. De estas operaciones se puede sacar información que permita tomar decisiones dependiendo de las condiciones que arroje un proceso de datos. Son condiciones clásicas en el mundo digital el que una respuesta o una resta sea cero o mayor que cero, o que sea un número negativo; si estas respuestas obedecen a una resta, el que dé cero significa que los operandos eran igua-
Figura 3. Aritmetic Logic/Unit (ALU).
Revista Escuela Colombiana de Ingeniería No. 40 / 33
ELECTRÓNICA
les, el que dé mayor que cero significa que el minuendo era mayor que el sustraendo y el que dé menor que cero significa que el minuendo era menor que el sustraendo. Fácilmente se podría pensar en inventar una máquina que hiciera las operaciones y a la que se le pudiera preguntar posteriormente por los resultados. La máquina que ejecuta las operaciones es conocida por la mayor parte de los ingenieros como ALU (Aritmetic Logic/Unit). En un curso básico de sistemas electrónicos digitales, un ingeniero aprende a diseñarlas. Al observar el gráfico 3 se ve una ALU que podría hacer cuatro operaciones gobernadas por los códigos de operación Cφ1 y Cφ0. En el cuadro 1 la unidad aritméticológica es capaz de hacer las operaciones de suma, resta, AND y OR. Figura 4. Creación de códigos de condición.
Cuadro 1 Cφ1
Cφ0
0 0 1 1
0 1 0 1
Suma Resta And Or
Con las operaciones que sabe hacer la ALU se pueden preguntar muchas cosas, sólo que no se le puede preguntar prosaica sino electrónicamente. Para ello es necesario tomar todos los bits de la respuesta e introducirlos en una humilde compuerta NOR que podrá avisar en su salida que la respuesta fue cero. Hágase la operación NOR en una respuesta que sea cero en todos sus bits: 0+0+0+0 Por las leyes de De Morgan 0+0+0+0 = 1.1.1.1= 1 si y solamente si cuando todos los bits de las
respuesta son cero, la salida de la NOR es uno; a esta salida de la NOR se la llamará Z (ver figura 4). A la máquina de esta figura se la llamará de aquí en adelante procesador de operandos. Si alguno de los bits de la respuesta no es cero, la salida de la NOR es cero, y avisa de esta manera que la respuesta no fue cero. Compruébese esto: 0+0+1+0 Esto es igual a 1.1.0.1 = 0 Otra condición que avisa detalles importantes del proceso es el carry o el llevo tanto de su primer año de primaria, cuando usted aprendió a sumar; sólo que este carry o llevo tanto se obtiene después de sumar los bits de mayor valencia (recordar el diseño de unidades aritmetico-
34 / Revista Escuela Colombiana de Ingeniería No. 40
lógicas). El carry (C) y el Z son, entre otros, los códigos de condición más comunes y tal vez los más importantes porque dan suficiente información sobre el estado del proceso. Así como el Z avisa si una respuesta fue 0 o no, el carry avisa que una respuesta no se puede representar en n bits sino en n + 1 bits. Además, ayuda a identificar si una respuesta fue positiva o negativa. Estos dos códigos de condición (C , Z) se deben memorizar en un registro de código de condición (RCC) (ver figura 4). Generalmente, el registro que memoriza el carry, para darle más potencialidad al microprocesador, no sólo es alimentado por el carry de la ALU sino también por el bit más significativo (bMs) o el bit menos significativo (bms) del registro Octubre-Diciembre 2000
ELECTRÓNICA
Figura 5. Fuentes de información del registro carry.
de respuesta, siendo este último también un registro de desplazamiento. Esta alimentación del registro carry se hace a través de un MUX (ver figura 5), y con los seleccionadores CMUX1 CMUX0 se elige cuál se carga en el carry (recordar diseño de multiplexer). Estas dos fuentes de información de estado del proceso (Z y C) son las que vamos a usar para explicar la toma de decisiones en un procesador de información. Z y C, previamente registradas, se introducen reales y complementadas en un multiplexer, que se llamará de aquí en adelante MUX.CC (multiplexer de código de condiciones) (ver figura 6). La salida del MUX.CC avisa con un contundente 1 si se cumple una condición o avisa con un 0 si no se cumple. Ahora el reto está en armar un rompecabezas digital que le permita interpretar a un procesador instrucciones que lo obligan a seleccionar alternativas en un proceso, dependiendo de que se cumpla o no una condición. Hay que recordar que estas instrucciones se llaman en lenguajes de alto nivel IF, THEN, Octubre-Diciembre 2000
ELSE, y en lenguajes de máquina o assembler, Branch; ambas se denominarán de aquí en adelante instrucciones de ramificación condicional. Una máquina que sea capaz de interpretar instrucciones de ramificación condicional chequea las condiciones mediante el MUX.CC y selecciona la condición que hay que examinar mediante los CMUXCC2, CMUXCC1, CMUXCC 0 (ver figura 6). La salida de este MUX.cc representa la respuesta a la condición examinada, resultado que debe provocar cambios en la ejecución de una instrucción.
Si la salida del MUX.cc es 1, se debe hacer un proceso que consiste en traer la dirección de la localización n+1 hasta depositarla en la máquina que gobierna las direcciones, como se explicará posteriormente(ver figuras 8, 9a y 9b); lo que se desea concretar aquí es que si se cumple una condición deben existir en alguna parte microinstrucciones para ejecutar la secuencia descrita anteriormente. Hay que repasar el diseño de la generación de secuencias mediante la combinación de contadores, ROM y MUX, recordando especialmente que dentro de la ROM están grabadas las microinstrucciones que indican cómo ejecutar una instrucción. Esta secuencia se deberá grabar a partir de una dirección de la misma ROM que contiene el procedimiento. La dirección a partir de la cual se va a colocar dicho procedimiento se llamará BRA, pero ésta es un código binario. La llamaremos BRA sólo para efectos de la explicación (ver figura 7). En este momento hay que hacer tres preguntas: 1. ¿De dónde sale BRA para que pueda tomar el control de las direcciones de la µROM?
Figura 6. Chequeo de condiciones mediante un multiplexer. Revista Escuela Colombiana de Ingeniería No. 40 / 35
ELECTRÓNICA
Quien recibe a BRA es un contador con carga en paralelo, porque éste debe recorrer la µROM a partir de BRA. Sin embargo, en caso de que no se cumpla la condición este contador con carga en paralelo debe recibir la dirección que le entregue el D.I., correspondiente a una nueva instrucción. 2. ¿Cómo hacemos para tener dos fuentes de direcciones, una para el caso de que se cumpla la condición y otra para el caso de que no se cumpla? 3. ¿Cómo lograr que la salida del MUX.CC gobierne el sistema de tal manera que si su salida es 1 se cargue en el contador, con carga en
paralelo, la dirección BRA, y en caso contrario, pase a una dirección de µROM correspondiente a traer una nueva instrucción? (proceso 4) (ver figura 1). Las soluciones a estas tres preguntas son, respectivamente: 1. BRA sólo puede estar grabada en un lugar fijo donde nunca se borre, por lo que lo podemos grabar en la misma µROM (ver figura 7). 2. Ésta se puede solucionar simplemente con un MUX que llamaremos de aquí en adelante MUX de control. 3. La tercera pregunta se resuelve colocando la salida del MUX.CC como control del contador con car-
ga en paralelo, de tal manera que si la condición se cumple el contador carga a BRA; esto significa que una línea de control proveniente de la µROM debe direccionar en ese instante al MUX de control para que BRA esté disponible a la salida de éste. En el caso de que no se cumpla la condición, el contador aumenta; por tanto, pasa a la siguiente microinstrucción y a partir de allí debe haber un procedimiento para traer la siguiente instrucción de la memoria externa (proceso 4)(ver figura 7). A esta máquina de aquí en adelante la llamaremos procesador de instrucciones.
Figura 7. Estructura básica de un procesador de instrucciones con posibilidad de interpretar operaciones de ramificación condicional.
36 / Revista Escuela Colombiana de Ingeniería No. 40
Octubre-Diciembre 2000
ELECTRÓNICA
Hasta aquí sólo podemos decir que la instrucción grabada en la localización n, (ver figura 2) en la memoria del usuario, ha sido llevada al bus de datos y de allí al decodificador de instrucciones. Este decodificador simplemente cambió el código de operación de la instrucción por una dirección de la µROM a partir de la cual están las microinstrucciones para ejecutar la instrucción. Ahora el trabajo consiste en grabar adecuadamente ceros y unos en cada bit de las microinstrucciones. Al observar la figura 7 vemos que cada bit de cada microinstrucción de la ROM del procesador de instrucciones corresponde a una línea de control de la máquina. Pensemos en qué estado binario colocar a CMUXcont, CMUXcc 2, CMUXcc 1 , CMUXcc 0 , CMUX 1 , CMUX 0 , CKcc, CRTA 1 , CRTA 0 , Cϕ 1 , Cϕ 0 , CK 1 , CK 2 , CKRTA, CCMUXR 1, R/W, CKCC. Pensar esto parece fácil, pero hay que ser muy cuidadoso porque existen operaciones que se logran hacer en un instante de tiempo pero otras requieren dos o tres instantes y, en algunos casos, más. Recordar control de procesos secuenciales usando ROM. Nos podemos ayudar en el diseño de microinstrucciones pensando en todos los pasos que se deben hacer cuando se quiere ejecutar la instrucción ramifique si Z vale 1. Podríamos decir que ésta consta de los siguientes pasos: 1. El MUXcc debe direccionarse por CMUXXcc 2 , CMUXcc 1 , CMUXXcco, para que E2 pase a la salida. E2 contiene la información de Z (ver figura 7). 2. Dependiendo de que la salida del MUXcc sea uno o cero el CAR cargará o contará, repetitivamente; Octubre-Diciembre 2000
recordemos que si carga es porque se cumplió la condición y si cuenta es porque no se cumplió la condición. Si carga, se carga la dirección BRA. A partir de la dirección BRA deben estar las microinstrucciones necesarias para traer la dirección de memoria externa contenida en n+1 (ver figura 8), y colocarla como nueva dirección en el contador de programas (PC). A partir de esta dirección se vuelve a ejecutar el programa (ver figura 1). 3. Si no se cumple la condición, a la línea de control del CAR llegará un cero y el CAR contará, y en la ROM del procesador de instrucciones aparecerá en el bus de datos el contenido de la dirección DI+1 (DI +1 significa la dirección siguiente a la última dirección entregada por el DI). A partir de esta dirección de-
ben estar las microinstrucciones necesarias para traer de la memoria externa el código de operación de la nueva instrucción contenido en n+2. Este código de operación de la nueva instrucción debe entrar a DI y producir una nueva dirección que estará en las puertas del MUX de control y se cargará en el CAR (ver figura 7). Nuevamente se leerán las microinstrucciones correspondientes a una nueva instrucción, y los ciclos lectura y ejecución de una nueva instrucción se repetirán hasta encontrar la instrucción pare. Como se puede concluir, existe la necesidad de construir dos máquinas más para completar nuestro diseño: una que gobierne el bus de direcciones y otra que reparta coherentemente instrucciones, direcciones y operandos.
Figura 8. Repartidor de instrucciones, direcciones y operandos. Revista Escuela Colombiana de Ingeniería No. 40 / 37
ELECTRÓNICA
2. Colocar sobre el bus de direcciones códigos o direcciones no consecutivos, y después de hacer operaciones de lectura o escritura sobre la memoria, hay que volver sobre los códigos consecutivos. Cuadro 2 CDMUX1 CDMUX0 Salida del DEMUX 0 0 1
Figura 9a. Procesador de direcciones (borrador).
Los operandos irán hacia los registros R1 y R2, registros de trabajo que rodean la ALU (ver figura 3). Las direcciones pasarán a tomar posesión del bus de direcciones, mientras que las instrucciones deben pasar al decodificador de instrucciones (DI) mediante algún proceso lógico. Sin el diseño de estas dos máquinas no se puede pensar todavía en el diseño de las microinstrucciones contenidas en la ROM del controlador (ver figura 7). Empecemos con el diseño del repartidor de operandos, direcciones e instrucciones. Un repartidor clásico es un demultiplexer (ver figura 8). Con esta máquina podemos tomar la información proveniente de la memoria externa y con el control de las líneas CDMUX1 y CDMUX0, dirigir la información hacia las salidas del demultiplexer correspondientes a instrucciones, operandos y direcciones, dependiendo del caso (ver cuadro 2). Diseñemos ahora la máquina que procesa direcciones:
Para hacer este diseño hay que pensar en las especificaciones que debe tener esta máquina, las cuales son: 1. Recorrer direcciones consecutivas.
0 1 0
Direcciones ← Bus de datos Operandos ← Bus de datos Instrucciones ← Bus de datos
3. Ser capaz de empezar una secuencia a partir de cualquier número. Este es el caso de los saltos condicionales que hemos venido explicando. Para satisfacer estas tres cualidades de la máquina se debe pensar con mucho orden. Primero, recorrer direcciones consecutivas, lo cual se logra con un contador. Sin embargo, hay que pensar que sobre el bus de direcciones, en un momento dado, puede estar una dirección fuera de
Figura 9b. Procesador de direcciones (diseño final).
38 / Revista Escuela Colombiana de Ingeniería No. 40
Octubre-Diciembre 2000
ELECTRÓNICA
secuencia; esto lo podemos lograr con una combinación de un contador con registro independiente y un MUX y tener así dos fuentes posibles de direcciones: una dirección en secuencia proveniente del contador y otra dirección fuera de secuencia proveniente de la memoria externa (ver figura 9a). Para cumplir con la tercera condición es necesario modificar la máquina de la figura 9a cambiando el contador por un contador con carga en paralelo, con el fin de que éste reciba los códigos a partir de los cuales se va a empezar un proceso en el caso de que se cumpla una condición (ver figura 9b). Uniendo todas las máquinas diseñadas hasta aquí, tendremos la es-
tructura básica de un procesador inteligente (ver figura 10). Con el deseo de explicar la diferenciación entre direcciones, operandos e instrucciones se colocó un DEMUX para recibir al bus de datos; sin embargo, este dispositivo nos lo podemos ahorrar usando un registro de datos, gracias a lo cual la información se depositará en el dispositivo destino que esté activado. Ahora, si juntamos todas las máquinas diseñadas, tendremos la estructura básica de un procesador inteligente (ver figura 10). Una máquina como la de la figura 10, agregándole interfaces de entrada y salida, puede emplearse para gobernar inteligentemente un avión, un barco, un submarino, un robot,
un GPS, un auto, un teléfono celular, un tomógrafo axial (TAC), una red de computadores local o una red de computadores grande como internet, un satélite, una refinería de petróleo, una máquina para hacer llantas, una máquina para hacer billetes, una máquina para hacer lo que usted quiera, etc. Esto, a mi juicio, es el invento del siglo; representa, solucionados los problemas sociales, la posibilidad de mejorar el aparato productivo de cualquier país, y por tanto la calidad de vida del mismo.
BIBLIOGRAFÍA Hayes, John, Computer Architecture and Organization, McGraw Hill. Hill and Peterson, Digital Systems, Prentice Hall. Morris, Digital Logic and Computer Design, Prentice Hall
Figura 10. Estructura básica de un procesador.
Octubre-Diciembre 2000
Revista Escuela Colombiana de Ingeniería No. 40 / 39