Kann ein FPGA-Design größtenteils (oder vollständig) asynchron sein?

39

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?

Roman Starkov
quelle
3
Ich weiß, dass Simon Moore von der Universität Cambridge viel über asynchrones Design geforscht hat, einschließlich der Herstellung eines Testchips. Es erfordert eine völlig neue Reihe von Entwurfswerkzeugen und hat merkwürdige Nebenwirkungen: Die Ausführungsgeschwindigkeit ist beispielsweise umgekehrt proportional zur Temperatur.
pjc50

Antworten:

27

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.

Andrej
quelle
3
Ich musste einige Geräte mit asynchronen FPGA-Designs verwenden. Es war schwer mit ihnen zu arbeiten. Bitte verwenden Sie mindestens Zeitbeschränkungen
Tim Williscroft
1
Es ist zwar möglich, asynchrone Designs mit einem FPGA zu implementieren, die meisten FPGAs unterstützen jedoch speziell synchrone Designs. Sie haben viele Ressourcen (PLLs, Taktverteilungsschaltungen und eine große Menge von Flip-Flops), die bei einem asynchronen Entwurf verschwendet werden.
Dmitry Grigoryev
2
Diese Antwort gibt keinen besonders guten Rat. Sie können ein taktloses FPGA erstellen und es vereinfacht tatsächlich Ort und Route, beseitigt eine Menge Probleme hinsichtlich der Timing-Anforderungen und kann aufgrund von feinkörnigem Pipelining einen messbar höheren Durchsatz aufweisen. Das eigentliche Problem tritt auf, wenn Sie versuchen, eine getaktete Schaltung einem taktlosen FPGA zuzuordnen, da diese sehr unterschiedliche Timing-Eigenschaften aufweisen. Es kann getan werden, es erfordert nur etwas mehr Front-End-Verarbeitung, um die Konvertierung durchzuführen. vlsi.cornell.edu/~rajit/ps/rc_overview.pdf
Ned Bingham
20

"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.

Davidcary
quelle
Genauso sehe ich die moderne Tendenz, Leiterplatten auf einem quadratischen Raster zu verlegen , auch wenn die Vorteile der Migration viel weniger bedeutend sind.
Roman Starkov
@romkyns - Das liegt eher an der Tatsache, dass das Schreiben von PCB-Software, die nicht geradlinige Gitter verwendet, schwierig ist .
Connor Wolf
1
@supercat: Ich vermute, Sie spielen auf die Vier-Phasen-Logik an . Es ist eines der mehrphasigen Taktsignale , die vergessen zu sein scheinen.
Davidcary
1
@davidcary: Sortiert nach, außer dass beide "Phasen" auf einem Draht liegen - eine Phase wird von der ansteigenden Flanke und eine von der abfallenden Flanke gesteuert. Grundsätzlich würde ich Latch-Uhren in vier Kategorien einteilen: sauberes Steigen, sauberes Fallen, spätes Steigen, spätes Fallen. Latches, die mit (L / CB) einer sauberen ansteigenden oder abfallenden Flanke getaktet werden, können Daten von jeder ansteigenden oder abfallenden Flanke aufnehmen. L / CB Eine späte Anstiegsflanke kann Daten von einer sauberen Anstiegsflanke oder einer fallenden Flanke von L / CB aufnehmen. L / CB durch späte abfallende Flanke kann Daten von einem sauberen Abfallen oder einem Anstieg von L / CB erfassen.
Superkatze
1
@davidcary: Vorausgesetzt, dass die schnellste Laufzeit eines Signalspeichers die längste Haltezeit überschreitet, und vorausgesetzt, dass der längste Signalpfad von einer Taktflanke über eine Taktgatterlogik und durch diese Flanke ausgelöste "späte" Signalspeicher zu einem durch den Signalspeicher ausgelösten Signalspeicher führt Wenn die folgende Flanke die Mindestzeit zwischen den Taktflanken nicht überschreitet, sollte ein solches Design meiner Meinung nach absolut zuverlässig und frei von intern generierter Metastabilität sein, wenn eine Kombination von Ausbreitungsverzögerungen vorliegt.
Supercat
5

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.

Superkatze
quelle
4

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".

mikeselectricstuff
quelle
4

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.

