Interfaz de memoria de alta velocidad entre 2 FPGA (Virtex 6)

Tengo una placa con 2 FPGA Virtex 6, que están conectadas entre sí a través de 64 líneas IO paralelas que pueden operar hasta 400 MHz. Una FPGA, llamémosla B, también tiene 2 GB de memoria DDR3 conectada. También necesito acceso de alta velocidad a esta memoria en FPGA A (que no tiene ningún DDR3 conectado). Eventualmente, el plan es almacenar en caché cosas en BRAM en FPGA B y transferirlas a FPGA A.

Entonces, estoy tratando de diseñar una interfaz de alta velocidad entre los dos FPGA para hacer precisamente esto, pero no sé por dónde empezar. Estoy pensando en FIFO para almacenar en búfer la dirección y la solicitud de datos.

¿Conoce alguna interfaz/protocolo que se ajuste a mi aplicación? Si me puede dirigir a cualquier documento, eso también sería genial.

Respuestas (5)

  1. Implementar un controlador DDR en FPGA B.
  2. Conecte el controlador DDR a un controlador de interfaz de memoria compartida.
  3. Conecte el bus de interfaz de memoria compartida A a las partes internas de FPGA B.
  4. Conecte el bus de interfaz de memoria compartida B a los pines FPGA BI/O.

Es posible que deba hacer algunos compromisos, por supuesto: 32 bits para datos, 31 bits para direcciones, 1 línea de control probablemente no funcionará; realmente necesitas más como 70 I/O. Si puede vivir con datos de 16 bits, feliz día.

Como se trata de Xilinx, podría usar Aurora para la interfaz entre los FPGA; tendría que implementar su propio protocolo de acceso a la memoria por encima, pero le permite obtener fácilmente un ancho de banda muy alto entre chips utilizando el SerDes incorporado ( pines GTP). Manejará toda la coincidencia de carriles y la vinculación de canales y le ahorrará el dolor de intentar enrutar (otro) bus paralelo de alta velocidad entre los FPGA.

Parece que OP ya tiene un diseño de placa y solo tiene GPIO disponible, ¿quizás @ dla59 podría aclararlo?
Ahh, me perdí el hecho de "tablero existente"... eso sí que restringe un poco las cosas :)

Capa fisica

¿Son los 64 GPIO todo lo que tiene o tiene alguna otra conexión entre los FPGA? Como indica Martin Thompson, para el ancho de banda sería mejor usar conexiones seriales de alta velocidad si están disponibles.

Suponiendo que su publicación original contiene todos los datos relevantes y solo tiene 64 GPIO, entonces deberá pensar en cómo va a lograr la frecuencia objetivo de 400 MHz indicada. Aunque ese podría ser el valor de la hoja de datos, hay muchas cosas que pueden evitar que alcance esta frecuencia; consulte esta respuesta relacionada: Frecuencia máxima de conmutación de pines GPIO de FPGA moderno y económico

También debe decidir si desea perder potencialmente ciclos al girar el bus (es decir, tener un bus de datos bidireccional) o desperdiciar pines/ancho de banda separando el bus en cada dirección. Claramente, será más simple de implementar si los pines son entradas o salidas dedicadas, por lo que si puede satisfacer sus requisitos de ancho de banda de esta manera, será mucho más rápido de implementar.

Capa de protocolo

Una opción sería emular un dispositivo SRAM o QDR, sin embargo, necesitaría agregar algo para compensar la latencia variable. Espero que la mejor opción sea una interfaz mapeada en memoria simplista, ya sea AXI-4 lite, Avalon o Wishbone, elija. A continuación, puede utilizar componentes estándar para almacenar en búfer solicitudes y respuestas.

Si no puede conectar el FPGA A a su propio banco de memoria, me aventuraría a decir que las líneas GPIO de 400 MHz entre los dos son su mejor opción. Utilizándolos en la configuración básica de SPI o algo así.

Si la placa está enrutada correctamente, podría intentar establecer algún tipo de comunicación PCIe entre los dos, pero eso es muy circunstancial.

Podría aventurarse a intentar hacer USB de alta velocidad entre los dos, pero eso requeriría implementar una pila OTG en ambos.

USB es una idea tonta. Implicaría implementar un protocolo enormemente complejo para una interconexión que solo tendrá dos nodos fijos . Lo mismo es cierto para PCIe.
Pero es una idea.

También puede intentar usar la comunicación linkport entre los dos (es posible que tenga que corregir manualmente el código para esto). Implementé una comunicación de puerto de enlace de 4 bits y la ejecuté a velocidades de 1 Gbps.