• No se han encontrado resultados

Manual de Programación X86 sobre plataforma FPGA.

N/A
N/A
Protected

Academic year: 2021

Share "Manual de Programación X86 sobre plataforma FPGA."

Copied!
39
0
0

Texto completo

(1)

Instituto Tecnológico de Costa Rica.

Escuela de Ingeniería Electrónica.

Manual de Programación X86 sobre plataforma FPGA.

Programas Básicos IA32 en Computador Específico.

Realizado por: Kervin Sánchez Herrera.

(2)

pág. 2

Contenido

Introducción: ... 4 Capítulo 1: Preparación. ... 5 1. Consideraciones Previas. ... 5 2. Herramientas necesarias. ... 5 Capítulo 2: Computador. ... 7 1. Microprocesador. ... 7 2. Computador. ... 7

3. Mapas del Computador. ... 9

Capítulo 3: Utilización de Memoria y Puertos. ... 11

1. Memoria. ... 11 2. Variables en el programa. ... 11 3. Puerto UART. ... 12 4. Módulo Contador. ... 13 5. Registro LEDS. ... 14 6. Puerto MOUSE. ... 14

7. Módulo VGA y Memoria de Video. ... 15

Capítulo 4: Implementación del Computador en SPARTAN 3E. ... 17

1. Programación de SPARTAN 3E. ... 17

2. Verificación. ... 20

3. Botones y Switches Externos del Computador. ... 21

Capítulo 5: Pautas para Programar el computador. ... 22

1. Características del Programa.... 22

2. Envío de programa a través de UART usando Realterm. ... 23

Capítulo 6: Programas para el Computador. ... 26

1. Desplazamiento en LEDS con dato recibido desde UART por interrupción. ... 26

2. Creación de cuadros en pantalla usando Botón del MOUSE. ... 27

3. Hola Mundo!!! Sin Interrupciones. ... 28

4. Hola Mundo!!! Con Interrupciones. ... 29

5. Animación en Pantalla. ... 30

6. Análisis. ... 31

Anexo 1: Arquitectura X86. ... 32

(3)

pág. 3

2. Arquitectura. ... 32

3. Características Generales. ... 33

4. Registros del Sistema. ... 33

5. Direccionamiento. ... 37

(4)

pág. 4

Introducción:

El presente documento muestra las herramientas y métodos de programación sobre plataforma de arquitectura X86, a utilizar en un computador específico sintetizado en un módulo FPGA SPARTAN 3E.

El primer capítulo se centra en las consideraciones previas y preparación, antes de empezar a programar en el computador. Por su parte el segundo capítulo muestra la estructura básica del mismo, también explica su funcionamiento y muestra los mapas que lo rigen.

En el tercer capítulo, encontrará una guía de cómo utilizar los diferentes periféricos, escribir y leer de los puertos así como utilizar la memoria RAM y de video. El capítulo 4 por su parte, trata sobre la implementación del computador en el módulo SPARTAN 3E y los pasos a seguir, mientras que el capítulo 5 muestra las pautas para ejecutar un programa.

Para terminar el capítulo 6 muestra diversos programas de ejemplo que pueden ser ejecutados en este computador.

Además en el anexo 1 encontrará información sobre el microprocesador 8088, en el cual se basó el diseño para el microprocesador de este instructivo.

(5)

pág. 5

Capítulo 1: Preparación.

1.

Consideraciones Previas.

Antes de comenzar cualquier programación sobre plataforma x86 tenga en cuenta lo siguiente.  Brinde una ubicación en memoria a los segmentos correspondientes (CS, ES, SS, DS), y utilice

el direccionamiento correcto.

 Defina y utilice un método de recepción de información por parte de los puertos, ya sea PULLING o INTERRUPCIÓN, según sea necesario habilite o deshabilite las interrupciones.  Utilice los registros de ejecución (AX, BX, CX, DX, SI, DI, BP, SP) para lo que fueron diseñados,

esta práctica reduce enormemente el tamaño del código.

 Utilice rutinas y subrutinas definidas, realice una buena jerarquización del programa.  Después de cada operación, siempre tenga en cuenta cuales banderas fueron alteradas y su

valor.

 Nunca pierda de vista el lugar exacto donde se lee o escribe en memoria. (Dirección real de 20 bits).

 Utilice los diferentes tipos de direccionamiento, algunos tipos hacen más corto el programa.  Conozca el funcionamiento de los diferentes puertos, la ubicación, el tamaño,

características de lectura/escritura etc.

2.

Herramientas necesarias.

Para realizar esta práctica, usted deberá contar con los siguientes elementos de hardware y software.

 Un módulo FPGA, SPARTAN 3E con cable USB y cable de alimentación.

 Un monitor o pantalla con conexión VGA que soporte la resolución de 640x480 pixeles.  Un MOUSE con conexión PS2.

 Un cable convertidor USB/UART, con terminal DB9 Macho.

 Un computador con los programas de XILINX (IMPACT), EMU8086 y Realterm.  El archivo .BIT del computador sintetizable en la SPARTAN 3E.

