ADS7924 interface (ADC with I2C bus)

144 views
Skip to first unread message

Jesus Arias

unread,
May 28, 2024, 3:41:11 AMMay 28
to FPGAwars: explorando el lado libre
Hola,
He escrito un módulo de interfaz para el ADC de la Alhambra (otro más). La idea era poder usarlo como un módulo Verilog, posiblemente fuera de Icestudio, además de poder ajustar el modo de funcionamiento del ADC a conveniencia.
Características:
- Caja negra con señales ADC por un lado y 4 datos de 12 bits como salidas asociadas a los canales analógicos por el otro.
- Modo burst con sleep mínimo, que nos da unas 1400 muestras/seg.
- 124 celdas lógicas ocupadas.

Cronograma de una captura:
cap03.png


cap01_an.png

cap02.png

Saludos

adci2c.v

Democrito

unread,
May 28, 2024, 9:23:49 AMMay 28
to FPGAwars: explorando el lado libre
Tiene muy buena pinta. Este fin de semana lo trataré de pasar a módulo de Icestudio.

Lee los 4 canales, a máxima velocidad, 12 bits de resolución y sólo consume 124 LC, es sencillamente genial.

Gracias Jesús!

charli va

unread,
May 28, 2024, 4:08:06 PMMay 28
to fpga-wars-explora...@googlegroups.com
Hasta ahora siempre había usado los bloques de la colección Jedi del ADC de la Alhambra y no me había metido en las tripas del chip y la verdad aún no he podido probarlo pero he estado viendo el código y me ha encantado como has resuelto el ADC con el modo burst, la verdad que el código me ha parecido super elegante y sencillo.

Si Demócrito monta el bloque para Icestudio, yo voy a preparar una comparativa con los dos actuales  y luego este nuevo en cuanto Demócrito lo tenga  y así que nos valga para aprender y ver las diferencias , ventajas y desventajas de unos y otros.

Enhorabuena por este tercer ADC! habrá que ir a por un cuarto.....



--
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/f3d8ff06-7d42-4e7e-9e56-d17a8f67bacbn%40googlegroups.com.

Jesus Arias

unread,
May 28, 2024, 5:24:25 PMMay 28
to FPGAwars: explorando el lado libre
Hola de nuevo
Adjunto una variante en la que sólo leo el canal #0 y con 8 bits de resolución en lugar de 12. Esto me permite subir la frecuencia de muestreo hasta las 18000 muestras/segundo (sin forzar SCL a más de 400kHz). Ocupa 72 LCs.
En este caso el truco está en mantener constante el puntero a los registros del chip, lo que nos ahorra tener que mandar toda una trama I2C de escritura para dar el valor inicial al puntero antes de la lectura. Desafortunadamente esto también supone que sólo se pueden leer los 8 bits MSB de los resultados.

Realmente este código necesita todavía una revisión, es más una prueba de concepto que otra cosa.
Saludos

adci2c_single.v

Democrito

unread,
May 28, 2024, 5:51:38 PMMay 28
to FPGAwars: explorando el lado libre
Acabo de pasar el primer ADC de 12 bits y 4 canales a módulo de Icestudio en plan borrador y funciona perfectamente.

Si miráis los detalles de frecuencia máxima y LCs, podréis ver lo que ocupa, etc.

Initial test Alhambra-II ADC.png

He conectado el tic de validación para las salidas "sampleck" a la entrada "int" (interrupción). Pero para que se ponga en marcha y no pare de escupir datos hay que dar un tic o un "1" momentáneo en la entrada "reset.

Según interpreto "sampleck" funciona como un "done" (tic),  y es por eso que lo he conectado a "int".

Estoy pensando en añadir un "init tic" (un sólo tic temporalizado, y se puede añadir una OR para la señal reset) en la señal "reset", para que no haga falta inicializar manualmente el driver ADC.

