Probleme bei der Implementierung eines Aufwärts-/Abwärtszählers

Ich versuche zu verstehen, wie man einen binären Ripple-Zähler nach oben / unten implementiert. Grundsätzlich habe ich ein paar D-Flipflops und verbinde clk des nächsten Flipflops mit Äther Q oder Q'.

Wenn ich also die Zählrichtung ändern möchte, schalte ich einfach alle clk-Multiplexer zwischen Q und Q' um, und der Zähler beginnt in die entgegengesetzte Richtung zu zählen.

Das Problem ist jedoch, dass Flipflops beim Umschalten der Eingänge zwischen Q und Q 1 Zählen, sodass mein Zähler von einer anderen Nummer zählt.

Dh ich kann nicht so etwas haben wie: 0->1->2->3(Richtungswechsel)->2->1->0, es wird wie 0->1->2->3(Richtungswechsel)-> c->b->a->9...

Was vermisse ich?

Antworten (2)

Die wichtigsten Punkte sind:

  • Stellen Sie sicher, dass nach dem Gating die neue Anordnung logisch sinnvoll ist. dh warum sollte es jetzt RUNTER zählen. Wenn Sie nicht der Logik dessen folgen, was Sie Ihrer Meinung nach tun sollten, können Sie nicht allzu überrascht sein, wenn es Ihnen nicht zustimmt :-)

  • Schalten Sie immer in einen "neutralen" Zustand. Stellen Sie sicher, dass Taktleitungen oder andere zustandsrelevante Leitungen vor und nach der Änderung in einem Zustand sind, der keine vorübergehende Zustandsänderung verursacht.


Eine "funktionierende" Schaltung von hier

Geben Sie hier die Bildbeschreibung ein

Ein wunderbares (& kostenloses) Tool

Logisim - ein Lehrmittel zum Entwerfen und Simulieren digitaler Logikschaltungen

Man sagt:

  • Logisim ist ein Lehrmittel zum Entwerfen und Simulieren digitaler Logikschaltungen. Mit seiner einfachen Symbolleisten-Oberfläche und der Simulation von Schaltkreisen, während Sie sie erstellen, ist es einfach genug, um das Erlernen der grundlegendsten Konzepte im Zusammenhang mit logischen Schaltkreisen zu erleichtern. Mit der Fähigkeit, größere Schaltungen aus kleineren Teilschaltungen aufzubauen und Kabelbündel mit einem einzigen Mauszug zu ziehen, kann Logisim verwendet werden (und wird verwendet), um ganze CPUs für Bildungszwecke zu entwerfen und zu simulieren.
Danke, das Problem schien zu sein, dass asynchrone Zähler nicht so einfach implementiert werden können :-)

Wenn Sie einen Ripple-Zähler wünschen, der bidirektional zählt, ist es möglich, einen bidirektionalen Gray-Code-Zähler mit Quadratureingang zu implementieren, der vollständig pegelempfindliche Latches verwendet. Die obersten zwei Bits einer Stufe können in die nächste Stufe eingespeist werden. Selbst wenn einer der Eingänge für eine Weile metastabil wird, verhält sich der Zähler, vorausgesetzt, dass sich der metastabile Eingang stabilisiert, bevor sich der andere Eingang ändert.

Doh, ja, anscheinend ist es etwas komplizierter als ich dachte :-)
@BarsMonster: Ich mag das Design eines bidirektionalen Quadratur-Graycode-Zählers, obwohl ein anderer Ansatz darin besteht, einfach ein Paar Ripple-Zähler zu haben - einen, der "Aufwärts" -Impulse zählt, und einen, der "Abwärts" -Impulse zählt. Der Versuch, einen normalen asynchronen Ripple-Zähler zu entwerfen, der asynchrone „Aufwärts“- und „Abwärts“-Ereignisse verarbeiten kann, ist problematisch, da nahezu gleichzeitige „Aufwärts“- und „Abwärts“-Ereignisse abgebrochen werden sollten, aber es ist schwer sicherzustellen, dass dies der Fall ist.
Nun, in meinem Fall kann ich nur eine Handvoll NAND-Gatter verwenden, also klingen komplexe Dinge beängstigend. In meinem Fall kann ich sicher sein, dass zwischen den Aufwärts- und Abwärtsimpulsen genügend Zeitintervalle liegen, damit sich die gesamte Logik beruhigen kann.