Sequenzielle Ampelsteuerung

Nur zur Klarstellung: Ich versuche nur zu sehen, ob ich für dieses Projekt auf dem richtigen Weg bin und herauszufinden, was der beste Angriffsplan sein könnte.

Ich versuche, einen sequentiellen Verkehrscontroller als Zustandsmaschine zu simulieren, indem ich D-Latches mit einer "One-Hot"-Zustandszuweisung verwende. Die jeweilige Kreuzung sieht so aus:

Geben Sie hier die Bildbeschreibung ein

Die Kreuzung soll wie folgt funktionieren:

  • Wenn keiner der Sensoren aktiv ist, durchlaufen die Ampeln einen festen Zyklus abwechselnd zwischen Hauptstraße und Seitenstraße (Abbiegelicht ist rot; Autos können auf einer Hauptstraße nicht grün abbiegen).

  • Wenn ein Sensor aktiviert wird, gibt der nächste Zyklus dieser Richtung einen grünen Pfeil, nachdem die Seitenstraße gegangen ist, aber bevor die Hauptstraße in die entgegengesetzte Richtung geht.

Ich plane, zwei Standardlichter (rot, gelb, grün) für jede Straße (eine für jede Richtung) sowie zwei zusätzliche Lichter (rot, gelb, grüne Pfeile ) für die Abbiegespuren auf der Hauptstraße zu verwenden.

Mein Prof sagte, dass es akzeptabel ist, ein Licht gleichzeitig von gelb nach rot und ein anderes von rot nach grün zu wechseln (z. B. müssen wir uns keine Sorgen machen, nach jedem Zyklus in einen kurzen Zustand von ganz rot zu wechseln). Außerdem werden die "Sensoren" mit Drucktasten implementiert und aktiv niedrig sein, und LEDs werden für jede "Ampel" (mit jeweils einem Rot, Gelb und Grün) verwendet, die aktiv hoch sein werden. Abgesehen davon sagte er, dass er Urteilsvermögen und gesunden Menschenverstand verwenden sollte, um es zu konfigurieren (wie viele Lichter verwendet werden sollen, was passiert, wenn die Sensoren genau zur gleichen Zeit ausgelöst werden usw.). Ich programmiere die Logik, nachdem sie festgelegt wurde, also mache ich mir noch keine Sorgen um diesen Teil. Ich denke, sobald ich das Zustandsdiagramm habe, werde ich dazu in der Lage sein.

Ich begann mit dem Erstellen einer Ausgabetabelle der trivialen Zustände, die ich für die Schaltung benötigen würde:

Geben Sie hier die Bildbeschreibung ein

(Entschuldigung, es ist klein, ich habe es in Excel gemacht und sehe keine Möglichkeit, es anzuhängen)

Für die Ausgänge habe ich diese Abkürzungen verwendet:

  • SG - Seitenstraße grün
  • SY - Seitenstraße gelb
  • MG - Hauptstr. grün
  • MY - Main St. gelb
  • MEGTG - Hauptstraße, grün in Richtung Osten, Abbiegespur grün
  • MEGTY - Hauptstraße in Richtung Osten grün, Abbiegespur gelb
  • MWGTG - Main St. Grün in westlicher Richtung, Abbiegespur grün
  • MWGTY - Hauptstraße in westlicher Richtung grün, Abbiegespur gelb

Ich werde die Sensoren, die die Eingänge der Zustandsmaschine sind, als IE und IW bezeichnen, die jeweils für induktiv (den Sensortyp im Problem) Ost bzw. West stehen. Auf Anhieb sieht es so aus, als gäbe es eine Redundanz; Die roten, gelben und grünen Bundesstaaten der Side St. in Richtung Norden und Richtung Süden sind genau gleich. Abgesehen davon fällt mir sonst nichts auf, was die Vereinfachung angeht. Ist dies der richtige Weg, um fortzufahren? Ich habe das Gefühl, dass ich das vielleicht etwas schwieriger mache, als es sein muss. Was wäre, wenn ich alle Rottöne für einen bestimmten Zustand erzeugen würde, indem ich einfach das grüne oder gelbe Signal invertiere?

SG → SY → MG → MY entspricht dem „festen Zyklus“ ohne ausgelöste Sensoren. Unter Bezugnahme auf die Ausgangstabelle für die Ausgänge lautet das Zustandsdiagramm:

Geben Sie hier die Bildbeschreibung ein

wobei C die positive Flanke des Taktimpulses ist.