Adjunto circuito preliminar por si alguien quiere probarlo. Recuerda que para ponerlo en marcha hay que pulsar momentáneamente el pulsador "SW1".


pre_test_ADC12_Arias.ice

charli va

unread,
May 28, 2024, 6:06:39 PMMay 28
to fpga-wars-explora...@googlegroups.com
Buenas equipo!! pues yo pensando que Demócrito no tocaría nada hasta el finde, me he puesto a preparar un pequeño juguete  XD

Os paso vídeo de como va (ya está tomando vida! y dentro de poco lo pondré bonito).

Ahora mismo está leyendo los datos del adc del módulo de obijuan de la colección jedi. A la alhambra va conectado un generador de onda a 3Hz que es lo que samplea el módulo de juan a 400Hz.

El juguete será online por lo que la prueba será super sencilla de hacer, lo que veis es una web, ya os pasaré url en cuanto esté en marcha.

Por el momento ya estoy pintando lo que llega por el puerto serie (16 bits a 1.5Mbps para que sea compatible a parte de la alhambra a otras placas ) y usando la gpu calculo la fft en tiempo real.

He metido controles de zoom, de posición para ver los datos, autoescalado, pan, exportar a imagen.

Meteré una exportación a fichero por si se quieren luego pasar los datos a otros programas y alguna cosa más.

Esto va alineado con el analizador lógico que propuso Jesús y que es similar a mi proyecto de Sigrok que aunque no he vuelto a dar noticias estoy avanzando poco a poco mezclando lanal con sigrok , si no se complican mucho las cosas pronto os dare noticias de esto y creo que va a ser algo que entre todos podemos construir algo muy potente.

Yo por hoy tengo que cortar aunque con vuestros dos últimos mails ya estoy deseando agarrarlos mañana :)

También si puedo intentaré darle una vuelta al código por si se me ocurre alguna cosa que pueda aportar.


Un abrazo!

--
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.
adc-toy.mp4

charli va

unread,
May 28, 2024, 6:17:15 PMMay 28
to fpga-wars-explora...@googlegroups.com
Demócrito , creo que sería más interesante simplemente instanciar el módulo y no copiarlo en código.  De esta forma si por ejemplo se mejora el verilog del módulo con sobreescribir el fichero verilog ya estaría actualizado el módulo .

Llevo tiempo haciendo pruebas de cómo convivir mejor verilog y icestudio, tengo varias cosas en pruebas y ya voy viendo como es mejor, mi idea es que pasemos a un formato de proyecto en carpeta o que un proyecto que contenga en su interior los ficheros verilog y sea fácil su actaulización si fuera necesario.

En cuanto liberemos la nueva versión empezaré a subir a la wip varias mejoras en esta línea (soporte de carpetas y un primer prototipo de importador automático de verilog a bloques).

Te digo esto porque es posible que estos dáis el módulo evolucione (o igual no) y si lo tenemos instanciado y referenciado al fichero de disco será muy fácil ir actualizándolo.

Pero es una sugerencia, tenerlo todo embebido de momento también es una maravilla.

Un abrazo!

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

charli va

unread,
May 28, 2024, 6:32:28 PMMay 28
to fpga-wars-explora...@googlegroups.com
Por cierto , y ahora sí que corto XD  pero no he podido antes de irme, evitar mirar la velocidad máxima del circuito al ver la captura de Demócrito. Con este ADC 211Mhz con los que teníamos hasta ahora apenas 30-60 :) 

¡Una pasada Jesús!

Jesus Arias

unread,
May 29, 2024, 3:12:42 AMMay 29
to FPGAwars: explorando el lado libre
Hola
La entrada INT hay que conectarla al pin "INT" del ADC (ADC_INT, pin 90,  en el archivo PCF)
Es un pin multifunción que configuro como "BUSY" y que genera un pulso en bajo de unos 4us por cada canal que se convierte.
Saludos

Jesus Arias

