Entwerfen Sie einen Zähler: 12-10-8-6-4-2-0-1-3-5-7-9-11 mit D Flip Flop.
Mein erster Ansatz besteht darin, einen 8 - 6 - 4 - 2 - 0 - 1 - 3 - 5 - 7 - 9 - 8 - 6 ... Zähler zu entwerfen und auf einer 7-Segment-LED anzuzeigen.
Nachdem ich den Binärcode dieser Zahlen oben aufgeschrieben habe, stelle ich fest, dass sie einer Regel zu gehorchen scheinen
1 0 0 0 (8)
0 1 1 0 (6)
0 1 0 0 (4)
0 0 1 0 (2)
0 0 0 0 (0)
0 0 0 1 (1)
0 0 1 1 (3)
0 1 0 1 (5)
0 1 1 1 (7)
1 0 0 1 (9)
Es ist ersichtlich, dass das LSB der geraden Zahlen immer 0 ist, während es für die ungeraden Zahlen immer 1 ist. Die 3 linken Bits sind symmetrisch. Meine Idee für dieses Problem ist also, dass nach dem Zählen von 8 bis 0 das LSB von 0 auf 1 wechselt und mit dem Aufwärtszählen beginnt (unter Verwendung von 3 oder 4 D-Flip-Flops und Logikgattern). Aber nachdem ich Next State Table aufgeschrieben habe, stehe ich vor dem Weg, meine Startnummer auf 8 zu zwingen.
Aktueller Zustand ---- Nächster Zustand
0 0 0 0 ------------ 1 0 0 0 (nächster Zustand ist 8, wenn die Startnummer 0 ist)
1 0 0 0 ------- ----- 0 1 1 0 (Anzeige 8, nächster Zustand ist 6)
0 1 1 0 ------------ 0 1 0 0 (Anzeige 6, nächster Zustand ist 4)
0 1 0 0 ------------ 0 0 1 0 (Anzeige 4, nächster Zustand ist 2)
0 0 1 0 ------------ 0 0 0 0 (Anzeige 2, nächster Zustand ist 0)
0 0 0 0 ------------ 0 0 0 1 (zeige 0, ändere LSB in 1 und aktiviere Hochzählen)
Das Problem dabei ist, dass der Zustand 0 0 0 0 zweimal verwendet wird (einmal, um die Startnummer auf 8 zu erzwingen und einmal, um LSB in 1 zu ändern) und ich denke, mein Zähler würde verwirrt werden. Ich frage mich also, ob es Möglichkeiten gibt, diese Art von Zähler zu implementieren?
Vielen Dank im Voraus für jede Ihrer Antworten.
Meine Schaltung funktioniert, basierend auf der Schaltung von @Trevor Vielen Dank an alle für Ihre tollen Ideen.
Es hört sich so an, als ob von Ihnen erwartet wird, dass Sie dies mit einer Schaltung vom Typ Zustandsmaschine lösen, es kann jedoch auch mit einer klassischen Zählerschaltung durchgeführt werden.
Der Schlüssel zu diesem Problem besteht darin, zu erkennen, dass Sie für die Hälfte der Zählung die Ausgangsbits des Zählers invertieren. Außerdem ist Ihr Ausgangsbit 0 tatsächlich das höchstwertige Bit des Zählers, es wird nur als LSB dargestellt.
Als solches müssen Sie nicht abwärts und dann aufwärts zählen. Für die Zählsequenz reicht ein klassischer synchroner D-Type-Zähler mit einigen XOR-Invertern aus.
Die zusätzlichen Gates am Ausgang erkennen die Carry-Bedingung, die die Eingänge auf D-Type zurück zur Startnummer zwingt.
Beachten Sie auch, dass ich das untere Flip-Flop invertiert habe. Da sich herausstellt, dass Ihre Anfangsbedingung für Ihre 12....11-Sequenz tatsächlich 1 auf dem Zähler ist, nicht 0, erhalten Sie damit effektiv die gewünschte Startbedingung, zumindest im Simulator. Ich habe auch eine Reset-Impulsleitung hinzugefügt, nur für ein gutes Maß.
Natürlich würde eine weitere Spalte von D-Typen, die an der anderen Flanke des Takts am Ausgang zwischengespeichert werden, es noch besser machen.
Da es sich um eine Aufgabe handelt, werde ich die Logik nicht durcharbeiten. In all diesen Fragen können Sie es jedoch auf eine Schaltung mit zwei Schritten reduzieren:
Sie müssen eine Binärzahl 0
zählen n-1
, wobei n
die Anzahl der erforderlichen Zustände ist (in Ihrem Fall 13). Dies kann ein synchroner Standard-Binärzähler sein, der bei 0000 beginnt und dann, wenn er erreicht ist, n
auf 0000 zurückgesetzt wird.
Eine kombinatorische Logikschaltung, die die Werte des Zählers auf die Ausgangswerte abbildet. Die Struktur davon können diskrete Logikgatter sein, deren Schaltung unter Verwendung von Karnaugh-Karten abgeleitet werden kann - eine Karte pro Bit in der Ausgabe. Alternativ könnte es ein einfaches ROM mit der darin gespeicherten Zuordnung sein, wo die Adressleitungen zum Zähler gehen und die Datenleitungen Ihre Ausgabe sind.
Dieser Ansatz ist viel einfacher und viel generischer (denken Sie flexibel) als die Verwendung von Hunderten von Schieberegisterbits.
Die langweiligste Lösung, die ich eigentlich empfehlen würde, besteht darin, einfach ein 8 Bit breites, 13 Stufen tiefes, kreisförmiges Schieberegister zu bauen, bei dem sieben Bits jeweils den Ein / Aus-Zustand eines Ihrer 1er Sieben darstellen LED-Segmente, und ein Segment stellt die zwei Segmente dar, die Sie einschalten müssen, um eine 1 in den 10ern anzuzeigen.
Tatsächlich wären das nur acht 13-stufige Schieberegister parallel. Schieberegister sind mit D FFs einfach zu implementieren, also los geht's:
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
Das Problem wäre, die Anfangswerte in dieses Schieberegister zu bekommen, aber Sie könnten einfach deklarieren, dass das Register die richtigen Rücksetzwerte hat, und damit fertig sein. Nichts sagt, dass Sie es nicht können.
Natürlich sind 8·13 = 104 Schieberegister vielleicht nicht schön , aber nichts in der Zuordnung sagt, dass schön besser ist als flexibel , schnell oder einfach .
Da dies ein rein akademisches Problem ist, können Sie dies gerne optimieren.
Sie können nach Vereinfachungen suchen.
Beispielsweise können Sie feststellen, dass ein Teil des Zählers einfach in einer einfachen Sequenz auf und ab zählt; Es gibt Muster (sogar TTL-Logikchips), die Sie als direkte Aufwärts-Abwärts-Zähler verwenden können.
Für diesen Teil des Zählers müssen Sie lediglich die beiden Endbedingungen erkennen und ein Bit setzen, das die Aufwärts-/Abwärtszählfunktion steuert.
Können Sie für das verbleibende Bit ein Muster oder eine Regelmäßigkeit in seiner Ausgabe erkennen? Lässt es sich leicht aus dem Aufwärts-/Abwärtszähler und/oder seiner Steuerlogik ableiten?
Dies ist oft mehr Arbeit als ein einfacher Zähler, der eine Nachschlagetabelle steuert, aber es ergibt wahrscheinlich eine kleinere Lösung.
Um Toms ausgezeichnete Antwort zu erweitern :
Wenn das Problem darin besteht, eine Schaltung mit möglichst wenigen Logikelementen aufzubauen, sollten Sie diesen 0…12-Zähler (der ein Vier-Bit-Zähler sein muss) vermeiden, sondern stattdessen ein Schieberegister mit linearer Rückkopplung verwenden, um die Differenz zu erzeugen Zustände und befassen sich mit der Tatsache, dass sie in der kombinatorischen Logik nicht sequentiell sind.
Dies war ein gängiger Trick, den Sie gemacht haben, als Sie in einer Zeit, in der die Waferfläche einiger Halbaddierer Ihnen wirtschaftlich schaden würde, Soundsamples aus einem ROM nehmen, um ein periodisches Signal zu erzeugen. Sie werden diesen Trick möglicherweise immer noch in modernen ICs finden, die eine ähnliche Aufgabe (dh die Erzeugung einer periodischen Ausgangssequenz) mit sehr hoher Geschwindigkeit oder mit einem sehr knappen Energiebudget ausführen müssen.
Ich glaube ehrlich gesagt nicht, dass Ihre Schule zu diesem Zeitpunkt erwartet, dass Sie so etwas entwerfen, aber ich denke, es ist wirklich wert zu wissen, dass Sie dies mit einem Schichtregister von können Stufen, finden Sie eine linear rückgekoppelte Schieberegisterkonfiguration , die einen Zyklus von ergibt verschiedene Staaten. Das hat wirklich sehr viele Anwendungen (insbesondere in der digitalen Kommunikation), die dir später im Studium sehr wahrscheinlich begegnen werden.
VERWENDUNG VON D FLIP FLOP.. Das Entwerfen dieses Zählers ist sehr einfach.. Sie müssen einige grundlegende Konzepte von Zustandsmaschinen verstehen, bevor Sie sie lösen können (HINWEIS: Sie können die Wahrheitstabelle zur Vereinfachung der Logik verwenden, und entschuldigen Sie, dass Sie die Logik nicht gezeichnet haben). Lösung
Und hier ist das grundlegende Blockdiagramm des Zustandsautomaten/beliebigen Sequenzzählers
Harry Swensson
Daniel Nguyen
WasRoughBeast
Trevor_G
Daniel Nguyen
Daniel Nguyen
Trevor_G
Trevor_G
Markus Müller
Markus Müller
Markus Müller
Mitu Raj
Daniel Nguyen
Daniel Nguyen
Paebbels
Trevor_G
WasRoughBeast