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):
- 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
- 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
- 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?
Antworten:
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.
quelle
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.
quelle
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.
quelle
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.N−1
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".
quelle