Fügen Sie nun hinzu, was passiert, wenn ein Sensor aktiviert wird. Wenn, sagen wir, IE = 0, wenn wir nach SY kommen (da beim ersten Tick der Uhr SG immer nach SY geht, muss die Schaltung daran denken, den Pfeil zu dieser Abbiegespur im nächsten Zyklus zu geben, nachdem Side St. geht, aber vor der Main St. geht es in die entgegengesetzte Richtung. Also möchte ich von SY → MEGTG → MEGTY gehen, dann zurück, um einen normalen Zyklus zu beenden MG → MY → SG. Ebenso, wenn IW=0, wenn wir bei SY ankommen von SY → MWGTG → MWGTY gehen möchte, dann zurück, um einen normalen Zyklus zu beenden.

Geben Sie hier die Bildbeschreibung ein

Ich habe noch nicht herausgefunden, was zu tun ist, wenn beide Sensoren angespannt sind. Ich habe überlegt, von MWGTY → MEGTG zu gehen, wenn der Ostsensor ausgelöst wird, aber das wird nicht funktionieren, weil die Hauptstraße in Richtung Westen von einer grünen direkt zu einer roten Ampel gehen würde. Wenn der Westsensor ausgelöst wird, würden wir von MEGTY → MWGTG gehen, wobei die Hauptstraße in Richtung Osten von grün auf rot wechseln würde. Vielleicht könnte ich einen Zustand hinzufügen, so dass, wenn IE = 0 ist, wenn MWGTY erreicht ist, es zu einem Zustand geht, in dem die Hauptstraße in Richtung Westen mit dem Abbiegelicht gelb wird, bevor es zu MEGTG geht. Ich könnte etwas Ähnliches tun, wenn der Westsensor bei MEGTY ausgelöst wird. Das einzige Problem beim Hinzufügen eines Zustands zwischen MWGTY → MEGTG oder MEGTY → MWGTG ist, dass das C nicht invertiert wird, wenn es bei MEGTG oder MWGTG ankommt, obwohl ich im neuen Zustand bleiben könnte, bis es invertiert wird, bevor ich zum nächsten Zustand gehe . Wie ich sagte, Es liegt an mir, wie ich es machen möchte, da es nicht spezifiziert ist. Mir geht es nur darum, es so einfach wie möglich zu machen.

Sobald ich alle Zustände bestimmt habe, kann ich eine Zustandstabelle erstellen. Da es sich um eine "One-Hot"-Zuweisung handelt, wären die Status 000001, 000010, 000100 usw. Nachdem ich die Zustandstabelle habe, kann ich die Logik programmieren. Also versuche ich zu sehen, ob ich bis zu diesem Punkt auf dem richtigen Weg bin, bevor ich damit beginne.

Schöne Präsentation, aber es ist unklar, was Ihre Frage ist.
Danke @tcrosley und sorry für die Verwirrung. Ich frage, ob ich es bisher richtig mache und wie es weitergehen soll.
Ihre Entwicklung scheint bisher richtig zu sein. In Bezug auf Was zu tun ist, wenn beide Sensoren aktiviert sind, empfehle ich die Verwendung eines Flip-Flops, um eine Richtung einmal und die andere Richtung auszuwählen, wenn beide Sensoren das nächste Mal aktiviert werden. Auf diese Weise werden Sie nie "wirklich" zwei Sensoren gleichzeitig "gleich" geltend machen.
Danke @Guill, das ist eine gute Idee, aber ich habe mein Design so gestaltet, dass, wenn beide ausgelöst werden, die Abbiegespur in Richtung Westen zuerst geht, dann nach dem Gelb die Abbiegespur in Richtung Osten grün wird, während die geraden Spuren der Hauptstraße rot bleiben die ganze Zeit. Dann zurück zum "festen Zyklus". Ich denke das deckt alles ab. Eine Sache, die ich herausfinden muss, ist das Hinzufügen eines Reset-Eingangs. Wenn die Schaltung in einem undefinierten Zustand beginnt, möchte ich in der Lage sein, einen Reset zu aktivieren, um in den ersten Zustand zu gelangen. Ich werde einen Druckknopf verwenden und ich möchte, dass er aktiv niedrig ist.
Ein Schlüsselfaktor kann sein: "Wenn ein Sensor aktiviert ist, gibt der nächste Zyklus dieser Richtung einen grünen Pfeil, nachdem die Seitenstraße gegangen ist, aber bevor die Hauptstraße in die entgegengesetzte Richtung geht." Ich könnte dies lesen, wenn Sie der Seite mit einem abbiegenden Auto einen grünen Pfeil und ein grünes Licht geben. Logisch, zwei Sensoren aktiv, rote Lichter am Hauptlicht, zwei Abbiegelichter. Ein Sensor aktiv, Gegenseite rot, grüner Pfeil und grünes Licht. Aber das wird komplex.
@stainlesssteelrat, wie gesagt, ich gebe meine Interpretation. Mein Prof ist sehr nachsichtig und sucht mehr nach einer Wissensdemonstration
Dann ist an deiner Deutung nichts auszusetzen. Sensoren arbeiten nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“. Die Krawatte geht an wen auch immer Sie wählen. Der Verlierer wartet bis zum nächsten grünen Zyklus.
Ich habe mein Design mit einer GAL implementiert und habe einige Probleme. Ich schalte den Stromkreis ein und alle Lichter leuchten sowohl grün als auch gelb. Es bleibt in diesem Zustand, bis ich einen Draht im Systemuhrstift auf Masse lege, dann geht alles auf rot (wenn ich eine Uhr anstelle eines Kabels verwende, bleibt es einfach im Anfangszustand). Danach kann ich es anscheinend nicht mehr dazu bringen, etwas anderes zu tun, außer bei einigen Gelegenheiten (nicht immer oder konsistent) geht es an den Zustand SG.
Wenn ich in SG komme, geht es nicht von selbst über, aber ich kann es dazu bringen, zu SY zu gehen, indem ich ein Kabel von Masse an den Systemuhrstift anschließe. Schließen Sie einen Draht noch einmal an und wieder wird alles rot. Ist es möglich, dass diese Inkonsistenzen darauf zurückzuführen sind, dass mögliche "Sackgassen"-Zustände nicht berücksichtigt werden? Wenn ja, wie kann ich sie beseitigen? Wenn nicht, gibt es irgendetwas Offensichtliches, das dieses Verhalten verursachen könnte? Am meisten verwirrt mich, dass es immer mit allen grünen und gelben Ausgängen beginnt, weil kein Zustand dieses Verhalten zeigen sollte.
Für alle Dokumentationsinteressierten verwende ich einen GAL22V10 für die Logik.
Es funktioniert! Hatte Probleme mit der Uhr.

Antworten (1)

Ich finde, du gehst viel zu früh ins Detail. Ich habe vor vielen Jahren komplexe Zustandsmaschinen entworfen, und diese Art von Problem wird ein bisschen schwierig zu lösen sein.

Schritt 1 besteht darin, das Verhalten richtig hinzubekommen. Denken Sie noch nicht einmal daran, Binärzahlen zur Darstellung der Zustände zuzuweisen. Aus Ihren Postings geht eindeutig hervor, dass Sie das ganze Verhalten nicht wirklich ausgearbeitet haben.

Schritt 2 besteht darin, Zustandscodes zuzuweisen und eine Implementierungstechnik wie die Methode der algorithmischen Zustandsmaschine (ASM) zu durchlaufen, um die Logik zu entwerfen und zu vereinfachen, vorausgesetzt, Sie bauen eine Logikschaltung, um sie zu implementieren. Dann können Sie sich um die physische Implementierung auf Chips wie FLPS (Field Programmable Logic Sequencer) oder sogar FPGAs (Field Programmable Gate Arrays) kümmern, und die Darstellung des Designs kann entweder als Schaltplan (Schaltplanerfassung) oder als Hardwarebeschreibungssprache erfolgen (HDL) basiert.

Machen Sie sich darüber noch keine Gedanken. Konzentrieren Sie sich zunächst darauf, das Verhalten zu entwerfen.

Sie sind direkt in ein Zustandsdiagramm gegangen. Das ist Ihr Endergebnis. Das versuchen Sie zu erreichen, also können Sie dann die Zustandsmaschine bauen.

Ich denke, Sie müssen darüber nachdenken, beispielsweise ein UML-Sequenzdiagramm zu verwenden, um das Verhalten zu veranschaulichen. Jede Ampel und jeder Sensor (induktiver Sensor) ist ein Objekt im Sequenzdiagramm, und die Sensoren lösen eine Reihe von Verhaltensweisen aus. In einem UML-Sequenzdiagramm fließt die Zeit die Seite hinunter, sodass Sie zeitbasiertes Verhalten und das, was passiert, einfach darstellen können zu den Lichtern, nachdem der induktive Sensor ausgelöst wurde.

Ich würde also vorschlagen, das zeitbasierte Verhalten zuerst mit einem Sequenzdiagramm zu entwerfen, und wenn Sie das richtig verstanden haben, was Sie wollen, können Sie zu einem Zustandsdiagramm wechseln. Dann können Sie mit dem Bau fortfahren.