Hola,
He estado probando el UDA1334. He tomado el proyecto de @Fernando (
Benitoss) que está diseñado para una ECP5 FPGA y lo he adaptado para una Alhambra II FPGA o para cualquier FPGA que funcione a 12 MHz.
A continuación os comento los cambios realizados por si esta información le sirve a alguien para otro tipo de FPGA o de reloj.
Dentro del módulo principal, es decir el "I2S Audio", lo único que hay que hacer es poner la frecuencia de tu FPGA, como estoy usando una Alhambra II en mi caso son 12 MHz.
En mi adaptación del proyecto de @Fernando, he preferido no usar ficheros externos, que además había que colocar dentro de carpeta "ICE_build" y a su vez dentro de la sub-carpeta del proyecto en concreto, los dos archivos de extensión ".hex", que son los ejemplos de sonido en formato hexadecimal para el canal derecho e izquierdo. Asi que en mi caso he metido esos datos en dos memorias que está en el mismo circuito, y como dije, así evitamos ficheros externos.
Dentro del módulo "Audio Generator" vemos que es un circuito (en Verilog) en el que se maneja dos memoria a la vez y que contendrán los sonidos del canal derecho e izquierdo. También vemos que irá sacando los datos a una frecuencia determinada (sample rate). Primero leerá el canal izquierdo y cuando termine pasa al derecho, y cuando termine vuelve a pasar al canal izquierdo y se repite infinitamente.
Modifiqué dos partes que paso a comentar:
* En el primer recuadro en rojo añado las dos memorias como "Parameter" y para que no dé fallo hay que añadir el "if (L) $readmenh..." e "if (R) $readmenh...", de esta manera luego podremos añadir las cajas de memoria dentro de Icestudio, una para L y otra para R. No se puede hacer sin esos "If", si no se ponen fallará la síntesis.
* El segundo recuadro en rojo modifico la frecuencia de muestreo para un reloj de 12 MHz. No estoy seguro de lo que voy a decir a continuación, si alguien cree que estoy equivocado, por favor, que lo dija:
Como estoy usando un clk de 12 MHz y la duración del sonido es de 1 segundo y en ese segundo hay que sacar 2000 bytes, sólo hay que hacer una división:
12000000/2000=6000 Para otra frecuencia de reloj sólo hay que sustituir el 12000000 por la frecuecia de reloj de tu FPGA.
De todas formas esta parte no es crítica, porque si ponemos ahí un número demasiado alto o demasiado bajo, simplemente se escuchará más agudo o más grave.
El circuito que adjunto es este. Vemos que los datos del sonido ya están incluidos dentro del mismo circuito; una caja de memoria para el canal izquierdo y otra caja de memoria para el canal derecho, con los datos cargados. Primero sonará el canal izquierdo y se encenderá Led0, y luego sonará el canal derecho y se encenderá Led7. Esto no es importante y lo puedes omitir si así lo deseas o si tu FPGA no tiene Leds.
El módulo "I2S Audio" es el módulo importante y que transforma una señal digital a una señal de audio y en estéreo. El nombre del patillaje lo he modificado para evitar líos de conexiones, los nombres que están dentro de las cajas de salida son los mismos nombres que encontrarás serigrafiados en la placa del UDA1334. Justo al lado pongo etiquetas para nombrar otras nomenclaturas que tiene:
SCLK = Serial clock.
LRclk = Word select (WSel)
Sdata = Serial Data (Din).
El UDA1334 no tiene "reset" (msclk), así que no se conecta.
La tensión de alimentación es de 3.3V si conectas el positivo al pin etiquedo como "3VD". Si usas 5V entonces conecta el positivo a "VIN" (también admite 3.3V).
Adjunto ejemplo que funcionará a la primera en una Alhambra II, o cualquier FPGA con reloj de 12 MHz, y un vídeo de prueba. En el vídeo se escucha en mono porque lo he grabado desde el smartphone, pero si realizas el proyecto y lo conectas a un amplificador de audio, comprobarás que suena primero en un altavoz y luego en el otro, así indefinidamente.
Desde aquí agradezco a @Fernando el módulo y ejemplo de este proyecto: Gracias!!!
Saludos.