per quanto riguarda il progetto precedente riesco a far accendere i led in corrispondenza agli sw passando attraverso la SDRAM.
unsigned int *mem = (unsigned int*)0x00800000; // puntatore alla memoria
mem[0] = 0; // scrivi la prima parola di 32 bit in memoria col valore 0x00000000
mem[1] = .. // scrivi la seconda parola di 32 bit in memoria ..
..
#include "stdio.h"
#include "math.h"
#define soglia_buffer 96
int main (void)
{
volatile int * red_LED_ptr = (int*) 0x01109040; //puntatore all'indirizzo di memoria dei led rossi
volatile int * green_LED_ptr = (int*) 0x01109020; //puntatore all'indirizzo di memoria dei led verdi
volatile int * audio_ptr = (int*) 0x01109010; //puntatore all'indirizzo di memoria della periferica audio, alla prima locazione
int * switches_ptr = (int*) 0x01109050; //puntatore all'indirizzo di memoria degli switch
volatile unsigned int * mem =(unsigned int*) 0x00800000;
int fifospace; //variabile per la gestione della memoria fifo
int right_data; //variabile per la gestione del dato audio del canale destro
int left_data; //variabile per la gestione del dato audio del canale sinistro
int left_tmp;
int right_tmp;
char reg_switch; //registro delle posizioni degli switch
long sizeofrec=1440000; //corrispondente a 15 secondi in stereo
long index;
// INSERIRE UN TASTO DI START REGISTRAZIONE
index=0;
while (1) //ciclo while infinito
{
// VU METER sui led rossi e verdi, posizionato fuori dal ciclo if altrimenti abbiamo distorsione del segnale per il troppo utilizzo di risorse
left_tmp=left_data>>24;
right_tmp=right_data>>24;
*(green_LED_ptr) = pow(abs(left_tmp+right_tmp),.5);
*(red_LED_ptr) = pow(abs(left_tmp+right_tmp),.5);
// Si fa puntare il puntatore audio_ptr al secondo registro del CORE AUDIO che corrisponde al registro fifospace
fifospace = *(audio_ptr +1);
// scrivo in fifospace il dato
// con l'operatore & fa un AND bit a bit del registro fifospace e della locazione 0x000000FF
if ((fifospace & 0x000000FF) > soglia_buffer)
{
// se la soglia di occupazione della FIFO è superata si devono spostare i dati nei registri left_data e right_data dell' AUDIOCORE
while (fifospace & 0x000000FF)
{
left_data = *(audio_ptr + 2); //sposto il puntatore e il contenuto al registro left_data del componente audio
right_data = *(audio_ptr + 3); //sposto il puntatore e il contenuto al registro right_data del componente audio
// INSERIRE SPOSTAMENTO DATI NELLA MEMORIA SDRAM
if (index<sizeofrec)
{
mem[index++]=left_data;
mem[index++]=right_data;
}
else
*(green_LED_ptr)=0xFF;
// INSERIRE UN TASTO DI STOP REGISTRAZIONE
//INSERIRE UN TASTO DI PLAY
//INSERIRE LETTURA DA SDRAM
//RIEMPIRE LA FIFO
//DARE IL DATO IN USCITA
reg_switch = *switches_ptr; //
if ((reg_switch & 0x01) == 1) // taglio il canale dx
right_data = 0;
if ((reg_switch & 0x02) == 2) // taglio il canale sx PERCHE' MI ESCLUDE I LED DEL VUMETRO
left_data = 0;
*(audio_ptr + 2) = left_data;
*(audio_ptr + 3) = right_data;
fifospace = *(audio_ptr + 1); // si ricomincia a riempire la fifo
}
}
}
}
The Audio core requires certain clock frequencies based on the sample rate of the audio. The University Program’s
IP core, Audio Clock for DE-series Boards, can be use to provide those required clock frequencies. The Audio core
also requires that the audio chip be initialized with some default values. The University Program’s IO core, Audio
and Video Config, provides the functionality required to initialize the audio chip. Refer to the specific documentation
for those cores for more information
When using the Memory-Mapped Avalon Type in Qsys, Altera recommends that the Audio core be used with
the standard or fast versions of the Altera Nios® II processor, so that a program running on the processor can keep
up with the generation of audio data. If the economic version of the processor is used, then the program may run too slowly, and the audio may not be clear. In such, cases, it may be possible to improve the audio clarity by selecting a
lower sampling rate in the audio chip
Users browsing this forum: No registered users and 15 guests