La figura 1.1, muestra los elementos de hardware mientras la figura 1.2 muestra los elementos de software necesarios. Cuando haya realizado su programa, y esté listo para implementar el mismo, realice la conexión de los elementos tal como se muestra en la figura 1.1.

(6)

pág. 6 Figura 1.1: Herramientas de Hardware.

(7)

pág. 7

Capítulo 2: Computador.

1.

Microprocesador.

Se cuenta con un computador basado en un microprocesador arquitectura x86, que ejecuta todas las instrucciones del microprocesador 8088. Entre las características generales de este microprocesador se enlistan las siguientes.

 Bus de datos interno de 16 bits.  Bus externo de datos de 8 bits.  Bus de direcciones de 20 bits.

 Capaz de manejar DMI, INTERRUPCIONES, NMI y Espera de dispositivos.  Arquitectura Von-Neumann.

 Diversos modos de direccionamiento.

 Ejecuta 87 instrucciones en 131 códigos de instrucciones diferentes. (ver bibliografía 2).  Arquitectura CISC, con instrucciones complejas, de largo y duración de ejecución variable.

2.

Computador.

El archivo .BIT, incluido con este instructivo, contiene un computador específico, con el microprocesador que se acaba de describir como núcleo. La figura 2.1 muestra la estructura del mismo, en donde se delimitan sus partes.

(8)

pág. 8

2.1

Decodificador de Memoria.

El decodificador de memoria tiene como función tomar las señales de Dirección, Escritura, Lectura y selección de memoria o INOUT, y generar las señales de habilitación para todos los periféricos del sistema según el mapa de memoria y el mapa de puertos.

2.2

Memoria ROM.

Se cuenta con una Memoria ROM, la cual contiene el programa BOOT, este programa se encarga de recibir el nuevo código, así como inicializar los puertos. Esta memoria puede ser leída, pero no escrita.

2.3

Memoria RAM.

Se tiene además una Memoria RAM, de 4KB de tamaño, sobre la cual se cargan el código a ejecutar y las variables. Esta memoria es de escritura y lectura y puede ser accesada por el programador por completo. El programador debe tener cuidado de no sobrescribir el código que se está ejecutando para evitar errores.

2.4

Módulo VGA.

El módulo VGA, es un controlador de video con una resolución de 640x480, que puede pintar en pantalla 32 elementos de tamaño variable en forma de rectángulos, además del puntero del MOUSE, para esto tiene una memoria de 256 bytes que se usa para definir los límites de los 32 elementos. Esta memoria es solo de escritura, no puede ser leída.

2.5

Registro LEDS.

El registro LEDS, es un registro de 8 bits que se despliegan en los 8 leds externos del módulo SPARTAN 3E. Es solo de escritura, no puede ser leído.

2.6

Unidad Contador.

La unidad contador, es un contador programable cuya base de tiempo es 1ms, puede ser programada para contar hasta 255 ms (1 byte), el final de la cuenta debe ser examinado mediante la patilla TEST del microprocesador, usando la instrucción WAIT. Es solo de escritura, no puede ser leído.

2.7

Módulo MOUSE.

Controlador de MOUSE, mediante PS2, que inicializa el mismo en modo STREAM, recibe frecuentemente la posición del MOUSE vertical y horizontal, así como el estado de los 3 botones del mismo. Esta unidad es de solo lectura, no puede ser escrita y genera dos interrupciones al sistema.

2.8

Módulo UART.

Controlador RS232, funciona con una velocidad de 9600 BAUDS, puede ser escrito, enviando datos al puerto, o leído, leyendo un dato del mismo. Genera 2 interrupciones al sistema.

(9)

pág. 9

2.9

Controlador de Interrupciones.

El último módulo corresponde a un controlador de interrupciones, que recibe las señales de interrupción de los diferentes módulos y genera las señales de INTR además de brindar los vectores de interrupción al sistema. Las interrupciones al sistema ya se encuentran mapeadas y definidas en la tabla de vectores de interrupción.

3.

Mapas del Computador.

En la figura 2.2, 2.3 y 2.4 se muestran el mapa de memoria del computador, el mapa de puertos y el mapa de vectores de interrupción. Tanto el mapa de memoria como el mapa de puertos son generados por el decodificador de memoria y el mapa de vectores por el controlador de interrupciones. Cabe destacar que estos mapas ya están definidos en el computador y no pueden ser cambiados por el programador.

(10)

pág. 10 Figura 2.3: Mapa de Puertos del Computador.

(11)

pág. 11

Capítulo 3: Utilización de Memoria y Puertos.

1.

Memoria.

