Laboratorio 3

Written by: Holguer A Becerra.

Para los no estudiantes de ECE 31289 upb:

  • Para montar la plataforma NES sobre la DE0-NANO solo debe seguir los pasos del 1 al 11, si usted quiere desarrollar el laboratorio propuesto lo puede hacer, o si quiere esperar a la solución(con sources) por parte de los estudiantes del curso.

Requerimientos:

Usted debe realizar de forma obligatoria las siguientes practicas para poder hacer este laboratorio, si no las hace no podrá entender el laboratorio.

  1. Practica 4

      1. Sincronizadores de datos.

      2. Sincronizador VGA.

  2. Practica 5.

    1. Parte 1.

      1. Parte 2.

      2. Parte 3(No obligatoria).

Algunas de los links que pueden ser útiles en el desarrollo de este laboratorio.

En este laboratorio usted utilizara los conocimientos que tiene de Diseño avanzado de hardware para:

    1. Montar en la DE0-NANO una NES (Nintendo Entertainment System) o una consola de tercera generación(Basada en la que hizo Brian Bennett https://github.com/brianbennett).

    2. Modificar el NES para:

      1. Cargar ROMs automáticos(Boot Loader) sin necesidad de utilizar elementos externos a la FPGA, como un PC.

        1. Haciendo un menú de selección de juego.

      2. Modificar el sistema de Audio del sistema NES para no utilizar PWM y utilizar en cambio modulación Delta-Sigma.

    3. Diseñar un conversor de control de SNES a NES ya que es difícil encontrar hoy en día NES controller.

Para los estudiantes que tienen a cargo el proyecto final del juego:

  • Para el proyecto final del juego en la FPGA, podrían portar este laboratorio utilizando la pantalla de 4.3 inch para la visualización del juego.

  • Utilizar el Touch de la FPGA para el menu de seleccion.

    • En otras palabras diseñar un NES portable.

Materiales para el laboratorio:

Desarrollo(trabajar en parejas):

Fecha de entrega 14 de abril de 2014.

Nota: Siga el orden que se estipula, no se salta pasos, como recomendación lea todo primero antes de seguir paso a paso.

Nota2: Usted trabaja en parejas, esto tiene la ventaja de que se pueden distribuir el trabajo, recuerde que el diseño modular es importante para agilizar el proceso, mi recomendación es que mientras que una persona trabaja en un modulo, la otra haga el otro y luego se ponen de acuerdo para unirlos y explicar cada uno.

Nota3: Como es en parejas y se confían por tiempos, no recomiendo que dejen esto para la ultima semana, este laboratorio esta diseñado para que salga en 4 semanas contando desde el 17 de marzo hasta el 13 de abril, por lo menos 1 o 2 horas diarias.

Nota4: Desde el 17 de marzo hasta el 14 de abril, por lo menos usted debe hacerme 2 preguntas(viendo código) semanales por cada grupo, no acepto el laboratorio si usted no ha completado por lo menos 8 consultas o preguntas, que puede hacer al correo, teléfono, o en la Universidad, tomare por grupo una lista de estas preguntas EXTRACLASE.

Recomendación: Trabaje sobre rutas sin espacios y que no sean muy largas.

Parte1:

    1. Descargue e instale python 2.7.

    2. Descargue e instale pySerial 2.7.

    3. Descargue el script en Python llamado pyFPGANES_Programming.py.

    4. Descargue el archivo .sof que contiene la consola NES y programe la DE0-NANO.

    5. Conecte el conversor USB serial a la DE0-NANO donde GPIO2[3](JP2) es RX y este debe ser conectado al TX del conversor.

      1. Los demás pines del sistema NES están distribuidos de esta manera(Conéctelos a VGA(Como se vio en la practica de VGA), los controles de NES(no pasa nada si no se tienen para esta primera prueba no son necesarios) y el audio de salida).

    1. Abra el Administrador de dispositivos y verifique el puerto COM(Windows) o TTY(Linux) asignado al conversor USB-Serial.

    2. Abra el archivo pyFPGANES_Programming.py y modifique la linea 44, ponga el nombre del puerto que vio en el administrador de dispositivos.

    3. En la misma ubicación donde se encuentra su archivo pyFPGANES_Programming.py, descargue el siguiente archivo tipo NES ece31289upb.nes.

    4. Modifique la linea 61 del archivo pyFPGANES_Programming.py

      1. rom=open('ece31289upb.nes','rb');

    5. La DE0-NANO debe estar conectada al VGA y al conversor USB-SERIAL, ahora ejecute el script de python utilizando F5 para programar el NES

    1. Ahora descargue el siguiente ROM 'mario_bros.nes' y programe utilizando el script de python, después de esto el juego de mario_bros debera estar corriendo sobre la plataforma NES, puede descargar varios roms compatibles en el siguiente link y probar varios juegos.

Parte 2:

    1. Como usted observo en la primera etapa, se programo el NES sobre la DE0-NANO y para cargar cada juego se debe utilizar una interfaz serial(Conversor USB-Serial), volviendo al sistema que esta sobre la NANO dependiente de tener un computador o alguien que envié por medio serial el archivo ".nes" para programar el cartucho del NES que esta siendo emulado dentro de la FPGA. En este laboratorio usted va implementar una solución que con la cual volverá este problema cosa del pasado.

  1. Asegúrese de que en su proyecto siempre este activada la opcion user-encoded para FSM:

    1. Vaya a Edit Settings de Synthesis.

    1. Aparece una ventana, en ella de ''more Settings''.

    1. Busque la que dice ''State Machine Processing'' y escoja su opcion de ''User-Encoded''

    2. El sistema que usted va a diseñar sera el siguiente:

        1. Como se ven la figura dentro de la FPGA existen 5 módulos o descripciones de hardware de las cuales usted tendrá que diseñar 4 de las 5("SNES to NES controller",. "Nios II/e", "List_text" y "Mux") y modificar en cosas mínimas el sistema NES.

      1. El bloque de color gris oscuro "NES" usted deberá implementarlo utilizando el ejemplo de la parte 1(el proyecto esta aquí), primero debe sintetizar y verificar que el proyecto funciona, conectar la pantalla y audio e utilizar el script de python para descargar ROMs en el.

        1. Una vez verifique el funcionamiento usted deberá modificar algunas secciones del NES empezando con el modulo "apu_mixer", esta descripción de hardware se encarga de hacer la mezclar de 4 señales(2 rectangulares, una triangular y una señal de ruido) provenientes de la APU(Audio Processing Unit), una vez las mezcla las enviar por medio de PWM(Pulse Width Modulation) al canal de audio y de esta forma usted puede escuchar la música que genera la consola, pero por medio de PWM no es la forma mas adecuada de transportar audio ya que la cuantificación del ruido se mantiene constante en todo el espectro, para cambiar esto usted deberá agregar al modulo "apu_mixer.v" un modulador del tipo "Delta-Sigma" reemplazando el PWM(Debe hacerlo de forma adecuada, puede seguir la documentación de sobre delta-sigma).

        2. Otra de las modificaciones que usted debe hacer sobre el NES es buscar en cual de las partes del sistema estas el sincronizador de VGA y llevar los buses "Current X y Y" o posiciones en las cuales esta el sincronizador de vídeo y también la señal "pix_pulse" con la cual se sincroniza el vídeo. Estas señales iran conectadas al modulo "List_Text".

      2. El bloque de color azul rey "List Text" es un modulo hardware encargado de generar una lista de 8 posiciones sobre la señal VGA, descargue el siguiente ejemplo y estúdielo para que entienda su funcionamiento, lea la descripción de hardware y entiendala.

        1. Se dio cuenta que en el modulo existe la entrada [2:0]select encargada de sobresaltar una de las filas de la lista.

        2. Se dio cuenta que enable vuelve visible la lista en la pantalla o no.

        3. Se dio cuenta que en el modulo existen unas entradas llamadas [6:0]char_2_write, [6:0]add_2_write y clk_write, ninguna de ellas estas hace nada hasta el momento, utilizando estas entradas usted debe hacer que se cambie el texto de cada fila de la lista.

        4. add_2_write: es una entrada de 7 bits que sera la dirección de la posición de la lista que se quiere variar o direccionar.

        5. char_2_write: es una entrada de 7 bits que sera el caracter que se quiere escribir en la posición add_2_write.

          1. clk_write: mientras que esta señal de 1 bit se mantenga en bajo, no se debe modificar ninguna de las posiciones, cuando exista el flanco de subida de esta señal se debe escribir en la posición add_2_write el caracter char_2_write.

      1. El bloque de color vino-tinto "MUX" es un multiplexor de RGB de VGA encargado de enviar la señal que viene del NES de forma constante, pero cuando la salida List_on del modulo "List_text" esta activada se debe enviar la señal RGB que proviene de este modulo de tal manera que cuando la lista se vea en la pantalla parezca que esta encima de la señal de vídeo que viene del NES.

      2. El bloque de color verde "SNES to NES controller" consiste en una descripción de hardware que convierte la interfaz de un control de SNES(mas fácil de conseguir en el mercado actual) a un control de NES compatible. A este modulo se deben conectar dos controles de SNES que cuestan alrededor de 10 mil pesos la unidad en san andresito las isla(5 USD en ebay), usted deberá estudiar como adquirir las señales que arroja el control de SNES para adquirir el estado de cada botón del control de SNES para esto puede ver el siguiente manual "SNES timing diagram"(Design Methodology), una vez se tenga el estado de cada botón del control de SNES se deben serializar para que se haga una interfaz NES compatible estudiando el siguiente manual "NES timing diagram". este modulo también debe arrojar por aparte el estado de los botones del control #1 X, Y, L y R del control de SNES que van conectados al bloque de color azul claro.

    1. El bloque de color azul claro "Nios II/e (NES loader)" es un soft-core Nios II de tipo económico que tendra como función:

        • Nota inicial: El sistema Nios debe ser unido a los demás sistemas que usted ya ha diseñado en los anteriores puntos, de forma de que usted pueda hacer pruebas directamente con el sistema NES y sus demás componentes adicionados por usted gracias a los anteriores puntos.

      1. Leer de la memoria SD cada uno de los ROMs con extensión ".nes" y descargarlos por medio de una interfaz serial(UART) al NES tal cual y como se hace en el script de python, usted deberá estudiar lo siguiente.

        • ¿Como enviar datos por medio de UART desde Nios? y ¿Como utilizar el driver para leer archivos de la SD?.

        • Para estas dos preguntas usted deberá estudiar y descargar esta plantilla que contiene la descripción de hardware de un Nios II/e con una interfaz lista para conectar directamente a la memoria SD(CS, MISO, MOSI, SCLK) y con una interfaz UART(RX,TX), este archivo también contiene las librerías software para leer y escribir archivos de la SD, y también la librería UART para recibir y enviar datos por medio de esta interfaz. Descargar Plantilla.

        • Modifique el puerto UART en el Qsys para que tenga paridad impar (ODD) ==> En el archivo python la tx uart es ODD.

        • En la instanciación de Quartus conecte el puerto UART a los GPIO[3] y GPIO[1] ==> como en la parte 1 de este lab.

        • Genere el hardware utilizando Qsys y Quartus.

        • Para entender como funciona el driver de UART haga lo siguiente:

          • Cree un proyecto en Eclipse(llamelo uart_test) y copie la carpeta "uart" que se encuentra en la carpeta software del archivo .zip al proyecto Eclipse(uart_test).

          • Copie el archivo main_base_uart.c en el proyecto Eclipse.

          • Explore la libreria uart, esta libreria tiene una función de inicialización(InitUart(38400)) y unas funciones que se encargan de enviar o recibir datos por medio de este puerto.

          • Utilice las librerias para enviar datos al computador por medio del conversor USB-Serial.

          • Conecte el conversor USB-Serial a la DE0-NANO

          • Para recibir los datos por UART enviados por el nios al computador utilice el siguiente script en python "python_rx.py

          • Verifique que lo que esta enviando por medio de Nios, lo que se esta recibiendo con el script de python

        • Una vez entendido como enviar datos por el puerto UART, cree un nuevo proyecto en Eclipse titulado "sd_test" y copie en en las carpetas y el main.c que están en la carpeta "software" del archivo .zip que descargo.

        • Compile el codigo en eclipse.

        • Carge la descripción de hardware en la DE0-NANO y programe el software, asegurese antes de tener conectada la memoria SD(Para esto puede basarse en la siguiente imagen) a la DE0-NANO en los pines correspondientes.

        • Si todo sale bien, usted vera en la consola o terminal del Nios que la Memoria SD se cargo con exito, usted podra escribir sobre esta consola estilo terminal de linux o cmd de windows para crear, leer, escribir y listar los archivos que estan dentro de la memoria SD.

          • Para entender como leer archivos usando la libreria de la SD_Card, utilice como referencia la siguiente pagina web, donde explican que funciones debe usar para el proposito de este laboratorio http://elm-chan.org/fsw/ff/00index_e.html

              • Por ejemplo: si desea abrir un archivo y leer un archivo debe usar las funciones f_open(), f_read(), f_close().... En el manual de referencia se encuentra como usar estas funciones con ejemplos.(Si se da cuenta son funciones parecidas a las que se usan en Python).

          • Después de saber usar el driver de SD, se dio cuenta que solo se pueden leer archivos con nombres cortos y que se hace reducción de nombres, lo cual traería consecuencias a la hora de cargar un rom de nombre largo, usted podria buscar una solución para esto cambiando los nombres de los roms en el directorio, pero si quiere abrir archivos de nombres largos puede ver la siguiente documentación que indica como hacerlo(o descargue el driver modificado).

        • Con la base en UART y SD, basese en el archivo main_base_sd_and_uart.c para empezar a escribir su codigo en un nuevo proyecto, en el cual usted escribira el código para descargar el archivo .nes a el sistemas NES, el cual es practicamente igual al que esta en el script de python, la diferencia es que esta vez es en C.(Recuerde que ahora debe cambiar en la instanciación en Quartus los pines el UART y conectar el TX directamente al RX del NES).

El Nios II también debe estar pendiente de las señales que vienen del control de SNES por parte del modulo "SNES to NES controller"(botones del control #1 X, Y, L y R) que no son necesarios para el NES.

  1. El botón "X" ordenara al Nios II para activar/desactivar el modulo "List_text" y enviar la lista de los juegos que contiene la memoria SD(estilo menu) por medio de los PIO de salida del nios(select, char_2_write, add_2_write, clk_write, enable).

  2. El botón "L" ordenara al Nios navegar hacia arriba de la lista que se controla por medio del modulo "List_text" cambiando el bus de salida "select".

  3. El botón "R" ordenara al Nios navegar hacia abajo de la lista que se controla por medio del modulo "List_text" cambiando el bus de salida "select".

  4. El boton "Y" ordenara al Nios II descargar el archivo .nes seleccionado por el usuario si solo si esta activada la lista "List_text"

Para guiarse con lo que debe hacer el software, descargue la siguiente guia.

Una vez usted termine el sistema hardware y software deberá ser NO-VOLATIL, tal y como se le enseño en la practica 5 de Nios II.

PD: Como dato curioso, si le interesa estudiar otros emuladores de vídeo consolas, este es uno muy bueno para que estudie la arquitectura del sistema 6502 procesador en el cual se basa el NES. Ademas si quiere puede también a futuro pensar en montar otras consolas en la FPGA, como la Sega Genesis, PC Engine, y SNES, o algunas mas avanzadas como la Atari Jaguar, Nintendo 64, Playstation, entre otras.... que requerirían vastos conocimientos en arquitectura de computadores, podría pensar en una tesis de grado para diseñar alguno de estos sistemas.

También les dejo los sources de una consola mas avanzada llamada PCEngine/Turbografx-16 para que se diviertan, podrian hacer lo mismo que hicieron con la NES modificando el boot para cargar los juegos desde la SD.

Solución del laboratorio por Prieto y Garcia(con SD card):

Solución del laboratorio por Fabio(sin SD card):