Wir hatten einen sehr kurzen FPGA / Verilog-Kurs an der Universität (vor 5 Jahren) und haben immer und überall Uhren verwendet.
Ich beginne jetzt wieder mit FPGAs als Hobby, und ich 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 so schnell wie möglich Dinge durchlaufen lassen?
Mir ist klar, dass dies eine Menge Fallstricke mit sich bringt, zum Beispiel zu wissen, wann sich das Signal durch alle Teile der Schaltung ausgebreitet hat und sich der Ausgang stabilisiert hat. Darum geht es nicht. Es geht mir nicht darum, ein Design zu erstellen, das vollständig asynchron ist, sondern nur darum, mein Verständnis der Funktionen zu verbessern.
Für Anfänger scheint es, dass das einzige Konstrukt, für das eine Uhr unbedingt erforderlich ist, eine ist reg
, und ich verstehe, dass bei einem typischen FPGA (z. B. einem Cyclone II) die Flip-Flops auf bestimmte Taktsignale vorverdrahtet sind. Ist das richtig? Gibt es andere implizite Uhren wie diese, und können sie normalerweise vom Design manuell gesteuert werden?
Antworten:
Eine kurze Antwort wäre: ja; eine längere antwort wäre: es ist deine zeit nicht wert.
Ein FPGA selbst kann ein völlig asynchrones Design problemlos ausführen. Das Ergebnis ist das Problem, da das Timing über einen FPGA nicht sehr vorhersehbar ist. Das größere Problem ist die Tatsache, dass Ihr Timing und das daraus resultierende Design zwischen verschiedenen Orts- und Routensitzungen fast eindeutig variieren. Sie können Einschränkungen für einzelne asynchrone Pfade festlegen, um sicherzustellen, dass diese nicht zu lange dauern. Ich bin mir jedoch nicht 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, um sicherzustellen, dass es immer noch funktioniert. Auf der anderen Seite, wenn das Design synchron ist, suchen Sie einfach nach einem Bestehen oder Nichtbestehen am Ende des Orts und der Route (vorausgesetzt, Ihre Einschränkungen sind richtig eingerichtet, was überhaupt nicht lange dauert).
In der Praxis wird ein vollständig synchrones Design angestrebt. Wenn Sie jedoch ein Signal einfach puffern oder invertieren müssen, müssen Sie kein Flip-Flop durchlaufen, solange Sie es ordnungsgemäß einschränken.
Hoffe das klärt es ein bisschen auf.
quelle
"Kann man ein komplexes Bündel von Logik aufbauen und so schnell wie möglich Dinge durchlaufen 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 Entwurfstechniken ablehnen, obwohl sie theoretisch einige Vorteile gegenüber synchronen Entwurfstechniken haben, nur weil (wie andere hier gesagt haben) asynchrone Entwürfe von den verfügbaren Werkzeugen nicht so gut unterstützt werden.
Für mich ist das so, als würde man empfehlen, alle Brücken aus Holz zu bauen, da mehr Menschen über Holzbearbeitungswerkzeuge als über Stahlbearbeitungswerkzeuge verfügen.
Glücklicherweise können einige der Vorteile des asynchronen Entwurfs erzielt werden, während weiterhin hauptsächlich synchrone Entwurfstechniken verwendet werden, indem ein globaler asynchroner lokaler synchroner Entwurf (GALS) verwendet wird.
quelle
Ein noch nicht genannter Faktor ist die Metastabilität. Wenn eine Verriegelungsschaltung mit 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 "Hoch" oder "Niedrig" ist. Betrachten wir zum Beispiel ein flankengetriggertes Flip-Flop, das gerade ein "low" ausgibt und dessen Eingang sich fast gleichzeitig mit dem Eintreffen einer Taktflanke von low auf high ändert. Wenn die Taktflanke lange genug vor dem Eingangswechsel auftritt, bleibt der Ausgang einfach bis zur nächsten Taktflanke niedrig. Wenn die Taktflanke lange genug nach dem Eingangswechsel auftritt, schaltet der Ausgang schnell von niedrig auf hoch 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 für eine Weile niedrig bleiben und dann umschalten oder umschalten und dann einige Zeit später umschalten oder ein paar Mal hin und her schalten usw.
Wenn eine Konstruktion vollständig synchron ist und alle Eingänge doppelt synchronisiert sind, ist es sehr unwahrscheinlich, dass ein Zeitsteuerungsimpuls den ersten Latch eines Synchronisierers so trifft, dass er zum perfekten Zeitpunkt umschaltet und den zweiten verwirrt verriegeln. Im Allgemeinen ist es sicher, solche Dinge als "einfach nicht passieren" zu betrachten. Bei einem asynchronen Entwurf ist es jedoch oft viel schwieriger, über solche Dinge nachzudenken. Wenn eine Zeitbeschränkung für eine Latch-Schaltung (nicht nur Flip-Flops, sondern eine beliebige Kombination von Logik, die als Latch fungieren würde) verletzt wird, kann nicht gesagt werden, was der Ausgang tun wird, bis das nächste Mal eine gültige Eingangsbedingung vorliegt, die den Latch erzwingt zu einem bekannten Zustand. Es ist durchaus möglich, dass verzögerte Ausgänge dazu führen, dass die zeitlichen Einschränkungen der nachgeschalteten Eingänge verletzt werden, was zu unerwarteten Situationen führt.
Der sicherste Weg, eine asynchrone Schaltung zu modellieren, besteht darin, dass fast jede Ausgangsschaltung für eine kurze Zeit einen "X" -Ausgang erzeugt, wenn sie zwischen "0" und "1" wechselt. Leider führt dieser Ansatz häufig dazu, dass fast alle Knoten "X" anzeigen, selbst in Fällen, die in der Realität mit ziemlicher Sicherheit zu einem stabilen Verhalten geführt hätten. Wenn ein System funktionieren kann, wenn simuliert wird, dass alle Ausgänge unmittelbar nach einer Eingangsänderung zu "X" werden und "X" bleiben, bis die Eingänge stabil sind, ist dies ein gutes Zeichen dafür, dass die Schaltung funktioniert, aber asynchrone Schaltungen unter solchen Einschränkungen funktionieren ist oft schwierig.
quelle
Natürlich ist es kein Problem, wenn Ihre Konstruktionsanforderungen langsam genug sind, dass viele interne Verzögerungen noch um Größenordnungen länger sind als die von Ihnen gewünschten Zeiten, und Sie können sich den Zeitplanbericht ansehen, um dies im Auge zu behalten, aber Es gibt eine Grenze dessen, was Sie ohne interne Statusinformationen sinnvoll tun können. Wenn Sie nur so etwas wie einen 100-Eingangs-Multiplexer machen möchten, denken Sie daran, dass jeder Eingang eine andere Laufzeitverzögerung hat. Tatsächlich kann es sein, dass Sie interessante und chaotische Effekte mit einer großen Anzahl von unvorhersehbaren, verzögerungsschwingenden Rückkopplungsschleifen erhalten - möglicherweise ist ein vollständig asynchroner FPGA-basierter Synthesizer das nächste "Analogon".
quelle
Ja, du kannst. Sie können die Flipflops vollständig ignorieren und alles aus LUTs zusammensetzen. Und / oder Sie können die Statuselemente der meisten Xilinx-FPGAs als (pegelgetriggerte) Latches anstelle von (flankengetriggerten) Flipflops verwenden.
quelle
X=(someComplexFormula)
undY=X & D
der Compiler diese Formel durch X ersetzt und feststellt, dass diesX & D
äquivalent istA & D
, ersetzt der Compiler möglicherweise Y durch A und D und nicht durch X, wodurch die Berechnung von Y möglich wird Solche Substitutionen sind mit kombinatorischer Logik gültig, verursachen jedoch Chaos in der asynchronen sequentiellen Logik.Wie @Andrey betonte, ist es Ihre Zeit nicht wert. Insbesondere die Tools tun dies nicht, so dass Sie vollständig auf sich alleine gestellt wären. Außerdem würden Sie nichts sparen, wenn Sie sie nicht verwenden, da sie integrierte Register haben.
quelle
Wirklich gibt es drei Arten von Designs.
Im Allgemeinen gehen die Tools bei der Synthetisierung / Optimierung der kombinatorischen Logik davon aus, dass nur das Endergebnis und die maximale Zeit für die Festlegung dieses Ergebnisses von Bedeutung sind.
Sie können ein Design erstellen, das rein kombinatorisch ist und das richtige Ergebnis liefert. Die Ausgänge können sich in beliebiger Reihenfolge und mehrmals ändern, bevor sie ihre endgültigen Werte erreichen. Solche Entwürfe verschwenden sehr viel Logikressourcen. Die meisten Logikelemente sitzen die meiste Zeit im Leerlauf, während Sie diese Elemente in einem sequentiellen System hätten wiederverwenden können, um mehrere Datenelemente zu verarbeiten.
In einem sequentiellen synchronen System kommt es nur darauf an, dass sich die Ausgänge des kombinatorischen Blocks auf ihren korrekten Zustand eingestellt haben, wenn sie in das nächste Flip-Flop getaktet werden. Es ist egal, in welcher Reihenfolge sie sich ändern oder ob es sich dabei um Pannen handelt. Wiederum können die Werkzeuge dies leicht in Logik umwandeln, vorausgesetzt, die Uhr ist langsam genug, gibt die richtige Antwort (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 von Bedeutung sein, die Reihenfolge der Ausgabeänderungen kann von Bedeutung sein. Sowohl die Tools als auch die FPGAs selbst wurden für synchrone Designs entwickelt. Es wurde viel darüber diskutiert (google asynchrone FPGA-Entwicklung, wenn Sie mehr wissen möchten), ob asynchrone Systeme entweder auf Standard-FPGAs oder auf speziell entwickelten Systemen implementiert werden können
quelle
Ja. Wenn Sie keine Prozesstypkonstrukte haben, sollten Sie keine Register ableiten. Es wird Dinge wie Onboard-Speicher geben, die Uhren erfordern, obwohl Sie diese wahrscheinlich asynchron generieren könnten, wenn Sie dies wirklich möchten.
quelle
FWIW Ich dachte, ich sollte hinzufügen, dass ein naheliegendes Ziel bei asynchronen Logiklösungen die globale Reduzierung des Stromverbrauchs sein würde.
Diese globalen Clock- / PLL- / Puffer verbrennen viele Joule.
Während sich FPGA-Lösungen in batteriebetriebene Arenen (z. B. Lattice Icestick) schlängeln, wird dieser Aspekt viel mehr Beachtung finden.
quelle