Hochgeschwindigkeits-Speicherschnittstelle zwischen 2 FPGAs (Virtex 6)

Ich habe ein Board mit 2 Virtex 6 FPGAs, die über 64 parallele IO-Leitungen miteinander verbunden sind, die mit bis zu 400 MHz betrieben werden können. An ein FPGA, nennen wir es B, sind auch 2 GB DDR3-Speicher angeschlossen. Ich brauche auch Hochgeschwindigkeitszugriff auf diesen Speicher auf FPGA A (an das kein DDR3 angeschlossen ist). Letztendlich ist geplant, Sachen im BRAM auf FPGA B zwischenzuspeichern und auf FPGA A zu übertragen.

Ich versuche also, eine Hochgeschwindigkeitsschnittstelle zwischen den beiden FPGAs zu entwerfen, um genau dies zu tun, aber ich weiß nicht, wo ich anfangen soll. Ich denke an FIFOs, um die Adress- und Datenanforderung zu puffern.

Kennen Sie Schnittstellen/Protokolle, die zu meiner Anwendung passen würden? Wenn Sie mich auf irgendwelche Papiere verweisen könnten, wäre das auch großartig.

Antworten (5)

  1. Implementieren Sie einen DDR-Controller auf FPGA B.
  2. Verbinden Sie den DDR-Controller mit einem Shared-Memory-Interface-Controller.
  3. Verbinden Sie den Shared-Memory-Schnittstellenbus A mit den Interna des FPGA B.
  4. Verbinden Sie den Shared-Memory-Schnittstellenbus B mit den FPGA-BI/O-Pins.

Möglicherweise müssen Sie natürlich einige Kompromisse eingehen - 32 Bit für Daten, 31 Bit für Adresse, 1 Steuerleitung wird wahrscheinlich nicht funktionieren; Sie brauchen wirklich mehr wie 70 E / A. Wenn Sie mit 16-Bit-Daten leben können, dann glückliche Tage.

Da es sich um Xilinx handelt, könnten Sie Aurora als Schnittstelle zwischen den FPGAs verwenden - Sie müssten Ihr eigenes Speicherzugriffsprotokoll darüber implementieren, aber es ermöglicht Ihnen, mithilfe des integrierten SerDes ( GTP)-Pins. Es übernimmt die gesamte Spuranpassung und Kanalbindung und erspart Ihnen den Versuch, einen (weiteren) parallelen Hochgeschwindigkeitsbus zwischen den FPGAs zu routen.

Klingt so, als hätte OP bereits ein Board-Design und nur GPIO verfügbar, vielleicht könnte @dla59 das klären?
Ahh, ich hatte die Tatsache "vorhandenes Board" übersehen ... das schränkt die Dinge etwas ein :)

Physikalische Schicht

Sind die 64 GPIOs alles, was Sie haben, oder haben Sie andere Verbindungen zwischen den FPGAs? Wie von Martin Thompson angegeben, sollten Sie für die Bandbreite besser serielle Hochgeschwindigkeitsverbindungen verwenden, sofern verfügbar.

Angenommen, Ihr ursprünglicher Beitrag enthält alle relevanten Daten und Sie haben nur 64 GPIOs, dann müssen Sie darüber nachdenken, wie Sie die angegebene Zielfrequenz von 400 MHz erreichen. Auch wenn dies der Datenblattwert sein könnte, gibt es viele Dinge, die Sie daran hindern können, diese Frequenz zu erreichen - siehe diese verwandte Antwort: Maximale Schaltfrequenz der GPIO-Pins moderner billiger FPGAs

Sie müssen auch entscheiden, ob Sie möglicherweise Zyklen verlieren möchten, indem Sie den Bus umdrehen (dh einen bidirektionalen Datenbus haben) oder Pins / Bandbreite verschwenden möchten, indem Sie den Bus in jede Richtung trennen. Es ist eindeutig einfacher zu implementieren, wenn Pins entweder dedizierte Eingänge oder Ausgänge sind. Wenn Sie also Ihre Bandbreitenanforderungen auf diese Weise erfüllen können, ist die Implementierung viel schneller.

Protokollschicht

Eine Option wäre, ein SRAM- oder QDR-Gerät zu emulieren, aber Sie müssten etwas hinzufügen, um die variable Latenz zu kompensieren. Ich denke, die beste Option wäre eine vereinfachte, speicherabgebildete Schnittstelle - entweder AXI-4 lite, Avalon oder Wishbone, Sie haben die Wahl. Sie können dann Standardkomponenten zum Puffern von Anfragen und Antworten verwenden.

Wenn Sie das FPGA A nicht an seine eigene Speicherbank anschließen können, wage ich zu sagen, dass die 400-MHz-GPIO-Leitungen zwischen den beiden Ihre beste Wahl sind. Verwenden Sie sie in der grundlegenden SPI-Konfiguration oder so.

Wenn die Karte richtig geroutet ist, könnten Sie versuchen, eine Art PCIe-Kommunikation zwischen den beiden durchzuführen, aber das ist sehr umständlich.

Sie könnten versuchen, Hochgeschwindigkeits-USB zwischen den beiden zu machen, aber das würde die Implementierung eines OTG-Stacks auf beiden erfordern.

USB ist eine dumme Idee. Es würde die Implementierung eines enorm komplexen Protokolls für eine Verbindung beinhalten, die immer nur zwei feste Knoten haben wird. Dasselbe gilt für PCIe.
Aber es ist eine Idee.

Sie können auch versuchen, die Linkport-Kommunikation zwischen den beiden zu verwenden (möglicherweise müssen Sie den Code dafür manuell korrigieren). Ich habe eine 4-Bit-Linkport-Kommunikation implementiert und mit einer Geschwindigkeit von 1 Gbit / s ausgeführt.