unread,
May 29, 2024, 3:46:22 AMMay 29
to FPGAwars: explorando el lado libre
Y el tema del reset se puede mejorar. Bastaría cambiar la línea:

reg [4:0]uaddr; // address counter

por:

reg [4:0]uaddr=ADDRST; // address counter

Y tendríamos un reset automático. Como vemos todavía se necesita "pulir" este tipo de detalles.
El martes, 28 de mayo de 2024 a las 23:51:38 UTC+2, Democrito escribió:

Democrito

unread,
May 29, 2024, 4:11:04 AMMay 29
to FPGAwars: explorando el lado libre
Sobre la patilla "int" es algo que sabía pero en el momento de la adaptación (verilog a módulo) se me fue completamente de la olla (no me acordaba de ese detalle pese haberlo visto miles de veces), y es debido a que nunca la había usado, pero cuando lo has comentado es cuando me he dado una palmada en la frente.

Adjunto de nuevo el mismo circuito con los cambios que has mencionado:

- pin "int" conectado al pin físico del ADC "ADC_INT"
- dirección del contador inicializado con el registro ADDRST;
- El reset hace su función al ser activado.

Me ha dado una sensación subjetiva de mejora en la estabilidad de los datos de salida.

Muchas gracias Jesús!
pre_test_ADC12x4_Arias.ice

charli va

unread,
May 29, 2024, 6:08:33 AMMay 29
to fpga-wars-explora...@googlegroups.com
Buenas! no sé si habéis visto el vídeo que os pasé ayer, ya tengo casi la herramienta lista, le estoy metiendo una funcionalidad para poder meter marcas de tiempo y una cosa que siempre quise en este tipo de herramientas era poder meter anotaciones sobre el gráfico, esto no lo tengo hecho pero creo que podría meterlo con relativa agilidad  y no sé si veis útil meter algún tipo de gráfica como la fft que nos pueda ser útil de cara a análisis de señales o depurar procesos de este tipo .

Si no veis útil tener una herramienta así que ya nos de un set de gráficas , medidas etc de forma sencilla decídmelo también .

Un abrazo!

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

Democrito

unread,
May 29, 2024, 9:46:57 AMMay 29
to FPGAwars: explorando el lado libre
Por supuesto Carlos, hay que integrar esa herramienta dentro de Icestudio, o un enlace tuyo para analizar señales.


charli va

unread,
May 29, 2024, 9:53:52 AMMay 29
to fpga-wars-explora...@googlegroups.com
A  partir de ahora por cambios que voy a meter en Icestudio me va a permitir muchos plugins o mejoras ponerlas primero online para que podamos probarlas sin tener que instalar versiones nuevas ni nada similar, va a ser todo un avance en cuanto a agilidad, a parte de que quiero montar una sección en la web con herramientas todas online para trabajar con las FPGAs, tengo ya varias en pruebas os las iré soltando según vayan estando potables.

Esto me vale además de para esto para evaluar ciertas cosas de las que ando trabajando en esta línea, pero aún así no quiero imponeros herramientas así que ahí dadme feedback para no daros la brasa sin sentido.

Mi idea es integrar en el terminal serie nuevas pestañas esta sería para análisis de señales numéricas (procedentes de adc o símplemente datos que generes en la fpga y que quieras graficar de algún modo).

La otra pestaña sería el analizador lógico que estoy mezclando lo que hizo Jesús con lo mio y pulseview esto me queda poco para teneros ya algo pronto.

Esta tarde intento pasaros el enlace para que probéis este pequeño juguete a ver si lo veis útil.

Un abrazo!

El mié, 29 may 2024 a las 15:46, Democrito (<spo...@gmail.com>) escribió:
Por supuesto Carlos, hay que integrar esa herramienta dentro de Icestudio, o un enlace tuyo para analizar señales.


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

Jesus Arias

