Esencialmente,
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
|
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 conectadas 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:
a. Registros
b. Información en código binario
c. Operaciones realizadas con
la información en los registros
d. 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 micro operaciones. Un micro operació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:
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 micro procesadores. Sin embargo, ya es tiempo de que juntemos toda
esta información para lograr el fin que hemos perseguido desde el inicio de
este artículo: el diseño del microprocesador. En esta parte es cuando hay que
poner todos los 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 más
microprocesadores. Los más simples podrán basarse en micro controladores, 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.
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.
Organización
del microprocesador
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 instrucciones 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 de 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
|
|
|
|
|
|
Ejemplo de un programa en memoria
En la primera dirección (0000) está el código de un LEE (0001) seguido de su dirección a leer (1000) en la segunda dirección (0001). En la tercera dirección
(00010) se encuentra el código de un SALTA (0100) seguido de la dirección. De
esta manera es como se escribe un programa en lenguaje maquina (con unos y
ceros). Cada instrucción genera una señal para el circuito de control. El IR se
encarga de decodificar una instrucción y enviarle la respectiva señal al
sistema de control.
Otras consideraciones de diseño
Como ya mencionamos con anterioridad, el microprocesador es
un circuito que ejecuta instrucciones de manera secuencial. Para lograr esto es
necesario una parte de temporizador dentro del micro. Aunque pareciera sencillo
pensar en implementar un circuito temporizador hay que tener algunas
consideraciones con respecto a los integrados que estemos utilizando. Para
nuestro caso, los registros que usaremos necesitan señales se reloj para poder
funcionar. Luego entonces nuestro reloj maestro debe de proporcionar no solo
los tiempos que ingresarán al circuito de control, sino también las señales de
reloj de nuestros integrados. A esto se le llama un circuito síncrono.
Ejemplo de conexión eléctrica del temporizador
Utilizamos un contador 74lLS161 para generar los tiempos por medio de un
botón de tiempo (será manual).
Las salidas deberían entrar a un decodificador para que se genere una sola
señal de tiempo a la vez. Del mismo botón de tiempos saldrá una señal que se
niega y se dirige hacia los relojes de nuestro registro. Se debe negar para que
se genere primero los tiempos que ingresan a la unidad de control.
Otra
consideración importante es el uso de compuertas de tres estados para poder
realizar lecturas y escrituras de la memoria con
seguridad.
Recordemos que el bus de daos de la memoria es bidireccional. Para poder
utilizarlo necesitamos de estas compuertas de tres estados. Además, hay que
notar el uso de unos multiplexores a la entrada de las direcciones y de los
datos. Son colocados porque programaremos la memoria de manera manual con unos
switches tipo DIP. Por lo tanto debemos de habilitar a la hora de programar las
entradas de los switches y una vez terminada la
programación se dejarán habilitadas únicamente las
entradas del MAR, para el caso de las direcciones, y las entradas del MBR, para
el caso de los datos. Observa que se usan otros multiplexores también. Como
vimos en el inicio, se usan para poder tener dos entradas a un mismo integrado.
CONCLUSIÓN
El
diseño de microprocesadores se estudiaba en las universidades de ingeniería con miras a mejorar los diseños
existentes. Hoy en día se prefiere enseñar microprocesadores y arquitectura de
computadoras desde el punto de vista económico o cuantitativo, desde el punto
de rendimiento-costo. A nuestro parecer, no deja de ser importante aprender las
bases principales del diseño de microprocesadores ya que ello llevará a una
mejor comprensión de los lenguajes de programación, segmentación,
computadoras de procesadores paralelos, micro controladores, etc. Además, poder
diseñar un microprocesador sencillo como el que se desarrolla en este
documento, nos conduce a conocer y comprender uno de los secretos de la
electrónica más hermosos y
enigmáticos. ¿Cómo se procesa la información? ¿Cómo es posible que una
computadora me pueda desplegar imágenes,
vídeos, texto,
etc.? Todas estas preguntas son el enigma de las computadoras y los estudiantes
de una ingeniería relacionada con la computación, así como nosotros que estudiamos esta carrera de ingeniería de sistemas debemos adentrarnos, al menos de
manera superficial, con las respuestas.