DISEÑO DE SISTEMAS DIGITALES COMPLEJOS LABORATORIO3: IP Catalog y Controlador de video VGA OBJETIVOS: Aprender a añadir módulos al bus PLB desde el IP Catalog. Desarrollar aplicaciones SW que permitan desplegar imágenes en una pantalla VGA. DOCUMENTOS DE APOYO: XPS Thin Film Transistor (TFT) Controller (v2.00a) DESCRIPCION En esta práctica se implementa un sistema en hardware que incluya un controlador de video TFT que permita controlar una interfaz VGA. Se incluye el controlador VGA desde la biblioteca IP Catalog y se conecta al bus PLB existente, además se asocia la memoria SDRAM como memoria de trabajo para el módulo controlador de video. La siguiente figura muestra el diagrama de bloques de la plataforma a crear. Además se aprenderá como desde un programa en lenguaje C, se puede manipular gráficos y se pueden desplegar en pantalla figuras básicas como rectángulos. Por último se propone la realización de una aplicación gráfica.
PROCEDIMIENTO 1. Cree un proyecto EDK para la SPARTAN-3E STATER BOARD 2. Configure el proyecto con los módulos mostrados en la siguiente figura. 3. Por cuestiones de limitaciones en los recursos en la FPGA, se elige NO implementar memoria cache. Cuando el wizard ha terminado se le agrega manualmente un módulo TFT (Thin Film Transistor) el cual permite controlar una pantalla VGA. La siguiente figura muestra una descripción estructural de este módulo. Consulte 5 características relevantes de un módulo de video TFT.
4. El módulo TFT necesita hacer uso de la memoria SDRAM, por lo que en el momento de su configuración habrá que especificarle en qué dirección está mapeada dicha memoria. En la pestaña Addresses averigüe esta información. 5. En la pestaña IP_catalog en la sección IO Modules seleccione XPS TFT y añada este módulo al proyecto. 6. En la ventana de configuración del módulo, en la pestaña User, deseleccione la opción Select TFT Interface e ingrese la dirección de la memoria de trabajo. Click OK.
7. Conecte el módulo al bus PLB. En la pestaña Bus Interfaces expanda el módulo xps_tft_0 y conecte tanto el puerto MPLB como el SPLB al bus mb_plb. 8. El controlador de pantalla requiere un reloj de 25MHz por lo que hay que configurar un generador de reloj con esta frecuencia. En la barra de menú Hardware->Launch Clock Wizard SYS_TFT_Clk elija una frecuencia de 25MHz. Click OK. En el componente
9. Se configuran los puertos de control VGA, tales como HSYNC, VSYNC, VGA_R, VGA_G, VGA_B. Consulte en qué consisten cada una de las señales mencionadas. En la pestaña ports, en la sección (IO_IF) tft_0 del módulo xps_tft_0, a las señales TFT_HSYNC, TFT_VSYNC, TFT_VGA_R, TFT_VGA_G, y TFT_VGA_B, selecciónelas, click derecho Make External. Por qué son 6 bits para TFT_VGA_R, TFT_VGA_G, TFT_VGA_B? 10. Las señales anteriores quedan disponibles externamente a la FPGA, en el archivo.ucf se debe declarar a cuáles pines físicos quedaran conectadas. Al archivo.ucf agregue las conexiones de estas señales, y salve los cambios. Consulte qu significan las directivas IOSTANDARD, DRIVE y SLEW, además que opciones hay para cada una de estas directivas. 11. En este momento el módulo TFT aún no ha sido mapeado a su respectivo espacio de direcciones. En la pestaña Addresses se puede verificar esto
12. En la columna Size se le asigna el tamaño del espacio de direcciones. Asígnele 8K. Al realizar esto, los 8K asignados quedan mapeados a partir de la dirección 0x0. Lo cual crea conflictos con los controladores de memoria dlmb_cntrl e ilmb_cntrl. Por lo que se acude al generador automático de direcciones que elimina los conflictos que posiblemente se puedan presentar. 13. Genere el BitStream. 14. Abra el SDK y cree un proyecto vacío, cree un nuevo archivo main.c a. Incluya las librerias xparameters.h y xtft.h. b. Instancie la siguientes variable e invoque las siguientes funciones con el fin de configurar el módulo TFT. //Instancias de las variables XTft TftInstance; XTft_Config *TftConfigPtr; //Funciones de configuración TftConfigPtr = XTft_LookupConfig(XPAR_XPS_TFT_0_DEVICE_ID); XTft_CfgInitialize(&TftInstance, TftConfigPtr,TftConfigPtr->BaseAddress); XTft_ClearScreen(&TftInstance); c. Una vez configurado el controlador de video TFT, se puede imprimir un color en un pixel determinado mediante la función XTft_SetPixel(). Con 2 for anidados se puede dibujar un rectángulo de un color determinado. //Loop para dibujar un rectangulo for (i=x_inic; i<=x_fin; i++) { for (j=y_inic; j<=y_fin; j++) { XTft_SetPixel(&TftInstance, i, j, color); } }
El máximo tamaño para el rectángulo es de 480x640 pixeles y el parámetro color en sus tres bytes menos significativos corresponde a los valores RGB requeridos. d. También existen funciones que permiten desplegar caracteres ASCCI en una posición específica. //Se ubica en una posición especifica en pixeles XTft_SetPosChar(&TftInstance, 70,55); //Se configura cuadro de texto, con foreground y background color XTft_SetColor(&TftInstance, 0x00ffffff,0x000000); //Se escribe carácter a carácter. XTft_Write(&TftInstance, H ); XTft_Write(&TftInstance, O ); XTft_Write(&TftInstance, L ); XTft_Write(&TftInstance, A ); 15. Realice una aplicación en donde se vean, como mínimo, 2 rectángulos y un mensaje. 16. Realice un juego que se despliegue en pantalla.