La memoria ROM ya está escrita y contiene el programa BOOT de inicio, este programa se ubica entre las direcciones de memoria 80000h:800E9h y no se puede modificar (escribir). Por su parte la memoria RAM se ubica entre las direcciones 00000h:00FFFh y se debe dividir en datos y programa a ejecutar.

El programa a ejecutar empieza en 00400h y el tamaño del mismo depende del programador (tamaño máximo de 3KB). Cada vez que se envía un programa nuevo al computador mediante el puerto UART, este empieza a guardar el programa en esa dirección, una vez completo, se realiza un salto a ese punto para empezar la ejecución del código.

El programador debe tener cuidado de no guardar datos en la dirección del programa para no causar problemas de ejecución. Se recomienda utilizar el primer 1KB para almacenar datos y vectores de interrupción, sin embargo es posible guardar datos en cualquier parte de la memoria RAM.

2.

Variables en el programa.

Las variables se definen usando DW y DB los cuales definen variables de tamaño Palabra o Byte correspondientemente. Cuando se relacionan variables con registros, las variables de tamaño Byte se deben usar con registros cortos como AL, y las variables de tamaño Palabra con registros largos como AX. La figura 3.1 muestra un ejemplo de esta definición y su uso.

Figura 3.1: Definición y uso de variables.

El compilador traduce el programa a lenguaje binario. Por el estilo de programación las variables son puestas en el mismo bloque del programa. Es decir que en el bloque van a existir datos que son variables y datos que corresponden a códigos de instrucciones. La figura 3.2 ilustra esta

(12)

pág. 12

organización. Para evitar cualquier problema se recomiendo que las variables a utilizar sean definidas en el principio del código.

Figura 3.2: Colocación de Datos e Instrucciones en la memoria.

Cuando se definen las variables y además se les da un valor, como en la figura 3.2, este valor se almacena en la memoria RAM en la parte del código.

ADVERTENCIA 1: Si el programador utiliza un DS igual a la parte más baja del mapa de memoria (0000H), cuando direccione las variables, estas no van a tener un valor inicial, por lo que debe inicializarse en el programa mediante instrucciones como MOV, etc.

Por su parte si se elige utilizar un DS igual al CS (0040H), los datos van a estar inicializados sin necesidad de ninguna instrucción, sin embargo existe el riesgo de sobrescribir datos del programa por la cercanía del mismo.

ADVERTENCIA 2: Si se trabaja con INTERRUPCIONES, se debe guardar los primeros 28 bytes del mapa, (desde 00000h a 0001Ch), pues en esa dirección deben ir los vectores de interrupción para las siete interrupciones del sistema. Uno de los principales errores es guardar variables en esta dirección.

3.

Puerto UART.

El puerto UART al igual que el resto de puertos, no necesita inicialización. Es un puerto de escritura y de lectura, su tamaño es de un byte. Genera interrupciones de envío y recibido (si no se desea trabajar con interrupciones, se debe usar la instrucción CLI, al inicio del código para deshabilitar las interrupciones). Se ubica en el puerto 00h.

Siempre se usa el registro AL o AX para leer o escribir de puertos. En el caso del puerto UART se debe usar el registro AL, dado que el tamaño del puerto es de 1 byte. La figura 3.3 muestra un ejemplo de escritura y lectura en el puerto UART.

(13)

pág. 13 Figura 3.3: Escritura y Lectura del Puerto UART.

4.

Módulo Contador.

La unidad contador es de solo escritura, no se puede leer desde ella, tiene un tamaño de 1 byte. Responde mediante la patilla de TEST, la cual se prueba mediante la instrucción WAIT, esta instrucción no es sintetizable por el programa EMU8086, por lo que se ha hecho una traducción a la misma usando las instrucciones PUSHA o POPA.

Estas instrucciones no son propias del microprocesador 8088, sino que corresponden a versiones posteriores por lo cual no son ejecutadas por el computador. Cada vez que se escriba en el código un POPA o PUSHA, el microprocesador lo interpretará como una instrucción WAIT.

El módulo contador no genera interrupciones. La unidad básica de cuenta es 1 ms y se puede programar una cuenta hasta de 255 ms (1 byte).Se ubica en el puerto 01H.

La figura 3.4 muestra un ejemplo de escritura del puerto en donde se realiza una cuenta de 50 ms.

(14)

pág. 14

5.

Registro LEDS.

Es un registro de solo escritura, por lo que no se pueden leer datos de él. Tiene un tamaño de escritura de 1 byte, no genera interrupciones. Este registro se muestra en 8 LEDS externos del sistema. Se ubica en el puerto 02H. La figura 3.5 muestra un ejemplo de escritura en este puerto.

Figura 3.5: Escritura en el registro LEDS.

6.

Puerto MOUSE.

