FPGA: hoch oder runter zählen?

10

Ich lerne, ein FPGA zu verwenden (Papilio Development Board, das ein xilinx spartan3e hat, mit vhdl).

Ich muss einen eingehenden Impuls durch eine (fest codierte) Zahl teilen.

Ich kann 3 Optionen sehen - ungefähr als Pseudocode (am Beispiel von 10 Zählungen):

  1. Initialisierung auf 0, bei Erhöhung der Eingangsanstiegsflanke um 1, vergleiche mit 10; Wenn sie gleich sind, setzen Sie sie auf 0 zurück und lösen Sie den Ausgangsimpuls aus
  2. Initialisieren Sie auf 10, wenn die Eingangsflanke um 1 abnimmt, vergleichen Sie sie mit 0; Wenn sie gleich sind, setzen Sie sie auf 10 zurück und lösen Sie den Ausgangsimpuls aus
  3. Initialisieren Sie auf 9, aber stellen Sie sicher, dass mindestens 1 führendes "0" -Bit vorhanden ist, das mein Ausgangsbit ist. Bei steigender Eingangsflanke um 1 verringern. Bei steigender Flanke des Ausgangsbits zurücksetzen.

Das Tastverhältnis ist unwichtig.

Ist einer davon besser als die anderen? Gibt es eine noch bessere Methode, an die ich nicht gedacht habe?

Gibt es eine "Standard" -Methode, die dem Compiler die besten Optimierungsmöglichkeiten bietet?

AMADANON Inc.
quelle
3
Das sind nur drei Möglichkeiten :-) ... Aber im Ernst, in einem FPGA ist das wirklich nicht so wichtig. Die einzelnen Logikelemente sind so allgemein, dass sie ungefähr die gleiche Anzahl von Ressourcen beanspruchen und Ihnen die gleiche Leistung bieten, egal wie Sie es tun. Die Entscheidung hängt davon ab, ob es an anderer Stelle im Entwurf nützlich ist, die Zahlen nach oben oder unten zählen zu lassen oder ein anderes Muster.
Dave Tweed
2
4. Option: 10-Bit-Kreisschieberegister mit "1000000000" geladen und bei steigender Flanke verschoben. Verwenden Sie ein Bit des Schieberegisters als Freigabe für das, was Sie tun.
Lincoln
1
Als Randnotiz: Ihr Compiler / Fitter-GUI-Tool sollte nach Abschluss des Auftrags eine Option haben, die Ihnen die tatsächliche Schaltung anzeigt, die auf verschiedenen Abstraktionsebenen erstellt wurde, bis hin zu Gates, damit Sie sehen können, wie das Tool zu Ihrer Schaltung passt und Dann können Sie entsprechende Änderungen an der Quelle vornehmen.
Anonym

Antworten:

12

Die Optimierung auf dieses Niveau wird Ihnen das Herz brechen. Das Ergebnis kann sich aufgrund der Technologie des von Ihnen verwendeten FPGA, anderer Faktoren im FPGA, aber auch aufgrund von Faktoren, die außerhalb Ihrer Kontrolle liegen, einschließlich des Zufallszahlen-Startwerts des Monteurs, ändern.

Trotzdem glaube ich, dass Option 3 die beste sein wird. Die Optionen 1 und 2 verfügen über ein Komparator- / ODER-Gatter zwischen den Zählern, damit signalisiert werden kann, dass die Zielnummer erreicht wurde. Option 2 ist möglicherweise etwas schneller als 1, da alles ohne Wechselrichter direkt ODER-verknüpft werden kann. Auch hier treten jedoch kleine technologische Unterschiede auf, bei denen AND und XOR möglicherweise schneller sind.

Option 3 überspringt den Vergleich für die geringen Kosten eines zusätzlichen Bits im Zähler. Dies sollte sich lohnen, es sei denn, Sie sind in Flip-Flops stark eingeschränkt.

Eine lustige Tatsache bei Zählern ist, dass sie dazu neigen, innerhalb eines Logikblocks in einer gerätespezifischen Größe gruppiert zu werden, und Sie werden sehen, dass sich das Timing mehr als erwartet ändert, wenn dieses zusätzliche Bit Sie aus dieser Gruppe herausdrückt.

pscheidler
quelle
+1, abgesehen von Taktraten, die die Grenzen der Technologie überschreiten, sollte der Timing-Bericht die Timing-Optimierungen leiten. Das Verfolgen von Hunderten von Pikosekunden auf einem Spartan 3e oder einem FPGA ohne Grund ist im Allgemeinen Zeitverschwendung.
Jalalipop
4

Eine andere Möglichkeit wäre, den Zähler auf 6 (= 2 4 - 10) zu initialisieren , hochzuzählen und dann zurückzusetzen, wenn der Übertragsausgang aktiviert wird (dh die FFs sind alle eins).

Dies hat den Vorteil, dass kein zusätzliches FF erforderlich ist und viele FGPAs eine spezielle Hilfslogik haben, um diese Art von Übertragsoperation in einer Zähler- oder Addiererschaltung zu beschleunigen.

Dave Tweed
quelle
3

Hängt davon ab. Beispiel: Die Flip-Flop-Ausbreitungsverzögerung für 0 → 1 und 1 → 0 kann unterschiedlich sein, und daher können die Übergangsverzögerungen eines Zählers für 000 → 001 und 001 → 000 geringfügig unterschiedlich sein. Je nach der im FPGA verwendeten cmos-Technologie kann sie höher oder niedriger sein. Sie müssen also synthetisieren und herausfinden, welches eine bessere Timing-Leistung hat.

Mitu Raj
quelle
3

Aus Sicht eines Compiler-Writers: Wenn Sie verwenden integer, ist die interne Darstellung undefiniert, und der Compiler kann die effizienteste Implementierung auswählen.

Wenn Sie eine bestimmte interne Darstellung erzwingen, versucht das Optimierungsprogramm weiterhin, sie zu verbessern, beginnt jedoch an einem etwas schlechteren Standpunkt.

Einige FPGAs verfügen über "Preload" -Funktionen, bei denen Register auf beliebige Werte initialisiert werden können. In diesem Fall ist das Initialisieren auf , das Herunterzählen und Verwenden des obersten Übertragsbits als Ausgabe und Zurücksetzen (im nächsten Zyklus) effizienter als das Implementieren beider Register ein Addierer und ein Komparator. Ohne Vorspannung könnte ein Addierer besser sein.N1

Sofern Sie die interne Struktur nicht kennen, sind die Ressourcen einer anderen Logik zugeordnet (viele FPGAs verfügen über eine dedizierte Gleitkomma-Multiplikations-Additionslogik, mit der Sie auch einen Zähler implementieren können, wenn Sie übrig gebliebene Einheiten haben) und sind sich völlig sicher, dass Sie nicht wechseln werden Auf ein anderes Modell lautet die Antwort "Denk nicht darüber nach".

Simon Richter
quelle