Practica #5 Nios II - parte 3

Written by: Holguer A Becerra

Requerimientos:

Desarrollo de Practica:

Solución HW (solo para guiarse): Descargar.

En base a lo aprendido con esta practica es momento de que usted modifique la descripción de hardware que usted hizo de la siguiente manera:

  1. Modifique el sistema Nios II utilizando Qsys y agregue lo siguiente:

    1. Character LCD module, que usted llamara "lcd"

    2. Ahora agregue un puerto de salida PIO de 32 bits, que usted llamara "div_freq"

    3. Si lo hizo bien queda algo así:

    4. Ahora genere el proyecto Qsys y modifique la instanciación de "mi_nios" en el proyecto Quartus II para agregar los dos nuevos puertos

    5. Ahora conecte el puerto "nios_div_freq[31:0]" al modulo "frecGen.v" y agregue también el modulo de "mono_dac.v", viendo el RTL debe quedar algo asi:

    6. Genere de nuevo el archivo ".sof" y asegúrese de que en los GPIOs de la DE0-NANO donde se encuentra la LCD se conecte una LCD 16x2 y que en la salida del mono_dac se conecte un audífono.

      1. Ahora vaya al proyecto software del Nios II, y oprima sobre la carpeta "mi_primer_soft_nios" clic derecho y busque la opción "clean project".

      2. Ahora vaya a la carpeta "mi_primer_soft_nios_bsp" de clic derecho y busque la misma opción "clean_project".

      3. Ahora sobre la misma carpeta "mi_primer_soft_nios_bsp" de clic derecho y busque la opción "Generate BSP" (Esto se hace para actualizar el sistema HAL debido a lo modificación que se hizo en Qsys).

    7. Antes de modificar cualquier código en C, genere de nuevo el archivo .elf haciendo Build y luego programe de nuevo el procesador para asegurarse de que el sistema funciona como lo ha hecho en toda la practica.

    8. Ahora modifique el código para que haga lo siguiente.

    • Cuando el puerto SW varie entre el valor de 0 y 7, mande al puerto "div_freq" el valor necesario para que el "frecGen" genere una octava de un piano según sea el valor, recuerde que la formula para calcular el valor de entrada del "frecGen" es IN=(freq_in/(2*freq_out))-1.

      • SW==0 ==> DO

      • SW==1 ==> RE

      • SW==2 ==> MI

      • SW==3 ==> FA

      • SW==4 ==> SOL

      • SW==5 ==> LA

      • SW==6 ==> SI

      • SW==7 ==> DO2

    • Cuando el valor de SW sea mayor a 7, debe programar un procedimiento en C que varie a la salida el valor del puerto "div_freq" a una velocidad especifica(usleep) para que:

      • SW == 8 debe sonar la canción de MARIO.

      • SW == 9 debe sonar la canción de DRAGON_BALL.

    • En el caso de que SW varie entre 0 y 7 se debe ver en la LCD la nota musical y la frecuencia.

    • En el caso de que SW mayor a 7 se debe mostrar el nombre de la canción que se esta escuchando.

      • Para hacer que la LCD funcione tome como base(*) el siguiente código

      • base(*) quiere decir que no es el código completo... quiere decir que este código le sirve para agregarlo al que ya tiene y hacer que la LCD funcione.

#include <stdio.h>

#include <unistd.h> // usleep (unix standard?)

#include "io.h" // I/O access

#include "system.h" // HAL system

static FILE *fp=0;

char LCD_Open(void){

fp = fopen(LCD_NAME, "w");

if (fp){

return 1;

}

return 0;

}

char LCD_TextOut(char *pText){

if (!fp){

return 0;

}

fwrite(pText, strlen(pText), 1, fp);

return 1;

}

char LCD_Clear(void){

char szText[32]="\n\n";

if (!fp){

return 0;

}

fwrite(szText, strlen(szText), 1, fp);

return 1;

}

void LCD_Close(void){

if (fp){

fclose(fp);

}

fp = 0;

}

void lcd_open(void){

LCD_Open();

}

void lcd_display(char *pText){

LCD_Clear();

LCD_TextOut(pText);

}

int main()

{

lcd_open();// inicializa la LCD y el driver.

lcd_display("Hola DE0-NANO\nSemilleroADT");

}