De este puerto se obtienen 5 bytes de información, los primeros 2 corresponden a la posición del mouse horizontal, esta posición se ubica en el puerto 03H en formato WORD. Los 2 siguientes bytes corresponden a la posición del mouse vertical esta se ubica en el puerto 05H también en formato WORD. El último byte corresponde al estado de los botones. Se ubica en el puerto 07H. Este byte tiene el siguiente orden, donde M, D y I representan la activación de los botones Medio, Derecho e Izquierdo correspondientemente.

bit 7 6 5 4 3 2 1 0 Botones 0 0 0 0 0 M D I

El estado de los botones Medio y Izquierdo generan una interrupción (no la posición, solo los botones). Todos son puertos de solo Lectura, no se pueden escribir. Se usa AX para las posiciones ya que son de tamaño WORD. Se usa AL, para el estado de los botones ya que su tamaño es 1 byte. La figura 3.6 muestra un ejemplo de lectura de los datos del mouse, la misma se almacena en 3 variables diferentes.

(15)

pág. 15

7.

Módulo VGA y Memoria de Video.

La memoria de video se ubica entre las posiciones de memoria 01000H:010FFH. Es una memoria de solo escritura, por lo que no puede ser leída, contiene 32 elementos imprimibles en forma de rectángulos.

Cada uno de ellos necesita de 8 bytes (4 palabras) para su definición, la primera palabra debe representar el pixel horizontal de inicio, la segunda palabra debe representar el pixel horizontal de final. De igual forma, la tercera y cuarta palabra deben representar los pixeles verticales de inicio y de final, con lo que se forma un rectángulo. Los elementos están organizados de forma ascendente.

Se debe recordar que los pixeles horizontales pueden tener un valor entre 0 y 639, contados de izquierda a derecha, mientras que los verticales pueden tener un valor entre 0 y 479, contados de arriba a abajo.

La figura 3.7 muestra la organización de los elementos en memoria.

Figura 3.7: Organización de elementos imprimibles en Pantalla.

Dado que esta memoria no puede ser leída, es una buena práctica guardar los parámetros en otra parte de la memoria RAM. La figura 3.8 y 3.9 muestra dos métodos distintos para la definición del primer rectángulo mediante copiado en memoria.

(16)

pág. 16 Figura 3.8: Copiado de Elementos mediante LOOP.

(17)

pág. 17

Capítulo 4: Implementación del Computador en SPARTAN 3E.

1.

Programación de SPARTAN 3E.

Para realizar la sintetización del computador en el módulo SPARTAN 3E siga los siguientes pasos. 1. Conecte el cable de suministro de energía a la entrada correspondiente.

2. Conecte los extremos correspondientes del cable USB al módulo y al PC. 3. Encienda el módulo SPARTAN 3E.

La figura 4.1 muestra la conexión para los tres primeros pasos.

Figura 4.1: Conexión de encendido de Módulo SPARTAN 3E.

4. Ejecute el programa IMPACT en el PC.

5. De doble clic izquierdo sobre la opción Boundary Scan en el panel de selección izquierdo. 6. Presione clic derecho sobre el espacio libre en la parte derecha y elija la opción Initialize

Chain. Si existe algún problema, revise la conexión y el encendido del módulo. La figura 4.2 muestra los pasos para inicializar la cadena.

(18)

pág. 18

7. Aparecerá una ventana con la opción de seguir asignando archivos de configuración. Elija la opción YES. (Figura 4.3).

8. Busque el archivo .BIT incluido con este instructivo en su ubicación respectiva. Presione OPEN. (Figura 4.4).

9. En la siguiente ventana se le pregunta si desea agregar archivos para SPI o BPI PROM, elija la opción NO. (Figura 4.5).

10. A continuación aparecerá una ventana con la opción de agregar nuevos archivos, elija la opción CANCEL ALL. (Figura 4.6)

11. En la última pantalla aparecerá un resumen de archivos agregados, presione OK, (Figura 4.7).

12. Como último paso, elija la opción Program, en el panel inferior izquierdo, y de doble clic izquierdo sobre el mismo. (Figura 4.8)

Las Figuras 4.3, 4.4, 4.5, 4.6, 4.7 y 4.8 muestran estos últimos 6 pasos.

Figura 4.3 Paso 7, programación SPARTAN 3E.

(19)

pág. 19 Figura 4.5: Paso 9, programación SPARTAN 3E.

Figura 4.6: Paso 10, programación SPARTAN 3E.

(20)

pág. 20 Figura 4.8: Paso 12, programación SPARTAN 3E.

2.

Verificación.

La figura 4.9 muestra la verificación de la correcta programación del módulo SPARTAN 3E. Una vez que el computador ha sido correctamente colocado en el módulo FPGA, el LED de programación debe estar encendido. En la figura 4.9, el cuadro rojo muestra el LED de programación del SPARTAN 3E.

