Modulo sonido I2S para nuestras placas ECP5

544 views
Skip to first unread message

beni...@gmail.com

unread,
Apr 8, 2021, 5:19:58 PM4/8/21
to FPGAwars: explorando el lado libre
Hola a todos

Acabo de implementar un modulo I2S. 

Vamos con los requisitos:
  - Placa ECP5  (se necesitan disponer de una BRAM minima de 4 Kb ) 
  - Tarjeta I2S , yo tengo la UDA1334A I2S Stereo DAC
  - 2 leds (opcionales)

Ahora con la receta:
 Capture2.PNG

En este ejemplo se puede ver dos partes
1) Un generador de señal de audio, stereo 16 bits
2) El modulo I2S , admite 16 bits de entrada y saca las 4 señales del I2S., aunque generalmente solo son necesarias 3 señales solo porque la mayoria de las placas I2S no necesitan conectar la señal MSCLK.

Ver los siguientes videos


El modulo de Audio propiamente dicho es el "Audio_I2S.ice"
Y el ejemplo del Test es "Test_sonido_I2S.ice"

Disfrutadlo

Fernando

Audio_I2S.ice
Test_sonido_I2S.ice

beni...@gmail.com

unread,
Apr 8, 2021, 5:46:58 PM4/8/21
to FPGAwars: explorando el lado libre
Se me ha olvidado añadir los archivos HEX de 2 Kb cada uno con el sonido digitalizado de las campanas que suenan. Copiar este archivo dentro de la carpeta del proyecto  a su vez dentro de la carpeta ice-build

Creo que la placa Alhambra II tiene mas de 4Kb de BRAM, por tanto este modulo I2S seria compatible, solo habria que adaptarlo al reloj de 12 Mhz de la Alhambra ya que la placa ECP5 tiene un reloj de 25 Mhz

Saludos

Fernando

left_and_Right_audio_hex.zip

Democrito

unread,
Apr 8, 2021, 6:33:58 PM4/8/21
to FPGAwars: explorando el lado libre
Me ha encantado. Estoy ávido de que la gente saquen sus proyectos o demos, sea para la placa que sea, pero ver ejemplos de lo que se puede hacer con una FPGA.

Muchas gracias.

Jesus Arias

unread,
Apr 9, 2021, 7:30:40 AM4/9/21
to FPGAwars: explorando el lado libre
Si no necesitas una calidad de sonido CD podrías usar una modulación PWM, que ocupa muy poco en la FPGA, y te ahorras el módulo I2S.
Saludos

beni...@gmail.com

unread,
Apr 9, 2021, 12:52:35 PM4/9/21
to FPGAwars: explorando el lado libre
Conozco perfectmente el sistema de modulacion PWM, en  las FPGAs tradicionales (ZXUNO, Mist y Mister) se usa el sistema de sonido basado en hardware RC 

Aqui tienes el hardware que hace falta en la FPGA, a la izquierda tienes los 2 pines de la FPGA (uno por canal) y a la derecha las salidas de audio que obtienes
Capture.PNG
Como modulo para hacer funcionar eso se necesita una implementacion DeltaSigma que trabaja en PWM. 
El inconveniente de eso es que la implementacion DeltaSigma hay que hacerla bien con varias etapas y fases y generalmente como eso consume muchos recursos en unidades logicas en la FPGA, se tiende a saltarse etapas con el consiguiente deterioro en la calidad del audio.
Es por ello que disponiendo una tarjeta I2S externa y a los bajos precios a los que estan, es mejor solucion que ademas da muchima mas calidad y consume menos celdas el trabajar directamente con una salida I2S de audio

Un saludo

Fernando


Jesus Arias

