Agregar a favoritos      Ayuda      Português      Ingles     

Microprocesadores: lógica y diseño

Enviado por xaviersierra_



  1. Registros
  2. Unidad aritmético lógica.
  3. Memoria de programa.
  4. Diseño de un microprocesador.
  5. Conclusiones

1. Registros

  1. 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:

  1. Registros
  2. Información en código binario
  3. Operaciones realizadas con la información en los registros
  4. 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.

  1. 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 bits

    En 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 ← A

    Lo 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 ← A

    Cada 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 ← A

    Es 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.

  2. Lenguaje de transferencia.
  3. 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

2. Unidad aritmético lógica.

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.

  1. = 0
  1. = 1
  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:

1x1 = 1

1x0 = 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.

5. Conclusiones

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.

Bibliografía.

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.


Comentarios


Trabajos relacionados

Ver mas trabajos de Hardware

 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.


Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Iniciar sesión

Ingrese el e-mail y contraseña con el que está registrado en Monografias.com

   
 

Regístrese gratis

¿Olvidó su contraseña?

Ayuda