COMPUTADOR SIMPLE ROP - RESUELTOS
ESTUDIEN EL CONJUNTO DE TRANSFERENCIA DE REGISTRO QUE RESUELVE EL CICLO DE CAPTURA o BÚSQUEDA, Y LOS CICLOS DE EJECUCIÓN DEL SIGUIENTE COMPUTADOR SIMPLE.
Realice el diagrama.
1. ORGANIZACIÓN DEL PROCESADOR
Comencemos por definir y explicar cada una de las partes de este computador simple.
AR: Este es el registro de direcciones de memoria (Address Register). Este registro funciona como búfer 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 número 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.
DR: Este registro es el buffer de datos de la memoria. Cuando la memoria se posiciona en una dirección, muestra el contenido en su bus de datos, pero estos datos o contenido cambiaran si se cambia la dirección que se pone en las entradas del bus de direcciones de la memoria. Es por esto que es necesario un buffer de salida en la memoria. También nos servirá como buffer para instrucciones de escritura a la memoria.
IR: Este registro el es registro de instrucciones (Instruction Register). Cuando el dato contenido en una dirección de memoria es una instrucción (suma, resta, salto, etc.) se manda a este registro para decodificarlo y mandar las señales correctas para realizar dicha instrucción.
ALU: La unidad aritmético lógica es un integrado que puede realizar operaciones aritméticas y operaciones lógicas ya sea con un solo operando o hasta con dos operandos.
A: 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 operando se proporcionará directamente a la ALU desde el DR.
ROP: Este registro contiene el código de operación (palabra de control) 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.
GENERADOR DE TIEMPOS: Es la parte de nuestro procesador 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.
La idea de esta organización es poder implementar cuatro operaciones básicas que nos servirán para poner a funcionar el procesador. Cuando veamos las instrucciones se comprenderá completamente el por qué de esta organización.
1.2 CÓDIGOS DE INSTRUCCIÓN
Un sistema digital se define por las operaciones que puede realizar. Cuando estas operaciones son establecidas 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 procesadores 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. 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 procesadores, solo podemos manejar códigos binarios. Con cuatro bits podemos referir hasta 16 códigos de instrucciones. Para el procesador 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 (2a. Palabra) y se lleva el registro A.
GUARDA: Guarda el contenido del registro A en la DIRECCIÓN (2a. Palabra) de memoria
SALTA: Continua la ejecución de las instrucción que se encuentra en DIRECCION (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 (3a. Palabra).
En ocasiones como la nuestra es necesario proporcionar no solo el código de operación que se desea ejecutar 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 computador simple estos códigos son fáciles y prácticos.
INSTRUCCIÓN | VARIABLE DECODIFICADA | CÓDIGO OPERACIÓN | 2ª PALABRA DE MEMORIA | 3ª PALABRA DE MEMORIA |
LEE | D1 | 0001 | DIRECCIÓN | |
GUARDA | D2 | 0010 | DIRECCIÓN | |
SALTA | D3 | 0100 | DIRECCIÓN | |
OPERA | D4 | 1000 | PALABRA CONTROL ALU | OPERANDO |
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 DR. 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 DR conectados a las entradas de la ALU.
Traslademos todo esto a una memoria de 16 x 4 bits. El procesador siempre iniciará buscando en la primera dirección de la memoria que contiene el programa. Si quisiéramos realizar un LEE en la dirección 1000 y luego un salta en la dirección 1111 tendríamos.
Dirección |
0000 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
1000 |
Contenido |
0001 |
1000 |
0100 |
1111 |
|
|
|
|
|
Fig. 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.
1.3 MACROOPERACIONES.
Las operaciones mostradas en el apartado anterior son macrooperaciones porque requieren un número 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.
1.4 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 procesador 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. 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 procesador 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 así activar la lógica correcta del circuito de control y llevar a cabo esta instrucción. Consta de tres tiempos y cinco microoperaciones.
COMIENZA DESDE AQUÍ:
T0: AR ←PC.
T1: DR ←M[AR], PC ←PC + 1
T2: IR ←DR, AR ←PC.
El PC inicia con 0000 y se lo transfiere a AR. 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 DR, en ese mismo tiempo de incrementa el PC (0001). Se transfiere el contenido de DR a IR para poder decodificar la instrucción y se manda el contenido de PC hacia AR 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.
1.5 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: D1 T3: DR ←M[AR], PC ←PC +1
D1 T4: AR ←DR
D1 T5: DR ←M[AR]
D1 T6: A ←DR, T ←0.
La instrucción Lee saca de la memoria la dirección que se desea leer y la transfiere al DR incrementando el PC en el mismo tiempo. Después pasa esa dirección a AR para que la memoria se posicione en esa dirección. Se saca el contenido de la dirección leída hacia DR y por ultimo se deposita en el registro A inicializando los tiempos para realizar el ciclo de búsqueda de la siguiente instrucción.
C.EJECUCION
GUARDA: D2 T3: DR ←M[AR], PC ←PC +1
D2 T4: AR ←DR
D2 T5: DR ←A
D2 T6: M[AR] ←DR, 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 DR, de ahí se transfiere a AR para que la memoria se posicione en esa dirección. Se pasa el dato en A hacia DR 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: D3 T3: DR ←M[AR]
D3 T4: PC ←DR, T ←0.
En la operación SALTA se transfiere de la memoria al DR 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.
EJECUCION SEGUNDA PARTE
OPERA: D4 |T3: DR ←M[AR], PC ←PC +1
D4 T4: ROP ←DR, AR ←PC
D4 T5: DR ←M[AR], PC ←PC +1
D4 T6: A ←A (op. ALU)DR
D4 T7: R ←A, T ←0.
Este es el más complejo. Primero se pasa de la memoria al DR 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 DR el segundo operando y en el tiempo seis se realiza la operación deseada transfiriendo el resultado al registro R en el tiempo siete.
1.6 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.
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.
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 (C1, C2... Cn) que será la encargada físicamente de que se realice.
AR ← PC : C1
DR ←M[AR] : C2
PC ← PC + 1 : C3
IR ← DR : C4
AR ← DR : C5
A ← DR : C6
T ← 0 : C7
DR ← A : C8
M[AR] ←DR : C9
PC ← DR : C10
ROP ← DR : C 11
A ← A (ALU) DR : C 12
R ← A : C13
En total tenemos 13 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 AR ← PC, puede darse cuando To, T2 o D4 T4 sean uno. 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.
AR ← PC : C1= T0 + T2 + D4 T4
DR ← M[AR] : C2 = T1 + D1 T3 + D1 T5 + D2T3 + D3 T3 + D4 T3 + D4T5
C2 = T1 + T3 (D1+ D2 + D3 + D4) + T5 (D1+ D4)
C2 = T1 + T3 + (D1+ D4) T5
PC ← PC + 1 : C3 = T1 + D1 T3 + D2 T3 + D3T3 + D4 T5+ D4 T3
C3 = T1 + T3 (D1+ D2 + D3 + D4) + D4 T5
C3 = T1 + T3 + D4T5
IR ← DR : C4= T2
AR ← DR : C5= D1 T4+ D2 T4= (D1 + D2) T4
A ← DR : C6= D1 T6
T ← 0 : C7= D1 T6+ D2 T6+ D3 T4+ D4 T6
C7 = (D1 + D2 + D4) T6+ D3 T4
DR ← A : C8= D2 T5
M[AR] ← DR : C9 = D2 T6
PC ← DR : C10= D3 T4
ROP ← DR : C11= D4 T4
A ← A (op.) DR : C12= D4T6
R ← A : C13= D4T7
Todo el circuito de control es un circuito combinacional de varios componentes electrónicos digitales.
INSTRUCCIÓN | VARIABLE DECODIFICADA | CÓDIGO DE OPERACIÓN | SIGUIENTE POSICIÓN DE MEMORIA | SIGUIENTE POSICIÓN DE MEMORIA |
LEE | D1 | 0001 | DIRECCIÓN | |
GUARDA | D2 | 0010 | DIRECCIÓN | |
SALTA | D3 | 0011 | DIRECCIÓN | |
OPERA | D4 | 0100 | PALABRADA CONTROL | OPERANDO |
AR ← PC : C1 = T0 + T2+ D4 T4
DR ← M[AR] : C2 = T1 + D1 T3 + D1 T5 + D2T3 + D3 T3 + D4 T3 + D4T5
C2 = T1 + T3 (D1+ D2 + D3 + D4) + T5 (D1+ D4)
C2 = T1+ T3 + (D1 + D4) T5
PC ← PC + 1 : C3 = T1 + D1 T3 + D2 T3 + D3T3 + D4 T5+ D4 T3
C3 = T1 + T3 (D1+ D2 + D3 + D4) + D4 T5
C3 = T1+ T3 + D4 T5
IR ← DR : C4 = T2
AR ← DR : C5 = D1 T4+ D2 T4= (D1 + D2) T4
A ← DR : C6 = D1 T6
T ← 0 : C7= D1 T6+ D2 T6+ D3 T4+ D4 T7
C7 = (D1+ D2) T6+ D4 T7+ D3 T4
DR ← A : C8 = D2 T5
M[AR] ← DR : C9 = D2 T6
PC ← DR : C10 = D3 T4
ROP ← DR : C11 = D4 T4
A ← A (op.) DR : C12 = D4T6
R ← A : C13= D4T7