FPGA/VHDL-Designanleitung: intermittierende Eingaben

Ich habe einen Algorithmus:

y[n] = x[n] * sum(x[0:31])

x ist im Eingangsstrom, y ist der Ausgangsstrom, beide ein Abtastwert pro Taktzyklus. Eine Bedingung ist, dass die Eingabe nicht zusammenhängend ist, es gibt ein Gültig-Flag, das anzeigt, dass die Eingabe gültig ist. Das gesamte Paket ist in x[0:255] enthalten, und im Allgemeinen erhalten wir nur ein einzelnes, seltenes Paket. Ich versuche herauszufinden, was die richtigen logischen Strukturen sind, um dies nahtlos zu implementieren.

Zuerst dachte ich, ich würde einfach ein Schieberegister am Eingang verwenden und bei gültigem Eingang verschieben. Auf diese Weise kann ich den Eingabefluss "anhalten", bis ich eine Summierung von 32 Proben habe. Das Problem, das ich dabei fand, war, dass ich, nachdem ich die 256 eingegebenen gültigen Flags erhalten hatte, immer noch 32 Samples in meinem Schieberegister steckte und keine zusätzlichen gültigen Flags hereinkamen, um sie herauszuschieben.

Die nächste Idee, die ich hatte, war, einen FIFO zu verwenden. Die FIFO-Lesefreigabeleitung würde durch ein Flag gesteuert, das anzeigt, dass die Summierungsantwort "bereit" ist und dass der Eingabe-FIFO nicht leer ist.

Überdenke ich das? Gibt es dafür eine einfache Lösung?

Ein FIFO scheint für diesen Fall eine gute Lösung zu sein. Aber auch die SR-Lösung ist OK. Sie brauchen das gültige Eingangssignal nicht, um weiter zu kommen, wenn Ihre interne Logik die vergangenen gültigen Signale erkennt und mit den Daten arbeitet.

Antworten (2)

Es scheint, als ob Sie verarbeiten möchten, wenn eine feste Pipeline (32) von Elementen verfügbar ist, also sollte ein Schieberegister gut funktionieren, und das wäre der einfachste Weg, wenn es in Logikzellen implementiert wäre. Aber 32 Wörter können sehr viele Zellen sein, daher möchten Sie diese Speicherung vielleicht stattdessen im Arbeitsspeicher implementieren. In diesem Fall hängt es nur von der Manipulation der In- und Out-Zeiger ab, ob Sie das als FIFO oder Schieberegister bezeichnen. Dies wäre also Teil des Datenpfadschemas.

Wenn Sie zum Steuerungsschema übergehen, haben Sie eine Beschreibung des gewünschten Verhaltens am hinteren Ende, aber nicht viel am vorderen Ende. Daher ignoriere ich das Frontend. Sie möchten mit der Verarbeitung beginnen und ein Wort ausgeben, wenn 32 Wörter vorhanden sind, daher ist es natürlich, einen Zähler zu haben, um die Anzahl der im Datenpfad (FIFO oder Schieberegister) gespeicherten Wörter zu zählen. Wenn der Zähler 32 erreicht, beginnt die Ausgabe und der Zähler wird auf 32 gehalten. Für das Ende bedeutet es also einfach, den Zähler vor dem Stoppen auf Null zurückgehen zu lassen.

Ein ziemlich offensichtlicher Weg, die Elemente zu addieren, besteht darin, sie so zu addieren, wie sie in einem Wort auf einmal vorkommen. Wenn die Zählung 32 erreicht und bei 32 gehalten wird, fügen Sie die neue hinzu, während Sie die alte subtrahieren, die am anderen Ende herausläuft (ich vermute, so soll es funktionieren).

Ein Schieberegister erzwingt die Verriegelung des Ausgangstimings mit dem Eingangstiming. Lücken in den gültigen Eingabedaten führen auch zu Lücken in der Ausgabe, wodurch Daten in der Pipeline mit fester Länge stecken bleiben, wie Sie bemerkt haben. Ein FIFO fungiert als Pipeline mit variabler Länge, die es ermöglicht, das Ausgangstiming vom Eingangstiming zu entkoppeln.

FIFOs werden sehr häufig verwendet, und alle FPGA-Anbieter verfügen über Tools, die es einfach machen, sowohl synchrone als auch asynchrone FIFOs zu konfigurieren, wobei entweder LUT-RAM oder Block-RAM verwendet werden, je nach Größe usw.