Arquitecturas para la adquisición de datos de alto rendimiento con sistemas integrados

2

Objetivo: adquirir un flujo de datos generado por ADC de alto rendimiento (1 Msample / s @ 16bits) en un procesador System-on-Chip. Propósito: visualización de datos en tiempo real y algunos procesamientos (menores) en tiempo real

¿Cuáles son los pros y los contras de las distintas arquitecturas para lograr el objetivo?

Arquitectura 1

Una RAM de doble puerto, que toma datos de un FPGA que pega la salida SPI de los ADC y el puerto 1 de la RAM. El SoC IC está conectado a esta RAM en el puerto 2 mediante un bus de memoria externo y ve los datos muestreados en su propio espacio de memoria. El procesador está 100% libre de gestionar el ADC. Los datos de muestra son visibles en un esquema de búfer doble desde el final de Soc con interrupciones que informan al SoC cuando los búferes están llenos.

Arquitectura 2

Como en la Arquitectura 1, hacer que la RAM de doble puerto sea visible en un bus PCIe como un dispositivo de punto final (en lugar de usar el Bus de memoria externa que hemos visto en varios SoC).

Arquitectura 3

Utilice una Soc con controladores SPI incrustados y DMA. Programe la DMA para que se active mediante la señal de fin de conversión de los ADC y para mover los datos del SPI FIFO a la memoria.

Arquitectura 4

Use un procesador dual o quad-core y dedique un núcleo para controlar la interfaz SPI con el ADC y seleccione un puerto GPIO para detectar la final de la conversión. De hecho, esta solución se implementa mediante una funcionalidad similar al DMA del software.

Arquitectura 5 ¿Tu solución?

    
pregunta Eric T

2 respuestas

1

En primer lugar, 1 MS / s a 16 bits es solo 2MB / s, lo que en realidad no es demasiado para el USB2. No hay necesidad de doble puerto RAM, si estamos hablando de dispositivos que se prestan para visualización o tienen PCIe como sugiere su Arch2, en mi opinión.

El hecho de que estés haciendo visualización implica que no te importa la latencia. ¿Qué es medio milisegundo para el ojo humano? Entonces, usted es bastante libre con respecto a la elección del transporte de muestras.

Entonces:

Arco 1

Muchos componentes, incluido un FPGA que no hace nada más que escribir un mínimo de 1 millón de muestras por segundo en una interfaz RAM. Yo diría que, si sigue ese camino, use un bus factiblemente rápido, y eso incluiría SPI o QSPI simples, y un poco de RAM con el FPGA para implementar un búfer de anillo. No necesita RAM de doble puerto: tendría que comunicar información como "ok, hay nuevas muestras disponibles para usted" o "no, no hay nada que buscar ahora", de todos modos.

Arco 2

PCIe suena como una gran sobrecarga aquí. Nuevamente, la tasa de la que estamos hablando es de 2MB / s.

Arco 3

Si tu ADC y tu SoC te permiten hacer eso, ¡comienza con eso! Ciertamente, suena como la solución más fácil y con el componente más bajo. A menudo, esto no funciona por razones eléctricas. SPI es absolutamente una interfaz normal para un sistema integrado, por lo que asumo que sería bastante fácil encontrar un controlador que lo tenga.

El problema sigue siendo que todavía necesitarías a alguien para, por ejemplo. genere su reloj de muestra, etc.

Arco 4

bueno, sí, como dices, una versión menos grande de 3.

Arco 5

1MS / s no es realmente de alto rendimiento. De hecho, recuerdo haber escrito el firmware para un proyecto ARM cortex-M0 ahora inactivo que ejecutó el ADC interno a 500 kS / sy llevó los datos a través de USB2 a una PC. Con un MCU ligeramente más capaz, deberías poder hacer lo mismo. De esa manera, tendría un dispositivo barato como el infierno dedicado a manejar datos de ADC y rellenarlos en paquetes USB, y solo tendría que escribir un par de líneas de Python o C para ejecutarse en su dispositivo integrado para pedirle al microcontrolador Para paquetes masivos USB llenos de datos. Bonificación: puede controlar su CPU principal cuando lo desee, y no tendrá ningún efecto en el muestreo.

