Wesentliche Bearbeitung - beachten Sie, dass die Antwort von David Kessner als Antwort auf den ursprünglichen Beitrag geschrieben wurde. Sehen Sie sich den Bearbeitungsverlauf an, um zu sehen, worauf er geantwortet hat
Nach dem, was ich über digitales Design gelesen habe, gibt es eine sehr starke Tendenz zur Verwendung streng synchroner Schaltungen, bei denen die einzigen "sequentiellen" Subsysteme Flip-Flops sind, die sich einen gemeinsamen Takt teilen. Signale, die sich zwischen Taktdomänen kreuzen, erfordern fast immer doppelte Synchronisierer.
Ich habe eine Reihe von Artikeln gesehen, die darauf hindeuten, dass vollständig asynchrone Designs sehr schwierig sind und anfällig für unvorhergesehene Fallstricke sind. Ich kann sicherlich einschätzen, dass es mathematisch unmöglich ist, irgendetwas über den Ausgang absolut zu garantieren, wenn die Eingänge zu irgendeiner Art von Verriegelungselement keine festgelegte Zeitbeziehung haben, und dass es sogar so weit kommt, dass seltsames Verhalten für praktische Zwecke unwahrscheinlich genug ist Dass sie nicht passieren, ist ohne Doppelsynchronisation oft schwierig.
Eine Reihe von Blogs sprechen auch über die Übel von Gated-Clocks und schlagen vor, dass es viel besser ist, einen ungated Clock zusammen mit einem "Latch-Enable"-Signal an einen Latch zu speisen, als den Clock zu gaten. Gated-Clocks erfordern nicht nur große Sorgfalt bei ihrer Implementierung, um "runt"-Taktimpulse zu vermeiden, sondern wenn nicht äußerst darauf geachtet wird, Verzögerungen auszugleichen, müssen Schaltungen, die von separat gated-Clocks betrieben werden, als in ihrer eigenen Clock-Domäne betrachtet werden.
Was ich nicht viel diskutiert gesehen habe, ist die Vorstellung von Schaltungen, die sequentielle Subsysteme verwenden, die nicht alle von demselben Takt getriggert werden, aber innerhalb einer bestimmten Dauer einer Taktflanke immer stabil sind. Wenn man versucht, so etwas wie einen N-Bit-Ereigniszähler zu implementieren, müssen bei vielen Flipflops, die alle von einem gemeinsamen Takt angesteuert werden, mindestens die Gates von 2N Transistoren bei jedem Taktübergang geladen und entladen werden. Wenn man stattdessen eine "Ripple"-Anordnung für die ersten paar Stufen verwenden würde, könnte man die Frequenz der Signale, die die oberen Stufen erreichen, wesentlich reduzieren, wodurch der Stromverbrauch reduziert würde.
Ich habe einige Prozessoren gesehen, die eine asynchrone Preskalarstufe am Eingang eines Zählers aufweisen, aber keiner der Preskalare, die ich gesehen habe, ermöglicht es dem Prozessor, sie zu lesen. Außerdem machen es fast alle Chips, die ich gesehen habe und die solche Vorteiler haben, unmöglich, in den Timer-Wert zu schreiben, ohne den Vorteiler zu löschen. Mein Verdacht ist, dass bei vielen solchen Geräten der Preskalar nicht wirklich den Hauptzähler taktet, sondern stattdessen verwendet wird, um bei einem bestimmten Zyklus der Systemuhr zu bestimmen, ob der Zähler vorgerückt werden soll oder nicht. Während einige dieser Systeme einen Modus bereitstellen, in dem einer der Zähler auf den "vollständig asynchronen" Modus gesetzt werden kann, was einen Betrieb im Ruhezustand ermöglicht,
Es scheint, dass einige dieser Probleme durch die Verwendung eines Graycode-Zählers gemildert werden könnten und dass die Implementierung eines solchen Zählers durch die Verwendung eines "halbsynchronen" Designs, wie oben beschrieben, erleichtert werden könnte. Es ist möglich, einen relativ kompakten und schnellen asynchronen bidirektionalen Graycode-Zähler mit Quadratureingang zu entwerfen, der Metastabilität an beiden Eingängen toleriert, solange der andere stabil ist (während der Zeit, in der ein Eingang metastabil ist, ist ein Ausgang undefiniert, vorausgesetzt, der metastabile Eingang stabilisiert sich bevor der andere Eingang einen Übergang hat, löst sich der Ausgang selbst in den richtigen Zustand auf). Die Ausgänge wären nicht mit einem bestimmten Takt synchron, aber wenn sich die Eingänge an einer bestimmten Taktflanke ändern, wäre die Beziehung zu den Ausgängen vorhersagbar. Hat jemand schon einmal von einer solchen Schaltung gehört?
Wow, Ihre Frage ist nicht sehr fokussiert und es ist nicht offensichtlich, wonach Sie wirklich fragen. Aber lass mich das mal ausprobieren. Tut mir leid, wenn ich es nicht ganz richtig verstanden habe.
Ripple-Zähler vs. normaler Synchronzähler: Wer sagt, dass Menschen keine Ripple-Zähler verwenden? Die Leute verwenden das, was ihnen zur Verfügung steht und das am besten funktioniert. In FPGAs verwendet niemand einen Ripple-Zähler, weil die Logikblöcke einen Sync-Zähler so viel besser machen als einen Ripple. Wenn Sie jedoch einen benutzerdefinierten Chip entwerfen, kann ein Ripple Counter vorteilhafter sein, wenn es um den Stromverbrauch und die Logikgröße geht. Es würde mich überhaupt nicht überraschen, wenn einige Leute Ripple-Zähler in ihren ASICs verwenden. Sync-Zähler wären immer noch besser für Geschwindigkeit und Einfachheit des Timings.
Grauer Zähler vs. binärer Zähler: Menschen verwenden graue Zähler in ASICs und benutzerdefinierten Chips. In FPGAs, wo Binärzähler schneller sind, werden immer noch Gray-Zähler verwendet, wenn der Zählwert Taktdomänen durchlaufen muss, wie z. B. in FIFOs.
Mehrphasenuhren: Diese werden sicherlich im Design verwendet. Es gibt Gründe, warum die PLLs in FPGAs häufig um 0, 90, 180 und 270 Grad phasenverschobene Versionen der ursprünglichen Takte ausgeben können. Aber wenn die Taktfrequenzen steigen, wird die Verwendung mehrerer Takte aufgrund von Taktversatz und Taktverteilungsproblemen schwieriger. Es ist bei hohen Frequenzen nicht unmöglich, aber es wird einfach nicht so oft gemacht.
Sync vs. Async: Sync-Schaltungen sind nicht nur einfacher zu simulieren, sondern auch einfacher zu entwerfen und einfacher zu garantieren, dass sie korrekt funktionieren. Verifizierungs- und Timing-Analyse-Tools sind mit asynchronen Schaltungen nur schwer bis unmöglich zu verwenden.
MCU Counter Circuit: WISSEN Sie, dass es keine MCUs gibt, die das so machen? Wenn ja, wie konnten Sie das feststellen? Vielleicht sind die Prescaler auf dem Timer Ripple-Zähler. Vielleicht ist der Timer selbst ein Gray-codierter Zähler und das Lesen / Schreiben der Register konvertiert ihn automatisch in / aus Binär. Mein Punkt ist folgender: Die Jungs, die Super-Low-Power-MCUs (wie den MSP430) entwickeln, tun alles, um den Stromverbrauch zu reduzieren. Viele dieser Tricks, wie die Verwendung von Ripple-Zählern und ggf. Gray-Code, sind für Leute wie Sie und mich völlig unsichtbar. Sie können diese Tricks verwenden und tun dies wahrscheinlich auch, plus ein paar hundert andere Tricks, an die Sie noch nicht gedacht haben .
Eine Sache, die Sie nicht erwähnt haben, ist die Verwendung von vollständig asynchronen Schaltungen. Hier endet all Ihr Gerede über Uhren schließlich, wenn es zu seinem logischen Schluss kommt. Es gab Unternehmen, die versuchten, große CPUs zu bauen, die vollständig asynchron sind, darunter eine Gruppe, die versuchte, einen asynchronen ARM auf den Markt zu bringen. Die Vorteile sind erstaunlich: unter anderem extrem niedriger Stromverbrauch, schnellere Verarbeitung und weniger EMI. Aber die Nachteile sind noch erstaunlicher. Der Hauptgrund ist, dass die Komplexität des Designs dieses Chips enorm ist und heute nicht wirtschaftlich ist. Ein sekundäres Problem besteht darin, dass sich die Anzahl der Transistoren im Vergleich zu einem äquivalenten Sync-Chip etwa verdoppelt.
Trotzdem gibt es heute CPUs auf dem Markt, die in einigen ihrer Blöcke asynchrone Logik verwenden, wie die FPU, aber niemand verwendet sie in großem Umfang.
W5VO
Kortuk
Superkatze
Superkatze
Kortuk
Oli Glaser
Superkatze