unread,
May 29, 2024, 10:04:37 AMMay 29
to FPGAwars: explorando el lado libre
Hola Carlos,
La visualización de las señales siempre está muy bien tenerla disponible.
La FFT es algo menos intuitiva que la pantalla de osciloscopio. Aquí te sugiero:
- Dibujar sólo media FFT. La segunda mitad es la correspondiente a las frecuencias negativas y sólo tiene sentido mostrarla si las señales de partida son complejas.
- Añadir la posibilidad de aplicar funciones "Ventana". Sin ellas cualquier tono un poco fuerte tapa por completo los tonos cercanos.

Saludos

charli va

unread,
May 29, 2024, 10:27:08 AMMay 29
to fpga-wars-explora...@googlegroups.com
Muchas gracias por las ideas Jesús, si os motiva seguro que poniéndolo en marcha se nos ocurrirán más funcionalidades.

La FFT justo la corté esta mañana, la estaba poniendo completa para comprobar que funcionara bien el algoritmo, he tenido ciertas dificultades para pintarla en tiempo real porque se me "freía" el navegador, al final se me ocurrió ver si era posible hacerlo usando la GPU para realizar los cálculos igual que hago en C a nivel de sistema operativo (desconocía que pudiera hacerlo en web) y me ha sorprendido gratamente encontrar que ya hay varias librerías para poder multiplicar matrices "a toda velocidad" tirando directamente de la GPU, esto va a dar recorrido.

El poder aplicar "funciones ventana" me ha parecido fantástico voy a ver como meterlo  porque me parece muy interesante, inicialmente he metido esta gráfica un poco por probar si esto daba de si.

El tema es que ayer me puse a montar esto "a modo rápido" para que pudiéramos jugar con lo del ADC y se me ha ido de las manos XD porque le veo muchas posibilidades. De cara al analizador lógico como irá vinculado con esto a parte del tiempo real tendremos el modo por disparo en vez del tiempo real que seguro será mucho más útil.

Efectivamente como un osciloscopio y sobre todo si es bueno , no hay nada pero creo que estas pequeñas herramientas pueden ser muy útiles para pequeñás cosas, pruebas rápidas,...

Lo dicho a ver si consigo cerrarlo  hoy, os lo paso para que lo probéis y ya soltamos ideas, cambios si se os ocurren cosas que pudieran ser útiles...

Pasad buen día!

charli va

unread,
May 30, 2024, 5:21:58 PMMay 30
to fpga-wars-explora...@googlegroups.com
Buenas a todos! ya tengo el primer boceto del juguete.

Me ha dado más problemas de los que pensaba el tema de la GPU, de momento sólo proceso la FFT por la GPU para que no sobrecargue mucho pero las ventanas las calculo algorítmicamente. Cuando juguemos un poco con ello y definamos bien por donde tirar si  vemos que puede ser interesante la herramienta ya iré optimizando esas cosas, de momento va bastante bien.