Por su parte, el programa BOOT del computador se encarga de encender 4 LEDS intercalados. El encendido de estos LEDS indica que el computador se está ejecutando correctamente. En la figura 4.9, el cuadro azul muestra los LEDS de funcionamiento del computador.

(21)

pág. 21

3.

Botones y Switches Externos del Computador.

Físicamente el computador sintetizado cuenta con 2 botones y dos switches que interactúan directamente con el computador y el microprocesador. La figura 4.10 muestra dichos botones. A continuación se enlistan y explican los mismos.

RESET GENERAL: activado al presionar el botón rotatorio del SPARTAN 3E. Este botón genera un reset sobre todos los dispositivos y controladores internos, provocando que el microprocesador vuelva al BOOT, y los controladores se inicialicen de nuevo.

RESET DE RELOJES: activado al presionar el botón EAST del SPARTAN 3E. (entre el botón rotatorio y el LCD). El mismo tiene como función reiniciar los relojes del sistema.

INTERRUPTOR HOLD: activado con el switch SW0 del SPARTAN 3E. genera una señal de sostenido de bus, con lo que solo el microprocesador se detiene momentáneamente. En funcionamiento normal, este switch debe estar apagado.

INTERRUPTOR NMI: activado con el switch SW1 del SPARTAN 3E. genera una interrupción no mascarable, lo que provoca que el microprocesador realice un salto a la dirección colocada en el vector 2. (00008h:0000Bh). Como su nombre lo dice, no se puede desactivar (enmascarar). En funcionamiento normal, este switch debe estar apagado.

(22)

pág. 22

Capítulo 5: Pautas para Programar el computador.

1.

Características del Programa.

En los siguientes capítulos se abarcarán algunos programas que se pueden utilizar en el computador de este instructivo. Para que dichos programas puedan ser cargados exitosamente deben tener definidos dos valores esenciales los cuales se muestran a continuación.

1.1

Tamaño de Bloque.

El tamaño de bloque indica al BOOT cuantos datos se deben recibir del puerto, antes de realizar un salto al programa, el mismo debe estar definido por una variable de tipo WORD al principio del código.

Para conocer el tamaño del bloque, abra el programa con el EMU8086, y emulé el mismo usando el botón EMULATE del panel superior. Aparecerán dos ventanas extras. La primera de ellas muestra el código original y la segunda muestra el código hexadecimal del programa hecho.

En la ventana del código original, busque la última línea del código realizado y márquela, esto marcará en color amarillo una o varias líneas hexadecimales en la ventana de código hexadecimal. La última dirección determina el tamaño completo del bloque. Esta dirección es el valor que debe ser escrito en la variable al inicio del programa. La figura 5.1 muestra la determinación del tamaño de bloque.

(23)

pág. 23

1.2

Inicio de Bloque.

Además del tamaño de bloque, el BOOT necesita saber el desplazamiento del salto que debe realizar. Como se ha explicado en capítulos anteriores, dado el modelo de programación, el EMU8086, coloca en un mismo bloque los datos de variables y de código. Si el microprocesador empieza a interpretar código en el área de variables, es impredecible saber lo que ocurrirá y de seguro provocará errores.

La mejor practica es colocar todas las definiciones de variables al inicio del código, y al realizar el salto, brincar directamente a las instrucciones evitando las variables. Los últimos 2 bytes recibidos por el BOOT mediante el puerto UART, son interpretados como este desplazamiento.

Para conocer el desplazamiento, abra el programa con el EMU8086, y emulé el mismo usando el botón EMULATE del panel superior. En la ventana del código original, busque la primera línea del código realizado que contenga una INSTRUCCIÓN y márquela, esto marcará en color amarillo una o varias líneas hexadecimales en la ventana de código hexadecimal. La primera dirección determina el inicio o desplazamiento del bloque con respecto a las variables. Esta dirección es el valor que debe ser escrito en la variable al final del programa. La figura 5.2 muestra la determinación del inicio de bloque.

Figura 5.2: Determinación del Inicio de bloque.

2.

Envío de programa a través de UART usando Realterm.

Una vez creado el programa que deseamos ejecutar en el computador, y habiendo seguido los pasos del capítulo 4 para la programación del módulo SPARTAN 3E, es hora de enviar el programa mediante el puerto UART. Los pasos para esto se describen a continuación.

(24)

pág. 24

1. En primer lugar cerciórese de que el módulo SPARTAN 3E ha sido programado correctamente, examinando los LEDS como se explican en la sección 2 del capítulo 4. Además de tener todos los dispositivos conectados como en la figura 1.1.

2. Abra el código del programa usando el EMU8086, y presione el botón COMPILE, ubicado en el panel superior.

3. Elija una ubicación válida para guardar el archivo de formato .BIN. (Figura 5.3).

