Entwirf einen 8 - 6 - 4 - 2 - 0 - 1 - 3 - 5 - 7 - 9... Zähler

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.

Ich stehe vor einem Problem , das das Entwerfen eines 8 – 6 – 4 – 2 – 0 – 1 – 3 – 5 – 7 – 9 – 8 – 6 … erfordert“, ich würde gerne mehr über dieses Problem erfahren, um zu sehen ob das der richtige Ansatz ist . Wäre es nicht schade, wenn wir dieses seltsame Problem lösen und es sich herausstellt, dass es sich nur um ein XY-Problem handelt ?
Eigentlich ist es meine Aufgabe, einen Zähler zu entwerfen: 12-10-8-6-4-2-0-1-3-5-7-9-11. Aber zur Vereinfachung frage ich nur nach 8 - 6 - 4 - 2 - 0 ... bla bla.
Warum muss der Reset-Zustand Ihrer Meinung nach Null sein?
Zusammenzählen? Ich sehe nur einen Abwärtszähler. Sie müssen etwas länger auf die Wahrheitstabelle starren.
@WhatRoughBeast Ich habe versucht, diesen Zähler auf Proteus zu simulieren, und die anfängliche Ausgabe von D Flip Flop ist immer 0. Also wähle ich 0000. Wenn Q3Q2Q1Q0 (Ausgabe von D Flip Flop) = 0000, dann erzwingen Sie 1000 (8).
@Trevor Ich meine, nachdem ich von 8 auf 0 heruntergezählt habe, wird das LSB von 0 auf 1 geändert und 000 1 -> 001 1 -> 010 1 -> 011 1 -> 100 1 hochgezählt und dann das LSB in 0 geändert. und wieder runterzählen (100 0 -> 011 0 -> 010 0 -> 001 0 -> 000 0). Das ist meine Idee.
Wie gesagt... genauer hinschauen. Bit 0 ist wirklich das höchstwertige Bit. Bit 1 ist Zählerbit 0. Es zählt von 4 bis Null herunter, dann geht es beim nächsten Zählen zu F. Da das verschobene Bit 0 jetzt eine Eins ist, werden die präsentierten Zählerausgangsbits invertiert. Dann wird weiter heruntergezählt
Oder Sie können auf ähnliche Weise einen Aufwärtszähler verwenden.
@DanielNguyen vereinfache das Problem für uns nicht zu sehr; Sie wissen vielleicht nicht, dass Sie es schwieriger machen, es zu lösen
Und vielleicht löschen Sie tatsächlich den schwierigen Teil, damit Sie eine Lösung für ein anderes, vielleicht einfacheres Problem erhalten. Zum Beispiel ist Ihre reduzierte Sequenz 10 Elemente lang – das ist eine gerade Zahl. Es macht den Teil der ungeraden Zahlen länger als den Teil der geraden Zahlen ungleich Null. Dadurch könnte das Problem 8…0…9 schwieriger zu lösen sein als das 12…0…11-Problem. Oder, da die Länge der korrekten Sequenz 13 und damit eine Primzahl ist, ist das Erzeugen einer Sequenz dieser Länge mit einem Schieberegister viel viel schwieriger, sodass die Lösung Ihrer Vereinfachung Ihnen etwas gibt, das Ihnen nicht viel hilft
(Ich weiß, dass Sie Ihrer Frage bereits das ursprüngliche Problem hinzugefügt haben. Es soll nur veranschaulichen, warum es eine schlechte Idee ist, ein Problem zu vereinfachen, ohne den Weg zu seiner Lösung zu kennen.)
Entwerfen Sie ihn als vorinstallierten Zähler, beginnend mit 1000.
@Trevor Das ist genau das, was ich erwarte ("Couting up", ich meine, die linken 3 Bits invertieren). Aber ich weiß nicht, wie ich diese Schaltung implementieren soll. Wenn es auf 0 zählt, habe ich ein Z = ~ (Q3 + Q2 + Q1) implementiert, um 1 für die Bitinvertierung auszugeben (unter Verwendung von XOR-Gattern). Aber die Ausgabe von Z ändert sich (von 1 auf 0), sobald es zur nächsten Zahl zählt (z. B. 0000, Ausgabe 1 -> 1100, Ausgabe 0). Vielen Dank für Ihren Kommentar.
@MarcusMüller Danke für deinen Beitrag. Dies ist das erste Mal, dass ich eine Frage poste. Ich werde es in der nächsten Zeit vermeiden.
Dieser Zähler kann aufgeteilt werden in einen 3-Bit-Zähler für die Bits 3..1, die 4->3->2->1->0->0->1->2->3->4 zählen, und ein Zustandsbit beginnend bei 0 invertieren, wenn der 3-Bit-Zähler 0 erreicht, und wieder invertieren, wenn der 3-Bit-Zähler 4 erreicht. Das Zustandsbit repräsentiert Bit 0 in Ihrem 4-Bit-Zähler.
Auch hier können Sie dies mit einem einfachen Zähler tun, siehe hier ... simulator.io/board/NGdEpJSRM2/1 Das Festlegen der Start- und Endpunkte sollte einfach genug sein
@DanielNguyen - Ich hatte gehofft, Sie allgemeiner denken zu lassen. Nur weil ein Proteus FF einen standardmäßigen Einschaltzustand hat, bedeutet das nicht, dass sich alle Simulatoren oder sogar irgendein echter FF so verhalten. Und die allgemeine Antwort auf Ihre Frage lautet, dass Sie Ihrem System ein zusätzliches Bit hinzufügen müssen, um den Einschaltzustand zu identifizieren.