Como es un primer prototipo puede haber errores de situaciones no controladas (por ejemplo me acabo de dar cuenta que no he controlado si desconectas mal la placa, si se queda tonto como es web con refrescar la página suficiente.

Tenéis que probarlo en chrome o chromium (u otro navegador basado en chrome) en firefox se puede pero activando funciones experimentales y es más rollo ( Chromium ya ha hecho estable el api del estandar de webserial así que es fantástico porque no hay que hacer nada especial.

El funcionamiento es muy sencillo, conectamos la placa por usb y damos al botón Load serial ports, saldrá un mensaje del navegador que nos permitirá seleccionar el puerto usb en cuestión. Con la alhambra es un poco jaleo porque a mi al menos el puerto serie el ftdi me lo va bailando cuando enchufo y desenchufo, y luego cuidado porque un puerto usb de la alhambra tiene dos uarts y opr ende teneis que seleccionar cual es.

Esto si avanzamos con el analizador lógico y con esta herramienta ya estableceremos un protocolo que permita autodetectar el puerto correcto, de momento en el peor de los casos tenéis que probar un par de veces.

No hace falta decir que al herramienta vale para cualquier placa, pronto probaremos la icecream ;)

Por si queréis implementar vuestro conector, ahora mismo la aplicaicón trbaaja con 16 bits de datos, pero la transmisión es a 1.5Mbps a 8 bits (he reutilizao bloques por hacer pruebas rápido y lo tenía así montado de otra cosa pero mejoraremos esto). Lo que hay que hacer es mandar primero el byte más significativo y luego el menos significativo.

Os adjunto un .ice que he usado para probar con el bloque de Obijuan y una uart serie que ando trabajando para el analizador lógico pero está verde aún aunque para esto me ha permitido probarlo rápido.

Demócrito si te animas mete el bloque que has hecho de Jesús y probamos.

Mañana prepararé un ejemplo instanciando diréctamente el código de Jesús, y os documentaré el proceso y así Demócrito si te animas montas tu el segundo ADC.

En este ejemplo símplemente se muestre a 400Hzpor el canal 0. Lo que sí he puesto un reset en el botón SW2, es decir si lo probáis hay que pulsar el botón 2 para que empiece a enviar datos. yo he hecho pruebas con un generador de señal a pocos herzios (1,2, ....20..) para poder ver bien la señal y demás.

- Sobre la interfaz  quiero mejorar unas cosillas y os preparé un pequeño tutorial aunque si jugais un poco es ultra sencilla, lo que he preparado par aeste primer prototipo:

  • 1) Freeze, como es tiempo real, esto permite congelar la visualización para hacer zooms, pan, etc, veréis que podeis volver a darle a continuar y retoma donde vaya en ese momento en tiempo real.
  • 2) Meausure, en estado Freeze podeis pinchar en la gráfica y medir, es muy tosco pero funcional, un click fijais el inicio de la medida, siguientes clicks redimensionan la ventana, luego le dais a stop measure y la medida queda fijada, el valor aparece debajo de la gráfica con un check por si queréis borrarla. podeis crear todas la medidas que querais.
  • 3)zoom, pan.... hay que mejorar sobre todo el zoom pero es bastante funcional.
  • 4) FFT entiempo real
  • 5) Escala logarítmica o lineal de la fft
  • 6) Ventanas de Hann, Hamming, Flat-top, exponencial y Kaiser-Bessel, Jesús si hay alguna otra que pueda merecer la pena la implemento en un momento.
  • 7) si haceis freeze la fft se calcula sobre lo que se vea, es decir si hacéis zoom se recalcula con lo que estais viendo. Ahora mismo se está implementando una FFT de 4096 muestras (en tiempo real se calculas las últimas 4096).

Más o menos es todo, aquí os dejo un vídeo que he colgado en funcionamiento:


Y lo más importante, el enlace! (por cierto hay que buscarle un nombre a esto):


Espero que os guste!! y abrimos debate de si es interesante , funcionalidades etc (si os interesa claro).

Un fuerte abrazo!

PD: Os adjunto el .bin por si alguien quiere tostarlo en la Alhambra sin icestudio.

adc-jedi.ice
hardware.bin

Jesus Arias

unread,
May 31, 2024, 3:27:34 AMMay 31
to FPGAwars: explorando el lado libre
Hola Carlos,
He intentado probarlo y la interface gráfica funciona pero la señal está siempre plana. Puede que no haya programado bien el bitstream, tengo que volver a probarlo.

Y respecto a los módulos en Verilog, tengo que volver a adjuntarlos con algunas correcciones:
- Ahora pongo el ADC en modo AWAKE antes de pasar al modo definitivo. Sin este cambio no funciona bien la selección del canal para la versión de un sólo canal.
- En la versión de un sólo canal de 8 bits se puede cambiar el canal seleccionado y el ADC se reinicia. (He tenido que incluir una bifurcación múltiple en el microcódigo ;)
- He reorganizado el microcódigo para que un "reset" comience en la dirección 0, pues parece que con los reset asíncronos los valores iniciales distintos de 0 suponen emplear más celdas lógicas.
- También he intentado meter uno de estos módulos en Icestudio y a la hora de sintetizar me dice que las salidas triestado no están soportadas. ¿Tengo que actualizar Icestudio, o la toolchain?