unread,
Apr 10, 2021, 6:56:59 AM4/10/21
to FPGAwars: explorando el lado libre
La modulación DeltaSigma (o SimaDelta, nunca estoy seguro del nombre) es algo muy distinto de la PWM. Para implementar una modulación de anchura de pulsos sólo necesitas un contador, un comparador, y un flip-flop. El comparador no es más que N puertas XOR de 2 entradas y una puerta NOR de N entradas. Si la salida es estéreo el mismo contador sirve para los dos canales. El flip-flop se pone en 1 cuando el contador da la vuelta y en 0 cuando el valor del contador coincide con el valor de la muestra de audio.

Por supuesto la calidad del sonido PWM puede ser bastante peor que la de un codec I2S (que internamente usará DACs del tipo SigmaDelta, con mucho procesamiento digital). La modulación PWM nos obliga a reducir la resolución pues divide el reloj por 2^Nbits, así que no es práctica para resoluciones de más de 10bits. Pero 10bits ya nos dan 60dB de relación señal ruido, que para los que vivimos la era del cassette eran algo inalcanzable. Otros problemas de la modulación PWM son las bandas laterales, que aparecen en (f_pwm-N*f_señal), y que nos obligan a usar frecuencias de PWM altas para que no resulten audibles, y la generación de distorsión si la modulación es una señal muestreada (esto último se puede compensar predistorsionando las muestras en el sentido contrario).

Aunque al final el principal componente que determina la calidad del audio suele ser el altavoz ;)
Saludos

Manuel Pascual

unread,
Apr 11, 2021, 2:50:12 AM4/11/21
to fpga-wars-explora...@googlegroups.com
Jesus y Fernando los dos teneis razon.
deltasigma sigmadelta y pwm son lo mismo y son algo muy distinto.
todas son tecnicas para codificar informacion mediante el porcentaje de tiempo que una señal esta activa en un periodo concreto.
en el caso de pwm la señal cambia de estado una sola vez. en otros cambia de estado muchas veces.
el rendimiento, respuesta al ruido y recursos logicos necesarios son diferentes, pero se pueden usar indistintamente en aplicaciones de cacharreo escogiendo parametros adecuadamente.

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/93bfbeab-dbe2-4ebf-af61-230ffd0d579cn%40googlegroups.com.

beni...@gmail.com

unread,
Apr 11, 2021, 3:22:00 PM4/11/21
to FPGAwars: explorando el lado libre
La gracia del tema esta en instalar una placa I2S, la parte del DeltaSigma esta muy extendida en muchas FPGAs y es sencilla de implementar. Por eso desarrolle este sistema en I2S. 
Os recomiendo que lo probeis, ya vereis el sonido tan limpio que obteneis.
Y eso que el sonido digitalizado de prueba es de 8 bits

Saludos

Jesus Arias

unread,
Apr 11, 2021, 5:51:32 PM4/11/21
to FPGAwars: explorando el lado libre
Hola,
¿El módulo I2S es capaz de reproducir el audio a sólo 2000 muestras/s?
Para una implementación PWM esa frecuencia de muestreo es muy baja, así que he tenido que repetir cada muestra unas 20 veces para subir la frecuencia de muestreo hasta unos 40kHz. Esto hace que aparezcan frecuencias alias que le dan al sonido un timbre metálico que a las campanas curiosamente no les queda nada mal. Para evitar este problema habría que interpolar la señal entre muestras, lo que no va a ser nada trivial (los codecs I2S sí que interpolan)

Para demostrar el audio I2S creo que sería preferible una frecuencia de muestreo del orden de los 40kHz y a ser posible 16bits de datos. Claro, eso supone mucha más memoria. No sé si en tu FPGA tienes accesible una flash SPI para configuración. Si así fuera ahí tienes disponibles algunos MBytes para almacenar unas muestras de audio de calidad.

En cualquier caso adjunto el código verilog del generador de sonido y el modulador PWM, por si quieres probarlo y comparar. El reloj principal era de 12MHz.
(Por cierto, había rellenado los archivos .HEX hasta las 2048 muestras añadiendo 48 datos 0x80 al final)

