Transferir un flujo de bits de 1 MB a un FPGA y leerlo

Estoy usando el Spartan 3E Starter Kit y necesito almacenar una secuencia de bits de alrededor de 1 MB. Es un flujo de bits constante y lo conoceré en el momento de programar la placa. Necesito poder leer un bit a la vez de esta transmisión. Creo que necesito poner esta secuencia de bits en la memoria flash de la placa, ya que necesito que sea persistente incluso cuando no se le da energía a la placa. ¿Alguna idea de cómo se debe hacer eso?

¿Puede alguien señalarme un tutorial sobre cómo poner estos datos en el flash y cómo leerlos en algún otro módulo que los procese?

Dispositivos Xilinx:

  • Spartan-3E FPGA (XC3S500E-4FG320C)
  • CoolRunner™-II CPLD (XC2C64A-5VQ44C)
  • Destello de plataforma (XCF04S-VO20C)
  • Relojes: oscilador de reloj de cristal de 50 MHz

Memoria:

  • Flash paralelo de 128 Mbit (28F256)
  • Flash SPI de 16 Mbits (M25P16)
  • SDRAM DDR de 64 MB (MT46V16M16)
Es de 1 MB (Megabyte). Pero no creo que eso nos afecte mucho, ya que las memorias son mucho más grandes que 1 MB.
El mejor tutorial probablemente sea leer la hoja de datos de la pieza. Elija el paralelo o el SPI, luego planifique las máquinas de estado que necesita para la interfaz.
La documentación básica no menciona ninguna forma de almacenar datos en la memoria flash (disponible en la FPGA) e interactuar con ellos. Escuché que usando Xilinx-EDK, puedo configurar algo similar a un microcontrolador y usarlo para interactuar con la memoria. Pero no estoy seguro de cómo proceder o cómo funciona realmente.
¿Los datos son constantes todo el tiempo o necesita programar diferentes tableros con datos diferentes? Es decir, ¿podría codificar los datos directamente en su código HDL?
Xilinx tiene MUCHA documentación sobre cómo almacenar su programa FPGA en flash.
@ThePhoton: los datos son constantes en todo momento y están codificados. No sé cómo hacer eso en la memoria flash, pero necesito encontrar una manera de hacerlo. Además, necesita encontrar una salida para leer de él.
@DavidKessner: No se trata de almacenar el "programa" en flash. Es una cuestión de cómo almacenar una gran cantidad de "datos" o "bitsream" en flash.

Respuestas (2)

Método 1: Cree ROM en su diseño de FPGA

Debido a que tiene los mismos datos en cada placa, una opción es usar bloques de RAM en el FPGA, configurados como ROM. Para hacer esto, crea una instancia de un bloque de RAM, pero no se conecta a los pines de escritura. Utilice una directiva de síntesis en su código HDL o archivo UCF para especificar el contenido inicial de la RAM. Lea la Guía del usuario de Spartan-3 Generation (Capítulo 4) para ver cómo instanciar la RAM y cómo acceder a los datos de la RAM. Si usa Xilinx ISE, probablemente también haya un "asistente" para generar el bloque de RAM y configurar los contenidos iniciales para usted.

Desafortunadamente, el Spartan-3E que está utilizando tiene solo 350 kbits de RAM en bloque, no 8 Mbits como necesita. Entonces, para que esto funcione, tendrá que elaborar un esquema para comprimir sus datos para que quepan en 350 kbits. Los detalles de cómo hacer esto dependen del tipo de datos que tenga. Si sus datos son especialmente aleatorios, puede que no sea razonable obtener tanta compresión.

Método 2: almacenar datos en la memoria externa

Dices que tienes un flash paralelo de 128 Mbit y un flash SPI de 16 Mbit. Deberá leer las hojas de datos de estas piezas y comprender cómo funcionan. Luego escriba una máquina de estado en su FPGA que pueda acceder a estos dispositivos. Pero este es su trabajo como diseñador de FPGA. Algunos extraños al azar en Internet no van a diseñar su FPGA por usted.

Para almacenar los datos en la memoria flash, inicialmente tiene dos opciones. Primero sería, si está construyendo estas placas en volumen, puede hacer que su taller de ensamblaje de placas programe previamente los dispositivos flash antes de ensamblarlos en las placas. Por lo general, les entrega un archivo de datos en algún formato que soliciten, y le cobran una pequeña tarifa adicional para que los datos se actualicen antes del ensamblaje.

Segunda opción: Lea la hoja de datos del dispositivo flash. Escriba un diseño de FPGA que le permita enviar datos desde alguna otra interfaz disponible en su placa (Ethernet, USB, SPI, I2C, lo que sea) y cárguelo en la memoria flash. En el momento de la fabricación, carga este diseño temporalmente en su FPGA y programa su flash; luego almacena un diseño FPGA de "tiempo de ejecución" diferente en la PROM de configuración integrada, que no tiene la capacidad de modificar el FLASH, y sus usuarios no tendrán la capacidad de estropear los datos.

¿Tiene un procesador suave como microblaze? Puede escribir en el DDR especificando la dirección base y luego escribiendo desde esa dirección en adelante. Creo que podría hacer lo mismo con el flash, aunque deberá consultar los documentos para conocer la sintaxis exacta.

Creo que Xilinx EDK (Embedded Development Kit) me permite hacer lo que dices. Pero, ¿cómo lo vinculo con mi código FPGA (código verilog) que usaría para procesar datos después de leerlos desde el flash?
Cuando hice algo similar, tenía un microblaze que estaba conectado a un coprocesador (escrito en VHDL/verilog) y el microblaze lee los datos y los transfiere a través de un enlace Fast simplex (FSL) al coprocesador que luego realiza el procesamiento necesario en el hardware y lo devuelve a través de FSL.