Saludos
adci2c.v
adci2c_single.v

charli va

unread,
May 31, 2024, 6:01:32 AMMay 31
to fpga-wars-explora...@googlegroups.com
No sé que versión de Icestudio tienes, tengo pendiente meter ya un sistema de auto actualización porque reconozco que es pesado
 el actualizar con cada cambio o mejora.

Mira a ver si tienes estas opciones en tus preferencias, si no, bájate de esta web https://downloads.icestudio.io/ la más nueva  y te echo una mano si te da problemas:

 Captura de pantalla 2024-05-31 a las 11.49.16.png

Asegúrate que tienes el check activado para las tri-estado.

También asegúrate que estás en la toolchain 0.9.4, puedes probar primero si tuvieras una versión inferior a darle a "Actualización (última estable)" que la última que es la que stamos ahora congelando ya soporta tri-estado.

Captura de pantalla 2024-05-31 a las 12.00.58.png
Hoy preparo uno de los bloques con tus adc y un pequeño manual para la gente que esté aprendiendo verilog y quiera ver como se importa en icestudio sin tener que pegar código.

Independientemente , cuando le des a detectar los puertos prueba primero con cada uno de los que te aparece (salen dos) y luego a su vez prueba primero con un puerto en el selector y luego con el otro.

En total a mi me salen 3 posibilidades (uno de los puertos de la alhambra, luego tiene como dos canales y el otro sólo una).

Y recuerda darle al sw2 una vez esté el puerto conectado

Una cosa por si pudiera ser, yo para esto tengo que usar un cable usb que tiene un nucleo de ferrita en el extremo, con un cable usb normal me da problemas , pero no sé si es por mi equipo o por la alhambra porque lo tuve que hacer desde el principio, te lo digo porque igual el cable que estás usando no es muy bueno.

Voy a mejorar hoy el tema del puerto serie quepodamos configurarlo (Velocidad, bits,etc) porque también podría ser que por alguna razón tu equipo no pueda configurar los 1.5Mbps aunque eso saldría basura la línea plana me da más pinta de que estás conectando el canal de la alhambra que no es (esto es otra cosa que quiero mejorar incorporando un protocolo de comunicación que permita al cliente testar sólo los puertos y ver en cual está el servicio escuchando).

Voy a liarme con ello y os digo.




Jesus Arias

unread,
May 31, 2024, 1:29:45 PMMay 31
to FPGAwars: explorando el lado libre
Hola
Estaba usando una versión demasiado vieja. No tenía esa opción en las preferencias.
Con la última que he descargado ya va todo bien, y sabiendo que hay que pulsar SW2 para que arranque la captura ;)
Gracias

charli va

unread,
May 31, 2024, 1:50:23 PMMay 31
to fpga-wars-explora...@googlegroups.com
me alegro! :) entonces probaste el visualizador y funcionó?

Jesus Arias

unread,
May 31, 2024, 2:35:27 PMMay 31
to FPGAwars: explorando el lado libre
Sí, he visto esto:
dataplot.png
Es la señal de un potenciómetro entre 3.3V y GND. Los glitches se pueden deber a que el cursor del potenciómetro esté un tanto oxidado. Aunque también se aprecian unos escalones un poco raros.

charli va

unread,
May 31, 2024, 2:50:01 PMMay 31
to fpga-wars-explora...@googlegroups.com
Bueno al menos parece que está vivo XD estoy mejorando la versión, los escalones pueden deberse a como se interpola la gráfica al pintar yo en mis pruebas también me aparecen glitches y escalones, voy a mejorar también la uart por si hubiera algún error por ahí.



Reply all
Reply to author
Forward
0 new messages