MICROPROCESADOR
Un microprocesador es un circuito de alta escala de integración (LSI), compuesto de muchos circuitos mas simples como son los Fip-flops, contadores, registros, decodificadores, comparadores, etc; todos ellos en una misma pastilla de silicio, de modo que el microprocesador puede ser considerado un dispositivo lógico de propósito general o universal. Todos estos componentes que llevan a cabo físicamente la lógica y operación del microprocesador se denominan el hardware del micro. Además existe una lista de instrucciones que puede realizar o acciones que puede llevar a cabo el micro. Éstas constituyen el lenguaje del micro o software.
Pongamos de ejemplo un micro que puede realizar cuatro tareas lógicas: AND, OR, NAND, XOR. Estas cuatro acciones serian el lenguaje del micro y a cada una le corresponderá una combinación binaria de dos dígitos.
Acción
|
Código
|
AND
|
00
|
OR
|
01
|
NAND
|
10
|
XOR
|
11
|
Operaciones y su código (figura 1)
El hardware quedaría de la siguiente manera:
En este ejemplo se puede ver claramente lo que es un microprocesador. Las señales de control son las que ejecutan cada una de las cuatro instrucciones que el micro puede realizar. Los datos se presentan en las líneas A y B.
Sin embargo, en la actualidad se requiere que un sistema cuente con una unidad de control, unidad aritmético / lógica y algunos registros para que se le pueda denominar microprocesador. La forma en que están conectados estas unidades se denomina la organización de un microprocesador.
Los sistemas digitales simples pueden ser diseñados por medio de tablas de estado. De esta manera se llega a circuitos lógicos secuenciales de grado no muy complejo. Sin embargo, a la hora de diseñar circuitos lógicos complejos las tablas de estado se tornan increíblemente complicadas, extensas y poco prácticas. Una manera de poder llegar a este tipo de circuitos es describir el sistema digital desde el punto de vista operacional. De esta manera se encuentran cuatro partes fundamentales en los sistemas digitales complejos:
- Registros
- Información en código binario
- Operaciones realizadas con la información en los registros
- Funciones de control que inician las operaciones.
Esta manera de ver al sistema (operacionalmente) se conoce también como lógica de transferencia ente registros y fue sumamente útil en el diseño de sistemas lógicos complejos como los sistemas de procesamiento o procesadores. En la lógica de transferencia entre registros la unidad registro abarca una gran gama de circuitos lógicos como son los contadores, registros de desplazamiento, unidades de la memoria, etc. Una unidad de memoria se considera como una colección de registros de almacenamiento donde se guarda la información. De hecho, un flip-flop se considera como un registro de un bit. La información binaria puede ser código, números binarios, decimales codificados en binario, etc. Dicha información es guardada en los registros antes mencionados. Las operaciones realizadas con la información en los registros se conocen como microoperaciones. Una microoperación es una operación elemental que se realiza en paralelo durante un periodo del pulso de reloj. Por ejemplo, sumar, restar, desplazar, borrar, cargar, etc. Las funciones de control, son las condiciones que deben de prevalecer para iniciar una secuencia de operación.
- Es necesario a este punto normalizar el lenguaje de transferencia que se utilizará de aquí en adelante. En nuestro caso utilizaremos los siguientes símbolos:1.- Letras mayúsculas: Los registros son nombrados con letras mayúsculas como puede observarse en la figura 1.
- Fig 2. Símbolo de un registro de 4 bitsEn la figura anterior se muestra gráficamente cómo se representa un registro de 4 bits. Los números colocados en las esquinas superiores del rectángulo son la numeración de los bits que tiene el registro. La letra A es el nombre del registro.2.- Subíndices: En ocasiones es necesario conocer la información de cada uno de los bits de manera singular, para estos casos se puede dividir el registro en cada una de sus celdas numerándolas con subíndices.Fig 3. Registro A con cada uno de sus bits.Este tipo de registros se les conoce como direccionables bit a bit porque se puede tener control de cada uno de sus bits de forma independiente aunque juntos formen un solo registro.3.- Flechas: Teniendo un registro A y otro B podemos denotar la transferencia de la información del registro A al B de la siguiente manera:B ← A4.- Dos puntos: Para que esta transferencia pueda llevarse a cabo es claro que se necesita que las salidas del registro A deben estar físicamente conectadas con las entradas del registro B. Y no es eso lo único que se necesita; cada una de las operaciones realizadas entre los registros necesitan, como ya hemos mencionado antes, de una función de control, por ejemplo podría ser:X T2: B ← ALo que nos indica la expresión anterior es que se necesita que la expresión X T2 sea verdadera para que pueda darse la transferencia. Esto es, X debe tener un valor "uno" lógico y también T2. ¿Cómo puede implementarse esto electrónicamente?Fig 4. Representación gráfica de la función XT2: B ← A.Como puede observarse en la figura 3 existe una parte de control para determinar en que momento se lleva a cabo la transferencia de información. Si solo X tiene un valor "uno", el circuito de control no manda señal de carga al registro B. Es necesario que ambos, X y T2 tengan valores de "uno". Cada proposición escrita en lenguaje de transferencia de registros implica una construcción conmateriales electrónicos para configurar dicha transferencia.5.- Coma: Es posible realizar dos o mas operaciones de transferencia entre registros bajo las mismas condiciones de una función de control. Esto se expresa de la siguiente manera:X T2: B ← A, R ← ACada microoperación es separada de la anterior por medio de una coma. Gráficamente esto se representa como muestra la figura 4.Fig 5. Representación gráfica de la función XT2: B ← A, R ← AEs sencillo, la misma señal de carga sirve para activar el registro B y el registro R. Lógicamente es necesario que las salidas del registro A estén físicamente conectadas con las entradas del registro B y R.Estas líneas de conexión (alambre físicamente) para lograr la transferencia entre los registros conforman el bus del microprocesador. Para transferencias en paralelo el numero de alambres del bus será igual al numero de bits de cada registro. Existen varias formas de implementar un bus, sin embargo, la mas simple en cuanto a su comprensión es utilizar un bus multiplexado. Si necesitamos transferir información entre tres registro A, B y C como muestra la figura 6 necesitaremos multiplexar en ocasiones al bus.fig 6. Interconexión entre tres registros.Como se puede observar en la figura 6, el registro A puede recibir información de los registro B y C. Esto puede crear un conflicto en las líneas del bus. Si el registro B tiene en sus salidas 0000, suponiendo que es de 4 bits, y el registro C tiene 1111, tendríamos un corto circuito en las líneas del bus, ya que el registro A solo tiene cuatro bits de entrada, estos cuatro bits estarán conectados tanto a la salida del registro B como a las salidas del registro C. Para solucionar este conflicto se usarán multiplexores .Fig 7. Uso de multiplexores en el bus.De esta manera, el multiplexor se encargará de seleccionar al registro que debe mandar información una vez por tiempo evitando conflictos en el bus. Claro está que esto no lo realiza por si solo el multiplexor pues no cuenta con la suficiente lógica interna para poder desarrollar estas funciones. Se requiere de circuitería extra para poder manipularlo a nuestras necesidades.
- Lenguaje de transferencia.
- Microoperaciones básicas.
Carga en paralelo.
Quizás la microoperación mas sencilla y primordial es la de carga en paralelo ya que es la manera en que se transfieren datos de un registro a otro. Esta operación se representa por medio de las flechas como ya hemos visto anteriormente. Para explicar mejor lo que sucede cuando se realiza una operación de carga en paralelo supongamos que tenemos dos registros independiente como el A y el B. Cada uno tiene información como se muestra a continuación:
Fig 8. Dos registros con contenido diferente
Cada uno de los registros tiene información binaria diferente dentro de sí. Cuado nosotros realizamos una carga en paralelo B ← A la información que tenga el registro A se transfiere al registro B pero de una manera ordenada bit a bit. Esto es, el bit mas a la derecha del registro A pasará al bit mas a la derecha del registro B, el bit mas a la izquierda del registro A pasará al bit mas a la izquierda del registro B y así con todos y cada uno de los bits. A esto se le llama una carga en paralelo.
Fig 9. Transferencia en paralelo de información
Desplazamiento.
En un desplazamiento lógico se desplazan a la derecha o a la izquierda los bits contenidos en un registro. En un extremo, el bit saliente se pierde al desplazarse. En el otro extremo se introduce un cero. Estos desplazamientos son útiles para aislar bits dentro de un mismo registro.
Fig 10. Desplazamiento hacia la derecha.
Por ejemplo, si el registro A tiene información 1101 al realizarle un desplazamiento hacia la derecha tendría 0110 como contenido. Si se vuelve a aplicar un desplazamiento quedaría 0011. Ahora, supongamos que se le hace un desplazamiento hacia la izquierda, el registro A tendría 0110, si se le vuelve a aplicar el corrimiento tendría 1100. Como puede verse la información desplazada se pierde por completo en el caso de que sea un "uno" debido a que en el desplazamiento se ingresa un cero. En el lenguaje de transferencia entre registros esto se expresa:
Shl A, desplazamiento a la izquierda del registro A.
Shd A, desplazamiento a la derecha del registro B.
Fig 11. Resultado de un desplazamiento hacia la derecha
Rotación.
En la rotación se preservan todos los bits del registro ya que si se hace hacia la derecha el bit mas a la izquierda se coloca en lugar del bit mas a la derecha corriendo los demás una posición hacia la derecha.
Fig 12. Rotación hacia la derecha.
Si, por ejemplo, nuestro registro A tiene 0011 y hacemos una rotación hacia la derecha quedará la información como 1001. En lenguaje de transferencia ente registros estas operaciones de rotación pueden expresarse de la siguiente manera:
Rotd A, rotación a la derecha del registro A.
Rotl A, Rotación a la izquierda del registro A.
Aritméticas
Las microoperaciones básicas son sumar, restar y complementar. Todas las demás operaciones aritméticas puede obtenerse de una variación o secuencia de estas microoperaciones. La operación de multiplicación, en la mayoría de las computadoras, se ejecuta con una secuencia de microoperaciones de suma y desplazamiento. La división se ejecuta con una secuencia de microoperaciones de resta y desplazamiento. En la siguiente tabla se muestran las operaciones aritméticas consideradas básicas con su respectiva simbología.
Simbología
|
Descripción
|
F ← A+B
|
Suma el contenido de A mas B y carga en F
|
F ← A-B
|
Resta el contenido A menos B y se carga en F
|
B ← B’
|
Complemento a1 del registro B
|
B ← B’+1
|
Complemento a2 del registro B
|
F ← A + B’ + 1
|
Sumar A mas el complemento a2 de B y carga en F
|
A ← A+1
|
Incrementar el contenido de A en uno
|
A ← A-1
|
Decrementar el contenido de A en uno
|
Tabla 2. Microoperaciones aritméticas.
Nota: El apóstrofe delante de un registro indica que es el complemento de dicho registro o bien que esta negado su contenido.
Lógicas
Las microoperaciones lógicas especifican operaciones binarias para una cadena de bits almacenados en los registros. Estas operaciones consideran cada bit en los registros separadamente y lo tratan como una variable binaria. Esto quiere decir que las operaciones lógicas se realizan a nivel de bit. Por ejemplo, su mi registro A contiene 1011 y mi registro B 0010 y realiza la operación A and B, el resultado se logra de realizar las operaciones 1 and 0 (bits menos significativos) 1 and 1, 0 and 0 y 1 and 0 cuyo resultado es 0010. Las microoperaciones lógicas básicas son:
A’, negación o complemento del registro A
A٧ B, OR lógica ente A y B.
A٨B, AND lógica entre A y B
AӨB, XOR lógica entre A y B
La ALU es la parte del microprocesador que realiza realmente las operaciones aritméticas y lógicas con los datos. Se basa, como la mayoría de los componentes de una computadora, en dispositivos lógicos sencillos. Pero no podemos hablar de unidades aritmético lógicas si no sabemos realmente como se llevan a cabo operaciones de tipo aritméticas y de tipo lógicas. Por lo mismo, comenzaremos por determinar operaciones simples como suma y resta, siguiendo por la multiplicación y división, también realizaremos operaciones en complemento a1 y complemento a2 (para simplificar la redacción las nombraré de aquí en adelante como a1 y a2).
2.1 Números enteros sin signo
A continuación se detallan la manera como se pueden realizar operaciones aritméticas con números sin signo y enteros. Existen maneras para realizar la suma, resta, multiplicación y división.
2.1.1 Suma
Si sumamos números decimales es común la expresión "cinco mas siete es igual a doce, entonces son dos y llevo uno". Este "llevo uno" se conoce como el acarreo. De la misma manera se realiza una suma binaria de varios bits. Unicamente necesitamos recordar las sencillas reglas de la suma binaria de un bit.
1+1 = 0 y llevo 1
1+0 = 1
0+1 = 1
0+0 = 0
1+1+1 = 1 y llevo 1
Con estas reglas tenemos por ejemplo.
Acarreo -->111
Diseño de un microprocesador
Hasta ahora hemos revisado paso por paso y en separado conceptos, procedimientos y circuitos que son utilizados en el diseño de microprocesadores. Sin embargo, ya es tiempo de que juntemos toda esta información para lograr el fin que hemos perseguido desde en inicio de este articulo: el diseño del microprocesador. En esta parte es cuando hay que poner todos los sentidos en alerta y prepararse para algo que, a mi manera de ver, es el secreto de la tecnología. Si miramos a nuestro alrededor podemos observar un sin fin de aparatos electrónicos de diferentes usos, formas y diseños. La mayoría, no digo todos, utilizan en su interior un sistema basado en uno o mas microprocesadores. Los mas simples podrán basarse en microcontroladores, pero los complejos y, sobre todo, de propósito general, como las computadoras contienen un procesador principal y varios procesadores a su alrededor como es el chip set.
4.1 Organización vs. Arquitectura
Antes de entrar de lleno al diseño de nuestro micro creo necesario definir y delimitar dos conceptos que aparecen siempre juntos pero que cuesta trabajo decir cuando comienza uno y termina el otro. Me refiero al concepto de organización y al de arquitectura. ¿Por qué en algunos temas nos presentan como organización algo que pudiera tomarse como arquitectura, o viceversa? A continuación se presentan algunas definiciones de arquitectura:
" Arte de diseñar una máquina con la cual sea agradable trabajar ". (Caxton Foster - 1970)
" Determinar componentes, funciones de los componentes y reglas de interacción entre los " (N. Prassard - 1981).
" La estructura de la Computadora que el programador necesita conocer con el objeto de escribir programas en lenguaje de máquina correctos " (Informe final del proyecto CFA Arquitectura de Familias de Computadoras).
Para mi gusto, las definiciones que presenta William Stallings en su libro Organización y Arquitectura de Computadoras (1996) delimitan de manera clara la diferencia entre los dos temas antes mencionados.
Arquitectura: La arquitectura se refiere a los atributos de un sistema que son visibles para un programador o bien, a aquellos atributos que tienen un impacto directo en la ejecución lógica de un programa.
Organización: La organización se refiere a las unidades funcionales y sus interconexiones, que dan lugar a especificaciones arquitectónicas.
Lo interesante de estos conceptos es que para el diseño de nuestro microprocesador necesariamente tendremos que involucrarnos en su arquitectura (conjunto de instrucciones, numero de bits para representar números, instrucciones y caracteres, etc.) y en su organización (señales de control, memoria, registros, etc). De hecho, en la actualidad muchos microprocesadores han conservado su arquitectura de una manera u otra pero su organización ha cambiado para mejorar su rendimiento. En las mismas compañías que ofrecen microprocesadores la arquitectura es la misma o muy similar con diferencia únicamente en la organización lo que hace variar precios y rendimiento.
4.2 Organización del microprocesador
A continuación veremos la organización del microprocesador .
Fig 16. Organización de un microprocesador sencillo.
Comencemos por definir y explicar cada una de las partes de este microprocesador.
MAR: Este es el registro de direcciones de memoria (memory adress register). Debido a que la memoria RAM requiere cierto tiempo para encontrar y posicionarse en una dirección, dicha dirección debe estar siempre en las entradas. Este registro funciona como buffer del PC.
PC: Este es un contador (program counter) que sirve para tener la dirección de memoria de la siguiente instrucción o dato que se debe de leer. Esto es, si en la memoria comenzamos con la localidad 0000, el contador, después de apuntar hacia esa dirección y después de haber tomado el dato contenido en la memoria, debe ser incrementado en uno para que contenga un 0001, o sea, apunte a la siguiente dirección de la memoria. En nuestro caso, este contador debe ser capaz de cargar datos en paralelo para poder realizar instrucciones de salto. Por ejemplo, el contador puede tener el numero 0100, y en esa dirección, la memoria contiene una instrucción de salto a la dirección 1000. El PC debe ser capaz de cargar este nuevo número y seguir su cuenta a partir de él.
MBR: Este registro es el buffer de datos de la memoria (memory buffer register). Cuando la memoria se posiciona en una dirección, muestra el contenido en su bus de datos, pero estos datos o contenido cambiaran si se cambia la dirección que se pone en las entradas del bus de direcciones de la memoria. Es por esto que es necesario un buffer de salida en la memoria. También nos servirá como buffer para instrcciones de escritura a la memoria.
IR: Este registro el es registro de instrucciones (instruction register). Cuando el dato contenido en una dirección de memoria es una instrucción (suma, resta, salto, etc.) se manda a este registro para decodificarlo y mandar las señales correctas para realizar dicha instrucción.
ALU: La unidad aritmético lógica es un integrado que puede realizar operaciones aritméticas y operaciones lógicas ya sea con un solo operando o hasta con dos operandos.
Acc: Este es el registro acumulador y es de propósito general. En nuestro caso será utilizado para guardar uno de los operandos del la ALU para llevar a cabo operaciones con dos operandos. El segundo se proporcionará directamente a la ALU desde el MBR.
ROP: Este registro contiene el código de operación de la ALU. Esto es, se requiere de un código binario en las entradas de la ALU para seleccionar qué tipo de operación se quiere llevar a cabo (suma, resta, complemento,etc.).
R: Este registro sirve únicamente para observar el resultado de las operaciones realizadas en la ALU pues está conectado directamente a las salidas.
Generador de tiempos: Es la parte de nuestro microprocesador que se encarga de generar señales de tiempos de acuerdo a la frecuencia de reloj que estemos manejando.
Unidad de control: Es la encargada de generar las señales correctas para realizar las operaciones deseadas por el usuario. Como una analogía tenemos al director de una orquesta.
La idea de esta organización es poder implementar cuatro operaciones básicas que nos servirán para echar a andar al microprocesador. Cuando veamos las instrucciones se comprenderá completamente el por qué de esta organización.
Códigos de instrucción
Un sistema digital se define por las operaciones que puede realizar. Cuando estas operaciones son fijadas de manera que solo puede ejecutar las mismas operaciones una y otra vez de manera secuencial entonces hablamos de un sistema digital de propósito especial. Cuando la secuencia de las operaciones que realizará nuestro sistema digital se puede modificar para que realice las tareas que deseamos en ese momento, entonces tenemos un sistema digital de propósito general. Los microprocesadores son sistemas digitales de propósito general puesto que cuentan con una lista de instrucciones que pueden realizar en el orden que nosotros deseemos. Este orden de instrucciones es lo que se conoce como programa. Todos nosotros, al menos que estamos en el ámbito de las computadoras, sabemos y conocemos los programas de computadoras y, quizás, hasta hemos hecho algún programilla por nuestra cuenta. Estos grandes programas están hechos con un lenguaje fácil de interpretar y comprender para los seres humanos. Sin embargo, hablando del lenguaje de microprocesadores, solo podemos manejar códigos binarios. Para realizar una multiplicación tenemos el código 1110, para la suma 1100, etc. Con cuatro bits podemos referir hasta 16 códigos de instrucciones. Para el microprocesador de una computadora son pocas 16 instrucciones, pero para nuestro procesador serán suficientes. Comenzaremos con cuatro instrucciones:
LEE: Saca de la memoria el contenido que está en la dirección DIR y se lleva el registro A.
GUARDA: Guarda el contenido del registro A en la dirección de memoria DIR
SALTA: Continua la ejecución de las instrucción que se encuentra en DIR (2a. Palabra).
OPERA: Realiza la operación aritmética lógica que es codificada por tipo entre el contenido del registro A y el operando OP.2
En ocasiones como la nuestra es necesario proporcionar no solo el código de operación que se desea hacer sino también alguna información extra como son los operandos o las direcciones de los operandos. Para nuestra instrucción LEE es necesario el código de instrucción y la dirección de la memoria que se desea leer. En la siguiente tabla se muestra cada una de las instrucciones y sus operandos necesarios. Cabe recalcar que los códigos de operación son propuestos, podrían ser cualquier combinación binaria de cuatro bits, pero para fines del diseño de nuestro microprocesador estos códigos son fáciles y prácticos.
Instrucción
|
Señal
|
Código
|
Operando 1
|
Operando 2
|
Lee
|
q1
|
0001
|
Dirección
| |
Guarda
|
q2
|
0010
|
Dirección
| |
Salta
|
q3
|
0100
|
Dirección
| |
Opera
|
q4
|
1000
|
Código de Operación
|
Segundo Operando
|
Tabla 4.
Instrucciones del microprocesador
De esta manera para hacer un GUARDA es necesario proporcionar la dirección en la cual se va a guardar el contenido del registro A. Para hacer un SALTA es necesario proporcionar la dirección a la cual se saltará el programa. Para el OPERA es necesario una combinación binaria que determina qué operación se va a realizar (suma, resta, and, or, xor, etc.), esta combinación será de acuerdo a la ALU que usemos, y también hay que determinar el segundo operando ya que el primero se encuentra en A y el segundo estará en el MBR. Nótese las conexiones que tiene la ALU en el diagrama a bloques para poder observar el registro ROP que es el que tendrá la combinación que determina qué operación se realiza con los datos que hay en A y MBR conectados a las entradas de la ALU.
Traslademos todo esto a una memoria de 16 x 4 bits. El microprocesador siempre iniciará buscando en la primera dirección de la memoria que contiene el programa. Si quisiéramos realizar un LEE la dirección 1000 y luego un salta a la dirección 1111 tendríamos.
Dirección
|
0000
|
0001
|
0010
|
0011
|
0100
|
0101
|
0110
|
0111
|
1000
|
Contenido
|
0001
|
1000
|
0100
|
1111
|

No hay comentarios:
Publicar un comentario