Sei sulla pagina 1di 50

Procesador didáctico

Este tutorial contiene una guía para el diseño y uso de un procesador didáctico que permita al
estudiante comprender los conceptos relacionados con la arquitectura de registro y de
microprograma almacenado. El modelo expuesto no pretende ser una aplicación de alguna de las
arquitecturas de procesador estándar y mucho menos un modelo óptimo de aplicación de
conceptos de diseño de procesadores. Sin embargo, el modelo propuesto ilustra conceptos básicos
introductorios que orientaron el diseño de procesadores simples en los primeros días de la historia
de la computación digital.

Como requisito general, se recomienda tener conocimientos de diseño de lógica combinatoria y de


lógica secuencial para atender los conceptos relacionados con los bloques básicos de diseño de
sistemas digitales.
Procesadores digitales.
Un procesador electrónico digital es un sistema combinatorio y secuencial que sigue un conjunto de
tareas programadas secuencialmente de acuerdo con juego especifico de instrucciones codificadas
en hardware dentro del procesador mismo. En general, los procesadores son el resultado de una
progresiva evolución del diseño a partir de un sistema mucho más primitivo y simple. Se acepta que,
las raíces de la moderna tecnología de procesadores digitales están profundamente basadas en el
diseño de circuitos digitales de cálculo aritmético y lógico.

Los circuitos digitales lógicos están relacionados con la combinatoria de funciones disyuntivas y
conjuntivas (en electrónica digital conocidas como compuertas OR y AND) y que corresponden a los
sistemas combinatorios. La integración de módulos o funciones combinatorias complejas para la
realizar operaciones lógicas es muy común.

Los circuitos aritméticos por su parte son funciones combinatorias que realizan operaciones
aritméticas básicas (suma, resta, multiplicación y división). Tanto los circuitos lógicos como los
aritméticos son constantemente usados en la moderna electrónica digital. En especial estos
sistemas de cálculo combinatorio suelen empaquetarse en un módulo más complejo que integra
funciones de operación aritmética y lógica en un solo paquete conocido como ALU (Arithmetic and
Logic Unit)

Función y diseño de la ALU.


Una ALU contiene múltiples operaciones aritméticas y lógicas seleccionables por el usuario. En
general se trata de un sistema de caja negra que suele representarse según la figura 1.

Figura 1 Símbolo de la ALU

Internamente la ALU consiste en un conjunto de funciones multiplexadas. Una de las mas usuales
es la AND lógica. Generalmente la ALU recibe operandos de n bits de acuerdo con la capacidad del
sistema que se diseña. Una compuerta AND aplicada a un sistema de datos de 8 bits consiste en un
juego de 8 compuertas procesando cada bit de entrada de manera paralela:
Figura 2 AND de 8 bits

Como se observa en la figura 2, cada bit de A se procesa con su correspondiente bit en el operando
B:

A0 and B0, A1 and B1, …, An and Bn.

La salida corresponde a un sistema de 8 bits en la que cada bit es el resultado de aplicar la operación
AND entre los correspondientes bits de A y de B.

De igual manera la función OR se puede aplicar como un módulo con dos entradas de 8 bits
procesados de manera similar, pero en un circuito aparte.

Figura 3 OR de 8 bits
Otros módulos lógicos típicos son:

XOR

Figura 4 Módulo XOR 8 bits

NOT operación unaria.

Figura 5 Negador NOT A

Por su parte las operaciones aritméticas se realizan bit a bit como en sus equivalentes lógicas, pero
a través de combinatoria digital más especializada. El caso más típico es el uso de sumadores
completos. Cuando se diseña un circuito de suma, se suele emplear una tabla de generación de
respuesta o una ROM, sin embargo, cuando se piensa en realizar una operación entre operandos de
8 bits, el número de términos de la tabla se eleva espectacularmente a 65536 combinaciones. Si se
piensa en un sistema de 16 bits cada operando, el número de combinaciones de la tabla sube a miles
de millones, por lo que el diseño por tabla no es una opción.
Como alternativa se diseña empleando el sumador completo (FULL ADDER)

Figura 6 Módulo sumador completo de n bits

Figura 7 Tabla generadora del sumados


de 2 bits

Las funciones derivadas de la tabla corresponden a:


El sumador completo procesa solo dos bits junto con un posible acarreo de entrada y entrega la
suma de los tres bits incluyendo el posible acarreo resultante de la suma.

Un sistema de 8 bits requiere de 8 sumadores completos tal como se presenta en la imagen 8

Figura 8 Sumador de 8 bits

En cuanto a la operación de resta puede ser implementada por medio de tabla, pero al igual que el
caso de la suma, cuando el número de bits de cada operando es grande se hace un problema
combinatorio muy grande. La alternativa es emplear la resta por complemento a 2. El circuito
correspondiente se presenta en la imagen 9.

Figura 9 Restador de 8 bits

Cada módulo genera una salida de 8 bits en este ejemplo. La ALU corresponde a la unión de los
distintos módulos lógicos y aritméticos descritos anteriormente. Sin embargo, el mayor problema
se presenta cuando se desea unificar las múltiples salidas en una sola. Debido a que cada módulo
genera su propia respuesta, existe una gran probabilidad de cortos circuitos con las diversas salidas.

Una solución al problema es enrutar la salida de cada módulo a través de un multiplexor como se
ve en la imagen 10

Figura 10 ALU con 6 operaciones

