Wie schreibe ich eine for-generate-Anweisung, um mehrere Instanzen dieser parallelen Sortiernetzwerkschaltung zu generieren?

Ich versuche, ein paralleles Sortiernetzwerk zu implementieren. Ich bin neugierig, wie man eine for-generate-Anweisung schreiben würde, um 128 Instanzen dieser Sortierschaltung zu generieren.

Es soll 256 8-Bit-Zahlen vom kleinsten zum größten ohne eine Uhr sortieren, die nur kombinatorische Logik verwendet.

Dies ist ein Link zu dem Artikel über das Sortiernetzwerk, das ich zu verwenden versuche:

https://www.researchgate.net/publication/261152327_Zero-delay_FPGA-based_odd-even_sorting_network?enrichId=rgreq-27e12d3d7cce338ad2cbbdffa750edb4-XXX&enrichSource=Y292ZXJQYWdlOzI2MTE1MjMyNztBUzoyMzg2MDc5Njk1NTAzNDNAMTQzMzg5OTk4MTg4Nw%3D%3D&el=1_x_3&_esc=publicationCoverPdf

Links zum Schalt- und Sortiernetzwerkdiagramm finden Sie unten.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Sie benötigen die VHDL-Entität für diesen Sortierer (oder einen VHDL-Wrapper dafür, falls er noch nicht in VHDL enthalten ist) und eine klare Vorstellung davon, wie Sie die Verbindungen in und zwischen Sortierern als Funktion der "Loop-Variablen" der Generate-Anweisung beschreiben. Dann sind Sie bereit, weiterzumachen.
Fangen Sie klein an - wie würden Sie es mit 4-Bit-Zahlen und nur zwei davon machen? Erweitern Sie dann auf vier Zahlen. Nehmen Sie, was Sie lernen, und bewegen Sie sich weiter.
In der PoC-Library sind 3 verschiedene parallele Sortieralgorithmen implementiert : zB Odd-Even Merge-Sort . Die Größe des Sortiernetzwerks kann über Generika konfiguriert werden.
Ich hoffe, es ist eine akademische Übung. Sie werden Schwierigkeiten haben, das in einem FPGA hinzubekommen. Ich habe gerade eine kurze Papieranalyse gemacht. Sie benötigen viele Zwischenbusse mit einer Breite von 8 Bit. Die Indizes werden viel einfacher, wenn Sie den oberen/unteren Drahtbus in jeder ungeraden Stufe umbenennen.
Ja, dies dient hauptsächlich nur zu Lernzwecken.

Antworten (1)

Ich mag Herausforderungen und es hat mich ein paar Versuche gekostet, aber ich habe es für W-Bit breite Daten und D-Eingänge zum Laufen gebracht. (D ist eine Zweierpotenz). Ich habe ein bisschen geschummelt, weil ich mit Verilog eher vertraut bin. Dies ist die RTL-Ansicht, die Xilinx mir gegeben hat:

Geben Sie hier die Bildbeschreibung ein

Ich gebe den Code nicht weiter, um zu verhindern, dass diese Website zu einem 'Schaut mal: kostenloser Code!' wird. aber ein paar tipps kann ich geben:

Ich begann mit der Definition von D*(D+1) 8-Bit-Bussen. Dadurch kann ich in meiner Generierung überall denselben Busnamen verwenden.

Verbinden Sie die ersten D-Busse mit Ihren Eingängen, die letzten D-Busse mit Ihren Ausgängen.

In der ungeraden Etappe passieren Sie zwei Busse, was die Busindizes sehr unangenehm macht. Eine einfache Lösung besteht darin, dass ich den Bus oben und unten in jedem ungeraden Zustand umbenenne. Für den oberen Bus ist dies:
assign bus[stage*d+d] = bus[stage*d];
Jetzt haben Sie immer D-Busse pro Stufe und alle Schleifen werden zu regulären For-Schleifen.