También voy a ver si hago también otra versión con un modulador sigma-delta. Esa no va a ser tan trivial como la PWM, pero la veo factible. Tal como mencionó Manuel, las señales PWM y las sigma-delta son cosas distintas, (me temo que cuando se habla de sigma-delta en realidad lo que se está implementando es PWM), pero la modulación sigma-delta es capaz de darnos una mejor calidad de señal analógica (de hecho es lo que van a usar los convertidores D/A de los codec I2S)

Saludos
system.v

Fernando Mosquera

unread,
Apr 11, 2021, 7:33:23 PM4/11/21
to fpga-wars-explora...@googlegroups.com
Hola Jesus

Si hubieras visto el codigo del mi generador de audio hubieras deducido  que la frecuencia de muestreo es de 2Khz y que el audio viene importado por 2 archivos hexadecimales de 2000 samples por canal, o sea 4000 samples , de ahí los casi  4 Kb que hacen falta de BRAM para guardar esos samples

He visto el visto tu código PWM y no esta kal pero yo el sistema PWM que planteas no lo veo interesante porque para eso ya tienes el DeltaSigma, de hecho en el FPGAs tradicionales (ZXUno, ZXDos, Mist, Mistica e inclusive la Mister) usan DeltaSigma como salida de audio. Por algo sera.
Asi que la implementacion del DeltaSigma ya esta hecha para esas placas y solo habria que adaptarlo a nuestra OpenFPGA.

Saludos
Fernando

Has recibido este mensaje porque estás suscrito a un tema del grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/fpga-wars-explorando-el-lado-libre/wubphxt9ohM/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/98e1df80-09fc-4682-8b9a-6b57037afff7n%40googlegroups.com.

Jesus Arias

unread,
Apr 12, 2021, 3:45:40 AM4/12/21
to FPGAwars: explorando el lado libre
Lo siento, no tengo instalado Icestudio, así que he tenido que indagar en tus fuentes con un editor de texto.
De todos modos mi pregunta era otra. Me refería a que 2kHz es una frecuencia de muestreo muy baja para unos codecs pensados para funcionar alrededor de 40kHz.
Mi duda era si el reloj del codec era el correspondiente a 2kS/s (2000*32=64kHz) o si habías aumentado previamente la frecuencia de muestreo antes de sacar los datos por el I2S.
Si pudiera ver el fuente en Icestudio seguramente no necesitaría preguntarlo. Creo que acabaré instalándolo aunque los editores de esquemáticos los use más bien poco.

Por cierto, que las placas que mencionas son muy interesantes.

Saludos

Jesus Arias

unread,
Apr 13, 2021, 1:51:03 PM4/13/21
to FPGAwars: explorando el lado libre
Hola de nuevo.
Para terminar incluyo una versión del audio con modulación Sigmadelta.
Básicamente esto es lo mismo que hace el chip I2S, salvo que ese lo hace mejor: La modulación va a tener un SNR más alto y además va a interpolar las muestras de entrada, cosa que yo no estoy haciendo. 
El coste en la FPGA: tres sumadores: dos de 11 bits y otro de 5 bits, y dos registros de 11 bits por cada canal. Esto es como el cuádruple de unos moduladores PWM, aunque el sonido también es mejor.

Saludos
system.v

beni...@gmail.com

unread,
Apr 13, 2021, 2:25:42 PM4/13/21
to FPGAwars: explorando el lado libre
Gracias por postearlo aqui en el grupo

En general el chip I2S es un chip que realiza esa tarea exclusivamente con un modulador SigmaDelta completo con muchisimas mas etapas que lo que has implementado en ese Verilog, por tanto si incluyeramos todas las etapas que tiene este chip I2S consumiriamos muchisimas mas celdas.
Aparte normalmente las pequeñas tarjetas I2S del mercado incluyen tambien una parte analogica, es decir unos filtros basados en condensadores y resistencias que ademas mejoran mucho el sonido