Observe que el multiplexor dispone de un conjunto de líneas (3 bits en este caso) que permite
seleccionar el módulo que se desea activar en la salida. Estas líneas se conocen como código de
operación y es importante porque es el mecanismo que se emplea para seleccionar determinada
operación aritmética 0 lógica en un momento determinado. A la salida de 8 bits se le ha incluido un
buffer de tres estados controlado por la entrada E, que permite controlar cuando se activa la salida
y cuando no. Las entradas Ci y Bi corresponden a los bits de acarreo de la suma y préstamo de la
resta respectivamente.
Detector de salida cero.
Es deseable incluir un mecanismo que señalice la ocurrencia de una salida completamente en ceros
(llamada comúnmente bandera de cero Z). este detector obedece simplemente a una compuerta
AND con sus entradas negadas:

Figura 11 ALU con detector de salida 0

La ALU es el corazón de la mayoría de los sistemas de cálculo y generalmente es capaz de hacer


operaciones especializadas como cálculo de cuadrados, producto entero, producto decimal, división
entera, división decimal, etc. En la actualidad los procesadores digitales pueden tener más de una
ALU para hacer sus cálculos.

La ALU puede ser usada como un módulo individual con dos enteros como operandos y una salida
entera de 8 bits como resultado de la operación seleccionada en la entrada de OP.

Figura 12 ALU conectada directamente a las entradas


Sin embargo, la operación de la ALU como se presenta en la imagen anterior carece de memoria.
¿Cómo se implementaría una operación en la que uno de los operandos es la respuesta de la última
operación? Tan pronto se comience a hacer cambios en las entradas ocurrirá un cambio en la salida
(debido a que se trata de lógica combinatoria). Es necesario disponer de un mecanismo que retenga
los valores originales de los operandos mientras se agrega el nuevo valor de operando con el
resultado de la operación.

Una solución es agregar registros en las entradas de los operandos:

Figura 13 ALU con memoria de operandos.

Observe que, aunque la entrada A está registrando el valor de la suma en la salida, el resultado de
la operación se mantiene. Solo cuando el reloj del sistema lo autorice junto con la línea de carga, se
actualizará la entrada en el operando A de la ALU

La figura 13 del sistema empleando los registros de entrada deja ver la posibilidad de realimentar
los resultados a uno de los registros desde la salida de la ALU tal como se aprecia en la siguiente
figura:

Figura 14 Configuración de bus de datos común.


En el caso de la figura 14, la salida de la ALU es realimentada al registro B permitiendo recuperar el
resultado de la última operación como operando. Surge una nueva pregunta: y ¿si se requiere que
el resultado sea llevado también a la entrada del registro A?

Es claro que lo que se requiere es que las líneas de salida (no olvide que cada línea de entrada de
datos o de la salida de la ALU tiene 8 bits), vayan tanto al registro A como al registro B:

Figura 15 Bus de datos accediendo a ambos operandos de la ALU

En el caso de este nuevo diagrama (figura 15), la salida de la ALU es llevada tanto a la entrada de
datos del registro A como la del registro de entrada B, se puede apreciar que se han agregado dos
nuevas entradas de 1 bit cada una (Carga Reg A y Carga Reg B) que permiten cargar los datos que
vienen de la ALU en los registros de entrada. Sin embargo, al eliminar la entrada externa se pierde
la a habilidad de permitir al usuario insertar valores externos al sistema, es necesario implementar
un mecanismo que permita tanto a una entrada de usuario como a la ALU llevar datos a las entradas
de los registros de la ALU. No es posible simplemente conectar una entrada de 8 bits a las líneas de
entrada comunes de los registros:

Figura 16 Falla de colisión en un bus de datos con múltiples aportantes


Como se aprecia en la imagen 16, cuando alguno de los bits de la entrada de USUARIO es contrario
al que aporta la ALU en la correspondiente línea de datos, se genera un corto circuito (mostrado en
color rojo y en la salida con una letra E).

Para evitar este conflicto entre la entrada de USUARIO y la salida de resultado de la ALU se emplea
un buffer de 3 estados:

Figura 17 Control de acceso al bus de datos

En la nueva configuración mostrada en la imagen 17, aparece una nueva entrada de 1 bit (USR E)
que actúa como habilitador de la entrada del usuario. Para que el sistema funcione, se requiere que
solo una de las fuentes de datos (ALU o USUARIO) puede estar activa al tiempo.

Lo observado anteriormente muestra uno de los principios maestros de los sistemas de


procesamiento digital modernos: EL BUS.

Un bus en electrónica digital es un conjunto de líneas binarias que son llevadas a la mayoría de los
dispositivos dentro de un sistema digital. En el actual caso el bus de información que va de la ALU a
los registros de entrada lleva los datos del sistema, es por ellos que es conocido como el BUS DE
DATOS.

El bus de datos es el conjunto de líneas paralelas que alimentan las entradas y salidas que manejan
exclusivamente la información de trabajo de un sistema electrónico digital. Los sistemas modernos
operan buses de datos de 32 y 64 bits con lo que son capaces de lidiar con números enteros
significativamente grandes. Sistemas más pequeños como los microcontroladores usados en las
placas ARDUINO utilizan buses de 8 bits (el mayor entero que puede manejar en una sola
transferencia es 255) tal como la ALU presentada en este documento.

