- Introducción.
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 |
Tabla 1. Operaciones y
su código
El hardware quedaría de
la siguiente manera:
Fig 1. Ejemplo de procesador de
operaciones
lógicas.
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 ← A
4.- 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 con materiales 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 ← A-B | Resta el contenido A menos B y se carga en |
B ← B’ | Complemento a1 del registro |
B ← B’+1 | Complemento a2 del registro |
F ← A + B’ + 1 | Sumar A mas el complemento a2 de B y |
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 –> 1 11
2.1.2 Resta
La resta se lleva de manera similar en números
decimales y binarios. Si en la suma existe el acarreo, en la
resta existe el "préstamo", igual que en
decimales.
- = 0
- = 1
- = 0
.0-1 = 1 prestando un uno al bit siguiente.
Con estas reglas tenemos por ejemplo.
2.1.3 Multiplicación
La multiplicación no es en lo absoluto mas
complicada que las dos operaciones anteriores que hemos visto.
Simplemente se trata de multiplicar con unas sencillas reglas y
después sumar. Cuando realizamos multiplicaciones
decimales de varios numero debemos multiplicar cada uno de los
numero del multiplicador por cada uno de los del multiplicando
corriendo el resultado un lugar hacia la izquierda para
después sumar los resultados.
Las reglas de la multiplicación son:
1×1 = 1
1×0 = 0
0x1 = 0
0x0 = 0
De esta manera tenemos:
2.1.4 División.
Es muy simple realizar una división de
números binarios pues es sumamente similar a la
división con números decimales. Hay un cociente
como resultado con un posible residuo, hay un dividendo y un
divisor y se trata de encontrar múltiplos e irlos restando
uno por uno. No creo necesario extenderse en la
explicación paso a paso de la división de
números enteros positivos en binario. Basta con un
pequeño ejemplo y recordar las reglas para la
división de números decimales ya que son
iguales.
00001101
1101 10010011
1011
001110
1101
001111
1101
100
2.2 Números enteros con signo.
2.2.1 Complemento a2
Es interesante lo que se puede hacer con números
binarios. Como ya vimos hay maneras de realizar sumas, restas y
multiplicaciones, pero hemos realizado operaciones con
números enteros y positivos. ¿Acaso se puede hacer
operaciones con números binarios que representen
números negativos? Sí se puede y no es tan
complicado como pareciera ser. Para esto se llegó a una
notación especial denominada complemento a2. Es mas
sencillo explicarlo si tomamos en cuenta registros de 8 bits.
Cuando queremos representar números positivos, el bit mas
significativo servirá de signo: si es 0 es positivo y si
es 1 es negativo. Esto nos deja únicamente 7 bits para el
numero o bien, hasta 64 números se pueden formar. Lo
importante es que de cada numero positivo se puede encontrar su
negativo por medio del complemento a2. Esto se hace sacando el
complemento de dicho numero y sumándole un uno.
Número positivo: 00000100 = 4
Complemento: 11111011
Se le suma uno: 11111011+1=11111100 = -4
Si alguna de las operaciones aritméticas nos
arroja un resultado negativo, dicho resultado estará en
representación complemento a2. Para leer mejor el
resultado solo tenemos que convertir dicho numero negativo a un
numero binario normal. Esto se hace calculando el complemento a2
de dicho numero (que ya esta en complemento a2). Por ejemplo, si
el resultado de una suma o una resta nos da –18 (11101110)
tendríamos que complementarlo primero (00010001) y
después sumarle 1 (10001 + 1) lo cual nos daría
10010 = 18. Es claro que al convertirlo a notación binaria
normal el numero nos da posistivo, pero esto solo se hace con
fines de poder leer mejor el resultado debido a que no nos vamos
a aprender todos los números en complemento a2. Sabemos
que el resultado es negativo, solo necesitábamos averiguar
la magnitud que es 18.
2.2.2 Suma
La suma en complemento a2 es sencilla ya que lo
único que tenemos que hacer es convertir a negativo
cualquier número que tenga signo negativo. Por ejemplo: Si
tenemos 6+9 no es complicado ya que ambos son positivos y sabemos
realizar este tipo de sumas.
Pero si la suma es –6+9, entonces debemos calcular
el complemento a2 del 6 que en binario es 110. Dicho complemento
se obtiene negando primero (11111001) y sumándole 1
después (11111001 + 1) para lo cual nos queda 11111010. La
suma quedará como sigue:
Si tenemos dos números negativos tampoco es para
desesperarse, simplemente hay que convertir en complemento a2
ambos números. La suma -9 + (-9) seria:
2.2.3 Resta
Cualquier resta decimal puede ser expresada y calculada
como una suma. Por ejemplo 9-6 puede ser expresada como 9 + (-6).
De la misma manera las restas binarias se traducen en sumas. Por
este motivo no creo necesario profundizar ni poner ejemplos
detallados de las restas que utilizan signos en forma de
complemento a2.
2.2.4 Multiplicación
La multiplicación con signo puede realizarse como
una multiplicación cualquiera convirtiendo ambos operandos
en positivos. Simplemente se realiza la multiplicación
como ya se vio anteriormente. Si los operandos eran de signos
iguales entonces el resultado ha de ser positivo y correcto a
nuestro resultado. Pero silos operandos tienen signos diferentes,
entonces el resultado (que siempre será positivo) es
incorrecto en cuanto al signo, aunque no en la magnitud. Aun
así es necesario convertir el numero a su complemento a2
para dejarlo en su forma negativa. Para reducir estos pasos y
simplificar sobre todo el hardware al implementar una
multiplicación con signo su puede utilizar el algoritmo de
Booth.
1.- | A | Q | Q-1 | M | |||
2.- | 0000 | 1100 | 0 | 1110 | Solo despl.. | Primer ciclo. | |
3.- | 0000 | 0110 | 0 | 1110 | Solo despl.. | Segundo ciclo | |
4.- | 0000 | 0011 | 0 | 1110 | A←A-M | Tercer ciclo | |
5.- | 0010 | 0011 | 0 | 1110 | Despl.. | ||
6.- | 0001 | 0001 | 1 | 1110 | Solo despl.. | Cuarto ciclo. | |
7.- | 0000 | 1000 | 1 | 1110 |
Tabla 3. Secuencia de una
multiplicación con el algoritmo de
Booth
Supongamos que deseamos realizar la
multiplicación de dos numero con signo como –2
(1110) y –4 (1100). Para el algoritmo de Booth debemos
considerar el multiplicando como un registro o variable M y el
multiplicador una variable Q. Además existe la variable A
y el bit Q-1 que representa el bit menos significativo
de un registro virtual formado por A, Q y Q-1 es ese
orden estrictamente. De hecho, el resultado aparecerá en
este registro virtual al que denominaré R (A, Q,
Q-1) y del cual hay que ignorar el bit Q-1
a la hora de leer el resultado. El algoritmo de Booth con estas
variables
definidas consiste en analizar el bit menos significativo de Q y
Q-1. Si son idénticos (0-0, 1-1) entonces solo
hay que realizar un desplazamiento aritmético a la
variable completa R. En el caso de que sean diferentes se
realizarán las siguientes operaciones: cuando sea 1-0 se
hace A←A-M y cuando sea 0-1 se hace A←A+M. Veamos
nuestro caso representado en la tabla anterior. He numerado las
filas de la tabla para simplificar su explicación. En la
fila dos puede observarse los valores
iniciales de cada una de las variables de
nuestro ejercicio. La variable A siempre inicia con valores 0000,
lo mismo que el bit Q-1 . Se comparan el bit menos
significativo de la variable Q y Q-1 (ambos en rojo) y
se determina que son iguales por lo que durante el ciclo uno solo
se realizará el desplazamiento aritmético de la
variable completa R. En la línea 3 puede observarse el
resultado de este desplazamiento. Es igual a un desplazamiento
lógico como ya vimos en la primera parte solo que el bit
del signo se conserva siempre. Al comparar el la línea
tres, que es el resultado del ciclo uno, puede observarse que son
iguales los bits por lo que solo se realizará un
desplazamiento aritmético durante el ciclo dos. En la
línea 4 se observa el resultado de este corrimiento. Al
comparar en la línea 4 los bits vemos que hay una
diferencia por lo que hay que hacer A←A-M. El resultado de
este operación puede observarse en la línea 5.
Después de cada operación es necesario realizar un
desplazamiento del resultado. En la línea 6 se muestra el
resultado de dicho desplazamiento. Esta línea 6 es el
final del ciclo tres. Comparando en la línea 6 los bits
vemos que son iguales por lo que solo hay que realizar un
desplazamiento aritmético en el ciclo cuatro. El resultado
se observa en la línea 7. Como los números con de 4
bits solo se necesitan 4 ciclos. El resultado se obtiene del
registro R omitiendo el bit Q-1, esto es 00001000 = 8.
¿Cuánto es –2 por –4? Pues
ocho.
3. Memoria de
programa.
En este capitulo se analizará la función
de la memoria
dentro del procesador que
diseñaremos. En una computadora,
cada programa que
ejecutamos se guarda en la memoria principal que es una memoria
tipo RAM. El
microprocesador va tomando de la memoria las instrucciones y los
datos que necesita aleatoriamente de acuerdo al programa o
programas que
se estén ejecutando en ese momento. De este mismo modo
nuestro microprocesador contará con una memoria donde se
almacenarán los datos y las instrucciones que pretendamos
que realice.
3.1 ROM
Las memorias ROM
son las "memorias de
solo lectura". La
idea de éstas es que se pudiese guardar información
en ellas y no se pierda dicha información a través
de los años o cuando se cortara la alimentación del
integrado. Antiguamente uno mandaba la especificación del
contenido que deseaba que tuviera una memoria ROM al
proveedor. Esto era debido a que la información contenida
en las memorias se fijaba en el proceso de
fabricación. Sin embargo, esto era un impedimento para
quienes necesitaban de una memoria para desarrollar
pequeños proyectos y no
tenían recursos
suficientes para pedir a los distribuidores una memoria,
además que los distribuidores solo hacían pedidos
grandes.
Debido a estos inconvenientes se desarrolló una
memoria de tipo ROM llamada PROM (memoria de sólo lectura
programable o memoria ROM
programable). Esta memoria tenia la facilidad que con un aparato
un poco costoso, cualquier persona
podía grabar el contenido de una memoria por lo que se
comenzó a utilizar la tecnología ROM para
propósitos generales. Desgraciadamente esta tecnología era OTP
(one time programable) solo se podía grabar una vez. Esto
representaba un costo elevado
para la investigación porque si el proyecto tenia un
pequeño error, la memoria ROM debía ser reemplazada
por otra sin error. De aquí que se desarrolle la memoria
EPROM (memoria ROM programable borrable). Dicha memoria
podría ser grabada eléctricamente y borrada con
luz
ultravioleta. Para quienes no tenían un módulo de
luz
ultravioleta era necesario que "sacaran al sol" sus memorias que
tenían una especie de "ventana" por donde entraba la luz
ultravioleta. En el caso de contar con un generador de luz
ultravioleta, los programadores se tardaban cuando mucho 8
minutos en borrar la memoria, pero quienes no tenían esta
facilidad debían dejar al sol sus memorias aproximadamente
24 horas. Además, estas memorias únicamente se
podían grabar y borrar unas 10 veces aprox. Finalmente se
desarrolló una memoria ROM que podía ser grabada
eléctricamente y borrada de la misma manera. Se
podía hacer este proceso mil
veces (si estaba buena) y no tomaba mas que unos minutos (en la
actualidad solo se requiere de unos segundos). Esta memoria se
llama EEPROM (memoria ROM programable borrable
eléctricamente).
En las computadoras
encontramos memorias ROM en lo que se llama el BIOS el cual
es una memoria donde se guarda la información de la
tarjeta madre,
de los conectores y dispositivos de la PC.
3.2 RAM
Este tipo de memoria puede ser borrada y grabada las
veces que deseemos. La única desventaja es que la
información grabada en ella solo puede ser utilizada
mientras tenga energía. En cuanto se corte la alimentación, los
datos que se grabaron se borrarán instantáneamente.
Se usan solo como almacenamiento
temporal.
Existen dos variantes entre las memorias RAM: SRAM y DRAM.
La SRAM es conocida como la RAM estática,
en ella los valores
binarios o información se almacenan utilizando
configuraciones de compuertas por lo que, mientras tenga la
alimentación, los datos guardados en ella se
mantendrán intactos. LA DRAM es conocida como RAM dinámica y esta hecha con celdas, que
almacenan los datos como cargas en condensadores.
La presencia o ausencia de carga en el condensador se interpreta
como el 1 o 0 binarios. Ya que los condensadores
tienen una tendencia natural a descargarse, las RAM
dinámicas requieren refrescos periódicos para
mantener memorizados los datos. Su costo no es muy
elevado.
Para nuestro caso utilizaremos una memoria
RAM.
3.3 Organización de memorias
pequeñas.
Para explicar cómo se guardan los datos en la
memoria recurriré a la clásica
representación del librero. Supongamos que tenemos un
librero con 4 línea para poner libros. En
cada línea caben hasta 4 libros.
Línea 1
Línea 2
Línea 3
Línea 4
Fig 13. Representación de una
memoria como un librero
Las líneas representan las direcciones que tiene
esa memoria, o bien, los espacios disponibles para guardar
información. Cada libro
representa un bit de información, por lo nuestro librero
representa una memoria con cuatro direcciones de cuatro bits de
capacidad. Cada dirección se representa por un numero
binario secuencial. Ahora se cambiamos nuestro librero por una
memoria verdadera y los libros por bits tendremos lo
siguiente:
Dirección | Datos (bits) | |||
00 | 1 | 0 | 0 | 1 |
01 | 1 | 1 | 1 | 1 |
10 | 0 | 0 | 1 | 1 |
11 | 1 | 0 | 1 | 0 |
Fig 14. Representación tabular de
una memoria
Para memorias pequeñas esta organización resulta práctica y
simple. Pero para memorias mas grandes es difícil tener
este tipo de organización. Aunque en el diseño
de nuestro pequeño procesador no utilizaremos memorias
grandes, me gustaría profundizar en la
organización de las memorias grandes sin adentrarnos
en la organización de módulos de memorias que son
los que se utilizan en las computadoras.
3.4 Organización de memorias
grandes.
Analicemos la siguiente figura que nos muestra la
organización de una memoria de 16 Mbits. Esto es, tiene 16
millones de celdas de memoria con la particularidad de que guarda
los datos en palabras de 4 bit. Por esto, tiene una matriz de
celdas de 2048 por 2048 donde cada localidad de la matriz tiene 4
celdas para formar la palabra.
Fig 15. Organización de una
memoria de 16Mb
Obsérvese que las líneas de direcciones de
esta memoria van de la A0 a la A10, es
decir, once líneas de dirección. Recordando el parcial pasado
tenemos que 211=2048. Realmente solo tendríamos
capacidad para direccionar 2048 localidades de 4 bits, pero esta
memoria, como la mayoría, tiene líneas de datos
multiplexadas. Esto se hace para ahorrar espacio y cableado. El
microprocesador manda 22 datos que sirven como dirección.
Sin embargo, las primeras 11 señales sirven para
seleccionar la fila de la matriz activando la señal de
control RAS (Row Address Selector). Luego entonces, podemos
seleccionar una fila entre 2048 existentes en la matriz. Para
esto sirve el decodificador de líneas en la memoria el
cual tiene once entradas (las primeras once señales de
dirección que manda el micro) y 2048 líneas de
salida. Las siguientes 11 señales de dirección que
manda el micro sirven para seleccionar la columna de la matriz.
Por esto se mandan al decodificador de columnas activando la
respectiva señal de control CAS (Column Address Selector).
Al ser una memoria DRAM, requiere de refresco cada cierto
tiempo por lo
que tiene un contador de refresco (Rerfesh Counter). Ademas, la
memoria cuenta con dos buffers: de entrada y de salida, de donde
precisamente entran y salen datos de la memoria (D0 a
D3 recuerda que es de 4 bits). Las señales WE y
OE son las que regulan las operaciones de escritura y
lectura de la memoria (Write Enable y Output Eneable). Si
tuviésemos una matriz de 8 x 8 x 4 tendría esta
apariencia ya con datos grabados.
1010 | 0001 | 1011 | 0101 | 1001 | 1010 | 0011 | 0011 |
0111 | 1001 | 0100 | 0010 | 1000 | 1010 | 0110 | 0111 |
1000 | 0111 | 1010 | 1100 | 1101 | 1111 | 1010 | 0101 |
1100 | 0011 | 1001 | 1011 | 1010 | 1010 | 1100 | 1100 |
1111 | 1000 | 0110 | 0010 | 0001 | 0101 | 1010 | 1100 |
0001 | 1111 | 1000 | 1001 | 1001 | 1001 | 1010 | 1011 |
1100 | 1101 | 1110 | 1111 | 0001 | 0010 | 0011 | 0100 |
0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 |
Para direccionar la matriz solo requeriríamos de
3 líneas de dirección. La organización de
esta memoria tendría la siguiente forma:
Fig 15. Organización de una
memoria de 256 bits
Esta memoria que hemos diseñado ahora tiene una
capacidad de 256 bits o bien 64 palabras de 4 bits.
4. 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.
4.3 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 |
Fig 17. 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.
4.4 Macrooperaciones.
Las operaciones mostradas en el apartado anterior son
macrooperaciones porque requieren un numero determinado de
microoperaciones para poder llevarse a cabo. A
continuación analizaremos cada una de las macrooperaciones
y de esta manera quedará completamente explicada nuestra
organización que da lugar a nuestra
arquitectura.
4.4.1 Ciclo Búsqueda o Fetch.
Recordemos que nosotros determinamos el código de
una instrucción por medio de una combinación
binaria de n bits que podemos escoger perfectamente al azar.
Entonces si tengo determinado la combinación 1000 como un
OPERA ¿por qué no se confunde mi microprocesador si
uno de los operando es 1000 o bien el código de la
operación es 1000?
Un ejemplo de esto puede ser como sigue:
Dirección |
0000 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
1000 |
Contenido |
1000 |
1000 |
1000 |
Fig 18. Ejemplo de un programa con
contenido aparentemente repetido
Observa el contenido de la siguiente memoria. Cualquiera
diría que vamos a realizar tres instrucciones OPERA pero
no es así, solo se va a realizar una con un código
de operación 1000 y un segundo operando 1000.
El microprocesador es un circuito secuencial
temporizado. Siempre antes de que empiece una nueva
instrucción los tiempos se inicializan precisamente para
realizar el ciclo Fetch. Este ciclo es el encargado de tomar un
código y llevarlo hacia el IR para ser decodificado y asi
activar la lógica correcta del circuito de control y
llevar a cabo esta instrucción. Consta de tres tiempos y
cinco microoperaciones.
T0: MAR PC.
T1: MBR M, PC
PC + 1
T2: IR MBR, MAR
PC.
El PC inicia con 0000 y se lo transfiere a MAR. Esto
quiere decir que la memoria se ubicará en la primera
dirección. Después se saca el contenido de la
memoria y se transfiere a MBR, en ese mismo tiempo de incrementa
el PC (0001). Se transfiere el contenido de MBR a IR para poder
decodificar la instrucción y se manda el contenido de PC
hacia MAR para que la memoria se posicione en la siguiente
dirección (0001). Una vez codificada una
instrucción la lógica de control se encarga de que
el siguiente dato que se encuentra en la memoria no sea tomado
como una instrucción, sino como un operando mas de la
instrucción previamente decodificada. De esta manera
podemos realizar la operación del ejemplo anterior. No
importa que nuestra instrucción OPERA tenga el
código 1000 y que el primer operando sea 1000 y el segundo
también.
4.4.2 Ciclos de ejecución.
El ciclo de búsqueda consiste un una serie de
microoperaciones secuenciales que no cambian nunca. Esto no
ocurre en un ciclo de ejecución ya que para cada
instrucción de nuestro procesador existe una serie de
microoperaciones a realizar de acuerdo con la instrucción
deseada.
Lee: q1 T3: MBR
M, PC PC +1
q1 T4: MAR
MBR
q1 T5: MBR
M
q1 T6: A MBR, T
0.
La instrucción Lee saca de la memoria la
dirección que se desea leer y la transfiere al MBR
incrementando el PC en el mismo tiempo. Después pasa esa
dirección a MAR para que la memoria se posicione en esa
dirección. Se saca el contenido de la dirección
leída hacia MBR y por ultimo se deposita en el registro A
inicializando los tiempos para realizar el ciclo de
búsqueda de la siguiente instrucción.
Guarda: q2 T3: MBR
M, PC PC +1
q2 T4: MAR
MBR
q2 T5: MBR
A
q2 T6: M MBR, T
0.
La instrucción Guarda saca de la memoria la
dirección en la cual se deberá guardar el dato en A
, lo transfiere al MBR, de ahí se transfiere a MAR para
que la memoria se posicione en esa dirección. Se pasa el
dato en A hacia MBR y de ahí se transfiere a la memoria
que ya esta previamente posicionada en la dirección
deseada. Al final se inicializan los tiempos para realizar el
ciclo de búsqueda de la siguiente
instrucción.
Salta: q3 T3: MBR
M. [ PC PC +1
q3 T4: PC MBR, T
0.
En la operación Salta se transfiere de la memoria
al MBR la dirección a la cual se quiere saltar para
continuar con el programa. Esta misma dirección se
transfiere al PC. Hay que notar que durante el tiempo tres se
incrementa el PC. Esta microoperación no es necesaria ya
que en el siguiente tiempo el mismo contenido de PC será
modificado totalmente. Sin embargo, para simplificar el
diseño del circuito de control se agrega en este tiempo ,
con esta instrucción.
Opera: q4 T3: MBR
M, PC PC +1
q4 T4: ROP MBR,
MAR PC
q4 T5: MBR M, PC
PC +1
q4 T6: R
A(op.)MBR, T 0.
Este es el mas complejo. Primero se pasa de la memoria
al MBR el código de operación que se desea
realizar, de ahí se manda hacia el ROP para indicarle a la
ALU la operación a realizar, se pasa de la siguiente
dirección al MBR el segundo operando y en el tiempo seis
se realiza la operación deseada transfiriendo el resultado
al registro R.
4.5 Diseño de la unidad de
control
Ya tenemos hasta este momento las instrucciones que
podrán utilizarse en nuestro procesador y la secuencia de
microoperaciones necesarias para cada una. Ahora llega el momento
de diseñar e implementar el circuito de control que se
encargará de enviar señales adecuadas para llevar a
cabo las instrucciones especificadas por el programador. Existen
gran variedad de técnicas
para implementar el circuito de control. La mayoría puede
clasificarse en:
- Control cableado
- Control microprogramado.
4.5.1 Control cableado.
El control cableado es esencialmente un circuito
combinacional. Sus señales lógicas de entrada se
convierten en señales lógicas de
control.
Fig 19.Diagrama de
la unidad de control.
Para cada una de las instrucciones el decodificador
enviará una y solo una señal de
instrucción las cuales ya hemos definido anteriormente.
De la misma manera el generador de tiempos enviará una y
solo una señal de tiempo. Estas serán las
entradas de nuestra unidad de control. Las salidas son
producidas por circuitos combinacionales simples dentro de la
unidad de control.
A cada microoperación le asignaremos una
señal de control (X1, X2…
Xn) que será la encargada físicamente
de que se realice.
MAR ← PC : à X1
MBR ←M : à X2
PC ← PC + 1 : à X3
IR ← MBR : à X4
MAR ← MBR :à X5
A ← MBR : à X6
T ← 0 : à X7
MBR ← A : à X8
M ←MBR : à X9
PC ← MBR : à X10
ROP ← MBR : à X 11
R ←A (op) MBR :à X 12
En total tenemos doce señales de control. Para
que cada señal sea verdadera (sea uno) es necesario que
varias condiciones se den. Por ejemplo en el caso de MAR ←
PC, puede darse cuando To, T2, y así por el estilo. De
esta manera se forman las funciones de boole para cada una de las
señales de control. Estas funciones determinan el circuito
combinacional de control que debe implementarse.
MAR ← PC
X1 = T0 + T2 +
q3 T4
MBR ←M
X2 = T1 + q0
T3 + q0 T5 + q1
T3 + q2 T3 + q3
T3 + q3 T5
X2 = T1 + T3
(q0 + q1 + q2 + q3)
+ T5 (q0 + q3 )
X2 = T1 + T3 +
(q0 + q3) T5
PC ← PC + 1
X3 = T1 + q0
T3 + q1 T3 + q2 T3
+ q3 T5+ q3 T3
X3 = T1 + T3
(q0 + q1 + q2 + q3)
+ q3 T5
X3 = T1 + T3 +
q3 T5
IR ← MBR
X4 = T2
MAR ← MBR
X5 = q0 T4+
q1 T4= (q0 + q1)
T4
A ← MBR
X6 = q0 T6
T ← 0
X7 = q0 T6+
q1 T6+ q2 T4+
q3 T6
X7 = (q0 + q1 +
q3) T6+ q2
T4
MBR ← A
X8 = q1 T5
M ← MBR
X9 = q1 T6
PC ← MBR
X10 = q2
T4
ROP ← MBR
X11 = q3
T4
R ← A (t) MBR
X12 = q3
T6
La manera como se use cada una de las señales de
control dependerá de los circuitos
integrados que utilicemos. Lo importante es saber que, por
ejemplo, la señal X12 debe hacer que el
registro R cargue en paralelo las salidas de la ALU, en donde se
realizó la operación deseada. Todo el circuito de
control es un circuito combinacional de varios componentes
electrónicos digitales.
Fig 20. Diagrama interno de la unidad de
control.
4.6 Otras consideraciones de
diseño.
Como ya mencioné 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.
Fig 21. 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 un a 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 nuestros 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.
Fig 22. Conexión de la memoria
usando switches para su programación.
Como ya pueden estar imaginando, el diagrama
eléctrico completo es enorme. Creo que con la
información proporcionada y siguiendo las consideraciones
de diseño, se puede realizar este microprocesador poco a
poco y con mucha paciencia.
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 mi 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, microcontroladores, 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 mas hermosos y
enigmáticos. ¿Cómo se procesa la
información? ¿Cómo es posible que una
computadora me pueda desplegar imágenes,
videos, texto, etc?
Todas estas preguntas son el enigma de las computadoras y los
estudiantes de una ingeniería relacionada con la computación deben de adentrarse, al menos
de manera superficial, con las respuestas.
1.- Arquitectura de computadoras.
Morris Mano.
Ed. Prentice Hall.
2.- Organización y arquitectura de
computadoras.
William Stallings.
Ed. Prentice Hall.
3.- Arquitectura de computadores: Un enfoque
cuantitativo.
Hennessy – Patterson.
Ed. McGraw Hill.
4.- Fundamentos de los microprocesadores
Roger Tokheim.
Ed. McGraw Hill.
5.- Arquitectura y organización de
computadoras.
Hayes.
Ed. McGraw Hill.
Xavier Sierra Canto.
Ingeniero en electrónica.
Profesor de arquitectura de computadoras.
Centro Educativo Latino, A.C.