Lectura de imagen, sonido, archivo binario desde memoria no volátil para FPGA

Para las aplicaciones que requieren diseño en FPGA que utilizará varios archivos de imagen, archivos de sonido u otras formas de archivos, ¿pueden simplemente incluirse en el archivo de configuración de diseño de FPGA? En cualquier caso, si estas cosas se almacenan en una memoria flash externa o EEPROM, ¿existe un diseño de referencia que:

  1. Muestra cómo ponerlos en esta memoria externa
  2. Cree un diseño que sepa dónde leer en la memoria externa
  3. ¿Lo lee y luego envía estos datos al dispositivo de salida?
Es posible que el diseño sea puramente en VHDL o más bien haga uso de un softcore para simplificar el proceso.
Xilinx proporciona herramientas para inicializar memorias Flash externas a través de JTAG, PicoBlaze y MicroBlaze. ¿Está utilizando un FPGA de Xilinx? ¿Cuál es el nombre del tablero? ¿El archivo de imagen supera la capacidad de BlockRAM? En caso afirmativo, no es posible resolverlo (codificado) en VHDL.
Estoy usando la placa Altera DE2-115. Esta es una pregunta general para entender cómo se puede resolver este problema de varias maneras.

Respuestas (2)

Bueno, realmente depende del tamaño de sus datos, con qué frecuencia necesita acceder a ellos y qué tipo de ancho de banda necesita. No existe una buena solución de "talla única" para esto.

Para datos pequeños, la RAM de bloque en FPGA es una buena opción. El bloque de RAM en el chip se puede inicializar a partir de los datos de flujo de bits, por lo que se puede usar como una ROM. La ubicación en el chip del bloque de RAM también proporciona el mayor ancho de banda posible. No se requieren pines externos. Sin embargo, el bloque de RAM tiene un tamaño muy limitado, así que no desperdicie este recurso a menos que sea absolutamente necesario. Tampoco es realmente posible que el FPGA edite las entradas de la ROM, ya que tendría que editar los datos de inicialización para el bloque de RAM en el flujo de bits (una operación que dista mucho de ser trivial), por lo que en realidad solo son útiles para el almacenamiento constante o volátil. .

Ahora, en cuanto a la memoria no volátil externa, esto es un poco más difícil. Hay muchos tipos diferentes de memoria que podrían usarse, con muchos protocolos diferentes. Esto podría variar desde un simple chip flash I2C o SPI o una tarjeta SD, hasta un flash NOR paralelo o flash NAND, un SSD o HDD conectado a través de SATA o PATA, para acceder a un servidor de archivos o SAN a través de Ethernet. Lo que tiene sentido depende del tamaño de sus datos, la latencia de acceso requerida y el ancho de banda de acceso requerido. Las conexiones a través de I2C o SPI serán muy lentas, quizás hasta un par de MB por segundo. Sin embargo, los protocolos son muy simples. Entonces, si solo necesita transmitir datos de audio de 48 ksps, esta podría ser una buena opción. Sin embargo, esto no funcionará para algo que requiere mucho ancho de banda, como un video Full HD. Para algo así, necesitarías una interfaz con mucho más ancho de banda. Aquí es donde la ingeniería puede ser un poco desafiante: no es fácil interactuar con un almacenamiento grande y rápido. Una opción podría ser abrir una interfaz SATA y conectar un SSD grande. Habrá cierta latencia al solicitar los datos, pero podrá transmitir muchos gigabytes de datos desde el dispositivo a varios cientos de Mbps.

Además, no olvide que probablemente también necesitará alguna forma de escribir en el almacenamiento no volátil. Si esto debe hacerse con un ancho de banda alto, eso significa que necesitará alguna otra interfaz con el mundo exterior. Ethernet y USB 3 son opciones razonables.

Creo que no hay una solución general porque:

  • Las EEPROM utilizan al menos 4 protocolos de interfaz
    • paralelo
    • un alambre
    • I2C
    • SPI
    • JTAG
    • ...
  • La memoria flash tiene tantas interfaces más algunas propietarias.

Además de un controlador de interfaz de bus para los protocolos mencionados, existe la necesidad de un controlador de lectura/escritura/borrado, que aborde cada posible tipo de memoria, tamaño... y proveedor.

Además de eso, necesitará una CPU de núcleo suave o un FSM grande para leer los flujos de configuración de:

  • UART
  • ethernet
  • PCIe
  • JTAG
  • ...

y escribirlo en la memoria externa. Después de la configuración, este circuito debe puentearse, intercambiarse, ...

Por lo tanto, se necesita otro controlador de bus más varias capas de protocolo para leer el flujo de entrada: por ejemplo, MAC, IPv4, UDPv4

Para omitir el configurador de memoria, puede usar:

  • programación doble:
    1. sube el programador flash
    2. enviar el contenido Flash
    3. sube el diseño de trabajo
  • programador anulable con reutilización del controlador de bus:
    1. cargue el diseño que comienza en el modo de configuración
    2. redirigir los contenidos recibidos a la memoria Flash
    3. cambiar al modo de trabajo/habilitar el diseño principal para usar el controlador de bus
  • reconfiguración dinámica para intercambiar el softcore/programación FSM con el diseño real.

¿Puedes precisar tu pregunta?

Bien, algunas imágenes (digamos que hay 10 de ellas) que no tendrán más de 800x600 píxeles deben leerse y enviarse a una pantalla VGA o TFT y algunos archivos de sonido que no están comprimidos, digamos 5 archivos. esa cantidad a 1 MB. No es necesario cambiar los datos una vez que se han colocado en la memoria no volátil. Solo se leerá cuando sea necesario.