En este trabajo realizaremos una maquina virtual, que cumpla los siguientes requisitos:

  • Cumplir con el ciclo de estados de instrucción.
  • El programa debe estar  orientado a objetos.
  • Cada estado debe realizarse siguiendo los pasos especificados en clase.
  • La maquina es capaz de ejecutar código elaborado por el usuario.
  • El programa genera interrupciones al ciclo usando 



La maquina virtual cuenta con varios tipos de objetos, como los buses que se usan para transferir o los registros que sirven para almacenar datos, todos los objetos y sus clases están representados en el siguiente diagrama.

(clic en la imagen para verla más grande)

INSTRUCCIONES Y DATOS GENERALES:

Las instrucciones se forman de una cadena de 16 bits:

0000 000000 000000
  • Los primeros 4 son las instrucciones.
  • Los siguientes 6 son la primera referencia.
  • Los últimos 6 son la segunda referencia.
Nuestras instrucciones son de dos referencias, lo cual significa que en la primera referencia de la operación es donde se almacena el valor resultante, ejemplo:

A + B 

se toma como:

A=A+B


Las operaciones que esta maquina ejecuta (junto a su valor en binario) son:

ADD = 1000  (Suma)
SUB  = 1001 (Resta)
MUL = 1010 (Multiplicación)
DIV  = 1011 (División)
AND = 1100 (Operación lógica AND)
ORR = 1100 (Operación lógica OR)
XOR = 1100 (Operación lógica XOR)

Para esta maquina contamos contamos con 10 espacios para datos, es decir 10 variables.
Nuestras variables abarcan de A a J, es decir, de 0 a 9 respectivamente en la memoria de la computadora.(Aunque se puede aumentar la cantidad de espacios se dejo en 10 por comodidad a la hora de programar)

Entonces, un ejemplo de una operación pasada a código sería:

A=A+C

1000 000000 000010
ADD     A           C

Final -> 1000000000000010

Para la interrupcion, una vez terminada una instrucción se calculara un random de 0 a 3 y en caso de que quede en 1 se realizara la acción de J=J+1;

CODIFICACIÓN:

Este programa necesita de un archivo llamado "code.txt" del cual se tomara el código a ejecutar.
Toda declaración de variable o instrucción se escribe en mayúsculas.

Para declarar un valor se escribe: una letra(A a J), espacio, cantidad.
Ejemplo:
A=35  se entiende como A 35

Para declara una instrucción se escribe: operación, espacio, letra de referencia, espacio, letra  de referencia.
Ejemplo:

A=A+B

queda como ADD A B

Todo espacio de la memoria no usado quedara en 0's.


Muestra de traducción de código a instrucciones en binario:



*En el programa final la parte de la impresión de instrucciones en binario estará comentada así solo se verán los resultados finales. Si desea ver la traducción de su programa quite los  //.



CLASES:


Clase Celda: Este es un espacio de memoria, no cuenta con una cualidad especial mas que ser la base para otras clases.

Clase Registro: Este registro hereda de celda, cuenta con funciones  get y set para establecer el valor almacenado en números binarios y por comodidad una función value() la cual regresa su valor almacenado en decimal.

Clase Bus: Este es una clase cuya función principal es simular que se transfiere de un lugar a otro una cadena bit por bit.

Clase ALU(Unidad lógica aritmética): Este objeto se encarga de ejecutar las instrucciones una vez que ya se hayan decodificado y realizado el fetch a los operados;

Clase Memoria: Esta clase se encarga de ser el almacenamiento principal de la computadora, almacena tanto instrucciones como datos, se pude leer datos de esta y escribir también. Para este proyecto la memoria cuenta con dos funciones especiales: la primera es  traducir el código del usuario a binario y almacenarlo en esta; la segunda función se encarga de realizar un calculo para saber a partir de que lugar en la memoria empieza el programa para que la maquina virtual realice su funcionamiento a partir de esta posición. Cuenta con 64 espacios para instrucciones o datos.

Clase Control unit; Esta es la unidad de control de la maquina virtual, se encarga de controlar a los demás objetos y cumplir con el ciclo de estados para cada instrucción. Cuenta con funciones para cada estado y funciones propias como la de decodificar una instrucción y también para regresar un valor cuando la unidad de control participa directamente en un estado.

OBJETOS:

PC1 (Tipo registro): Apunta a la siguiente instrucción que se va a ejecutar.

MAR (Tipo registro): Se encarga de transferir la dirección del PC al bus de dirección;