4. Ejecute el Realterm. Seleccione la pestaña PORT, configure el número de puerto COM correspondiente, la velocidad del puerto a 9600 BAUDS, sin bit de paridad, con 8 bits de dato y un bit de parada. Cuando haya colocado la configuración presione el botón CHANGE para realizar los cambios. Los parámetros en vigencia se muestran en la esquina inferior derecha. (Figura 5.4).

5. Seleccione ahora la pestaña SEND, presione el botón con los tres puntos (…) para seleccionar el archivo .BIN generado por el EMU8086. Seleccione un retraso entre envió de datos de 10 ms y un retraso entre envió de líneas de 10 ms. Por ultimo presione el botón SEND FILE. (Figura 5.5).

Estos pasos provocarán la programación del computador. Las figuras 5.3, 5.4 y 5.5 muestran el proceso.

(25)

pág. 25 Figura 5.4: Paso 4, programación del computador.

Figura 5.5: Paso 5, programación del computador.

En el momento en que se está cargando el programa, el programa BOOT genera un conteo de datos que puede ser visto en los LEDS del módulo SPARTAN 3E. Se recomienda que al principio del programa cargado, se haga una escritura del registro LEDS, de tal forma que pueda servir como comprobación de que el código fue cargado exitosamente.

En caso de que el programa no se cargue bien o por completo, presione el botón RESET del sistema y realice el envío nuevamente.

(26)

pág. 26

Capítulo 6: Programas para el Computador.

En este capítulo se muestran programas sencillos para el computador, que pueden servir como guía para utilizar el mismo, o familiarizarse con la programación sobre X86. Nótese que estos programas cumplen con los requisitos de la sección 1 del capítulo 5.

1.

Desplazamiento en LEDS con dato recibido desde UART por

interrupción.

El programa mostrado en la figura 6.1, genera un desplazamiento en los LEDS de la SPARTAN 3E. Además puede recibir un byte del puerto UART y cambiar la velocidad con la que se mueve el LED. Programe el computador con este programa, y envíe diferentes valores por el puerto UART. Note que mientras más bajo es el valor enviado, más rápido se desplaza el LED, esto dado que la cuenta en la unidad contador será menor.

(27)

pág. 27

2.

Creación de cuadros en pantalla usando Botón del MOUSE.

El programa mostrado en la figura 6.2, dibuja un cuadro en pantalla, el cual es cambiado de posición al presionar el clic izquierdo del MOUSE. Programe el computador con este programa, y presione el botón izquierdo del MOUSE para ver el cambio en pantalla y en los LEDS.

(28)

pág. 28

3.

Hola Mundo!!! Sin Interrupciones.

El programa mostrado en la figura 6.3, envía un Hola Mundo! mediante el puerto UART. Para esto se realiza una espera usando el módulo contador. Programe el computador con este programa, y compruebe el dato enviado al PC mediante la consola del Realterm.

(29)

pág. 29

4.

Hola Mundo!!! Con Interrupciones.

El programa mostrado en la figura 6.4, envía un Hola Mundo! mediante el puerto UART. Para esto se realiza un proceso por Interrupción. Programe el computador con este programa, y compruebe el dato enviado al PC mediante la consola del Realterm.

(30)

pág. 30

5.

Animación en Pantalla.

El programa mostrado en las figuras 6.5 y 6.6, realiza una animación en pantalla. Para esto dibuja un cuadro y lo desplaza. Mediante datos enviados por el Puerto UART se controla la velocidad del mismo. El puerto UART es manejado por interrupción. Programe el computador con este programa, y compruebe la animación enviando datos desde la consola del Realterm. Note que mientras más bajo es el valor enviado, más rápido se desplaza el cuadro en Pantalla.

(31)

pág. 31 Figura 6.6: Programa Animación en Pantalla, Parte 2.

6.

Análisis.

Al sintetizar los programas, intente realizar diferentes acciones como presionar los switches del sistema, enviar datos por el puerto UART o presionar los botones del MOUSE. Responda las siguientes preguntas.

 Nota algún cambio en el sistema?  A que se deben estos cambios?

(32)

pág. 32

Anexo 1: Arquitectura X86.

1.

Historia en Breve.

En la década de los años 70, la corporación INTEL, saca al mercado los primeros computadores con arquitectura X86, en específico, el INTEL 8086 y el INTEL 8088, los cuales se convirtieron en la base de los microprocesadores modernos, dando paso a dispositivos INTEL como el 80286, el 80386 y el PENTIUM, siendo el inicio de los microprocesadores de 16 y 32 bits.

Lo que hizo tan especial a esta arquitectura fue la versatilidad con la que se podía comunicar con diferentes dispositivos, de manera que era modular, y podía ser utilizado para muchas aplicaciones. Su arquitectura de propósito general, se basaba en un banco de registros internos, de los cuales muchos podían ser utilizados como registros de 8 y 16 bits simultáneamente.

El INTEL 8088 era un microprocesador con un bus interno de datos de 16 bits, y un bus externo de 8 bits, permitiendo la versatilidad con diversos dispositivos como memorias RAM, memorias ROM, interfaces externas y demás.

