Help progetto FPGA

Sezione dedicata alle logiche programmabili

Re: Help progetto FPGA

Postby Francesco » 03 Apr 2015, 12:16

Ciao

scusate ma ho perso del materiale e non riesco più a trovarlo...
Dove si trova il tutorial di ALTERA che come progetto fa il registratore audio con l'utilizzo delle HAL...

Grazie
Francesco
 
Posts: 23
Joined: 20 Jan 2015, 13:09

Re: Help progetto FPGA

Postby Leonardo » 03 Apr 2015, 12:42

Ciao Francesco,

Per PM ti avevo segnalato un progetto di esempio della DE1-SOC (NB: Diversa dalla tua DE1 ma con stesso chip audio) che puoi trovare nel rispettivo manuale a pag. 62 (paragrafo 5.2 Audio Recording and Playing).

Manuale e codice della DE1-SOC li puoi trovare sul sito Terasic, ti potranno servire da esempio anche se saranno da adattare alla tua board.
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 502
Joined: 29 May 2013, 22:31
Location: Parma

Postby Francesco » 07 Apr 2015, 12:45

Grazie

secondo me Altera ha cambiato il sito, non riesco nemmeno più a trovare gli esempi con le HAL per scrivere e leggere in memoria Sdram della scheda...
Qualcuno sa aiutarmi
Francesco
 
Posts: 23
Joined: 20 Jan 2015, 13:09

Re: Help progetto FPGA

Postby Leonardo » 09 Apr 2015, 10:15

Ciao Francesco,

Non c'è una HAL per leggere e scrivere nella SDRAM. Viene semplicemente mappata in memoria e ci si accede mediante puntatori accedendo agli indirizzi corretti. Se tramite il linker è stata mappata nelle sezioni .data quando dichiari un array statico automaticamente verrà riposto nella SDRAM.

Ti lascio due link:
ftp://ftp.altera.com/up/pub/Altera_Material/13.0/Computer_Systems/DE1/DE1_Media_Computer.pdf
ftp://ftp.altera.com/up/pub/Altera_Material/13.0/Tutorials/HAL_tutorial.pdf

Nel primo viene spiegato il "DE1 Media Computer" che puoi istanziare con Altera Monitor Program ed evitare di utilizzare QSys ed impostare manualmente il sistema. E' molto meno didattico a mio parere ma permette di concentrarsi sulla parte sw del sistema.

Nel secondo viene mostrato un esempio di utilizzo delle HAL per realizzare la registrazione e riproduzione di suoni tramite un pulsante, molto simile a quello che devi realizzare. Ti consiglio di leggere attentamente i due documenti.

Nell'esempio la sezione .text e .data dovrebbe essere mappata nella SDRAM (ma non ho controllato) quindi automaticamente viene utilizzata per i dati statici (es. array di buffer statici) e il codice eseguibile. Non c'è quindi da fare nulla di particolare per utilizzare la SDRAM.

Questo è il codice dell'esempio che alla fine è il template "audio" che viene automaticamente creato dall' Altera Monitor Program:

Code: Select all
#include "altera_up_avalon_parallel_port.h"
#include "altera_up_avalon_audio.h"
#include "sys/alt_stdio.h"

/* globals */
#define BUF_SIZE 500000         // about 10 seconds of buffer (@ 48K samples/sec)
#define BUF_THRESHOLD 96      // 75% of 128 word buffer

/* function prototypes */
void check_KEYs( int *, int *, int *, alt_up_parallel_port_dev *, alt_up_audio_dev * );

