Ä Å ÕÙ Ò Ë Ò ÐÐ - Universidad de Buenos Aires

Anuncio
La M
aquina Sencilla
Organizacion de Computadoras I
18 de marzo de 2002
Este apunte esta hecho por la catedra de Organizacion de Computadoras I
de la Facultad de Ciencias Exactas y Naturales de la Universidad de Buenos
Aires. Esta basado un texto de la Universidad Politecnica de Catalunia.
A lo largo del apunte describiremos la arquitectura y la organizacion de una
maquina muy sencilla pero con gran detalle. En muchos casos se presenta una
parte de la arquitectura y luego su manera de implementarla (organizacion) sin
separarlas en distintas secciones.
En el captulo 1 trataremos brevemente algunos conceptos basicos que seran
usados luego en el resto del apunte. En el captulo 2 describiremos la arquitectura y organizacion de la maquina.
En el caso que se detecten errores o se deseen hacer sugerencias con respecto
a este apunte por favor mandar un mail a [email protected]
1
Indice General
1 Arquitectura y Organizacion
1.1 Procesador . . . . . . . . .
1.2 Memoria . . . . . . . . . . .
1.3 Entrada/Salida . . . . . . .
1.4 System Bus . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
4
6
7
8
2 La Maquina Sencilla
2.1 Arquitectura y organizacion . . . . . . . . . . . . .
2.1.1 Conjunto de instrucciones . . . . . . . . . .
2.1.2 Memoria . . . . . . . . . . . . . . . . . . . .
2.1.3 Formato de instruccion . . . . . . . . . . .
2.1.4 Codigo de operacion . . . . . . . . . . . . .
2.1.5 Operandos . . . . . . . . . . . . . . . . . .
2.2 Dise~no del procesador . . . . . . . . . . . . . . . .
2.2.1 Registros . . . . . . . . . . . . . . . . . . .
2.2.2 Unidad aritmetico logica (ALU) . . . . . .
2.2.3 Accesos a memoria . . . . . . . . . . . . . .
2.3 Esquema completo de la Maquina Sencilla . . . . .
2.4 Ciclo de instruccion . . . . . . . . . . . . . . . . .
2.4.1 Ciclo de instruccion en la Maquina Sencilla
2.5 Dise~no de la Unidad de Control . . . . . . . . . . .
2.5.1 Ciclo de instruccion . . . . . . . . . . . . .
2.6 Optimizacion de los ciclos de instruccion . . . . . .
2.6.1 Optimizacion de la instruccion ADD . . . .
2.6.2 Optimizacion de M OV , C M P y BE Q . . .
2.6.3 Estados . . . . . . . . . . . . . . . . . . . .
2.7 Implementacion de la UC . . . . . . . . . . . . . .
2.7.1 Descripcion . . . . . . . . . . . . . . . . . .
2.7.2 Clock . . . . . . . . . . . . . . . . . . . . .
2.7.3 Implementacion . . . . . . . . . . . . . . . .
2.7.4 Comentario sobre la UC . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
10
10
12
13
13
14
15
16
18
19
20
22
23
23
24
27
27
29
30
31
31
32
32
35
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
A Logica Digital
37
A.1 Operaciones logicas . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2
Cap
tulo 1
Arquitectura y
Organizacion
>Que es una computadora? En inges el verbo \To Compute" signica \hacer
cuentas". Historicamente \computer" no era una maquina, sino era el que trabajaba haciendo calculos. Desde este punto de vista podemos pensar que una computadora es una maquina capaz de hacer calculos. Las primeras computadoras
podan resolver determinados problemas |ejecutar determinados algoritmos|
que eran parte de la computadora. Las maquinas actuales permiten ejecutar
todo tipo de algoritmos ya que estos son ingresados como datos.
Una computadora esta caracterizada por varios aspectos, uno de los principales es el conjunto de instrucciones a partir de los cuales se deben expresar
todos los algoritmos.
La arquitectura se puede denir como las caractersticas de una computadora
que necesita conocer un programador para poder hacer uso de el. Esta denicion
de arquitectura no es la unica ni la mejor, veamos otras dadas por distintos
autores:
Baer: \Es el dise~no de un sistema integrado que brinda una herramienta
util para el programador"
Hayes: \El estudio de la estructura, el comportamiento y el dise~no de las
computadoras"
Abd-Alla: \El dise~no de la especicacion del sistema a un nivel general o
a un nivel de de sub sistema"
Foster: \El arte de dise~nar una maquina con la cual sera un placer trabajar"
Hennessy and Patterson: \La interface entre el hardware y el nivel mas
bajo del software"
3
La diversidad de estas deniciones nos muestra que no esta claro que partes
|reales o conceptuales| forman parte de la arquitectura de una computadora.
En este curso usaremos la denicion del parrafo anterior y la de HennessyPatterson. Estas dos tienen muchas cosas en comun.
La organizacion de una computadora es la implementacion de su arquitectura. Esta es invisible al programador. Incluye que bloques funcionales lo
constituyen y como se relacionan.
No siempre es facil determinar si un determinado componente pertenece a
la arquitectura o a la organizacion.
Se denomina programa a la secuencia de instrucciones que resuelve un determinado problema o implementa un determinado algoritmo.
Toda computadora consta de las siguiente partes:
Procesador: esta destinado a ejecutar operaciones. Sus componenetes
basicos son:
{ Unidad Aritmetico-Logica (ALU): destinada a realizar operaciones
aritmeticas (+; ; ; =) y logicas (and, or, xor . . . ).
{ Registros: almacenan los datos con que operar y resultados de la
operacion.
{ Unidad de Control (UC): gobierna el funcionamiento del procesador.
Para cada instruccion del programa, la UC decide que accion debe
realizar cada parte del procesador.
{ Reloj: emite pulsos regularmente. La UC funciona gracias a estos
pulsos.
Memoria: almacena informacion a la espera de ser trasladada al procesador o al subsistema de entrada/salida.
Entrada/Salida: permite toda comunicacion con el exterior, a traves de
perifericos o dispositivos de E/S. Esta comunicacion puede ser con un
usuario (monitor, mouse, teclado, etc.), con almacenamientos secundarios (disco rgido, disco optico, CD) o con otros sistemas (redes, puertos
seriales, USB, etc)
Buses: permiten la transferencia de informacion entre las distintas partes
que constituyen el computador.
La estructura general de una computadora es la mostrada en la gura 1.1
En general se suelen utilizar echas con area para indicar un grupo de lneas y
echas de una dimension para indicar una unica lnea.
1.1
Procesador
Para el progamador de la computadora, el procesador se caracteriza por su
conjunto de instrucciones (conjunto de operaciones basicas que es capaz de
4
Figura 1.1: estructura general de una computadora
realizar). Para cada instruccion, la UC realiza una secuencia de acciones a n
de realizar la operacion indicada en la instruccion.
Es conveniente tener una peque~na memoria dentro del procesador, para tener
\a mano" datos usados repetidas veces o resultados intermedios de operaciones
mas complicadas que las elementales. Esta memoria son los registros. Podemos
dividir a los registros en dos categoras: los de usuario o de uso general y los de
sistema o de uso especco. Los primeros estan a disposicion del programador,
y este los usara para guardar cualquier valor que crea conveniente, los segundos
no son directamente accesibles por el programador y tienen un n determinado,
no es posible guardar en ellos cualquier valor. Ejemplos de registros de uso
especco son:
Program Counter (PC): indica la direccion de memoria donde se encuentra la proxima instruccion a ejecutar. Tambien se suele usar el nombre
Registro de Proxima Instruccion (RPI).
Registro de Instruccion (RI): Guarda la instruccion que se esta ejecutando.
Registro Direcciones de Memoria (RDM): se usa para mandar direcciones
a memoria.
Registro Buer de Memoria (RBM): se usa para mandar y recibir datos
desde y hacia memoria.
Codigos de condicion: guardan |entre otras cosas| informacion sobre la
ultima operacion realizada por la ALU. Tambien se suele usar el nombre
de Program Status Word (PSW)
La ALU es la unica parte con capacidad de hacer operaciones aritmeticas y
logicas sobre numeros. Toma dos numeros como entrada y devuelve el resultado
5
de una operacion entre esos numeros e informacion adicional sobre ese resultado.
Esa informacion es usada |por ejemplo| para realizar comparaciones, y queda
almacenada en el registro de codigos de condicion.
Ver gura 1.2.
Figura 1.2: estructura general de un procesador
1.2
Memoria
El bloque de memoria almacena dos tipos de informacion:
datos: variables y constantes utilizados en el programa
programa: secuencia de instrucciones
La memoria esta compuesta por una enorme cadena de ceros y unos. Esta
cadena se divide en celdas de tama~no jo. Cada celda de memoria tiene una
direccion (un nombre) para poder ser usada por el procesador (o el subsistema
de E/S). Un acceso a memoria es una operacion de la forma \Dar el contenido
de la celda con direccion 3322" o \Guardar el valor 33 en la celda con direccion
1234". El tama~no de las celdas y el tama~no de las direcciones depende de cada
computadora.
6
En un acceso a memoria se puede traer una o mas celdas de memoria. La
cantidad de celdas de memoria que se traen en un acceso es determinada por el
dise~nador de la computadora, no por el programador. La longitud de la palabra
es la cantidad de bits que se traen en un acceso a memoria 1 .
Podemos pensar a la memoria como un gran arreglo de celdas donde cada ndice del arreglo se corresponde con la direccion de cada celda. De esta
manera, para indicar del contenido de una determinada direccion escribiremos
Mem[direccion] o simplemente [direcci
on], de la misma forma que haramos
en un arreglo.
Existen distintas formas de indicar a la memoria cual es la celda sobre la que
se desea trabajar. Direccionar quiere decir indicar a la memoria una direccion.
Las distintas formas de direccionar se llaman modos de direccionamiento, y
estos tambien son parte de la arquitectura. Los modos de direccionamiento mas
comunes son los siguientes:
Directo: Traer el contenido de la celda 1234. Ej: Mem[1234]
Indirecto: Traer el contenido de la celda, cuya direccion esta guardada en
la direccion 2345. Ej: Mem[Mem[2345]]
Inmediato: No se accede a memoria. El dato es una constante. Ej: 1024
1.3
Directo de Registro: Traer el contenido de la celda, cuya direccion esta guardada en el registro 2. Ej: Mem[R2]
Indexado: Traer el contenido de la celda cuya direccion se obtiene haciendo
la suma de dos direcciones. Cada una de estas direcciones pueden tener
cualquiera de los anteriores modos de direccionamiento. Ej: Mem[R1+10]
Entrada/Salida
El subsistema de entrada salida esta compuesto por dos partes:
controladores, intefaces y procesadores de E/S
dispositivos de E/S
Los ejemplos de dispositivos de E/S son innumerables, aqu se mencionan solo
algunos:
De entrada: scanner, lapiz optico, mouse, joystick, teclado, touch screen,
etc.
De salida: monitor, impresora, plotter, etc.
De E/S: disco rgido, disco exible, disco optico, cintas, CD, CDR, DVD,
tape backup, placas de red, placas de sonido, placas de video, etc.
1 Esta es una denici
on posible de palabra pero no la unica. Existen excepciones por causas
particulares.
7
Los controladores, interfaces, y procesadores de E/S hacen de intermediarios
entre el procesador y los dispositivos. Alivian la tarea el procesador y proporcionan al programador una forma simple de usar cada dispositivo. As como
cada celda de memoria tiene una direccion unica para poder ser referenciada,
cada controlador tiene al menos una direccion propia.
En la gura 1.3 vemos un esquema del subsistema de E/S
Figura 1.3: Subsistema de Entrada/Salida
1.4
System Bus
La transferencia de informacion entre las distintas partes de una computadora se
realiza usando un bus. En principio podemos pensar un bus como un conjunto
de cables o lneas por los cuales se transmitira informacion. Un system bus se
divide en las siguientes partes:
Bus de direcciones: a traves de el el procesador indica la direccion de
memoria donde se encuentra el dato que desea acceder.
Bus de datos: por el se transere el contenido de la posicion de memoria
seleccionada. Es un bus bidireccional, es decir, permite la transferencia de
informacion desde memoria al procesador (operacion de lectura) o desde
el procesador a memoria (operacion de escritura).
Bus de control: conjunto de lneas que controlan la transferencia a realizar (entre otras cosas). Cabe destacar, de entre otras, las lneas de
lectura/escritura, acceso a memoria/periferico, reloj, . . .
8
Figura 1.4: Partes de un bus
En la gura 1.4 se muestra un esquema de las partes de un bus.
Como en un instante cada lnea fsica del bus puede tener un unico valor,
no es posible transmitir mas de un dato por vez. Al estar conectado el bus con
muchas partes funcionando en forma asncrona es posible que mas de una parte
desee hacer uso del bus en un instante. En este caso se debe priorizar alguna
parte con algun criterio. Justamente estos criterios, constituyen la poltica de
asignacion del BUS.
Notacion: su suele usar el smbolo @ para designar direcciones.
9
Cap
tulo 2
La Maquina Sencilla
2.1
Arquitectura y organizaci
on
2.1.1
Conjunto de instrucciones
Queremos dise~nar un procesador capaz de ejecutar 4 instrucciones diferentes:
suma: suma el contenido de dos posiciones de memoria Dst y F te dejando
el resultado en la direccion Dst:
ADD Dst, Fte
[Dst] [Dst] + [F te]
Ademas modica un codigo de condicion que denominaremos F Z en funcion del resultado de la operacion. Este indicador toma el valor 1 si el
resultado es cero o se activa a 0 en caso contrario, es decir,
FZ
([Dst] + [F te] = 0) 1
movimiento: copia el contenido de una posicion de memoria
posicion Dst:
MOV Dst, Fte
[Dst] [F te]
FZ
([F te] = 0)
comparacion: compara el contenido de dos posiciones de memoria
F te:
CMP Dst, Fte
[F te] [Dst]
FZ
([F te] [Dst] = 0)
No almacena el resultado de la operacion en el destino.
salto: si F Z = 1, pasa a ejecutar la instruccion que se encuentra en la
direccion Dst. En caso contrario, continua con la siguiente instruccion de
F te
a otra
Dst
y
1 En esta asignaci
on se esta guardando en FZ el valor de verdad de la expresion de la
derecha.
10
memoria.
BEQ Dst
Si F Z = 1 entonces P C
Dst Esta instrucci
on permite romper el secuenciamiento implcito de las instrucciones de un programa.
Veamos cual sera la secuencia de instrucciones que debera ejecutar la CPU
para realizar una multiplicacion de dos variables a y b dejando el resultado
almacenado en la variable c. El algoritmo escrito en lenguaje Pascal sera:
begin
c := 0;
i := 0;
while i < b do
begin
c := c + a;
i := i + 1;
end
end
Se entiende por lenguaje ensamblador a un conjunto de instrucciones con
nombres mnemotecnicos mas algunas facilidades para el programador como las
etiquetas.
Una traduccion posible de este algoritmo al lenguaje ensamblador de nuestra
computadora es:
begin: MOV
MOV
while: CMP
BEQ
ADD
ADD
CMP
BEQ
end:
c, 0
i,0
i, b
end
c, a
i, 1
1, 1
while
; c := 0
; i := 0
; mientras i < b
; c := c + a
; i := i + 1
Fijemonos que la ultima instruccion de salto debe ser incondicional, es decir,
debe saltar siempre. Como nuestro conjunto de instrucciones no incluye un salto
incondicional se hace una comparacion que fuerce F Z = 1 con lo cual logramos
que el BE Q salte siempre.
Un programa ensamblador no puede ser ejecutado directamente en una computadora. Se debe ensamblar y linkear el programa para convertirlo en codigo
de maquina (lenguaje de maquina). Este ultimo es la codicacion en binario del programa ensamblador y es lo que entiende el procesador. El lenguaje
ensamblador existe simplemente para facilitar la tarea del programador. Una
caracterstica importante de un lenguaje ensamblador es que sus instrucciones
se corresponden una a una con el lenguaje de maquina.
11
2.1.2
Memoria
Tanto el programa como las variables y constantes que se utilizan deben residir
en memoria.
En el dise~no de esta computadora supondremos que el bloque de memoria
dispone de una capacidad de 128 palabras. La interfaz de la memoria es la que
muestra en la gura 2.1 Se conecta con el bus de direcciones para recibir en
donde debe leer o escribir, con el bus de datos para enviar o recibir datos y
tiene una lnea de control de un bit para que le indiquen la operacion que debe
realizar (lectura o escritura).
Figura 2.1: Memoria
Veamos como se ubicara el programa anterior en la memoria. Suponiendo
que las variables y constantes se almacenan a partir de la direccion 0x10 2
y el programa a partir de la direccion 0, tendremos las siguientes direcciones
de memoria asignadas a las variables, constantes e instrucciones del programa,
suponiendo que cada una de ellas ocupa una palabra de memoria:
etiqueta
a
b
c
i
1
0
begin:
while:
end:
2 0x
direccion
0x10
0x11
0x12
0x13
0x14
0x15
0x00
0x02
0x08
se usa para aclarar que los numeros estan en hexadecimal.
12
2.1.3
Formato de instrucci
on
En las secciones anteriores vimos que tanto los programas como los datos que
estos utilizan estan almacenados en memoria y viajan al procesador a traves
del bus de datos. Esta observacion, en principio trivial, esconde un concepto importante; para el procesador no hay diferencia entre los programas y los
datos. Si uno mirara un pedazo de la memoria no podra saber si en ese lugar
esta almacenado un programa o los datos que el programa usara. Esta claro
que el procesador interpretara programas y datos de una manera muy distinta, ya que en cada acceso a memoria sabe si lo que recibe es un dato o una
instruccion, pero a pesar de ser interpretados de distinta manera ambos son
tratados |desde el procesador| como datos. El hecho que los programas sean
datos para el procesador, es lo que hace que una computadora sea de proposito
general. Las primeras computadoras no fueron de proposito general sino que
tenan determinados algoritmos que saban aplicar a los datos residentes en la
memoria. Una maquina es de proposito general cuando los algoritmos que aplica
son un dato mas de entrada.
Ahora que tenemos en claro que los programas residen en la memoria y, que
sabemos que un programa esta compuesto por un conjunto de instrucciones,
podemos asegurar que cada instruccion debera codicarse en binario para poder
ser almacenada en memoria. Se denomina formato de una instruccion a la
organizacion en campos de bits de toda la informacion que requiere la instruccion
para ser ejecutada.
2.1.4
Codigo de operacion
Veamos que es lo que hace el procesador cuando recibe una instruccion de memoria. Primero debe conocer de que instruccion se trata, la manera mas simple
de hacer esto es asignarle un numero o codigo a cada instruccion. Este codigo se llama codigo de operacion (CodOp) (muchas veces se usan los terminos
instruccion y operacion indistintamente). El procesador en la UC tendra un
decodicicador que le permita saber que codigo se corresponde a que accion (que
instruccion). Demos un ejemplo: el codigo de operacion esta en el sistema (2,
3), esto permite tener 23 instrucciones distintas.
Ademas de conocer la longitud del codigo de operacion es necesario conocer
su ubicacion dentro de la palabra (recordemos que de memoria siempre llegan
palabras). Es natural suponer que los 3 bits mas signicativos de la palabra
tienen el codigo de operacion. 3 Al llegar una palabra de memoria la UC
compara los 3 bits del codigo de operacion con su tabla, si no se encuentra
tenemos un error, si se encuentra la UC sabe que acciones debe realizar para
ejecutar esa instruccion.
3 Pero
es una decision arbitraria
13
2.1.5
Operandos
Una vez que la UC sabe de que instruccion se trata, tambien sabe cuantos
parametros necesita y de que tama~no. Si la instruccion es una suma, debera tener al menos dos valores para sumar y un lugar para guardar el resultado. Al
ser estos los valores usados para ejecutar la operacion se les da el nombre de
operandos. Vimos que existen muchas maneras de decir donde se encuentra un
dato (modos de direccionamiento). Cuando la UC busca los valores para ejecutar la operacion debe conocer que modo de direccionamiento se esta usando
en este caso. Esa informacion tambien esta implcita en el codigo de operacion.
Para el caso de nuestra suma podemos suponer que la instruccion tiene dos
operandos, ambos usando el modo de direccionamiento directo. Esto quiere decir que la instruccion tendra dos direcciones de memoria donde se encuentran
los dos numeros que se deben sumar. Es comun suponer que el resultado se
almacenara en la primera de estas direcciones, muchos procesadores actuales
as lo hacen. Veamos como queda el formato de nuestra instruccion de suma:
Codop
dst
fte
En el caso que el dise~nador desee agregar una nueva instruccion de suma, por
ejemplo con un operando con modo de direccionamiento directo y un operando
con modo inmediato, debera agregar un nuevo codigo de operacion, ya que para
resolver esta nueva suma la UC debe hacer distintas acciones que para resolver
la anterior.
Maquina Sencilla
Como nuestra maquina dispone solo de 4 operaciones distintas, alcanza con que
el campo que indique la instruccion a ejecutar tenga 2 bits. Los codigos de
operacion asignados a cada instruccion seran los de la tabla 2.1
CodOp
00
01
10
11
operacion
ADD
CMP
MOV
BEQ
Tabla 2.1: Codigos de operacion de la MC
Las instrucciones ADD, CMP y MOV necesitan dos operandos (suponiendo
que ADD guarda el resultado en uno de ellos) y la instruccion BEQ uno solo,
as que en la maquina tendremos dos formatos distintos de instruccion. En
maquinas reales suele haber mas formatos de instrucciones pero no demasiados
ya que, cuantos mas sean, mas complicada sera la UC.
Como la memoria de nuestra maquina es de 128 palabras y deseamos que
un operando pueda estar en cualquier lugar de la memoria, cada direccion debe
14
tener 7 bits. Por lo tanto los formato de instruccion en la nuestra maquina son
los siguientes:
Formato de las instrucciones ADD, CMP y MOV
Formato 1
2 bits
Codop
7 bits
Dst
7 bits
Fte
2 bits
Codop
7 bits
Dst
7 bits
Basura
Formato de la instruccion BEQ
Formato 2
Al ejecutar un programa, el procesador lee de memoria una a una las instrucciones que constituyen dicho programa. Si las instrucciones precisan datos, sus
direcciones estaran despues del codigo de operacion.
Datos Los datos que nuestra maquina va utilizar son numeros sin signo o
notacion complemento de 16 bits. La memoria se utiliza para almacenar tanto
instrucciones como datos, est organizada como 128 palabras de 16 bits cada
una. Con este formato para instrucciones y datos, el programa ejemplo anterior
quedara almacenado en memoria tal como muestra la gura 2.2. En la primera
columna vemos cada instruccion del programa en lenguaje ensablador. En la
segunda, en que direccion de memoria se almacena esa instruccion. Luego cada
campo en binario de la instruccion. Donde aparece x es porque no interesa el
valor del bit. Se asumio que son ceros. En la ultima esta la codicacion en
binario de la instruccion, es decir cada instruccion en lenguaje de maquina.
Leng. Ens.
MOV c, 0
MOV i,0
CMP i, b
BEQ end
ADD c, a
ADD i, 1
CMP 1, 1
BEQ while
Dir
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
CoDop
10
10
01
11
00
00
01
11
Destino
00 1001 0
00 1001 1
00 1001 1
00 0100 0
00 1001 0
00 1001 1
00 1010 0
00 0001 0
Fuente
000 0000
000 0000
001 0001
xxx xxxx
001 0000
001 0100
001 0100
xxx xxxx
Cod. maquina
8900
8910
4991
C400
0910
0994
4A14
C100
Tabla 2.2: Programa almacenado en memoria
2.2
Dise~
no del procesador
Pasaremos a dise~nar el procesador de nuestra maquina.
15
2.2.1
Registros
Contador de programa
Hemos visto en la introduccion que existen algunos registros de uso especco
que estaran en cualquier maquina. Uno de ellos es el program counter (P C ) o
contador de programa o registro de proxima instruccion (RP I ).
Este registro tendra siempre la direccion de memoria donde se encuentra la proxima instruccion que se debe ejecutar.
Como un programa siempre estara almacenado en la memoria de forma secuencial, es decir, una instruccion detras de la otra, cada vez que ejecutemos una
instruccion se debera incrementar en uno el P C para ejecutar las instrucciones
en orden. Esta operacion de suma sobre el P C se debera realizar muchas veces
(una vez por cada instruccion a ejecutar), por lo tanto no es ilogico pensar en
agregar circuitera especial para realizarla. Un diagrama de esta circuitera se
muestra en la gura 2.2.
Figura 2.2:
PC
con su sumador
En la gura se muestran dos lneas de control. Todas las lneas de control
|de este y de todos los esquemas| estan conectadas a la unidad de control, es
esta ultima la que las activa y desactiva en el momento indicado para que las
instrucciones sean ejecutadas correctamente. El estado natural de la lnea P Cin
es 0 y en ese estado el registro manda por el bus de salida su contenido. Cuando
la lnea P Cin toma el valor 1, el registro P C deja de mandar su contenido por
el bus de salida y toma el contenido del bus de entrada. El registro toma un
nuevo valor y cuando la lnea P Cin vuelva a 0, se mandara el nuevo valor por
el bus de salida.
Este funcionamiento de los registros es muy importante. De aqu en mas
todas las lneas de control llamadas
2in funcionan de la manera recien descripta.
En particular el registro Latch y su lnea de control funcionan as. Luego
volveremos sobre el registro Latch y veremos su funcion.
El componente +1 es un sumador. Toma el valor de su bus de entrada, le
suma 1 y manda el resultado por el bus de salida. Este componente tiene el
16
mismo comportamiento todo el tiempo, le suma uno a todo lo que entra por el
bus de entrada, es por eso que no necesita ninguna lnea de control.
Con esta circuitera podemos ejecutar un programa con todas sus instrucciones ordenadas, pero existen casos donde el programador desea realizar distintas acciones (ejecutar distintas instrucciones) dependiendo de algun resultado
anterior. Para esto existe la instruccion BE Q que le permite al programador
modicar el contenido del P C .
Registro de instrucci
on
Veamos que hace el procesador cuando debe ejecutar una instruccion. En el
P C est
a la direccion de la instruccion que se debe ejecutar. Una vez que se
haya pedido a la memoria que de el contenido de la celda con la direccion que
esta almacenada en el P C y que se haya recibido la respuesta de la memoria, se
debe mirar los bits correspondientes al codigo de operacion para saber de que
instruccion se trata. Determinar que instruccion se acaba de traer de memoria
se llama decodicar la instruccion. Para esto debemos tener almacenado en
algun lugar la instruccion recien recibida. Para esto se utiliza un registro de uso
especco llamado registro de instruccion (RI ).
En el RI siempre estara almacenada la instruccion que se esta ejecutando.
Operandos
Supongamos ahora que se acaba de decodicar una instruccion y que se determina que es un ADD. Se debes buscar los valores de memoria para sumarlos.
Pero solo se puede pedir un valor por vez a la memoria (<solo hay un bus de
datos!) As que se pedira uno de los valores a la memoria y cuando se reciba el
dato habra que guardarlo en algun lado hasta que se reciba el otro valor a ser
sumado. Nuevamente este es un registro de uso especco que llamaremos A.
De igual manera guardaremos el otro operando en un registro llamdo B 4
Codigos de condici
on
Como se explico en la introduccion, los codigos de condicion guardan informacion sobre la ultima instruccion ejecutada. En el caso de nuestra maquina la
unica informacion que se necesita es la que precisa la instruccion BE Q, ya que
es la unica instruccion que necesita informacion de la ejecucion anterior. As que
alcanza con tener un registro de codigos de condicion de un unico bit. A este
registro lo llamaremos F Z .
4 Se puede ver que este registro no es indispensable para el funcionamiento de la m
aquina
tal cual esta presentada en este apunte
17
Registros de usuario
En nuestra maquina no existen registros de usuario. La razon de esta ausencia
es mas didactica que practica. Todas los procesadores actuales tienen registros
de este tipo, (16 registros es un numero habitual) podramos decir que hay una
tendencia a tener cada vez mas registros de usuario dentro de los procesadores.
Un exceso de registros (512 registros de usuario o mas) hace que un procesador
sea muy rapido, pero trae problemas a nivel de organizacion que deben ser
resueltos usando tecnicas especiales. Para mantener nuestra maquina simple,
excluiremos estos registros de nuestro dise~no.
2.2.2
Unidad aritmetico logica (ALU)
La ALU debe resolver todas las operaciones necesarias para ejecutar todas las
instrucciones de nuestro procesador. Estas son:
Sumar dos numeros de 16 bits.
Comparar dos numeros de 16 bits, ver si son iguales. Esta operacion
se puede realizar de varias maneras: restando los numeros y viendo si
el resultado es cero o comparando bit a bit con una compuerta XOR5 .
Nosotros adoptamos la segunda solucion.
Mas adelante veremos que por como estan conectados los componentes a
los buses necesitamos que la ALU en algunos casos no haga nada; simplemente de como resultado uno de los parametros de entrada.
Ademas necesitamos que se detecte si el resultado es cero o no.
La interfaz de nuestra ALU consta de dos buses de entrada llamados A y
B , por donde recibir
a los numeros sobre los que operara, y un bus de salida S
por donde dara el resultado. Tiene dos lneas de control por donde se eligira la
operacion a realizar. Por ultimo tiene una lnea de salida que tendra el valor
del codigo de condicion Z .
As como pusimos codigos para cada instruccion (al procesador) pondremos
codigos para cada operacion de la ALU. Estos codigos seran mandados a la ALU
por la UC a traves de las lneas de control. Los codigos estan descriptas en la
tabla 2.3
CodOp ALU
00
01
10
11
operacion
S
A +B
A xor B
S
B
indenida
Tabla 2.3: Codigos de operacion de la ALU
Podemos ver el dise~no de la ALU en la gura 2.3.
5 Ver
Apendice
18
Figura 2.3: Unidad Aritmetico Logica
2.2.3
Accesos a memoria
Hay 3 motivos para acceder a memoria en nuestra maquina:
para traer la proxima instruccion a ejecutar
para buscar un operando sobre el cual se operara
para guardar un resultado obtenido de la ALU
En cada uno de estos casos se debe dar a la memoria la direccion en donde
debe leer o escribir y, en cada caso esa direccion estara almacenada en distintos
registros de nuestro procesador: en el primero la direccion estara almacenada en
el P C , en el segundo en el RI en la parte correspondiente al operando fuente, y
en el ultimo tambien estara en el RI pero en la parte del operando destino. La
UC decidira en cada acceso a memoria que direccion se le enva a la memoria.
Para esto se incorporo un multiplexor.
Un multiplexor (MUX) en un componente que permite seleccionar una de
varias entradas posibles. En la gura 2.4 tenemos un esquema de un multiplexor
de 4 entradas. Cada entrada del MUX recibira un valor y de acuerdo a las lneas
de control e1 y e2 se mandara por la salida S el valor recibido por entrada que
corresponda. El resto de las entradas se ignoraran.
En nuestro procesador conectaremos a las entradas del MUX los registros
de donde puede necesitarse la direccion para ser mandada a memoria: el P C
y los dos operandos del RI . Cuando se realice un acceso a memoria la UC
seteara las lneas de control del MUX para que llegue a memoria la direccion
que corresponde. En la tabla 2.4 vemos las asignaciones en nuestra maquina.
19
Figura 2.4: Multiplexor
e1 e2
00
01
10
11
entrada
PC
no utilizada
op. Fte del RI
op. Dst del RI
Tabla 2.4: Conexiones del MUX en la maquina Sencilla
2.3
Esquema completo de la Maquina Sencilla
En la seccion anterior vimos con algun detalle los distintos componentes que
componen nuestra maquima y como funciona cada uno. El objetivo de esta
seccion es entender como se relacionan entre ellos y como cooperan para resolver
las instrucciones. El funcionamiento de la UC sera dejado para una seccion
posterior.
Empecemos viendo en la gura 2.5 la organizacion completa de nuestro
procesador.
En esta gura tenemos mucha informacion, vemos todos los registros que
existen en el procesador, vemos todos los buses y que conecta cada uno y vemos
todas las lneas de control necesarias para manejar todos los componentes.
Las lnas de control son todas las lneas de un bit que tienen un extremo sin
conectar en la gura. Todos los extremos sueltos estan realmente conectados a
la UC, para que esta coordine todos los componentes.
Tambien vemos en la gura que existen dos tama~nos de bus distintos, los
buses por donde viajan datos (16 bits) y a buses por donde viajan direcciones
(7 bits).
Otra particularidad que vemos en la gura es que el RI , a diferencia de
todos los demas registros no esta conectado a un unico bus de salida, sino a
tres buses distintos: uno conectado a los bits que corresponden al operando
fuente, otro conectado a los bits que corresponden al operando destino y, por
20
Figura 2.5: Organizacion de la Maquina Sencilla
ultimo uno que conecta el codigo de operacion con la UC para poder realizar
la decodicacion de la instruccion. Cual de los operandos se utilizara en cada
momento sera determinado por el valor del MUX. La UC usara la informacion
del codigo de operacion a la hora de decodicar.
Por ultimo hemos incorporado el registro R que tiene un comportamiento
inverso al resto de los registros de la maquina. Digimos que el seteo a 1 de una
lnea de control de cualquier registro hace que este guarde el valor que recibe
por el bus de entrada, y que el resto del tiempo se esta mandando el contenido
del registro por el bus de salida. El registro R es la unica excepcion a esta regla
en nuestra maquina. La lnea de control de R cuando esta en 1 provoca que
el contenido de este registro se vuelque al bus de salida y, el resto del tiempo
toma el valor que recibe por el bus de entrada. La razon de esta excentricidad la
entenderemos en la proxima seccion, pero ya podemos intuir que se debe a que si
R y la memoria vuelcan su contenido simultaneamente al bus, este quedara con
un valor indeterminado.
La lnea de control de R no tiene un nombre propio ya que es la negacion
de la linea R=W . Esta conexion tambien es simple de entender: siempre que la
memoria mande un dato la bus, R no debe mandar nada, y al reves, siempre
que la memoria escriba un dato, este vendra del registro R.
21
2.4
Ciclo de instruccion
Un procesador ejecuta instrucciones. Esa es su funcion y su razon de ser. No
\sabe" hacer otra cosa que ejecutar instrucciones (un procesador es un automata). Veremos es esta seccion como es que se ejecuta una instruccion.
Como siempre, para simplicar una tarea complicada la dividiremos en pasos
mas peque~nos y simples. La ejecucion de una instruccion sera dividida en los
siguientes pasos:
Busqueda de la instruccion en memoria.
Recordemos una vez mas que lo unico que conocemos de una instruccion
antes de ejecutarla es donde esta ubicada en la memoria. As que lo
primero que debemos hacer es pedirle a la memoria que nos de el contenido
de la direccion que esta guardada en el P C y almacenar ese dato en el RI .
Toda esta operacion de busqueda en memoria y almacenado del resultado
se llama Fetch o Instruction Fetch.
Una vez que la instruccion se encuentra en el RI se debe ver de que
instruccion se trata. Esto es realizado por la UC. Este paso se llama
decodicacion.
Ya sabemos que instruccion debemos ejecutar, por lo tanto sabemos si
necesita operandos o no. En el caso que s, se buscaran los los operandos
en memoria y se almacenaran en los registros destinados a tal n. Este
paso se suele llamar Operand Fetch.
Una vez que se trajeron todos los operandos se opera con la ALU para
obtener el resultado. Este paso se llama ejecucion.
Si el resultado se debe guardar en la memoria se hace una operacion de
escritura.
Por ultimo y muy importante, se debe incremetar en P C , ya que si no se
hace en el proximo ciclo el P C tendra el mismo valor y se ejecutara nuevamente la misma instruccion.
Estos pasos no se siguen exactamente en el orden descripto, ni se realizan
necesariamente todos en la ejecucion de una instruccion; la instruccion C M P no
guarda ningun resultado y la instruccion M OV no utiliza la ALU. Podemos decir
que los unicos pasos que estaran en todos los ciclos son el Fetch, la decodicacion
y el incremento del PC.
La ejecucion de los pasos necesarios para ejecutar una instruccion se
llama ciclo de instruccion.
Un procesador esta realizando todo el tiempo ciclos de instruccion. Un
procesador solo realiza ciclos de instruccion, no sabe hacer ninguna otra cosa.
Resumiremos los pasos de un cclo de instruccion en la tabla 2.5.
22
1. Fetch
2. Decodicacion
3. Operand Fetch
4. Ejecucion
5. Guardar resultados
6. Incrementar P C
Tabla 2.5: Ciclo de instruccion
2.4.1
Ciclo de instrucci
on en la Maquina Sencilla
Cuando se dise~na una maquina se decide cuales de los pasos del ciclo de instruccion se realizan simultaneamente. Esta decision esta fuertemente condicionada
por el dise~no de la organizacion del procesador. Un ejemplo simple: si se tiene un
unico bus dentro del procesador todos los movimientos de datos entre registros
se deben realizar de forma secuecial (uno detras de otro), si se tiene mas de un
bus, dependiendo de como se conecten se podran realizar varios movimientos a
la vez.
2.5
Dise~
no de la Unidad de Control
Pasaremos a dise~nar la UC, encargada de sincronizar todos los componentes que
se han sido agregados a nuestra maquina. Sin duda este sera el componente mas
complicado de nuestro procesador.
Como primer paso se puede ver en la gura 2.5 que para controlar todos los
componentes del procesador hacen falta solo 11 lneas de control. Todas estas
lneas seran la salida de la UC. De igual manera se puede ver que la UC recibe
solo 4 lneas de entrada. Estas son las dos lneas correspondientes al Codop,
el codigo de condicion almacenado en F Z y el reloj que no esta dibujado en la
gura pero no debemos olvidarlo nunca.
Veamos que lneas de control se deben activar (setear a 1) para ejecutar cada
una de las acciones de cada paso de una instruccion. Para hacer esta tarea mas
facil, pondremos algunos nombres mnemotecnicos a las lneas de control. Esto
es solo para facilitar la lectura.
23
Nombre
MUX = P C
M U X = F te
M U X = Dst
M emwrite
lnea de control
M U X0 = 0, M U X1 = 0
M U X0 = 0, M U X1 = 1
M U X0 = 1, M U X1 = 1
R=W = 1
R=W = 0
Lin
Latchin
ALUadd
ALU0
ALUxor
ALU0
M emread
= 0, ALU1 = 0
= 0, ALU1 = 1
ALU0 = 1, ALU1 = 1
ALUnop
El subndice nop signica \No Opera", esta es la operacion de la ALU que
manda B como salida.
2.5.1
Ciclo de instrucci
on
Teniendo en cuenta estas lneas y los pasos de el ciclo de instruccion de nuestra
maquina analizaremos nuevamente la instruccion ADD, viendo en cada paso
que lneas de control se deben activar.
Instruccion
Fetch
ADD
IR
PC
Decod.
Op. Fetch
Exec.
Res.
[P C ]
PC + 1
Decod. C0 y de C1
B
[F te]
A
[Dst]
R
A +B
[Dst] R
MUX
MUX
= P C , M emread , I Rin
= P C , Lin
P Cin
= F te, M emread , Bin
= Dst, M emread , Ain
ALUadd , F Zin
M U X = Dst, M emwrite
MUX
MUX
Hay varios detalles de este cuadro muy importantes. Primero vemos que
en la Maquina Sencilla hemos reducido el numero de pasos con respecto a la
tabla 2.5. En realidad lo que hicimos fue agrupar estos pasos.
Otra cosa que debemos notar en el cuadro es que las lneas de control se
activan con un cierto orden. Veremos que las lneas de control que estan en un
mismo renglon separadas por comas se activan todas juntas, y que en el paso
de un renglon a otro todas las lneas pierden su valor. Entonces para mantener
una lnea activa en varios ranglones se debe activarla en cada uno de ellos.
Miremos con detalle que es lo que estamos haciendo en cada paso del cuadro
anterior. Es muy importante que mientras se lea la siguente explicacion se siga
cada paso en el la gura 2.5.
Fetch En este paso se hacen dos tareas distintas:
{ Primero se busca en memoria la proxima instruccion a ejecutar.
Para esto se setea el M U X de manera tal que el contenido del P C
24
llegue al bus de datos y de ah a la memoria. Mientras tanto se le da
a la memoria una orden de lectura, lo que provoca que el resultado
de esta lectura (la instruccion que se debe ejecutar) pase el bus de
datos. Como tambien activamos lnea in del registro RI el contenido
del bus de datos queda guardado en este registro.
De esta manera hemos logrado poner en el RI la proxima instruccion
a ejecutar.
{ Luego se incrementa el P C para que en el proximo ciclo de instruccion se levante la siguiente instruccion del programa.
Para esto se utiliza el sumador +1. Este componente siempre esta activo y no tiene ninguna lnea de control; siempre que pase una direccion por el bus de direcciones la salida de +1 tendra esta direccion
incrementada en uno. Por lo tanto lo que controlara el el uso de la
salida de +1 sera el registro Latch. La lnea in de Latch sera activada solo cuando el dato que sale de +1 deba ser pasado al P C . En
cualquier otro caso la salida de +1 sera ignorada. Como se quiere
incrementar el P C justamente se hace que su contenido llegue al bus
de datos, de ah pasara a +1 y, se habilita la lnea Lin para tener ese
resultado disponible.
Una vez que en Latch este guardado el resultado, se activa la lnea
P Cin para que este valor pase al P C y este quede listo para el proximo ciclo de instruccion.
Decod Por ahora la decodicacion la pasaremos por alto. Sabemos que en este
paso la UC averigua que instruccion se levanto en el paso anterior y, en
base a eso elije que pasos se deben ejecutar, es decir que lneas activar y
en que orden.
Operand Fetch En el Operand Fetch se debe traer los datos a sumar de la memoria y
dejarlos en los registros destinados a los operandos.
Se empieza por el traer en operando fuente. Para esto se debe mandar a
la memoria la direccion de donde se quiere leer, esto se hara seteando el
M U X para que mande el contenido de la porci
on de RI que corresponde
al operando fuente al bus de direcciones. Mientras se activa la lnea de
lectura de memoria y la lnea in del registro B para guardar el resultado
de la lectura.
Con el operando destino se hace exactamente lo mismo, guardando el
resultado en el registro A. Cual de los dos operandos se lee primero es
indistinto en esta maquina.
Exececution Los datos ya estan en los registos correctos, por lo tanto estan llegando a la
ALU, solo se debe setear el codigo de operacion de la ALU correctamente
para que esta haga la operacion.
Como el registro R esta siempre tomando el valor del bus de salida de la
ALU, no hace falta activar ninguna lnea para que tome el valor. Esto no
ocurre con el codigo de condicion F Z que si se debe decir explcitamente
que tome el valor que da la ALU activando su lnea in.
25
Save Result Para guardar en la memoria el resultado de la operacion se setea el M U X
para que llegue al bus de direcciones la direccion destino almacenada en
el RI y se manda una orden de lectura a la memoria. Como la orden de
lectura esta tambien conectada a la lnea de control del registro R, este
manda su contenido al bus de datos de donde la memoria lo tomara para
almacenarlo en la direccion indicada.
La razon por la que la lnea de control de R sea la misma que la
que controla la memoria es que siempre que se haga una escritura
en la memoria, el dato que se escriba estara almacenado en R.
Ya hemos visto todas los pasos necesarios para completar una instruccion
. Veamos el resto de las instrucciones.
ADD
Instrucci
on
M OV
La instruccion M OV es muy parecida a ADD. La unica diferencia es la orden
que le damos a la ALU.
Fetch I R [P C ]
M U X = P C , M emread , I Rin
PC
PC + 1
M U X = P C , Lin
Decod.
Op. F.
Exec.
Res.
Instruccion
Decod. C0 y de C1
B
[F te]
A
[Dst]
R
[Dst]
B
R
P Cin
= F te, M emread , Bin
= Dst, M emread , Ain
ALUnop , F Zin
M U X = Dst, M emwrite
MUX
MUX
CM P
La instruccion C M P diere muy poco de las anteriores. Es simple entender su
funcionamiento. El paso de guardar resultados es inexistente.
Fetch I R [P C ]
M U X = P C , M emread , I Rin
PC
PC + 1
M U X = P C , Lin
Decod.
Op. F.
Exec.
Instruccion
Decod. C0 y de C1
B
[F te]
A
[Dst]
AxorB
P Cin
= F te, M emread , Bin
= Dst, M emread , Ain
ALUxor , F Zin
MUX
MUX
BE Q
Esta instruccion diere de los anteriores porque su ejecucion depende del valor
del registro F Z . Para realizar esto pondremos una ejecucion condicional que
depende del registro F Z . En el caso que F Z tenga el valor 0 ese paso no se
ejecuta.
26
Fetch
IR
PC
Decod.
Res.
[P C ]
PC + 1
MUX
MUX
Decod. C0 y de C1
if F Z = 1
= P C , M emread , I Rin
= P C , Lin
P Cin
MUX
= Dst, Lin
P Cin
2.6
Optimizacion de los ciclos de instruccion
Hemos visto las secuencias de lneas de control que es necesario activar para
ejecutar cada una de las instrucciones de nuestra maquina. Vimos que lneas se
deben activar al mismo tiempo, y que lneas se deben activar secuencialmente.
Llamaremos ciclo de reloj o simplemente ciclo a la activacion de todas las lneas
de un mismo renglon en un intervalo de tiempo. De esta manera la instruccion
ADD necesita 7 ciclos para ser ejecutada si se ejecuta tal cual est
a en la tabla.
Sin embargo al armar las tablas no prestamos atencion a ver que pasara si juntamos mas lneas de control en un mismo ciclo. En esta seccion nos ocuparemos
de ver que lneas de control podemos activar simultaneamente y cuales no. Esto
nos permitira reducir el numero de ciclos de cada instruccion y as obtener un
procesador mas veloz.
Nuevamente haremos un analisis profundo sobre la instruccion ADD y luego
lo repetiremos para el resto de las instrucciones.
2.6.1
Optimizacion de la instrucci
on
ADD
Empecemos por el Fetch. Este es comun a todas las instrucciones.
Fetch
Podemos ver que en los dos primeros ciclos del fetch se utiliza el valor del P C en
el bus de direcciones, por lo tanto podramos intentar unicar estos dos ciclos.
De hecho, si lo hacemos nos queda un fetch con esta forma
IR
[P C ], P C
PC
+1
MUX
= P C , M emread , I Rin , Lin
Aun nos falta el ultimo ciclo del fetch, pasar el valor de Latch a P C . Si
miramos la organizacion de nuestro procesador, vemos que esa transferencia se
hace usando un bus exclusivo para ese n. Por lo tanto podramos realizar esa
operacion en simultaneo con cualquier otra sin tener ningun conicto. >Por
que entonces no juntarla tambien con las anteriores? No es posible juntarla
con las anteriores por dos razones. La primera es que no tenemos garanta de
que el resultado del sumador sea el correcto hasta que halla nalizado el ciclo
completo. Esta regla vale para todos los componentes: no podemos asumir que
un registro guardo un valor del bus hasta que no haya terminado el ciclo, no
podemos suponer que el resultado de la ALU es el correcto antes del n del
27
ciclo, etc. La segunda razon por la que no podemos juntar el P Cin con el resto
del fetch es que si lo hacemos necesitamos que el P C de su contenido al bus
de salida y tome su contenido del bus de entrada en el mismo ciclo. Eso no es
posible para ningun registro en ningun caso. Ya que necesitaramos que la lnea
de control tenga el valor 0 y el valor 1 a la vez. Una lnea de control mantiene
su valor a lo largo de todo un ciclo.
Hemos nombrado algunas reglas del funcionamiento de un procesador:
1. No se puede asumir que el resultado de una operacion es correcto hasta el n del ciclo en que se realiza esa operacion.
2. No es posible leer y escribir un registro en un mismo ciclo.
3. Una lnea de control mantiene su valor durante todo el ciclo.
4. De las regla 3 se deduce que no importa en que orden escribamos
las lneas de control ya que todas estaran activas (o no) durante
todo un ciclo.
A pesar de no poder juntar todo el fetch en un solo ciclo podemos posponer
esta parte del fetch para hacerla mas adelante junto con alguna otra accion.
Esto desordenara un poco nuestro ciclo de instruccion pero hara un procesador
mas rapido.
Data Fetch
Es este paso levantamos los dos operandos que necesita la instruccion ADD.
No es posible relizar esto en menos de dos ciclos ya que la memoria no puede
satisfacer dos pedidos a la vez, el bus de datos y el de direcciones pueden tener
un unico valor a lo largo de un ciclo, etc.
Pero no olvidemos el ultimo ciclo del fetch; este se puede juntar con cualquiera
de estas dos lecturas sin problemas. Con lo que nuestro Data Fetch queda de la
siguiente manera:
B
[F te] M U X = F te, M emread , Bin , P Cin
A
[Dst] M U X = Dst, M emread , Ain
Ejecucion y guardado de resultados
Cada uno de estos pasos se realiza en un unico ciclo as que no sera posible
reducirlos. Pero podramos intentar juntar ambos pasos entre s o con los anteriores.
Una vez que tengamos los valores con los que operar podemos pasar a la fase
de ejecucion. Entonces podramos suporponer la ejecucion con el segundo ciclo
del data fetch. En este ciclo la memoria pone en el bus de datos el resultado
de la lectura, este pasa por A y llega a la ALU |B ya tiene el valor correcto
desde el ciclo anterior| por lo tanto si activamos la ALU tendremos en su bus
de salida el resultado de la operacion, y como R graba todos los resultados de la
ALU y, este se activa junto con el pedido de lectura a memoria, en R tenemos
el resultado de la suma.
28
El data fetch/ejecucion queda con la siguiente forma:
B
[F te] M U X = F te, M emread , Bin , P Cin
A
[Dst] M U X = Dst, M emread , Ain , ALUadd, F Zin
El paso del resultado desde R a la memoria nuevamente no es posible hacerlo
hasta que no se libere el bus de datos. As que tendremos que usar un nuevo
ciclo para ello.
Ciclo de instrucci
on de
ADD
optimizado
Resumamos lo discutido en la seccion anterior. Nuestro ciclo de instruccion
para ADD es el siguiente:
M U X = P C , M emread , I Rin , Lin
E0
Decod. C0 y de C1
M U X = F te, M emread , Bin , P Cin
E1
M U X = Dst, M emread , Ain , ALUadd , F Zin
E2
M U X = Dst, M emwrite
E3
Hemos agregado a cada conjunto de lneas que se activan en un ciclo un
nombre (estado). Esto nos servira para ordenar nuestra unidad de control.
En la siguiente seccion reduciremos los ciclos del resto de las instrucciones
de la maquina de la misma manera que lo hicimos con ADD.
2.6.2
Optimizacion de
MOV , CMP
y
BEQ
M OV
= P C , M emread , I Rin , Lin
E0
C0 y de C1
M U X = F te, M emread , Bin , P Cin
E1
M U X = Dst, M emread , Ain , ALUnop , F Zin
E4
M U X = Dst, M emwrite
E3
Como la unica diferencia entre M OV y ADD es la operacion de la ALU el
tercer ciclo es al unico que le asignamos un nuevo estado.
MUX
Decod.
CM P
= P C , M emread , I Rin , Lin
C0 y de C1
M U X = F te, M emread , Bin , P Cin
M U X = Dst, M emread , Ain , ALUxor , F Zin
MUX
Decod.
BE Q
MUX
Decod.
= P C , M emread , I Rin , Lin
C0 y de C1
P Cin
if F Z = 1:
if F Z = 1:
MUX
P Cin
= Dst, Lin
E0
E6
E7
E6
29
E0
E1
E5
2.6.3
Estados
Hemos conseguido reducir todas nuestras instrucciones a su mnima cantidad
de ciclos, alcanza con 4 ciclos para ejecutar cualquier instruccion. Vimos que
con 8 estados distinos se describen todas las acciones que debe realizar la UC
para ejecutar cualquier instruccion.
Estos 8 estados deben ser combinados en cierto orden. Nos interesa ahora ver como se relacionan y se ordenan estos estados. Para esto usaremos la
gura 2.6 en donde cada crculo se corresponde con un estado, y cada echa se
corresponde con un cambio de estado. Cuando la echa tiene nombre, ese nombre esta indicando una condicion para que el cambio de estado ocurra. Cuando
la echa no tiene nombre es cambio de estado ocurre siempre.
Figura 2.6: Estados de la UC
En la gura 2.6 dividimos a la ejecucion de todas las instrucciones en 4
ciclos. Para seguir entendiendo el funcionamiento de la UC esta division es muy
importante; nos esta diciendo como se relaciona un ciclo de instruccion con un
ciclo de reloj. Cada division en el graco se corresponde con un ciclo de reloj.
Esto quiere decir que en un ciclo de reloj se mantentran constantes todas las
lneas de control. En cada ciclo de reloj el procesador estara en uno de los 8
estados posibles. Y en el ciclo siguiente cambiara su estado segun el graco 2.6.
En los estados donde existen varias transiciones posibles solo una se llevara a
cabo, y se eligira de acuerdo al codigo de condicion que se encuentra en el RI ,
ya que ese valor indica que instruccion se esta ejecutando.
30
2.7
Implementaci
on de la UC
2.7.1
Descripci
on
Conocemos todas las lnes de control que entran y salen de la UC (gura 2.7)
Multiplexor
M U X0
M U X1
Registros
P Cin
Lin
I Rin
Bin
Ain
F Zin
ALU
salida
salida
ALU1
salida
salida
salida
salida
salida
salida
C0
C1
FZ
clock
Memoria
salida
salida
ALU0
R=W
salida
entrada
entrada
entrada
entrada
Figura 2.7: interfaz de la UC
Conocemos todos los estados posibles de la UC (gura 2.6) y conocemos
tambien por que y cuando se producira un cambio de un estado a otro. Sabemos la duracion de cada estado. Ya es el momento de implementar la UC.
Implementar quiere decir en este caso dise~nar toda la circuitera necesaria para
que la UC funcione tal cual la describimos.
Para ordenar las lneas de control se armara una matriz con los estados en
las columnas y las lneas de control en las las. De esta manera se resumiran
todos los estados y las lneas de control que se activan en cada uno (gura 2.8).
Esta matriz no es otra cosa que el resumen de informacion que ya tenamos
anteriormente, no agrega nada nuevo.
E0
M U X0
M U X1
ALU0
ALU1
R=W
P Cin
Lin
I Rin
Bin
Ain
F Zin
0
0
x
x
1
0
1
1
0
0
0
E1
0
1
x
x
1
1
0
0
1
0
0
E2
1
1
0
0
1
0
0
0
0
1
1
E3
1
1
x
x
0
0
0
0
0
0
0
E4
1
1
1
1
0
0
0
0
0
1
1
E5
1
1
0
1
0
0
0
0
0
1
1
E6
x
x
x
x
1
1
0
0
0
0
0
Figura 2.8: Matriz de lneas de cada estado
31
E7
1
1
x
x
1
0
1
0
0
0
0
En la matriz de estados cuando aparece una x es porque el valor de esa lnea
en ese estado no inuye y puede tomar cualquier valor.
Veamos ahora en forma matricial los estados que usa cada instruccion.
(gura 2.9). Pondremos en las columnas los estados y en las las las instrucciones. Esta matriz resume la gura 2.6
E0
ADD
M OV
CM P
BE Q
0
0
0
0
E1
1
1
1
E2
2
E3
3
3
E4
2
E5
2
E6
E7
1,3
2
Figura 2.9: Matriz de estados de cada instruccion
2.7.2
Clock
El reloj emite pulsos de igual duracion cada determinado lapso de tiempo. Podemos gracar el valor que toma la lnea del reloj como una funcion en el tiempo
como muestra la gura 2.10.
Figura 2.10: Clock
Es simple desde un punto de vista electronico armar circuitera capaz de
partir esta se~nal en 4 nuevas se~nales que tomen el valor 1 una por vez y en
orden. Como se muestra en la gura 2.11.
Esta particion del clock nos permitira realizar los 4 pasos del ciclo de instruccion de nuestra maquina. Tenemos una se~nal t0 que solo toma el valor 1
en el primer ciclo de reloj, una se~nal t1 que solo toma el valor 1 en el primer
segundo ciclo de reloj, etc. Si logramos hacer que todas las lneas de control
del estado 0 (E0 ) esten activas solamente cuando t0 esta en uno tendremos listo
nuestro primer paso del ciclo de instruccion.
2.7.3
Implementacion
Primero haremos un componente con la matriz de lneas por estado (gura 2.8)
que tenga 8 lneas de entrada, una por cada estado y 11 lneas de salida, una por
32
Figura 2.11: Clock partido en 4 sub ciclos
cada lnea de control. El funcionamiento es muy simple, cuando se activa una
lnea de entrada correspondiente a un estado, las lneas de salida toman el valor
que corresponde a ese estado. Nunca se deben activar dos lneas de entrada a
la vez.
Con este componente mas la division del clock nos alcanzara para implementar la UC.
ADD
Empecemos una vez mas armando la instruccion ADD con detalle.
Supongamos ahora que tenemos una lnea que esta en uno siempre que estemos ejecutando la instruccion ADD. Esta lnea es muy simple de fabricar,
alcanza con poner un multiplexor con las lneas C0 y C1 como entradas y 4
lneas de salida, una por cada instruccion. Este multiplexor que acabamos de
agregar es el que esta decodicando la instruccion. Ver gura 2.12.
Figura 2.12: Implemetacion del decodicador
Usaremos la lnea que llamaremos add mas la matriz de estados mas las
cuatro lneas del reloj para implementar la instruccion ADD.
En el primer ciclo de cualquier instruccion debemos ejecutar el estado E0
correspondiente al fetch. Esto quiere decir setear todas las lneas de control
como esta descripto en el estado 0. Para esto simplemente conectaremos la
lnea t0 del reloj a la entrada E0 . Con esto logramos que cada vez que estemos
33
en el primer paso del ciclo de instruccion la UC este en el estado 0, es decir
todas las lneas de control estan como corresponde al estado 0.
El segundo ciclo ya depende de que instruccion estamos ejecutando as que
conectaremos a E1 la linea t1 en conjunto con la lnea add para que el estado 1
sea activado cuando estamos ejecutando un ADD, pero no cuando ejecutamos
otras instrucciones. Para esto hacemos un AND logico entre la lnea t1 y la lnea
add y conectamos el resultado del AND a la l
nea E1 . Usaremos de aqu en mas
muchas veces este tipo de conexion
Lo mismo ocurre con el tercer y cuarto ciclos de la instruccion ADD, estos
no debe ejecutarse siempre y por eso los conectaremos usando un AND logico.
En la gura 2.13 vemos como quedan |teniendo en cuenta solo la instruccion
ADD | conectadas las l
neas de control internas de la UC.
Figura 2.13: Implemetacion de ADD en la UC
M OV
Ya implementamos la instruccion ADD a nivel de logica digital. Agregar la
instruccion M OV sera simple ya que son muy parecidas. La unica diferencia
entre las dos instrucciones es el codigo de operacion de la ALU. Esto lo podemos
ver en la matriz de estados de cada instruccion (gura 2.9) donde el unico estado
diferente es el del tercer ciclo en el paso de ejecucion.
Teniendo esto en cuenta agregamos la circuitera necesaria a la UC para
poder ejecutar un M OV y queda como la mostrada en la gura 2.14
34
Figura 2.14: Implemetacion de ADD y M OV en la UC. Las lneas que estan
conectadas entre s se las marca con un punto negro.
CM P
La instruccion C M P diere de las anteriores ya que necesita solo 3 ciclos de
reloj para ser ejecutada. Por la forma en que estamos armando la UC deberemos
dejar el ultimo ciclo libre, es decir, cada vez que se ejecute un C M P tendremos
un ciclo desperdiciado. Esto nos permitira tener un dise~no simple de la UC.
El resto de la instruccion C M P es simplemente volver a utilizar un AND
para ejecutar los estados solamente en el momento e instruccion indicados. En
la gura 2.15 vemos la UC con la instruccion C M P
BE Q
La instruccion BE Q una vez mas diere de las anteriores. Para lograr la ejecucion condicional se debe tener en cuenta el valor de registro F Z y es por eso
que esta es una de las lneas de entrada a la UC. Para activar las lneas solo
en el momento indicado se utilirara una vez mas un AND, pero esta vez con el
valor de la lnea FZ. Como los ciclos 3 y 4 del BE Q dependen del valor de F Z
se hace un OR logico entre las lneas t2 y t3 .
Con el agregado del BE Q la UC queda lista. En la gura 2.16 vemos toda
la circuitera de la UC con su interface con el resto del procesador.
2.7.4
Comentario sobre la UC
Este dise~no de la UC \paga" su simpleza con la perdida de algunos ciclos.
Cuando un BE Q no salta porque el registro F Z esta en cero se desperdician
35
Figura 2.15: Implemetacion de ADD, M OV y C M P en la UC.
Figura 2.16: UC completa con su interfaz con el resto del procesador.
dos ciclos de reloj. Procesadores reales aprovechan al maximo todos los ciclos
para acelerar la ejecucion. Obviamente sus dise~nos son mucho mas complicados.
Se invita a los alumnos a hacer dise~nos mejorados de esta maquina para ser
agregados a este apunte.
36
Ap
endice A
L
ogica Digital
A.1
Operaciones logicas
Las operaciones logicas utilizadas en este apunte son las siguentes:
Operacion
Tabla
Smbolo
AND
OR
AND
0
1
OR
0
1
0
0
0
0
0
1
1
0
1
1
1
1
XOR
XOR
0
1
0
0
1
1
1
0
NOT
NOT
0
0
1
1
0
37
Indice de Figuras
1.1
1.2
1.3
1.4
estructura general de una computadora
estructura general de un procesador . .
Subsistema de Entrada/Salida . . . . . .
Partes de un bus . . . . . . . . . . . . .
.
.
.
.
5
6
8
9
Memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
P C con su sumador
. . . . . . . . . . . . . . . . . . . . . . . . .
Unidad Aritmetico Logica . . . . . . . . . . . . . . . . . . . . . .
Multiplexor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Organizacion de la Maquina Sencilla . . . . . . . . . . . . . . . .
Estados de la UC . . . . . . . . . . . . . . . . . . . . . . . . . . .
interfaz de la UC . . . . . . . . . . . . . . . . . . . . . . . . . . .
Matriz de lneas de cada estado . . . . . . . . . . . . . . . . . . .
Matriz de estados de cada instruccion . . . . . . . . . . . . . . .
Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Clock partido en 4 sub ciclos . . . . . . . . . . . . . . . . . . . .
Implemetacion del decodicador . . . . . . . . . . . . . . . . . .
Implemetacion de ADD en la UC . . . . . . . . . . . . . . . . . .
Implemetacion de ADD y M OV en la UC. Las lneas que estan
conectadas entre s se las marca con un punto negro. . . . . . .
2.15 Implemetacion de ADD, M OV y C M P en la UC. . . . . . . . .
2.16 UC completa con su interfaz con el resto del procesador. . . . . .
12
16
19
20
21
30
31
31
32
32
33
33
34
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
38
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
35
36
36
Indice de Tablas
2.1
2.2
2.3
2.4
2.5
Codigos de operacion de la MC . . . . . . . .
Programa almacenado en memoria . . . . . .
Codigos de operacion de la ALU . . . . . . .
Conexiones del MUX en la maquina Sencilla .
Ciclo de instruccion . . . . . . . . . . . . . .
39
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
14
15
18
20
23
Descargar