MBR (Tipo registro): Se encarga de almacenar el dato regresado por la memoria a través del bus de datos.

IR (Tipo registro): Se encarga de almacenar la instrucción a ejecutarse.

OPC (Tipo registro): Almacena la parte del código de operación de la instrucción.

OP0 (Tipo registro): Almacena la primera referencia (variable) de la instrucción.

OP1 (Tipo registro):Almacena la segunda referencia (variable) de la instrucción.

X (Tipo registro): Almacena el valor de la primera referencia.

Y (Tipo registro):Almacena el valor de la segunda referencia.

RESULT (Tipo registro): Almacena el valor resultante de la operación.

ALU1(Tipo ALU): Realiza las operaciones.

Mem(Tipo memoria): Almacena el código y las variables.

ADR(Tipo bus): Se encarga de transferir una dirección hacia la memoria ya sea para escribir o leer en ella.

CTRL(Tipo bus): Se utiliza para transferir el comando leer o escribir que emite la unidad de control hacia la memoria.

DATA(Tipo bus): Transfiere un dato de o hacia la memoria.


Pruebas  y resultados: 










DESCARGA:

MEGA

*Programa realizado en Visual Studio 2013 si llega a tener problemas a lo mejor tiene que realizar modificaciones.





Proyecto 2: Ejercicios y proyectos del curso c++ de Google.

Enlace: Curso c++

Ejercicios:

1.- Solución:  se usan ciclos for para hacer las repeticiones y  una función para la alineación
2.-  Solución: usar la función clear e ingore para que el programa siga corriendo.
3.- Solución: Da las tablas de multiplicar;
4.- Solución: Poner todo en una función y luego hacer que se vuelva a llamar para continuar el programa:
5.-Solución: Usar ciclos for anidados.
6.- Soluciona: El programa realiza un remplazo de caracteres en una cadena;
7.- Solución: Aquí  no hubo solución debido a que se necesitan varios parámetros que  se deben tomar antes de decidir.
8.- Solución: Solo demuestra la diferencia entre variables globales y privadas.
9.- solución:  Usar una librería para abrir y guardar archivos.

Proyectos:

1.- Solución: hacer una entrada de un entero sumarle 40 y dividirlo entre 4.
2.- Solución: Es solo  multiplicar las calificaciones por el porcentaje que se les da y sumarlas.
3.- Solución: Hacer una conversión de segundos a horas y luego los decimales pasar los a minutos y luego a segundos.
4.-Solución: hacer una función que regrese la letra introducida pero un banner;
5.-Solución: Convertir el numero a cadena y luego regresar lo entero para poder hacer las inversas;
6.-Solución: Hacer librerías para recibir el código en letras y regresar los números correspondientes.
7.-Solución: pedir número, descomponerlo y realizar operaciones;

Ejemplo de objeto en el enlace

Descarga: Programas
Nota: Realizados en visual studio puede haber problemas de sintaxis al usar otro compilador.
Proyecto 1. En este trabajo tenemos la tarea de realizar los siguientes circuitos



  •  Circuito 1:Realizar un circuito con cuatro entradas que representan un numero binario y una salida que indica sí el número introducido es primo o no. 

  • Circuito 2:Realizar un circuito con dos partes: Un timer que genere que genere una señal cuadrada y un contador de cuatro bits con botón de reset. 

  • Circuito 3:Realizar Realizar un semáforo de cuatro vías Norte-Sur y Este-Oeste cuyos tiempos serán los siguientes:


Soluciones

Solución circuito 1: Se analizó en una tabla las entradas con respecto a la salida. Llegando a la conclusión de usar un circuito multiplexor 8 a 1 (74ls151) se calculó cuáles serían las entradas de éste. Se usó un contador de 4 bits para realizar las entradas.

Circuito 1 Resultante:

Solución circuito 2: Para armar este circuito primero se hizó el generador de señal de reloj y luego se uso para conectar al contador. Este contador de 4 bits se basó en el diseño de rizo, el cual consiste en concectar  la salida de un flip-flop jk como entrada para el siguiente.

(Imagen tomada de: centros.edu.xunta.es )
Circuito 2 Resultante:



Solución circuito 3: Para armar este circuito se analizó los tiempos del contador y las salidas correspondientes en el tiempo definido.


(Imagen sacada de: centros.edu.xunta.es )
Circuito 3 Resultante:

Simulaciones:
NOTA: Estan hechas en Multisim 13, puede dar problemas con las simulaciones en dado caso simplemente pause y luego reanude la simulación.

MEGA:








More

Recent Posts

Whats Hot