El circuito presentado hasta ahora dispone de una forma primitiva de memoria: los registros de
entrada A y B que actúan como suministro de operandos a la ALU. En este caso cada registro de 8
bits aporta una forma de memoria de un byte en cada uno, es decir este sistema tiene una memoria
de 2 bytes. Dependiendo de la aplicación solo 2 bytes pueden ser suficientes para realizar una tarea
específica. En el caso de los sistemas con microprocesador, generalmente se requiere toda la
memoria que pueda usarse. Es deseable disponer de mayor cantidad memoria. La memoria dentro
de un microprocesador necesita ser muy veloz y de bajo consumo. Estas características hacen ideal
una solución basada en memoria estática. Una fuente de memoria estática típica son los registros
(como los usados en la entrada de la ALU). Generalmente se agrupan varios registros de tal manera
que el procesador pueda guardar variables muy usadas directamente en lugar de consultar una
memoria externa.
Registros de memoria del procesador.
Existen múltiples registros dentro de un procesador. En una buena parte de los sistemas existentes
el principal registro es conocido como registro de trabajo o registro acumulador y suele ser
nombrado simplemente como registro A. el registro A esta conectado como operando directo de la
ALU (en el caso del circuito de ejemplo podría ser reg. A) y en algunas arquitecturas de procesador
actúa como registro intermediario de la mayoría de las operaciones que se realizan dentro de un
procesador. Cuando un procesador emplea un registro intermediario como A (en el caso de la ALU
didáctica de este documento, hay dos registros intermediarios A y B)

Es adecuado disponer de un mayor número de registros, la pregunta es por supuesto, ¿cómo se


involucran dentro del bus de datos del sistema, a fin de que no se interfieran unos a otros y puedan
ser trabajados de la manera más eficiente posible? La primera idea es conectar los registros
adicionales al bus de datos de manera similar que la entrada de usuario. Sin embargo, este
mecanismo genera una mayor complejidad del sistema y un mayor número de líneas de habilitación.
La solución es construir un sistema que permita seleccionar el registro que aporta datos al bus de
datos y que además disminuya la cantidad de líneas dentro del sistema.

Figura 18 Implementación de un arreglo de registros de 8 bits

Los registros pueden ser organizados aportando sus datos a un bus común (bus de datos). En la
figura anterior se presenta un arreglo de 8 registros cuya entrada y salida es común, es decir los
datos en las líneas pueden trabajar como una entrada para cargar en cualquiera de los registros o
transportar como salida, el valor de alguno de los 8 registros. Observe que, debido al decodificador,
nunca se habilita más de un registro al tiempo dentro del circuito, en este caso la entrada DIR actúa
como un mecanismo de selección del registro que se escribe o lee en un momento dado. Es usual
que las líneas que entran a DIR sean conocidas como líneas de dirección y permiten seleccionar uno
y solo un registro de memoria. En sistemas más complejos las líneas de DIR entran a la memoria y
otros dispositivos que reciben y/o aportan al bus de datos sus contenidos. Cuando se distribuyen
para seleccionar distintos dispositivos dentro de un sistema digital se les llama BUS DE DIRECCIONES
(ADDRESS BUS) y permiten identificar todos los elementos del sistema.

En el diagrama se observa que una de las entradas de 1 bit (R/W) permite seleccionar si el registro
seleccionado por DIR va a ser leído o escrito cuando el reloj se presente (en este sistema funciona
por flanco de subida del CLK). Cuando R/W es 0 el sistema está listo para escribir en el registro
elegido por DIR, si R/W es 1, el contenido del registro seleccionado por DIR es el que se verá en el
bus de datos.
Sistema de calculadora aritmética y lógica.
Un primer paso para ilustrar el funcionamiento de un sistema microprocesador es estudiar un
modelo más simple que permita observar la operación básica del sistema de cálculo lógico y
aritmético, en otras palabras, la interacción entre la ALU y los registros de memoria.

Para comenzar desde los apartados anteriores, es necesario recordar que se empleara una ALU
simple con datos de 8 bits y cinco operaciones aritméticas y lógicas, así como bits de entrada que
incluyen acarreos y préstamos y un bit detector de resultado 0.

Figura 19 ALU usada en el procesador didáctico.

La tabla muestra la función de las líneas de entrada disponibles:

Entrada Función Nro de bits


A Entrada del operando A de la ALU 8
B Entrada del operando B de la ALU 8
Ci Acarreo de entrada para operaciones de suma 1
Bi Préstamo de entrada para operaciones de resta 1
OP Selector de la operación realizada 3

La tabla presenta la función de las salidas del módulo ALU

Entrada Función Nro de bits


out Salida de la ALU 8
E Habilitador de salida de 3 estados 1
Z Indicador de respuesta = 0 1
Co Acarreo de salida de suma 1
Bo Bit de préstamo en resta 1
Las operaciones de la ALU propuesta se presentan junto con su respectivo código binario en la tabla:

Operación ALU Código (OP)


AND lógico 000
OR lógico 001
XOR lógico 010
NOT A 011
Suma aritmética de 8 bits 100
Resta aritmética de 8 bits 101

La ALU integrada con los registros de entrada a los operandos conforma un primer modelo que
permite tomar resultados de una operación y realizar una nueva operación usando ese resultado
como insumo:

Figura 20 ALU con bus de datos

Como se dijo en un apartado anterior, se requiere de un mecanismo que permita al usuario externo,
el acceso al bus de datos sin que se genere un cortocircuito. Para tal fin se emplea una entrada
conectada al bus de datos a través de un buffer de tres estados que evita el conflicto de voltajes
aportados por la ALU y la entrada del usuario. La figura 21 permite ver esta configuración.

Figura 21 Control de acceso al bus de datos de una entrada externa


Para la figura 21, suponga que desea sumar los valores de usuario 6 + 8. El proceso para hacer
funcionar esta máquina sigue los pasos:

1. Habilita la entrada userE.

2. Carga el valor 6 (0110) en la entrada U. observe que por estar habilitado SOLO la entrada
del usuario, el bus de datos (Data Bus: DB) está ahora cargado con el mismo valor. Esta
operación suele mostrarse con la función:
[DB] <= U

3. Habilitar la línea de carga de A (E_regA = 1)


4. Generar un CLK para cargar el registro A con el valor del bus A <= [DB]

5. Ahora inhabilitar la carga del registro A.

6. Cargar en U el valor 8 (1000) y habilitar userE para que quede en el bus de datos este valor.

7. Habilitar la línea de carga de B (E_regB = 1)


8. Generar un CLK

9. Seleccionar la operación suma con OP = 100

10. Inhabilitar la entrada de usuario U (userE = 0) y registro B (E_regB = 0)


11. Habilitar la ALU (E ALU = 1) para cargar el bus de datos con la suma obtenida

Después de los pasos anteriores, se aprecia el resultado de la suma:

En decimal 6 + 8 = 14

En binario 110 + 1000 = 1110

Aunque la secuencia es larga y compleja, permite fácilmente ver que una abstracción como (6+8)
puede ser llevada a un circuito lógico mediante un algoritmo compuesto por operaciones simples
llamadas MICRO OPERACIONES

Agregando más registros de memoria.


Solo dos registros (A y B) para almacenar datos de las operaciones aritméticas o lógicas de esta
máquina son realmente pocos cuando se desea hacer operaciones más complejas como, por
ejemplo, una multiplicación por iteración (m x n equivale a sumar n veces el valor m) o en el caso
de operaciones con más de dos operandos o con más de una operación aritmética y/o lógica. Es
deseable agregar más registros al sistema para facilitar operaciones más complejas. Aunque una
forma simple es agregar registros independientes con su respectivo habilitador, este proceso resulta
en un número elevado de habilitadores y por tanto un conjunto de micro operaciones más grande
para realizar una tarea.

Sin embargo, al principio de este tutorial se estableció que se puede construir un arreglo de registros
de memoria que tenga pocas líneas de control y cuyo empleo se fácil de realizar siendo en esencia
un módulo de memoria RAM como el de la figura

Figura 22 Arreglo de registros estáticos


La figura muestra un bloque o modulo lógico de una memoria RAM que es en esencia un arreglo de
n registros de m bits. El número de registros depende de la capacidad del decodificador incorporado
tal como se mostró en su momento en el apartado dedicado a la memoria RAM estática.

Por ejemplo, si se desea un arreglo de 8 registros de 8 bits cada uno, el número de líneas de selección
requerido para poder seleccionar cualquiera de esos 8 registros será de:

𝑙𝑜𝑔2 (𝑛𝑢𝑚𝑒𝑟𝑜 𝑑𝑒 𝑟𝑒𝑔𝑖𝑠𝑡𝑟𝑜𝑠) = 𝑙𝑜𝑔2 (8) = 3

Es decir que el decodificador usado para seleccionar cualquiera de los registros para
lectura/escritura, requiere de tres bits. A estas líneas de selección se les conoce como líneas de
dirección de memoria. Por otra parte, los datos que puede guardar en cada registro dentro de la
RAM tienen 8 bits, por lo que esta configuración pertenece a una memoria RAM de 3 bits de
dirección por 8 bits de datos. La figura 23 presenta esta configuración particular.

Figura 23 RAM usada en el procesador didáctico

El modulo presentado en la imagen 23 presenta las líneas mas usuales en paquetes de memoria
RAM:

Nombre Función Numero de bits


Direcciones Líneas de selección del registro que se lee/escribe 3
Datos Datos para leer/escribir desde/en el registro seleccionado 8
CLK Reloj del sistema (lee/escribe en flanco de subida) 1
R/W 1- lee el registro, 0- escribe en el registro seleccionado 1
CLR Lleva todos los registros a 0 1
sel Permite seleccionar múltiples paquetes de RAM 1

Agregar este módulo de memoria a la máquina de cálculo aritmético/lógico que se ha construido


hasta el momento. Para ensamblar el arreglo de registros de memoria que es usado para guardar
valores intermedios y variables de resultado, por lo cual suelen ser llamados REGISTROS DE
PROPOSITO GENERAL (GPR), es necesario incorporar los datos que aportan/reciben al bus de datos
del sistema. La línea R/W actúa como un control para evitar corto circuitos y no requiere de un
buffer tres estados para su incorporación al bus.
Sin embargo, es necesario incorporar un mecanismo de habilitación que evite que el reloj CLK no
escriba accidentalmente alguno de los registros de memoria. La figura 24 muestra la
implementación de este control.

Figura 24 Habilitador de escritura del GPR

Como se puede apreciar, al introducir una compuerta and habilitando mediante E GPR el reloj CLK
se evita que el CLK cargue valores presentes en los bits de datos cuando la línea R/W valga 0 (orden
de escritura).

El conjunto de registros puede ahora incorporarse a toda la maquina como queda presentado en la
figura 25

Figura 25 ALU con registros de memoria y bs de datos

Figura 26 ALU con arreglo de registros


Con la configuración presentada en la figura 25, el numero de tareas que se pueden realizar es
mayor. Se distinguen a hora tres clases de acciones:

• Transferencia entre registros: llevar información desde un registro fuente al bus de datos y
luego a otro registro.
• Operación aritmética a través de la ALU
• Operación lógica a través de la ALU

Una transferencia de registro típica puede consistir en llevar el contenido del área de registros a
otro registro como por ejemplo A.

Suponga que se desea cargar un valor de entrada desde U (entrada del usuario) en el registro A de
la ALU:

1. Inicialmente todos los registros y ALU deben estar inhabilitados para cargar datos desde el
bus de datos o entregar datos al bus de datos

2. El usuario escribe el valor en la entrada U por ejemplo 0x35


3. Se habilita la entrada userE para permitir que la entrada U se cargue en el bus de datos.

Observe que en el bus de datos esta cargado ahora el valor del usuario U.

4. Ahora hay que habilitar la carga de datos en la entrada del registro A

5. Generar un flanco de subida en la entrada de reloj (CLK)


Observe que el valor 0x35 esta cargado dentro del registro A

6. Finalmente debe volver a inhabilitarse todos los componentes

Otra transferencia de registro puede ocurrir entre la entrada U y el arreglo de registros.

Ejemplo: transferir el valor de U al registro de memoria 011 (cuarto registro de la memoria RAM)

1. Inicialmente asegurarse que todos los componentes estén inhabilitados

2. Cargar el valor que se desea guardar en la memoria de registros (por ejemplo 0xA9)
3. Habilitar U para cargar su valor en el bus de datos

4. Ahora es necesario cargar la dirección del registro destino (011)

5. Pasar al modo escritura en la RAM (R/W = 0)


6. Habilitar la memoria RAM para escritura (E GPR = 1)

7. Generar un flanco de subida en la línea de reloj

Como se aprecia, la posición 011 o registro 3 de la memoria RAM ya se ha cargado con el


valor de U.
8. Finalmente inhabilitar todos los elementos del sistema

Como se observa en los ejemplos de transferencia de registro, se distinguen dos elementos básicos:

• Un registro que aporta al bus de datos (y que suele llamarse origen o fuente)
• Un registro que recibe lo que esta en el bus de datos (que suele ser llamado destino)

Las transferencias de registro consisten en cargar un registro destino con el valor de un registro
fuente. La transferencia generalmente esta conformada por dos operaciones que pueden darse de
manera simultanea

• Cargar el bus de datos con el valor de la fuente: [DB] <- fuente


• Cargar el registro destino con el valor del bus de datos: destino <- [DB]

Como se ve de las secuencias de los ejemplos, es necesario tener gran cuidado en los habilitadores
de los dispositivos tanto de origen como de destino. También se nota que solo hay un dispositivo
origen habilitado al tiempo y solo hay un dispositivo destino habilitado en cada momento. Esto nos
da una pista para hacer un control de habilitadores que solo permita un dispositivo habilitado en
cada momento y lleva a pensar en el uso de un decodificador. El uso de decodificadores es muy
común en este tipo de soluciones ya que garantizan que solo una de sus salidas se activa para cada
combinación de entrada de las líneas de selección.

Figura 27 Decodificador con 3 lineas de


selección
En el modelo didáctico, es posible agregar un decodificador para los habilitadores de lo dispositivos
que aportan al bus de datos:

• ALU
• U
• GPR

Siendo solo tres dispositivos, se puede emplear un decodificador de 4 salidas, es decir dos líneas de
selección. Como se observa en la figura 28, la línea R/W se ha conectado a la salida 00 del
decodificador, la de userE a la salida 01 y la E ALU a la salida 10.

Figura 28 Habilitación de origen con decoder

la tabla de control para el decodificador corresponde a

Dispositivo habilitado como origen ORIGEN


Habilita la memoria de registros GPR 0 0
Habilita entrada de usuario U 0 1
Habilita la salida de ALU en el bus de datos 1 0
Todos inhabilitados 1 1

Con este mecanismo seleccionar el origen de los datos que se cargan en el bus de datos resulta
mucho mas simple y no requiere del cuidado que exigía el manejo de los habilitadores individuales.
Figura 29 Sistema con decodificador de destino

Con respecto a los habilitadores que determinan el destino de los datos que están en el bus de
datos, también es posible emplear el mismo modelo de solución, es decir, un decodificador de
destino como se muestra en la figura 29.

La tabla de selección de destino queda como

Dispositivo habilitado como destino DESTINO


Habilita para escribir la memoria de registros GPR 0 0
Habilita para escritura el registro A 0 1
Habilita para escritura el registro B 1 0
Todos inhabilitados 1 1

Con el decodificador de origen y el de destino es más fácil establecer la transferencia entre registros,
sin embargo, el proceso sigue siendo lento de realizar.

Suponga que desea realizar la operación:

𝑎 = 𝑏+𝑐
Donde a, b y c son variables enteras de 8 bits.

En este caso cada variable representa un nombre dado a un espacio de memoria. Los espacios de
memoria (en el caso del procesador didáctico son los registros GPR) se identifican no con una letra
sino con un número o DIRECCIÓN DE MEMORIA.
Para el modelo que se trabaja en este tutorial, hay 8 identificadores o direcciones de memoria que
pueden ser identificados a través de las líneas DIR (figura 30)

Figura 30 direcciones de registro del GPR

Las variables a, b y c deben tener asignada una posición de memoria a cada una de ellas para que el
sistema sepa donde guardar los valores que podrían tomar cualquiera de ellas

Para el ejemplo suponga que se asignan arbitrariamente las direcciones o registros de acuerdo con
la tabla

Variable Posición Entrada en DIR


a 1 001
b 5 101
c 7 111

En ese caso la tarea:

𝑎 = 𝑏+𝑐

Se puede escribir como:

(1) = (5) + (7)


Se puede leer como:

Lo que esta guardado en registro 5 súmelo con lo que esta guardado en registro 7 y el resultado
guárdelo en el registro 1.

Pero ¿Cómo se guarda un valor en el registro 5 y otro distinto en el registro 7?

Es necesario leer estos dos valores (b y c) desde la entrada de usuario (U), de tal manera que el
algoritmo general de la operación correspondería a:

• Lea el valor de b
o Cargue el valor en U en el registro 5 de GPR
• Lea el valor de c
o Cargue el valor de U en el registro 7 de GPR
• Sume b más c
o Copie el registro 5 en registro A
o Copie el registro 7 en registro B
o Programe la operación SUMA en la ALU
• El resultado guárdelo en a
o Cargue el resultado de ALU en el registro 1 de GPR

Cada elemento de este algoritmo esta formado por un conjunto de pequeños pasos que permiten
llevar un valor (trasferir un registro) a un elemento especifico.

Para la maquina propuesta en la figura 29, el algoritmo correspondería a:

• Leer valor de b:
o [DB] <- U lleve el valor de U al bus de datos
o (5) <- [DB] cargue en la dirección 5 de GPR lo que hay en bus de datos
• Leer el valor de c:
o [DB] <- U Lleve el valor de U al bus de datos
o (7) <- [DB] Cargue en la dirección 7 de GPR lo que esta en el bus de datos
• Sume b más c
o [DB] <- (5) Cargue lo que hay en registro 5 de GPR en el bus de datos
o A <- [DB] Cargue lo que hay en el bus de datos en el registro A de la ALU
o [DB] <- (7) Cargue lo que hay en registro 7 de GPR en el bus de datos
o B <- [DB] Cargue lo que hay en el bus de datos en el registro B de la ALU
o OP <- 100 Cargue el código de la operación suma en la ALU
• El resultado guárdelo en a:
o [DB] <- ALU Cargue el resultado en el bus de datos
o (1) <- [DB] Cargue lo que esta en el bus de datos en el registro 1 de GPR

Ahora se puede generar la secuencia de micro operaciones necesaria para ejecutar la operación
propuesta:

𝑎 = 𝑏+𝑐
Para la prueba daremos el valor 140 (0x8c) para guardar en b y el valor 85 (0x55) en c

• Leer b:
o habilitar en el decodificador de origen a U (01)
o habilitar en el decodificador de destino GPR (00)
o seleccionar registro 5 (DIR = 101)

• generar CLK

• leer c:
o habilitar en el decodificador de origen a U (01)
o habilitar en el decodificador de destino GPR (00)
o seleccionar registro 5 (DIR = 111)
• Generar CLK

• Sume b más c
o Cargue (5) en el registro destino A
▪ ORIGEN = 00 (seleccionar como origen GPR), DIR = 5
▪ DESTINO = 01 (seleccionar como destino el registro A)

o Generar CLK
o Cargue (7) en el registro B
▪ ORIGEN = 00 (seleccionar como origen GPR), DIR = 7
▪ DESTINO = 10 (seleccionar como destino registro B)

o Generar clk

o Seleccionar operación suma (OP = 100)


• Guardar resultado en (1)
o ORIGEN = 10 ( origen de datos es ALU)
o DESTINO = 00 (destino GPR), DIR = 001 (registro en donde se guarda es el 1)

o Generar clk

• Inhabilitar Origen y destino


o ORIGEN = 11
o DESTINO = 11

Al final del ejercicio, en la posición 1 el valor almacenado es de 225 (0xE1) (11100001) que es la
suma de los valores 85 + 140

En el caso anterior tenemos una maquina que requiere más micro operaciones, pero más confiable.
Microprograma almacenado

A partir del ejemplo presentado anteriormente, se observa que se requieren secuencias muy
específicas de micro operaciones para lograr la operación de maquina lógica/aritmética. Las
secuencias de bits que controlan las operaciones individuales son patrones que se presentan en
combinaciones determinadas y que ocurren simultáneamente.

Para facilitar la operación de borrado de todos los registros del sistema se introducirá una línea
común que permita generar un RESET, como se ve en la figura 31

Figura 31 Línea de RESET adicionada al sistema

Las líneas disponibles en la maquina de la figura 31 corresponden a:

• RESET (1 línea): Borra todos los valores de los registros del sistema
• ORIGEN (3 líneas): Determina cual registro aporta al bus de datos
• DESTINO (3 líneas): Señala quien recibe datos desde el bus de datos
• CT (1 línea): Línea de conteo de registro A
• DIRECCIONES (3 líneas): determina cual registro de memoria se escribe o lee.
• OP (3 líneas): selección de operación lógica o aritmética
En total 12 bits de control que deben combinarse de una forma especial para que se realice una
operación determinada de:

• Transferencia de registros
• Aritmética
• lógica

Esencialmente cada secuencia de micro operaciones es una tabla de bits en un patrón específico.
No resulta extraño entonces pensar que cada microinstrucción podría ser almacenada a manera de
tabla consecutiva en una memoria ROM.

La idea consiste en conectar cada uno de los bits de control a la salida de datos de una ROM, como
se trata de 12 líneas de control, la salida de datos de la memoria deberá tener 12 bits también (uno
para cada línea de control). En cuanto al numero de palabras que puede almacenar la memoria
ROM, debería ser suficiente para atender las micro operaciones requeridas para cualquier tarea que
se desee realizar en el procesador didáctico.

