Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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)
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:
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
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)
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.
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
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:
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.
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:
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:
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:
Para evitar este conflicto entre la entrada de USUARIO y la salida de resultado de la ALU se emplea
un buffer de 3 estados:
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.
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)
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.
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:
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.
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
6. Cargar en U el valor 8 (1000) y habilitar userE para que quede en el bus de datos este valor.
En decimal 6 + 8 = 14
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
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
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:
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.
El modulo presentado en la imagen 23 presenta las líneas mas usuales en paquetes de memoria
RAM:
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
• 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
Observe que en el bus de datos esta cargado ahora el valor del usuario U.
Ejemplo: transferir el valor de U al registro de memoria 011 (cuarto registro de la memoria RAM)
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
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
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.
• 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.
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.
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.
𝑎 = 𝑏+𝑐
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)
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
𝑎 = 𝑏+𝑐
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.
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.
• 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 Generar clk
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
• 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:
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
• bit 0: CT es una entrada que permite hacer trabajar el registro A como contador incremental.
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
𝑎 = 𝑏+𝑐
Usando la tabla de direcciones RAM ya presentada anteriormente
• 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:
• El resultado guárdelo en a:
o Debe habilitar como fuente la ALU, seleccionar como destino el registro 1 del GPR
Los valores hexadecimales que tiene la secuencia de micro operaciones necesarias para calcular la
instrucción:
𝑎 = 𝑏+𝑐
Corresponde a:
La instrucción
𝑎 = 𝑏+𝑐
Se codifica en 7 micro operaciones.
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)
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)
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
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.