2.

Arquitectura.

El microprocesador utilizado en este manual, tiene una arquitectura muy similar al 8088, de tal forma que puede ejecutar todas las instrucciones que se podían sintetizar para ese microprocesador y emular sus buses de datos, direcciones y señales.

La figura A1.1, muestra la arquitectura fundamental de este microprocesador, tomada de la hoja de datos del INTEL 8088. Cabe destacar que el microprocesador usado en este instructivo utiliza la misma arquitectura con pequeñas variaciones.

(33)

pág. 33

En esta arquitectura se puede observar que el microprocesador 8088 contaba con dos bancos de registros separados, los registros de segmento y los registros de ejecución, además de contar con una unidad lógica-aritmética para la ejecución, una pequeña cola de instrucciones y unidad de control principal.

3.

Características Generales.

Tanto el 8088 como el microprocesador usado en este manual poseen una arquitectura Von Neumann, es decir, utilizan una misma interfaz para los datos y para el programa, además, pueden direccionar hasta un 1MB de memoria y direccionar hasta 64K puertos diferentes.

Internamente está formado por dos módulos principales, el módulo de ejecución el cual está encargado de ejecutar las instrucciones como tales, y el módulo de interfaz el cual se encarga de cargar instrucciones en la cola de instrucciones y atender a peticiones de escritura o lectura de memoria de la ejecución. Ambos módulos deben funcionar de forma sincronizada para optimizar el tiempo de ejecución de las instrucciones.

Las instrucciones ejecutadas por el 8088, son de tipo CISC, es decir, que son instrucciones complejas con varios tamaños y formatos diferentes. Además de esto, la versatilidad del microprocesador para realizar direccionamiento, brinda una ventana de opciones infinitas para el programador, así como servir de base para direccionamientos avanzados como la virtualización y la paginación.

Posee diferentes señales externas que amplían las posibilidades de uso, puede responder a interrupciones, así como a señales de retención del bus, permitiendo funciones como el acceso directo a memoria. Además cuenta con una señal de espera, la cual es examinada mediante una instrucción permitiendo aguardar otros dispositivos.

4.

Registros del Sistema.

El microprocesador 8088 cuenta con 22 registros diferentes, separados en 2 bloques principales. 19 de ellos son direccionables directamente, los otros 3 requieren instrucciones específicas para hacerlo.

El primer bloque está formado por los registros de ejecución, la figura A1.2 muestra estos registros. Se trata de 12 registros, de los cuales, 4 son de 16 bits, estos son los registros SP, BP, SI y DI, además de 8 registros de 8 bits AH, AL, BH, BL, CH, CL, DH y DL, estos últimos registros se unen para formar 4 registros de 16 bits. De esta forma AH-AL forma el registro AX, de manera similar la concatenación de BH-BL, CH-CL, DH-DL forman los registros BX, CX y DX.

El diseño permite que el programador pueda direccionar las partes bajas, las partes altas o los registros completos.

(34)

pág. 34 Figura A1.2: Registros de Ejecución.

Cada uno de estos registros tiene una función especial, conocer esa función es fundamental para que el programador pueda ejecutar programas más eficientes. El nombre de los registros y su función se explica a continuación.

AX (AH-AL): El registro acumulador, se utiliza para realizar cuentas, operaciones y movimientos sencillos, su uso acorta el tamaño de muchas instrucciones.

BX (BH-BL): El registro base, se utiliza como base para hacer direccionamiento a la memoria de Datos, de igual forma algunas instrucciones tienen su uso por defecto.

CX (CH-CL): El registro cuenta, como su nombre lo indica, se utiliza principalmente para realizar cuentas, incrementos y decrementos.

DX (DH-DL): El registro de datos, se utiliza principalmente para guardar datos, muchos de estos, datos resultantes de 32 bits de largo.

SP: El registro apuntador de Pila, permite direccionar la pila. Se aumenta o decrece con muchas instrucciones de movimiento a la misma.

BP: El registro apuntador de Base, se utiliza principalmente para hacer direccionamiento dentro de la pila.

DI: El registro índice de Destino, se utiliza para hacer direccionamiento avanzado junto con el registro SI, permitiendo copiar bloques completos usando pocas instrucciones.

SI: El registro índice de Fuente, se utiliza, al igual que el DI, para hacer direccionamiento avanzado entre segmentos.

(35)

pág. 35

El segundo bloque está formado por los registros de segmento, todos estos son registros de 16 bits, correspondiente a los cuatro segmentos, CS, ES, SS, DS. Se utilizan como base superior para realizar diferentes tipos de direccionamiento a pila, código o datos. La figura A1.3 muestra estos registros.

Figura A1.3: Registros de Segmento.

Al igual que los registros de ejecución cada registro de segmento tiene una función específica la cual requiere ser conocida por el programador. Dicha función se explica a continuación.