Para el modelo actual se escogerán 32 palabras (cada una de 12 bits como se estableció en el párrafo
anterior), por lo tanto, para direccionar 32 palabras se requieren:

𝑙𝑜𝑔2 (𝑛𝑢𝑚. 𝑝𝑎𝑙𝑎𝑏𝑟𝑎𝑠) = 𝑙𝑜𝑔2 32 = 5


Es decir que la entrada de direcciones de la ROM tiene 5 bits. La imagen 32 presenta la configuración
de esta memoria en la que se almacenará el microprograma para realizar una determinada función.

Figura 32 ROM para almacenar programa

Para este modelo se alambrará cada bit de control de la ROM con los bits de control del sistema que
se ha presentado en las secciones anteriores. La distribución al azar de estas palabras es:

Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
RST Registro Origen Registro Destino Dirección de registro GPR Operación en la ALU conteo
RESET O1 O0 D1 D0 R2 R1 R0 OP2 OP1 OP0 CT

La distribución presentada corresponde a:

• bit 0: CT es una entrada que permite hacer trabajar el registro A como contador incremental.

• Bit 1: bit 0 de la selección de la operación aritmética/lógica (entrada OP)


• Bit 2: bit 1 de la selección de la operación aritmética/lógica (entrada OP)
• Bit 3: bit 2 de la selección de la operación aritmética/lógica (entrada OP)
• Bit 4: bit 0 de selección de registro dentro de la RAM (entrada dirección)
• Bit 5: bit 1 de selección de registro dentro de la RAM (entrada dirección)
• Bit 6: bit 2 de selección de registro dentro de la RAM (entrada dirección)

• Bit 7: bit 0 de selección en el decodificador de destino (entrada DESTINO)


• Bit 8: bit 1 de selección en el decodificador de destino (entrada DESTINO)

• Bit 9: bit 0 de selección en el decodificador de origen (entrada ORIGEN)


• Bit 10: bit 1 de selección en el decodificador de origen (entrada ORIGEN)

• Bit 11: Reset de todos los componentes

La figura 33 muestra la configuración de la maquina final

Figura 33 Procesador didáctico con memoria de programa

Conviene recordar las configuraciones de cada grupo de bits:

BIT 11 Función: RESET


RESET
0 Funcionamiento normal
1 Todos los registros del sistema borrados a 0
BIT 10 BIT 9 Función: Seleccionar el origen de los datos que se cargan en el bus de datos
O1 O0
0 0 Selecciona GPR (PAM) como fuente de datos para el bus de datos
0 1 U aporta datos al bus
1 0 La salida de la ALU aporta datos
1 1 Ninguna fuente seleccionada (bus de datos en alta impedancia XXXXXXXX)

BIT 8 BIT 7 Función: Seleccionar el destino de los datos que están en el bus de datos
D1 D0
0 0 Los datos del bus se guardarán en la memoria GPR (RAM)
0 1 Los datos se cargarán en el registro A
1 0 Los datos se cargarán en el registro B
1 1 Ningún destino seleccionado

BIT BIT BIT Función: Seleccionar el registro de memoria (GPR) que se leerá o se escribirá
6 5 4
R2 R1 R0
0 0 0 Selecciona el registro 0
0 0 1 Selecciona el registro 1
0 1 0 Selecciona el registro 2
0 1 1 Selecciona el registro 3
1 0 0 Selecciona el registro 4
1 0 1 Selecciona el registro 5
1 1 0 Selecciona el registro 6
1 1 1 Selecciona el registro 7

BIT BIT BIT Función: Seleccionar la operación aritmética o lógica que realiza la ALU
3 2 1
OP2 OP1 OP0
0 0 0 Selecciona la operación A and B
0 0 1 Selecciona la operación A or B
0 1 0 Selecciona la operación A xor B
0 1 1 Selecciona la operación not A
1 0 0 Selecciona la operación A + B
1 0 1 Selecciona la operación A - B
1 1 0 Ninguna operación seleccionada
1 1 1 Ninguna operación seleccionada

BIT 0 Función: selecciona el mod de operación del registro A


CT
0 A opera como registro de 8 bits de carga paralela
1 A funciona como contador de 8 bits
La máquina presentada por la figura 33 permite simplificar el proceso de programación. Retomemos
el ejemplo anterior:

𝑎 = 𝑏+𝑐
Usando la tabla de direcciones RAM ya presentada anteriormente

Variable Número de registro (RAM - GPR)


A 1
B 5
C 7

El algoritmo ya empleado anteriormente para esta operación corresponde a:

• Lea el valor de b
o Cargue el valor en U en el registro 5 de GPR
• Lea el valor de c
o Cargue el valor de U en el registro 7 de GPR
• Sume b más c
o Copie el registro 5 en registro A
o Copie el registro 7 en registro B
o Programe la operación SUMA en la ALU
• El resultado guárdelo en a
o Cargue el resultado de ALU en el registro 1 de GPR

Con la configuración de bits definida en la ROM, se puede hacer cada micro operación de la siguiente
forma:

• Lea el valor b (dirección 5 de RAM):


o Debe habilitar como fuente al usuario U, seleccionar como destino el registro 5 del
GPR

La combinación de bits que permite hacer esta tarea es:


RST Origen Destino Registro GPR Operación en la ALU conteo Valor
RESET O1 O0 D1 D0 R2 R1 R0 OP2 OP1 OP0 CT HEX
0 0 1 0 0 1 0 1 0 0 0 0 0x250

• Lea el valor c (dirección 7 de RAM):


