Wir hatten einen sehr kurzen FPGA/Verilog-Kurs an der Universität (vor 5 Jahren) und wir haben immer und überall Uhren verwendet.
Ich fange jetzt wieder als Hobby mit FPGAs an und kann nicht anders, als mich über diese Uhren zu wundern. Sind sie unbedingt erforderlich oder kann ein FPGA-basiertes Design vollständig asynchron sein? Kann man ein komplexes Bündel von Logik aufbauen und Sachen so schnell wie möglich durchlaufen lassen?
Mir ist klar, dass es dabei viele Fallstricke gibt, wie zum Beispiel zu wissen, wann sich das Signal durch alle Teile der Schaltung ausgebreitet hat und sich der Ausgang stabilisiert hat. Das ist nebensächlich. Es ist nicht so, dass ich tatsächlich ein Design erstellen möchte, das vollständig asynchron ist, sondern nur, um mein Verständnis der Fähigkeiten zu verbessern.
Für mein Anfängerauge scheint es, dass das einzige Konstrukt, das unbedingt eine Uhr benötigt, eine ist reg
, und ich verstehe, dass ein typisches FPGA (z. B. ein Cyclone II) seine Flip-Flops mit bestimmten Taktsignalen vorverdrahtet hat. Ist das richtig? Gibt es andere implizite Uhren wie diese und können sie normalerweise manuell durch das Design gesteuert werden?
Eine kurze Antwort wäre: ja; Eine längere Antwort wäre: Es ist Ihre Zeit nicht wert.
Ein FPGA selbst kann problemlos ein vollständig asynchrones Design ausführen. Das Ergebnis, das Sie erhalten, ist das Problem, da das Timing durch jedes FPGA nicht sehr vorhersehbar ist. Das größere Problem ist die Tatsache, dass Ihr Timing und das resultierende Design mit ziemlicher Sicherheit zwischen verschiedenen Orten und Routen variieren werden. Sie können Einschränkungen für einzelne asynchrone Pfade festlegen, um sicherzustellen, dass sie nicht zu lange dauern, aber ich bin mir nicht ganz sicher, ob Sie eine Mindestverzögerung angeben können.
Am Ende bedeutet dies, dass Ihr Design unvorhersehbar und möglicherweise sogar bei einer geringfügigen Designänderung vollständig variabel ist. Sie müssten jedes Mal, wenn Sie etwas ändern, den gesamten Timing-Bericht durchsehen, nur um sicherzustellen, dass es noch funktioniert. Auf der anderen Seite, wenn das Design synchron ist, suchen Sie am Ende von Place und Route einfach nach einem Pass oder Fail (vorausgesetzt, Ihre Einschränkungen sind richtig eingerichtet, was überhaupt nicht lange dauert).
In der Praxis streben die Leute nach vollständig synchronen Designs, aber wenn Sie ein Signal einfach puffern oder invertieren müssen, müssen Sie kein Flip-Flop durchlaufen, solange Sie es richtig einschränken.
Hoffe das klärt es ein wenig auf.
„Kann man ein komplexes Bündel von Logik aufbauen und so schnell wie möglich Daten durchfließen lassen?“ Ja. Es wurden ganze CPUs gebaut, die vollständig asynchron sind – mindestens eine davon war die schnellste CPU der Welt. http://en.wikipedia.org/wiki/Asynchronous_circuit#Asynchronous_CPU
Es ärgert mich, dass Leute asynchrone Designtechniken ablehnen, obwohl sie theoretisch mehrere Vorteile gegenüber synchronen Designtechniken haben, nur weil (wie andere hier gesagt haben) asynchrone Designs nicht so gut von den verfügbaren Tools unterstützt werden.
Für mich ist das so, als würde ich empfehlen, alle Brücken aus Holz zu bauen, weil mehr Leute Holzbearbeitungswerkzeuge als Stahlbearbeitungswerkzeuge haben.
Glücklicherweise können einige der Vorteile des asynchronen Entwurfs erzielt werden, während immer noch hauptsächlich synchrone Entwurfstechniken verwendet werden, indem ein globaler asynchroner lokaler synchroner (GALS) Entwurf verwendet wird.
Ein noch nicht erwähnter Faktor ist die Metastabilität. Wenn eine Latch-Schaltung von einer Folge von Eingaben/Übergängen getroffen wird, so dass der resultierende Zustand von Ausbreitungsverzögerungen oder anderen unvorhersehbaren Faktoren abhängen würde, gibt es keine Garantie dafür, dass der resultierende Zustand ein sauberes "High" oder "Low" sein wird. Betrachten Sie beispielsweise ein flankengetriggertes Flip-Flop, das derzeit ein "Low" ausgibt und dessen Eingang fast gleichzeitig mit dem Eintreffen einer Taktflanke von Low auf High wechselt. Wenn die Taktflanke lange genug vor der Eingangsänderung auftritt, bleibt der Ausgang einfach bis zur nächsten Taktflanke niedrig. Wenn die Taktflanke lange genug nach dem Eingangswechsel erfolgt, schaltet der Ausgang schnell einmal von Low auf High und bleibt dort bis zur nächsten Taktflanke. Wenn keine dieser Bedingungen zutrifft,. Es kann niedrig bleiben oder schnell einmal umschalten und hoch bleiben, aber es kann eine Weile niedrig bleiben und dann umschalten oder umschalten und dann einige Zeit später zurückschalten oder ein paar Mal hin und her wechseln usw.
Wenn ein Design vollständig synchron ist und alle Eingänge doppelt synchronisiert sind, ist es sehr unwahrscheinlich, dass ein Zeitimpuls den ersten Latch eines Synchronisierers so trifft, dass er zum perfekten Zeitpunkt schaltet, um den zweiten zu verwirren verriegeln. Im Allgemeinen ist es sicher, solche Dinge als "einfach nicht passieren" zu betrachten. In einem asynchronen Design ist es jedoch oft viel schwieriger, über solche Dinge nachzudenken. Wenn eine Timing-Beschränkung für eine Latch-Schaltung (nicht nur Flip-Flops, sondern jede Kombination von Logik, die als Latch fungieren würde) verletzt wird, ist nicht abzusehen, was der Ausgang tun wird, bis das nächste Mal eine gültige Eingangsbedingung vorliegt, die den Latch erzwingt in einen bekannten Zustand. Es ist durchaus möglich, dass verzögerte Ausgänge dazu führen, dass die Zeitbeschränkungen von nachgeschalteten Eingängen verletzt werden, was zu unerwarteten Situationen führt.
Der sicherste Weg, eine asynchrone Schaltung zu modellieren, wäre, fast jede Ausgangsschaltung für eine kurze Zeit einen "X" -Ausgang erzeugen zu lassen, wenn sie zwischen "0" und "1" wechselt. Leider führt dieser Ansatz oft dazu, dass fast alle Knoten "X" anzeigen, selbst in Fällen, die in Wirklichkeit mit ziemlicher Sicherheit zu einem stabilen Verhalten geführt hätten. Wenn ein System funktionieren kann, wenn simuliert wird, dass alle Ausgänge sofort nach einer Eingabeänderung zu "X" werden und "X" bleiben, bis die Eingänge stabil sind, ist das ein gutes Zeichen dafür, dass die Schaltung funktioniert, aber asynchrone Schaltungen dazu bringt, unter solchen Einschränkungen zu arbeiten ist oft schwierig.
Wirklich gibt es DREI Arten von Designs.
Im Allgemeinen gehen die Tools beim Synthetisieren/Optimieren der kombinatorischen Logik davon aus, dass alles, was zählt, das Endergebnis und die maximale Zeit ist, die benötigt wird, um sich auf dieses Ergebnis festzulegen.
Sie können ein rein kombinatorisches Design erstellen, das zum richtigen Ergebnis führt. Die Ausgänge können sich in beliebiger Reihenfolge ändern und können sich mehrmals ändern, bevor sie ihre endgültigen Werte erreichen. Solche Konstruktionen verschwenden sehr viel Logikressourcen. Die meisten Logikelemente verbringen die meiste Zeit im Leerlauf, während Sie in einem sequentiellen System diese Elemente zur Verarbeitung mehrerer Datenelemente hätten wiederverwenden können.
In einem sequentiellen synchronen System kommt es nur darauf an, dass die Ausgänge des kombinatorischen Blocks ihren korrekten Zustand erreicht haben, wenn sie in das nächste Flip-Flop getaktet werden. Es spielt keine Rolle, in welcher Reihenfolge sie sich ändern oder ob es sich um Störungen auf dem Weg handelt. Auch hier können die Tools dies leicht in Logik umwandeln, die die richtige Antwort liefert, vorausgesetzt, die Uhr ist langsam genug (und sie können Ihnen sagen, ob die Uhr, die Sie verwenden möchten, langsam genug ist).
In einem asynchronen sequentiellen System gehen diese Annahmen aus dem Fenster. Störungen können eine Rolle spielen, die Reihenfolge der Ausgabeänderungen kann eine Rolle spielen. Sowohl die Tools als auch die FPGAs selbst wurden für synchrone Designs entwickelt. Es wurde viel über die Möglichkeit diskutiert (google asynchrones FPGA-Design, wenn Sie mehr wissen möchten) über die Möglichkeit, asynchrone Systeme entweder auf Standard-FPGAs oder auf speziell entworfenen zu implementieren, aber es liegt immer noch außerhalb der allgemein akzeptierten Designpraxis
Wenn Ihre Designanforderungen langsam genug sind, dass viele interne Verzögerungen immer noch um Größenordnungen länger sind als die Zeiten, die Ihnen wichtig sind, ist dies natürlich kein Problem, und Sie können den Timing-Bericht anzeigen, um dies im Auge zu behalten, aber Es gibt eine Grenze für das, was Sie ohne interne Statusinformationen sinnvoll tun können. Wenn Sie nur so etwas wie einen Multiplexer mit 100 Eingängen erstellen möchten, denken Sie daran, dass jeder Eingang eine andere Laufzeitverzögerung hat. Tatsächlich können Sie einige interessante und chaotische Effekte mit einer großen Anzahl von oszillierenden Rückkopplungsschleifen mit unvorhersehbarer Verzögerung erhalten - vielleicht könnte ein vollständig asynchroner FPGA-basierter Synthesizer der nächste "Analog" sein.
Ja, du kannst. Sie können die Flipflops vollständig ignorieren und alles aus LUTs bauen. Und/oder Sie können die Zustandselemente der meisten Xilinx-FPGAs als (pegelgetriggerte) Latches anstelle von (flankengetriggerten) Flipflops verwenden.
X=(someComplexFormula)
und Y=X & D
der Compiler diese Formel für X ersetzt und feststellt, dass X & D
dies äquivalent zu A & D
ist, ersetzt der Compiler möglicherweise compute Y in Bezug auf A und D und nicht in Bezug auf X, wodurch die Berechnung von Y ermöglicht wird um schneller fortzufahren als die von X. Solche Substitutionen sind mit der kombinatorischen Logik gültig, richten aber in der asynchronen sequentiellen Logik Chaos an.lpm_ff
ein Flipflop vom Typ d oder t mit synchroner Last implementiert werden kann. Durch die Verwendung dieses Moduls kann ich sicher sein, dass diese Funktionen genau auf die Low-Level-Funktionen des Geräts abgebildet werden, ohne dass sie möglicherweise wegoptimiert werden.Wie @Andrey betonte, ist es Ihre Zeit nicht wert. Insbesondere die Tools tun dies nicht, sodass Sie völlig auf sich allein gestellt wären. Da sie außerdem eingebaute Register haben, würden Sie nichts sparen, wenn Sie sie nicht verwenden.
Ja. Wenn Sie keine Prozesstypkonstrukte haben, sollte es keine Dinge wie das Ableiten von Registern tun. Es wird Dinge wie Onboard-Speicher geben, die Takte benötigen, obwohl Sie diese, wenn Sie wirklich wollen, wahrscheinlich asynchron generieren könnten.
FWIW Ich dachte, ich sollte hinzufügen, dass ein offensichtliches Ziel bei asynchronen Logiklösungen die globale Reduzierung des Stromverbrauchs sein würde.
Diese globalen Uhren/PLL/Puffer verbrauchen jede Menge Joule.
Da FPGA-Lösungen in batteriebetriebene Bereiche vordringen (z. B. Lattice Icestick), wird dieser Aspekt viel mehr Aufmerksamkeit erregen.
pjc50