Martin Thompson
quelle
3
Eine Gefahr dabei ist, dass, wenn man den Logik-Compiler nicht einschränkt, es Logik erzeugen kann, die negativ ist für einige Gatter Laufzeit . Wenn man zum Beispiel und angibt X=(someComplexFormula)und Y=X & Dder Compiler diese Formel durch X ersetzt und feststellt, dass dies X & Däquivalent ist A & 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.
Superkatze
@supercat - Ich habe noch nie mit Xilinx-Tools gearbeitet, aber wenn ich mit Altera-FPGAs gearbeitet habe, hatten Sie immer die Möglichkeit, kritische Pfade als verbundene Gate-Module anstatt in RTL anzugeben behindert.
Jules
@Jules: Alle meine Designs für programmierbare Logik haben Abel verwendet, eine etwas doofe Sprache, die es jedoch ermöglicht, Dinge auf eine Art und Weise zu spezifizieren, die einige CPLDs implementieren können, die jedoch für ein VHDL- oder Verilog-Synthesewerkzeug Schwierigkeiten bereiten können. In einem meiner Projekte habe ich beispielsweise die Tatsache ausgenutzt, dass Xilinx-Teile über Clock, Async-Set und Async-Reset verfügen, um ein asynchron ladbares Schieberegister zu implementieren. Wenn ich solche Aufgaben in einem FPGA ausführen muss, ohne Verilog oder VHDL verwendet zu haben, wie soll ich dann lernen, was dazu erforderlich ist? Übrigens, wenn Speicher dient, habe ich T-Flops für den Shifter verwendet, und ...
Supercat
... das Timing war so, dass das asynchrone Schreiben nur zu Zeiten auftreten konnte, zu denen der T-Eingang niedrig war, vorausgesetzt, dass das asynchrone Schreiben, wenn ein NOP-Takt nahe dem Start eines Schreibimpulses auftrat, sich weit genug darüber hinaus erstrecken würde um einen stabilen Wert sicherzustellen, und wenn der NOP-Takt gegen Ende auftritt, würde er einfach einen noch stabilen Wert speichern. Ich bin mir nicht sicher, wie man solche Fälle in VHDL oder Verilog effizient handhaben kann.
Supercat
@supercat - unter Berücksichtigung eines ähnlichen Problems im Cyclone IV-Gerätehandbuch stelle ich fest, dass die Verwendung der Option "LAB-weites synchrones Laden" (ein "LAB" ist eine Gruppe von 16 Logikelementen) die beste Lösung für dasselbe Problem darstellt Wenn also die Größe eines solchen Registers nicht ein Vielfaches von 16 Bits ergibt, werden einige Bits verschwendet, aber dies scheint die nützlichste Option zu sein. Ich habe jetzt zwei Möglichkeiten: Ich kann einen funktionalen Verilog schreiben, für den das Synthese-Tool einen Weg zur Implementierung des erforderlichen Registers auswählen muss (was normalerweise die beste Option ist), oder, wenn ich ein genaues Timing habe ...
Jules,
3

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.

Brian Carlton
quelle
3

Wirklich gibt es drei Arten von Designs.

  1. Kombinatorisch. Es gibt keine Uhren und keine Rückkopplungspfade und das System hat keinen "Speicher". Wenn sich einer oder mehrere Eingänge ändern, kräuseln sich die Änderungen durch die Logik. Nach einiger Zeit wird der Ausgang in einen neuen Zustand versetzt, in dem er verbleibt, bis sich die Eingänge erneut ändern.
  2. Synchron sequentiell. Ein System ist aus Registern und Blöcken kombinatorischer Logik aufgebaut, wobei die Register von einer kleinen Anzahl (oft 1) von Takten getaktet werden. Wenn es mehrere Takte gibt, sind möglicherweise spezielle Vorsichtsmaßnahmen für Signale erforderlich, die von einer Taktdomäne zu einer anderen übergehen.
  3. Asynchron sequentiell. Es gibt Rückkopplungspfade, Latches, Register oder andere Elemente, die den Entwurfsspeicher vergangener Ereignisse liefern und die nicht von einfach zu analysierenden Taktleitungen getaktet werden.

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

Peter Green
quelle
2

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.

mikeselectricstuff
quelle
1
Wollten Sie dies zu einer einzigen Antwort machen?
Kevin Vermeer
1

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.

Harrygoz
quelle
Dies ist ein guter Punkt, obwohl man bedenken sollte, dass eine schlecht ausgelegte kombinatorische Schaltung, die dieselbe Operation wie eine sequentielle Schaltung ausführt, in einigen Fällen viele vorübergehende Übergänge ausführen kann, wenn Teilergebnisse berechnet und die endgültige Ausgabe aktualisiert wird, um diese zu berücksichtigen. und in CMOS-Schaltungen (wie die meisten FPGAs) ist der Stromverbrauch ungefähr proportional zur Anzahl der Übergänge. Uhren können zu unnötigen Übergängen führen, aber Sie können auch viel weniger Strom verbrauchen, indem Sie Uhren in Teilen der Schaltung deaktivieren, die momentan nicht benötigt werden.
Jules