CS: El registro de Segmento de Código, se utiliza como parte alta para direccionar el programa. Este registro NO puede ser escrito de forma directa, requiere un salto especial para hacerlo.

SS: El registro de Segmento de Pila, se utiliza como parte alta para direccionar la pila, se usa junto con los registros SP y BP para guardar datos importantes en la misma.

DS: El registro de Segmento de Dato, se utiliza como parte alta para direccionar los datos.  ES: El registro de Segmento de Datos Extra, se usa con instrucciones especiales para hacer

direccionamiento de datos.

Además de estos dos bloques principales de registros existen dos registros extra con funciones especiales. El primero de ellos es el registro IP. Este registro se usa como contador de programa para determinar, junto con el CS en donde se encuentra el programa. Como registro no puede escribirse directamente, pero se modifica cada vez que se realiza un salto, un salto condicional, una llamada a rutina, un retorno de rutina, una interrupción, un retorno de interrupción o al ejecutar una simple instrucción.

Por último el registro FLAGS contiene las banderas de la ejecución, estas sirven para indicar el estado del programa así como determinar cómo realizar ciertas funciones. La figura A1.4 muestra el registro FLAGS y las banderas correspondientes. La mayoría de estas se modifican al realizar

(36)

pág. 36

operaciones aritméticas y lógicas, pero no todas las instrucciones modifican todos los bits, algunas instrucciones solo modifican ciertas banderas específicas.

Figura A1.4: Registro de Banderas.

Cada bandera se usa para diferentes procesos, las mismas se explican a continuación.

O: Bandera de Overflow, se activa en algunas instrucciones al existir un desbordamiento, además se utiliza en ciertos saltos condicionales.

D: Bandera de Dirección, se activa solo con instrucciones específicas, determina la dirección de copiado (ascendente o descendente) de datos en algunas instrucciones.

I: Bandera de Interrupción, se activa solo con instrucciones específicas o en una atención de interrupción, determina la habilitación o deshabilitación de interrupción.

T: Bandera de Trampa, se utiliza para hacer DEBUG de programas.

S: Bandera de Signo, se activa en algunas instrucciones al existir un signo negativo, además se utiliza en ciertos saltos condicionales.

Z: Bandera de Cero, se activa en algunas instrucciones al obtener un resultado igual a cero, además se utiliza en ciertos saltos condicionales.

A: Bandera de Acarreo Auxiliar, se activa en algunas instrucciones al existir un acarreo entre el cuarto y quinto bit, se usa para hacer conversiones a ASCII o Decimal.

P: Bandera de Paridad, se activa al existir una paridad impar en el resultado de ciertas instrucciones, además se utiliza en ciertos saltos condicionales.

C: Bandera de Acarreo, se activa en ciertas instrucciones al existir un acarreo, se usa para múltiples instrucciones con acarreo, como operaciones y desplazamientos.

Existen un par de instrucciones que pueden modificar el registro de banderas completo o la mitad del mismo, entre ellas está el movimiento del registro AH al registro FLAGS y viceversa, así como los movimientos a la pila.

(37)

pág. 37

5.

Direccionamiento.

El direccionamiento en el microprocesador 8088 se realiza utilizando un registro de segmento y un desplazamiento. La figura A1.5 muestra la estrategia para formar la dirección de 20 bits.

Figura A1.5: Direccionamiento.

Como se puede observar, el registro de segmento se adjunta en la parte más alta del primer operando mientras que el desplazamiento, que puede ser un registro o un dato, se adjunta en la parte baja del segundo operando, la suma de ambos operandos forman la dirección.

El programador nunca debe de perder de vista la dirección, ya que las instrucciones incluyen generalmente el desplazamiento, pero no incluyen el segmento de código, este se asigna dependiendo de la instrucción, el formato y el modo de direccionamiento.

El microprocesador 8088 cuenta con varias formas de realizar direccionamiento, como se comentó anteriormente. La figura A1.6 resume estos métodos de direccionamiento, los cuales pueden ser usados por el programador.

(38)

pág. 38 Figura A1.6: Modos de direccionamiento.

Si se desea conocer más sobre los modos de direccionamiento o la arquitectura del microprocesador 8088, consulte las bibliografías.

(39)

pág. 39

Bibliografía.

1. Intel Corporation. iAPX 86/88, 186/188 User´s Manual. 1ra Ed., Intel Literature Sales, USA, 1986.

2. Brey, Barry B. Microprocesadores Intel. 7ma Ed., Pearson Pretice Hill, Mexico, 2006. 3. Intel Corporation. 8088 8-bit HMOS microprocessor data sheet, 1990.

4. Ing. Johan Carvajal. Programación Básica en Ensamblador. Notas de Clase, Estructura de Microprocesadores, ITCR, 2009.

Referencias

Documento similar