o Debe habilitar como fuente al usuario U, seleccionar como destino el registro 7 del
GPR

La combinación de bits que permite hacer esta tarea es:


RST Origen Destino Registro GPR Operación en la ALU conteo Valor
RESET O1 O0 D1 D0 R2 R1 R0 OP2 OP1 OP0 CT HEX
0 0 1 0 0 1 1 1 0 0 0 0 0x270
• Sume b y c:
o Se subdivide en tres tareas:
▪ Cargue (5) en registro A
• Debe habilitar como origen el GPR registro 5 y destino el registro A

RST Origen Destino Registro GPR Operación en la ALU conteo Valor


RESET O1 O0 D1 D0 R2 R1 R0 OP2 OP1 OP0 CT HEX
0 0 0 0 1 1 0 1 0 0 0 0 0x0D0

▪ Cargue (7) en registro B


• Debe habilitar como origen el GPR registro 7 y destino el registro B

RST Origen Destino Registro GPR Operación en la ALU conteo Valor


RESET O1 O0 D1 D0 R2 R1 R0 OP2 OP1 OP0 CT HEX
0 0 0 1 0 1 1 1 0 0 0 0 0x170
▪ Sume A y B
• Cargue la operación suma en la ALU (100), habilite la ALU como
origen e inhabilite los destinos

RST Origen Destino Registro GPR Operación en la ALU conteo Valor


RESET O1 O0 D1 D0 R2 R1 R0 OP2 OP1 OP0 CT HEX
0 1 0 1 1 1 1 1 1 0 0 0 0x5F8

• El resultado guárdelo en a:
o Debe habilitar como fuente la ALU, seleccionar como destino el registro 1 del GPR

RST Origen Destino Registro GPR Operación en la ALU conteo Valor


RESET O1 O0 D1 D0 R2 R1 R0 OP2 OP1 OP0 CT HEX
0 1 0 0 0 0 0 1 1 0 0 0 0x418

• Finalmente inhabilitar todo:


o Inhabilitar origen y destino, operación de la ALU (000)

RST Origen Destino Registro GPR Operación en la ALU conteo Valor


RESET O1 O0 D1 D0 R2 R1 R0 OP2 OP1 OP0 CT HEX
0 1 1 1 1 0 0 0 0 0 0 0 0x780

Los valores hexadecimales que tiene la secuencia de micro operaciones necesarias para calcular la
instrucción:

𝑎 = 𝑏+𝑐
Corresponde a:

Dirección o posición de la palabra de control Valor hexadecimal


0 0x250
1 0x270
2 0x0D0
3 0x170
4 0x5F8
5 0x418
6 0x780

La instrucción

𝑎 = 𝑏+𝑐
Se codifica en 7 micro operaciones.

Las micro operaciones deben colocarse secuencialmente en la ventana de edición de la ROM en el


simulador LogiSim como se ve en la figura 34. Para abrir la ventana de edición, basta con hacer clic
derecho sobre la ROM y elegir editar contenidos

Figura 34 Ventana de edición de la ROM

Para cargar el programa, se escribe la secuencia de valores y se salva al disco.

Se salva en un archivo y se cierra la ventana de edición


Si ya hay un archivo guardado con valores obtenidos anteriormente, basta con abrir dicho archivo y
el listado de valores hexadecimales se cargará en la ROM de microprograma.

Para probar la ejecución del microprograma se carga el valor 0000 en la entrada microOP y se
escribe el primer valor de la variable a (suponga que a = 0x09)

Se genera CLK (recuerde que el reloj es el que determina la operación del sistema) y se cargará el
valor 9 en el registro 5 de GPR (RAM)
A continuación, se carga el valor 0001 en microOP y el valor para la segunda variable (suponga b =
18)

Generar el CLK para cargar el valor de b (0x12) en el registro 7


Cargar microOP con el valor 0010 (tercera micro operación)

Generar CLK para que A = a

Observe como el registro ahora tiene almacenado el valor que esta en el registro 5 del GPR (RAM)
Cargar microOP con el valor 0011 (cuarta micro operación)

Generar CLK para que B = b (recuerde que b esta guardado en el registro 7 del GPR)

Observe que ahora el registro B es igual al valor del registro 7 de la RAM


Cargar microOP con el valor 0100 (quinta micro operación) y genere CLK para hacer la suma

Observe que en el bus de datos ya esta la suma de los dos valores

Cargar en microOP el valor 0101 (sexta micro operación) y generar el CLK para guardar el resultado
en el registro 1 de la RAM

El valor resultado esta guardado en el registro 1 de la RAM


Finalmente se carga el valor 0110 en microOP para ejecutar la última micro operación que inhabilita
origen y destino del sistema

Observe que lo que realmente se ha estado haciendo en el proceso anterior es cargar un conteo de
0000 a 0110 en la entrada microOP.

Es posible reemplazar esta entrada por un contador que se incrementa con el clock del sistema para
simplificar el proceso y evitar el proceso tedioso de cargar microOP manualmente.

El modelo de simulación completo corresponde a:

Figura 35 Sistema procesador didáctico


Usar el modelo de la figura 35 solo requiere de generar clk. La secuencia del ejemplo anterior tendría
la siguiente secuencia:

• U = 0x09 (escribir el binario de 0x09 en la entrada U) y generar CLK


• U = 0x12 (escribir el binario de 0x12 en la entrada U) y generar CLK
• Generar CLK
• Generar CLK
• Generar CLK
• Generar CLK

Y se realizara la misma tarea que en el ejemplo anterior.

Potrebbero piacerti anche