/********************************************************************************
 * This program demonstrates use of HAL functions
 *
 * It performs the following:
 *     1. records audio for about 10 seconds when KEY[1] is pressed. LEDG[0] is
 *        lit while recording
 *    2. plays the recorded audio when KEY[2] is pressed. LEDG[1] is lit while
 *       playing
********************************************************************************/
int main(void)
{
   /* declare variables to point to devices that are opened */
   alt_up_parallel_port_dev *KEY_dev;
   alt_up_parallel_port_dev *green_LEDs_dev;
   alt_up_audio_dev *audio_dev;

   // open the pushbutton KEY parallel port
   KEY_dev = alt_up_parallel_port_open_dev ("/dev/Pushbuttons");
   if (KEY_dev == NULL)
   {
      alt_printf ("Error: could not open pushbutton KEY device\n");
      return -1;
   }
   else
      alt_printf ("Opened pushbutton KEY device\n");
   // open the green LEDs parallel port
   green_LEDs_dev = alt_up_parallel_port_open_dev ("/dev/Green_LEDs");
   if (green_LEDs_dev == NULL)
   {
      alt_printf ("Error: could not open green LEDs device\n");
      return -1;
   }
   else
      alt_printf ("Opened green LEDs device\n");
   audio_dev = alt_up_audio_open_dev ("/dev/Audio");
   if ( audio_dev == NULL)
   {
      alt_printf ("Error: could not open audio device\n");
      return -1;
   }
   else
      alt_printf ("Opened audio device\n");

   /* used for audio record/playback */
   int record = 0, play = 0, buffer_index = 0;
   unsigned int l_buf[BUF_SIZE];
   unsigned int r_buf[BUF_SIZE];
   int num_read; int num_written;
   /* read and echo audio data */
   record = 0;
   play = 0;
   while(1)
   {
      check_KEYs ( &record, &play, &buffer_index, KEY_dev, audio_dev );
      if (record)
      {
         alt_up_parallel_port_write_data(green_LEDs_dev, 0x1); // set LEDG[0] on

         // record data until the buffer is full
         if (buffer_index < BUF_SIZE)
         {
            num_read = alt_up_audio_record_r (audio_dev, &(r_buf[buffer_index]),
               BUF_SIZE - buffer_index);
            /* assume we can read same # words from the left and right */
            (void) alt_up_audio_record_l (audio_dev, &(l_buf[buffer_index]),
               num_read);
            buffer_index += num_read;

            if (buffer_index == BUF_SIZE)
            {
               // done recording
               record = 0;
               alt_up_parallel_port_write_data(green_LEDs_dev, 0x0); // set LEDG off
            }
         }
      }
      else if (play)
      {
         alt_up_parallel_port_write_data(green_LEDs_dev, 0x2); // set LEDG[1] on

         // output data until the buffer is empty
         if (buffer_index < BUF_SIZE)
         {
            num_written = alt_up_audio_play_r (audio_dev, &(r_buf[buffer_index]),
                BUF_SIZE - buffer_index);
            /* assume that we can write the same # words to the left and right */
            (void) alt_up_audio_play_l (audio_dev, &(l_buf[buffer_index]),
               num_written);
            buffer_index += num_written;

            if (buffer_index == BUF_SIZE)
            {
               // done playback
               play = 0;
               alt_up_parallel_port_write_data(green_LEDs_dev, 0x0); // set LEDG off
            }
         }
      }
   }
}

/****************************************************************************************
 * Subroutine to read KEYs
****************************************************************************************/
void check_KEYs(int *KEY1, int *KEY2, int *counter, alt_up_parallel_port_dev *KEY_dev,
                alt_up_audio_dev *audio_dev)
{
   int KEY_value;

   KEY_value = alt_up_parallel_port_read_data (KEY_dev); // read the pushbutton KEY values
   while (alt_up_parallel_port_read_data (KEY_dev));      // wait for pushbutton KEY release

   if (KEY_value == 0x2)               // check KEY1
   {
      // reset counter to start recording
      *counter = 0;
      // reset audio port
      alt_up_audio_reset_audio_core (audio_dev);

      *KEY1 = 1;
   }
   else if (KEY_value == 0x4)            // check KEY2
   {
      // reset counter to start playback
      *counter = 0;
      // reset audio port
      alt_up_audio_reset_audio_core (audio_dev);

      *KEY2 = 1;
   }
}


Che si può provare premendo il pulsante Compile and Load dell' Altera Monitor Program se si è selezionata la board corretta (nel tuo caso DE1).

Facci sapere se riesci a far funzionare l'esempio

PS: Ma all'uni non la rivogliono indietro la tua board? :)
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 502
Joined: 29 May 2013, 22:31
Location: Parma

Re: Help progetto FPGA

Postby Leonardo » 21 Apr 2015, 16:50

@Francesco: Oggi è finalmente arrivata la nuova DE1-SOC sulla mia scrivania, a breve sarò in grado di provare il tuo progetto e darti maggiormente supporto visto che monta il solito codec audio, hai fatto progressi nel frattempo?
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 502
Joined: 29 May 2013, 22:31
Location: Parma

Previous

Return to FPGA & CPLD

Who is online

Users browsing this forum: No registered users and 15 guests

cron