Antworten (6)

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.

Geben Sie hier die Bildbeschreibung ein simulator.io

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.

Danke für deine tolle Schaltung. Aber was meine Sequenz (12-10-8-6-4-2-0-1-3-5-7-9-11) betrifft, muss meine Schaltung so zählen: 6-5-4-3-2 -1-0-15-14-13-12-11-10). Für diese Schaltungsimplementierung müsste ich meines Wissens eine Zustandstabelle für 13 Zustände schreiben (die gleiche Anzahl von Zuständen wie meine ursprüngliche Zählsequenz, und das ist nicht das, was ich will). Es wäre großartig, wenn Sie bitte andere Lösungswege vorschlagen würden.
@DanielNguyen Ich habe keine Ahnung, was du sagst ...
Diese Seite ist mein Nr. 1 Comedy-Kanal.

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:

  1. Sie müssen eine Binärzahl 0zählen n-1, wobei ndie 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, nauf 0000 zurückgesetzt wird.

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

:D Sofortiges positives Votum dafür, dass Sie das offensichtlich Vernünftige vorschlagen , anstatt denjenigen zu ärgern, der den Auftrag erteilt hat. (Beachten Sie, dass ich dem "einfacheren" Aspekt nicht zustimme, ich sehe meine "Lösung" als einfacher an, aber Ihre Lösung ist sehr wahrscheinlich das, was sie lehren wollten.)
@MarcusMüller Mit einfacher meine ich in Bezug auf die Ressourcennutzung in der Schaltung, im Gegensatz zu einfacher zu implementieren.
Danke für deine Antwort. Eigentlich war dies mein erster Ansatz für dieses Problem. Zustandstabelle mit 13 Zuständen aufschreiben und Kmap zum Minimieren von D3 D2 D1 D0 verwenden (ich habe 4 D Flip Flop verwendet). Aber dann wurde mir klar, dass es einer Regel gehorcht.
@DanielNguyen Diese "Regel" ist eine aufstrebende Eigenschaft. Es ist, als würde man versuchen, die Schwerkraft in einem Flugzeug mit $-x^2+10$ zu modellieren und dann die entstehende Regel bemerken, dass der Betrag, um den es ansteigt, jedes Mal um zwei zunimmt - beide sind gültig, aber einer ist prägnanter (derjenige, der dies nicht tut t zeigen das Muster).

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:

schematisch

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 .

  • Flexibel : Mit dieser Schaltung können Sie jede 13-Schritt-Sequenz auf einem Schieberegister implementieren.
  • Einfach: Da Sie direkt mit dem Ein/Aus-Zustand der 7-Segment-Anzeigen arbeiten, vermeiden Sie den Aufwand, irgendetwas von einer Darstellung einer Zahl in eine andere umwandeln zu müssen.
  • Schnell: Die Taktgeschwindigkeit wird nur durch das Timing eines einzelnen Flipflops begrenzt, und das bedeutet, dass diese Implementierung nachweislich die schnellste aller Implementierungen ist, die mindestens ein D-Flipflop beinhalten. Nicht, dass die Taktrate für das vorliegende Problem von Bedeutung wäre, aber Sie verstehen wieder, dass Ihre Problemstellung nicht die Designziele definiert.

Da dies ein rein akademisches Problem ist, können Sie dies gerne optimieren.

Vielen Dank für diese Antwort. Aber die Verwendung des 104-Schieberegisters ist möglicherweise nicht das, was mein Dozent erwartet. Ich lerne etwas über Zustandsdiagramme, Zustandstabellen und die Verwendung von Kmap zur Implementierung boolescher Funktionen. Danke trotzdem für deine wirklich ausführliche Antwort.
Sie können eine Lösung für BCD-Zahlen mit einem 3-Bit-Aufwärts-/Abwärtszähler und einem bei 0 und 4 invertierenden Zustandsbit bauen.

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 N Stufen, finden Sie eine linear rückgekoppelte Schieberegisterkonfiguration , die einen Zyklus von ergibt 2 N 1 verschiedene Staaten. Das hat wirklich sehr viele Anwendungen (insbesondere in der digitalen Kommunikation), die dir später im Studium sehr wahrscheinlich begegnen werden.


Ich sehe nicht, wo im Text auf die 2. Fußnote verwiesen wird ...
Ich sehe nicht, wo im Text auf die 1. Fußnote verwiesen wird, und auch nicht auf die 2. ... vielleicht versteckt sie sich in der 2 N .
Ooops, ja, ich hatte eine viel längere Antwort parat, als mir klar wurde, dass die Ringtheorie bei dieser Frage niemandem nützt (es ging darum, warum Sie mit einem Schieberegister, das kürzer als 12 ist, keine Sequenz der Länge 12 erzeugen können).

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ösungGeben Sie hier die Bildbeschreibung ein

Und hier ist das grundlegende Blockdiagramm des Zustandsautomaten/beliebigen SequenzzählersGeben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein