Método 1: Crear ROMs en el diseño de tu FPGA
Dado que tienes los mismos datos en cada placa, una opción es utilizar RAMs en bloque en la FPGA, configuradas como ROM. Para hacer esto, instancias una RAM en bloque, pero no la conectas a los pines de escritura. Utiliza una directiva de síntesis en tu código HDL o archivo UCF para especificar el contenido inicial de la RAM. Lee el Guía del Usuario de la Generación Spartan-3 (Capítulo 4) para ver cómo instanciar la RAM y cómo acceder a los datos desde la RAM. Si utilizas Xilinx ISE, probablemente también haya un "asistente" para generar el bloque de RAM y configurar el contenido inicial por ti.
Desafortunadamente, el Spartan-3E que estás utilizando solo tiene 350 kbits de RAM en bloque, no 8 Mbits como requieres. Para que esto funcione, tendrás que idear un esquema para comprimir tus datos para que encajen en 350 kbits. Los detalles de cómo hacer esto dependen del tipo de datos que tengas. Si tus datos son especialmente aleatorios, puede que no sea razonable lograr tanta compresión.
Método 2: Almacenar datos en memoria externa
Dices que tienes un flash paralelo de 128 Mbits y un flash SPI de 16 Mbits. Necesitarás leer las hojas de datos de estas partes y entender cómo funcionan. Luego escribe una máquina de estados en tu FPGA que pueda acceder a estos dispositivos. Pero esta es tu tarea como diseñador de FPGA. Algunos extraños al azar en internet no van a diseñar tu FPGA por ti.
Para almacenar los datos en el flash inicialmente, tienes dos opciones. La primera sería, si estás fabricando estas placas en volumen, puedes hacer que tu taller de ensamblaje de placas pre-programen los dispositivos flash antes de ensamblarlos en las placas. Normalmente les proporcionas un archivo de datos en algún formato que soliciten, y te cobran una pequeña tarifa adicional por programar los datos antes del ensamblaje.
Segunda opción: Lee la hoja de datos del dispositivo flash. Escribe un diseño de FPGA que te permita enviar datos desde alguna otra interfaz disponible en tu placa (Ethernet, USB, SPI, I2C, lo que sea) y cargarlos en el flash. En el momento de la fabricación, cargas este diseño temporalmente en tu FPGA y programas tu flash; luego almacenas un diseño de FPGA "de tiempo de ejecución" diferente en la PROM de configuración a bordo, que no tiene la capacidad de modificar el FLASH, y tus usuarios no tendrán la capacidad de estropear los datos.