Arco 6

Un poco fácil. Con la ayuda de un poco de pegamento-FPGA (sin RAM propia, iirc), se puede realizar una visualización mínima, muestrear a varias mega muestras por segundo (complejo) y un poco de análisis en ARM cortex-M4. Esto está probado por el diseño abierto del HackRF. Creo que podría valer la pena que veas esto. Desde mi punto de vista, parece que básicamente solo querrías tirar todas las cosas de RF en eso, y usarlas como están. ¡Incluso obtendría controladores y firmware gratis!


DiagramasdecomponentesdehardwareHackRFdelawikidelproyecto

Eldiagramaanteriorsesimplifica,comosemencionó,hayunpequeño"pegamento" FPGA entre el híbrido ADC / DAC y el LPC Cortex-M4, como el schematic te lo dirá.

    
respondido por el Marcus Müller
1

Sugeriría una quinta arquitectura, utilizando un búfer de 16 bits de ancho entre ADC y cualquier caja lógica. Para lograr 16 bits significativos (supongo que desea que el LSB sea significativo), debe mantener el ruido transitorio de la caja lógica fuera del ADC.

Cualquier caja lógica tendrá 0.5vpp sonando {OK, quizás 0.2vpp sonando, si VDD es 1.8v} con bordes de 0.5nS, en su GND interno y RAIL. Esta basura interna se acopla a través de diodos ESD y puertas FET a las salidas ADC; la carga transferida exige un camino de regreso a casa, que incluirá la entrada analógica del ADC y la Referencia y el GNC del ADC.

Suponga que la caja de la caja lógica de 1volt / nanosegundos y el acoplamiento de 3pF ESD, etc. Esto inyecta 3 miliAmps en cada salida de ADC; 16 pines de salida (salida paralela) es de 48 miliAmps, con Trise (se diferencia por la capacitancia) de 0.25nS.

Suponga que la única ruta que sale del ADC es la ruta 1nH (llámela GND). ¿Cuál es el voltaje a través de ese inductor (este es nuestro malestar de GND). $$ V = L * dI / dt $$ $$ V = 1nH * 0.048amps / 0.25nS $$ $$ V = 0.192 voltios $$

Por lo tanto, sugiero la arquitectura # 5, para incluir un búfer entre ADC y la lógica.

simular este circuito : esquema creado usando CircuitLab

------- edit ------

Observe que el trastorno de GND que creamos dentro del ADC, a 0.192 voltios, no es mucho más pequeño que el rebote dentro de la MCU / caja lógica a 0.5 voltios. Necesitamos reducir el tiempo de subida de las corrientes que fluyen hacia nuestro ADC y hacia nuestro búfer de 16 anchos. Insertar 16 resistencias, valor 1Kohm. La resistencia no ralentiza los bordes, pero limita la corriente a 0.5v / 1Kohm = 0.5mA. Ahora agregue 10pF en cada una de las 16 líneas, justo en el ADC (o en el lado MCU del búfer); esto divide la corriente por 3pf / (3 + 10) = ~ 1/4; lo que es más importante, el borde se ralentiza en 4: 1.

Con la doble diferenciación, esta reducción de borde tiene una mejora de 4 ^ 2 = 16: 1 en la corriente inyectada. Pero has añadido 32 componentes. Pero ha reducido el timbre (dentro de ADC, o dentro del búfer entre ADC y MCU) en 3ma / 0.5ma * 16 o de cien a uno. 40 dB. Dibuje algunos esquemas, dibuje los flujos de corriente, observe los índices de giro de los bordes y cómo esos bordes cargan / descargan los diodos ESD dentro de todos los circuitos integrados, con las corrientes de diodos ESD explorando Todos posibles caminos de regreso al MCU. TODOS rutas posibles, proporcionales a la conductancia.

    
respondido por el analogsystemsrf

Lea otras preguntas en las etiquetas