Aqui tienes un ejemplo de varias  tarjeta ISs y su diagrama de bloques a la derecha

1) La primera la CS4344 , es la mas simple y con menor calidad de las que te voy a poner, aun asi supera con mucho al simple deltaSigma usado en muchas FPGAs comerciales del momento (ZXUno, ZXDOS. Mist).
Esta placa es la unica que requiere que el pin MSCLK este conectado al no llevar un reloj interno, ni en la placa
ebceb26a-421f-4bdc-99b4-cbadebe34bf2.d73a433d7d90484687aab164e7c6cbb6.jpegCapture5.PNG





2) Esta con el chip PCM5102 

519IVSN+8tL._AC_SY355_.jpgCapture3.PNG

3) Otro ejemplo lo tienes en la UDA1334a

1334-UDA1334A-Arduino-Module-Decoder-CJMCU-3.3V-LEORY-Board-Audio-Stereo-0.jpgCapture4.PNG

4) Finalmente para mi la que mejor calidad da es la ESS 9023, en donde la parte analogica y filtrados de salida son mucho mas evidentes. Esta placa no requiere MSCLK porque la placa lleva un reloj de 50 Mhz que va conectado a ese MSCLK

7fec29a9-9d48-4558-8c58-48b05ec7705b.jpg Capture2.PNG
Espero que con esta informacion quede mas claro,  los I2S mas economicos del mercado que se pueden utilizar perfectamente en nuestras FPGAs

Saludos

Fernando Mosquera

jor...@gmail.com

unread,
Jun 5, 2021, 4:47:26 AM6/5/21
to FPGAwars: explorando el lado libre
Confirmo que funciona el ejemplo con la placa Alhambra 2 y el módulo UDA1334

UDA1334.png

Parámetro frecuencia = 12000000

PINOUT UDA1334
SCLK = BCLK
LRCLK = WSEL
SDATA = DIN
MSCLK = SIN CONECTAR

VIN = 3.3V
GND = GND

El dia dimarts, 13 d’abril de 2021 a les 20:25:42 UTC+2, beni...@gmail.com va escriure:

Jo mo

unread,
Nov 29, 2022, 6:14:38 PM11/29/22
to FPGAwars: explorando el lado libre
Let us summarize and continues the subject started in the other post here!

Democritos:
     I bought an ecp5 board and also an UDA1334 (for one day experiment with sound )
     I won't be touching any of this for many months, but I wanted to have it. I have a lot of unfinished business to finish first, and when I do, I want to try other boards and catch up.

benitoss:
     I have similar boards.
     - Colorloght 5A-75E  with the bypasses done
     - USB BLASTER
     - FT2232H 
     - FT232H
     - UDA I2S Board
     - PCM5102A I2S Board
     - CS4344 I2S Board

     When are we are gonna start to play with these toys ?

Democrito:
     Fernando: I already have a project in mind with the subject of sound. I want to play with memoryless Xor gates, via a shift register to create pseudo-randomness. Creating something random is           impossible (you would have to get into quantum issues, listen to the noise of a diode for example). And with important toys... it's a subject I need to learn and I'm completely blank.

Jo mo:
     here, i have a pcm5102 i2s module!
     i can not wait too for playing with sound !

     @ democrito: Your project is "mysterious" :-)
     One of my first project may be a bit more basic!
     Making a wavetable oscillator for playing those one cycle 8 bit waveforms at different pitches !
     the pack of waveform can be download here

     So many think to do, it is frightening! :-)  But doing one by one, we should be able to manage !

charliva:
     Hi guys!!! Why not talk in this thread about a project to do together and use it to test the new features that I have been developing for icestudio and that I will have operational shortly.
     Sound ideas are welcome!

Jo mo :
     - The first stage is to be able to drive an audio Dac chip!
     For not starting fully from zero, we can start from the UDA1334A  i2S module work made in april 2022 by Fernando (Benitos) !
     Democrito already have that module (see his earlier post) and Fernando too probably !
     i will get one too!

     -And then we can add functions to send digital sound to that chip!

