Usando BRAM en lugar de SRAM en Virtex-5 FPGA

Estoy trabajando en un proyecto en el que estamos capturando señales de un ADC usando un FPGA Virtex-5 y las muestras se almacenan en una SRAM de 128K x 256 desde donde una PC adquiere las muestras de datos. Creo que el Virtex-5 ofrece una opción para una BRAM y, aunque entiendo que la profundidad no se acerca en nada a la que proporciona la SRAM, me gustaría utilizar la opción BRAM en la Virtex-5 como un búfer para contener la muestras temporalmente hasta que sean adquiridas por la PC. ¿Qué tan difícil sería implementar esto?

Puede usar fácilmente el generador de memoria para crear un búfer de memoria para su diseño, pero tener datos de 256 bits de ancho lo hace bastante lento. la mejor manera es crear un FiFo de 256 bits entre su ADC y la interfaz de su PC, el tamaño puede ser inferior a 128k si diseña bien su interfaz o si necesita capturar un cuadro de 128k de tamaño, debe crearlo en HDL y deja que la herramienta de síntesis lo mapee por ti.

Respuestas (2)

Buenas noticias. Esta es una aplicación muy común para las interfaces ADC. En realidad, es muy fácil configurar el bloque de RAM en los dispositivos Xilinx.

Deberá ejecutar el "Generador de memoria de bloque" Coregen de Xilinx, que generará básicamente un módulo VHDL de caja negra que puede crear instancias en su módulo VHDL de nivel superior. En el coregen, puede personalizar su RAM de bloque para que "se vea" como su SRAM externa existente. La única diferencia será que conectará señales en su módulo de nivel superior al nuevo módulo de caja negra que ha instanciado en lugar de a sus pines externos.

No estoy seguro de que pueda obtener un ancho de datos de 256 (¿realmente quiso decir 8?), pero creo que podría obtener una profundidad de 128K en la mayoría de los dispositivos Virtex-5. La hoja de datos que muestra la tabla de recursos de Virtex-5 (cuánta BRAM está disponible) está disponible aquí .

La hoja de datos que explica Block Memory Generator está aquí . Puede explicar la configuración, etc.

Para iniciar el generador de memoria de bloques en ISE 14, haga clic con el botón derecho en la jerarquía del proyecto y seleccione "nueva fuente". Luego seleccione el tipo de fuente como "IP (Core...") Luego seleccione Block Memory Generator como el tipo de IP como se muestra a continuación.

Generador de memoria de bloque

Una vez que se abra el "Generador de memoria de bloques", seleccione las opciones que desee y luego haga clic en configurar. Agregará el núcleo de la caja negra a su proyecto. Tendrá que instanciarlo en su módulo de nivel superior. Por lo general, puede ver la "plantilla de creación de instancias" haciendo clic en el núcleo en la jerarquía del proyecto y seleccionando "Ver plantilla de creación de instancias HDL" en la ventana de procesos.

La forma en que la configuración actual es la SRAM es de 32M y está estructurada en un formato de 256 x 128k. Cada palabra de 256 longitudes consta de 16 muestras de 16 bits que se envían a la SRAM desde la FPGA después de recibir los datos del ADC. Cuando el usuario quiere adquirir los datos a través de la PC, utiliza un microcontrolador para acceder a la SRAM a través de los registros FPGA. No necesito que la profundidad sea de 128k ya que solo necesitaría usarlo como un búfer, pero creo que el ancho de 256 es necesario.
Veo. No obtendrá 32M en su Virtex FPGA, pero parece que no lo necesita de todos modos. Acabo de mirar la herramienta y parece que puede configurarla para que tome un ancho de 256 bits (al menos en el objetivo Spartan 6 que estoy usando en este momento).
Sí, no necesito los 32 MB. Solo lo suficiente para contener el búfer antes de transferirlo a la PC.

Las RAM de bloque son muy fáciles de obtener para producir a partir de código HDL, sin necesidad de meterse con Coregen.

Las ventajas de hacerlo sin coregen son:

  • Sin herramientas adicionales en el flujo
  • puede usar constantes y genéricos (o sus equivalentes de Verilog) del resto de su diseño para configurar la profundidad y el ancho de la memoria
  • coregen puede agregar varios minutos a una ejecución de compilación cuando ha cambiado algo, mientras que un ajuste rápido a un archivo HDL no cambia el tiempo de compilación en una cantidad notable en mi experiencia. ¡No tengo idea de qué está haciendo Coregen todo ese tiempo!

Consulte el manual de su sintetizador para saber cómo escribir código que inferirá RAM de bloque, y hay algunos ejemplos en las respuestas a esta pregunta.