charliva:
     I'm going to buy one. Fernando what is the i2s that you recommend?

benitoss:
     UDA1334 or PCM5102 are enough

 Democrito:
     Whatever you decide will be fine with me. I will take time to join, if I do not finish what I have pending, it accumulates and then it is more difficult for me to resume it.

Joaquim:
     Do not worry Democritos, i will start slowly too :-) i have also some other pending task to complete !

Democrito

unread,
Nov 29, 2022, 7:04:20 PM11/29/22
to FPGAwars: explorando el lado libre
We'll be hitting this thread soon.

Jo mo

unread,
Nov 30, 2022, 11:08:36 AM11/30/22
to FPGAwars: explorando el lado libre
Ja Ja!

Yes, we can already drive an Oled display and some plastic switches so no problem to reproduce that digital synth! ;-)
What is crasy, about this OP-1 synth is that it looks like a plastic toy, and it sounds not very interesting (to my taste) and these people from Sweden are  selling this boxes for around 2000Euros !!!
For 1700Euros we can buy an heavy analog synth like this one one !

Jo mo

unread,
Dec 19, 2022, 4:13:25 AM12/19/22
to FPGAwars: explorando el lado libre
Hello guys, on Saturday, i got my UDA1436 ic boards! as early Christmas gift ;-)

IMG_20221219_093014.jpg
So i will put a bit on hold my "difficult" tunings on the serial monitor code !

To start, i tried Benitos .ice designs and they work well!
Thanks Fernando for that good starting point!
So let'us play ;-)

Have a nice Christmas time!

Democrito

unread,
Feb 5, 2023, 10:09:03 AM2/5/23
to FPGAwars: explorando el lado libre
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.

clk.PNG
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.

Modify.PNG



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.

UDA1334.PNG
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.

Test_Bell_I2S_12MHz.ice

Democrito

unread,
Feb 5, 2023, 10:16:21 AM2/5/23
to FPGAwars: explorando el lado libre
Se me olvidó adjuntar el vídeo...
VIDEO-2023-02-05-14-33-08.mp4

beni...@gmail.com

unread,
Feb 5, 2023, 1:47:46 PM2/5/23
to FPGAwars: explorando el lado libre
Muchas Gracias Democrito
Fantastica explicacion de los modulos

Yo he modificado un pelin el codigo para universalizarlo a cualquier placa con cualquier reloj


Creo que hay un pequeño error y por eso el segundo Gong se escucha raro, no completo

En la linea 18 tu tienes puesto esto

if (cnt_2000 == 14'd6000)

Y para 12 Mhz deberia de ser

if (cnt_2000 == 14'd5999)

En general la formula es esta
if (cnt_2000 == (CLK_RATE/2000)-1)

Por tanto es mejor usar un parametro exterior de CLK_RATE donde pones la frecuencia del reloj

Adjunto el proyecto con esas pequeñas modificaciones.
Testea si suena ya bien el segundo gong.

Saludos

Fernando Mosquera


Test_Bell_I2S_Universal.ice

Democrito

unread,
Feb 5, 2023, 3:49:28 PM2/5/23
to FPGAwars: explorando el lado libre
Buenas Fernando!

Gracias por la explicación! Ha sido muy buena idea lo de universalizar los módulos, ya no habrá problemas con los relojes de las placas. Sobre "el segundo gong" mi oído no distingue diferencias, sólo noto una especie de "dong" (izquierdo) y "ding" (derecho), es decir, que ambas señales son ligeramente con una nota musical de diferencia. Creo que esto es normal porque el contenido de ambas memorias tienen diferencias. He probado varias veces para ver si notaba algún acortamiento o algo pero no consigo distingirlo. En las pruebas utilicé auriculares.

Gracias de nuevo y un abrazo de mi parte!
Reply all
Reply to author
Forward
0 new messages