Inhaltsverzeichnis:

L I G H T S - Gunook
L I G H T S - Gunook

Video: L I G H T S - Gunook

Video: L I G H T S - Gunook
Video: Makarov Today. 2024, November
Anonim
BELEUCHTUNG
BELEUCHTUNG

Der Zweck dieses Abschlussprojekts war es, etwas zu schaffen, das sich auf Nachhaltigkeit konzentriert und digitale Designkonzepte implementiert. Um dies zu erreichen, habe ich mich entschieden, ein skalierbares Energiesparsystem mit vhdl zu entwerfen und für das Basys 3-Board (Artix-7 35T-Serie)). Skalierbar, da beliebig viele Sensoren in einem Raum und beliebig viele dieser Systeme um ein Gebäude oder ein Haus herum platziert werden können. Was dieses System bewirken würde, ist theoretisch Tausende von Dollar im Gewerbebau zu sparen und einen großen Prozentsatz des Energieverbrauchs in kleineren Wohngemeinschaften zu senken, indem ein verbundenes System aus aktiv und passiv gesteuerten Lichtern, Bewegungsmeldern, Timern, die auf 7-Segment-Anzeigen angezeigt werden, und Steuerschalter. Dieses Beispiel behandelt ein einzelnes System mit drei Bewegungsmeldern, einem Hauptschalter, einem Hand-/Normalschalter, vier Siebensegmentanzeigen und einer einzelnen Leuchte, die das System steuert.

In einem ausgewählten Raum würden beispielsweise mehrere Bewegungsmelder platziert (dieses Beispieldesign hat drei) und jeder würde ein Signal senden (1), wenn er eine Bewegung erkennt, und (0), wenn dies nicht der Fall ist. Wenn mindestens einer der Bewegungsmelder eine Bewegung erkennt, schaltet sich das Licht ein, wenn es noch nicht eingeschaltet ist, und bleibt eingeschaltet, wenn es bereits eingeschaltet ist. Zu jeder Zeit erkennen alle Bewegungsmelder nichts, ein Timer beginnt für eine festgelegte Zeit (einstellbar im Code) herunterzuzählen und die Lichter bleiben an, während der Timer herunterzählt. Sobald der Timer den Countdown beendet hat, stoppt der Timer und die Lichter erlöschen. Wenn mindestens ein Bewegungsmelder eine Bewegung erkennt, während der Timer herunterzählt, stoppt der Timer und wird zurückgesetzt. Und wenn mindestens ein Bewegungsmelder bei ausgeschaltetem Licht eine Bewegung erkennt, geht das Licht sofort an.

Dieses System hat zwei Modi, einen mit dem oben genannten Timer und einen zweiten mit einem Schalter, der die Lichter manuell steuert (ohne Sensoren). Es gibt einen Hauptschalter, mit dem der Benutzer wählen kann, welchen Modus er verwenden möchte, je nachdem, welcher Modus er für insgesamt mehr Energie spart. Ex. Ein Raum wie z als Schlafzimmer mit einem einzelnen Benutzer wäre besser manuell bedient. Und der Hauptschalter wäre beispielsweise hilfreich, wenn die Person, die im Schlafzimmer wohnt, für längere Zeit weggeht, dann könnte der Hauptschalter ausgeschaltet werden und der Timer-Modus würde effizienter arbeiten, um Energie zu sparen.

In diesem System gibt es also zwei Zustandsmaschinen, eine ist die Hauptzustandsmaschine und eine andere für den Countdown-Timer. Die Hauptzustandsmaschine hat fünf als solche definierte Zustände: 1. "Licht an, Bewegung erkannt" (id = 000), 2. "Licht an, keine Bewegung erkannt" (id = 001), 3. "Licht aus, keine Bewegung erkannt“(id = 010), 4. „manuell eingeschaltet“(id = 011) und 5. „manuell ausgeschaltet“(id = 100). Diese Hauptzustandsmaschine hat vier Eingänge: den Hauptschalter (ms), den manuellen/normalen Schalter (ns), ein Signal, das hoch ist, wenn mindestens ein Schalter eine Bewegung erkennt, und ansonsten niedrig (orx) und ein Signal, das ist hoch, wenn der Timer abgelaufen ist, andernfalls niedrig (td). Die Hauptzustandsmaschine hat zwei Ausgänge: Lichter (Lichter) und ein Signal, das anzeigt, wann der Countdown-Timer (Timer) oder (t) eingeschaltet werden soll (beide werden austauschbar verwendet).

Die zweite Zustandsmaschine, der Countdown-Timer, hat 12 Zustände: 10 von ihnen haben IDs, die mit der Nummer verbunden sind, die das sieben Segment anzeigt – „seg 10“(id = 1010), „seg 9“(id = 1001), […], „seg 2“(id = 0010), „seg 1“(id = 0001), und die anderen beiden Zustände zeigen beide null an, was bedeutet, dass der Timer ausgeschaltet ist – also gibt es das erste leere „leere 1“(id = 1111) und das zweite Leerzeichen "blank 2" (id = 0000). Der Countdown-Timer hat einen Eingang: Timer (t) und drei Ausgänge: die Zahl wird binär mit vier Bits angezeigt (bin) und ein Signal, das anzeigt, dass der Timer abgelaufen ist (td).

Schritt 1: Black-Box-Diagramm

Black-Box-Diagramm
Black-Box-Diagramm

Dies ist eine Übersicht über die Funktionsweise des gesamten Systems und wird mit einem Black-Box-Diagramm beschrieben.

  • Der Takt wird verwendet, um die Hauptzustandsmaschine und den Sieben-Segment-Decoder zu takten; für den Abwärtszähler wird ein langsamerer Takt benötigt, daher gibt es ein Taktteilermodul, das den Takteingang übernimmt und einen langsameren Takt für den Abwärtszähler ausgibt.
  • Die Zwischenvariable (orx) im Wrapper ist an die Bewegungssensoren gebunden und wird hoch sein, wenn mindestens einer der Sensoren etwas erkennt, andernfalls niedrig; die boolesche Gleichung dafür ist einfach orx = s(2) oder s(1) oder s(0).
  • Der main fsm steuert in Abhängigkeit von den Eingängen (orx, ms, ns, td) in welchem allgemeinen Zustand sich das System befindet und gibt den aktuellen Zustand (sm) vereinfacht mit den beiden Signalen, für die es verwendet wird (Timer und Lichter), aus.

    • (Timer) ist ein Wrapper-Signal, das als Eingang an den Abwärtszähler fsm gesendet wird und vom aktuellen Zustand des Haupt-fsm gesteuert wird. Es zeigt an, wann der Timer eingeschaltet werden soll.
    • (Lichter) ist ein Wrapper-Signal, das zur Steuerung der LED verwendet wird und vom aktuellen Status des Haupt-FSM gesteuert wird.
  • Der Abwärtszähler fsm steuert, was die sieben Segmente je nach Eingang (timer) anzeigen und gibt den aktuellen Zustand aus (sd), vereinfacht dargestellt mit den beiden Signalen, für die sie verwendet werden (td und bin).

    • (td) ist ein Wrapper-Signal, das als Eingang an den Haupt-fsm gesendet wird und vom aktuellen Zustand des Abwärtszählers fsm gesteuert wird. Es fungiert als Rückmeldesignal, das anzeigt, wann der Timer abgelaufen ist.
    • (bin) ist ein Vier-Bit-Wrapper-Signal, das mit vier Bits Null verkettet ist („0000“& bin) und die kombinierten acht Bits werden an (q) gesendet, ein Acht-Bit-Wrapper-Signal, das wiederum an die Sieben gesendet wird Segmentdecoder unter (ALU_VAL).
  • Das Sieben-Segment-Modul ist das gleiche wie bei Polylearn; seine Haupteingänge nehmen eine 8-Bit-Zahl (bin) bis (ALU_VAL) auf, um sie auf vier verschiedenen Sieben-Segment-Anzeigen anzuzeigen, wobei die Ausgänge (SEGMENTS) zum Wrapper-Signal (seg) und (DISP_EN) zum Wrapper (disp_en) verwendet werden.

    • Da zwei oder mehr Siebensegmentanzeigen nicht gleichzeitig verschiedene Ziffern anzeigen können, wird eine Uhr benötigt, um durch die vier Segmente zu schalten, die jeweils die entsprechende Ziffer für jedes einzelne eingeschaltete Segment anzeigt, und das Radfahren schnell genug macht die ssegs scheinen alle gleichzeitig aktiviert zu sein.
    • (Vorzeichen und gültig) sind während dieses Programms konstant, daher ist (Vorzeichen) dauerhaft niedrig und (gültig) dauerhaft hoch eingestellt.
    • (ALU_VAL) nimmt das Wrapper-Signal (q) als Eingabe auf, das die Zahl darstellt, die auf der Sieben-Segment-Anzeige in binärer Form angezeigt wird.
    • Die Ausgabe (SEGMENTS) wird an ein Acht-Bit-Wrapper-Signal (seg) und (DISP_EN) an ein Vier-Bit-Wrapper-Signal (disp_en) gesendet.
  • Es gibt auch ein D-Flip-Flop-Modul, das im Diagramm nicht explizit dargestellt ist, aber für die beiden Zustandsautomaten als Submodule benötigt wird und den Zustandsübergang synchron unterstützt.

    • (3) davon werden für die Hauptfsm benötigt, da 2^(3) = 8 > 5 Zustände für die Kodierung
    • (4) davon werden für den Abwärtszähler fsm benötigt, da 2^4 = 16 > 12 Zustände für die Kodierung

Schritt 2: Zustandsautomaten

Zustandsmaschinen
Zustandsmaschinen

Um die beiden Zustandsautomaten richtig zu gestalten, müssen die einzelnen Zustände mit ihren Ausgängen und dem Zustand, in den sie aufgrund der verschiedenen möglichen Eingänge übergehen, klar definiert werden.

Hauptfsm-Zustände:

„Licht an, Bewegung erkannt“(id = 000)

Licht ist an, mindestens einer der Bewegungsmelder erkennt Bewegung, also muss Orx hoch sein und ms ist eingeschaltet.

  • Ausgänge: Licht = 1 und Timer = 0
  • Bleibt dieser Zustand bei ms = 1 und orx = 1.
  • Geht in den Zustand „Licht an, keine Bewegung erkannt“, wenn ms = 1 und orx = 0.
  • Geht in den Zustand „manuell eingeschaltet“, wenn ms = 0 und ns = 1.
  • Geht in den Zustand „manuell ausgeschaltet“, wenn ms = 0 und ns = 0.

„Licht an, keine Bewegung erkannt“(id = 001)

Lichter sind an, keine Bewegung von einem Bewegungsmelder erkannt, daher muss Orx niedrig sein und ms ist eingeschaltet. Auch zu Beginn dieses Zustands weist der Timer, der hoch eingestellt ist, dem Countdown-FSM an, mit dem Herunterzählen zu beginnen, fährt mit dem Herunterzählen fort und stoppt das Herunterzählen, sobald der Countdown-FSM diesem FSM mitteilt, dass er mit dem Zählen fertig ist.

  • Ausgänge: Licht = 1 und Timer = 1.
  • Bleibt in diesem Zustand, wenn ms = 1 und orx = 0 und td (Timer ist fertig) = 0.
  • Geht in den Zustand „Licht an, Bewegung erkannt“, wenn ms = 1 und orx = 1.
  • Geht in den Zustand „Licht aus, keine Bewegung erkannt“, wenn ms = 1 und orx = 0 und td = 1.
  • Geht in den Zustand „manuell eingeschaltet“, wenn ms = 0 und ns = 1.
  • Geht in den Zustand „manuell ausgeschaltet“, wenn ms = 0 und ns = 0.

„Licht aus, keine Bewegung erkannt“(id = 010)

Die Lichter sind aus, es wurde keine Bewegung von einem Bewegungssensor erkannt und der Timer hat das Herunterzählen beendet, also muss Orx niedrig sein, ms ist eingeschaltet und td ist ausgeschaltet.

  • Ausgänge: Licht = 0 und Timer = 0.
  • Bleibt dieser Zustand bei ms = 1 und orx = 0.
  • Geht in den Zustand „Licht an, Bewegung erkannt“, wenn ms = 1 und orx =1.
  • Geht in den Zustand „manuell eingeschaltet“, wenn ms = 0 und ns = 1.
  • Geht in den Zustand „manuell ausgeschaltet“, wenn ms = 0 und ns = 0.

„Manuell eingeschaltet“(id = 011)

Lichter sind an, Bewegungsmelder sind irrelevant, daher ist ms ausgeschaltet und ns eingeschaltet.

  • Ausgänge: Licht = 1 und Timer = 0.
  • Bleibt dieser Zustand bei ms = 0 und ns = 1.
  • Geht in den Zustand „manuell ausgeschaltet“, wenn ms = 0 und ns = 0.
  • Geht in den Zustand „Licht aus, keine Bewegung erkannt, wenn ms = 1.

„Manuell ausgeschaltet“(id = 100)

Lichter sind aus, Bewegungsmelder sind irrelevant, daher ist ms ausgeschaltet und ns ausgeschaltet.

  • Ausgänge: Licht = 0 und Timer = 0.
  • Bleibt dieser Zustand bei ms = 0 und ns = 0.
  • Geht in den Zustand „manuell eingeschaltet“, wenn ms = 0 und ns = 1.
  • Geht in den Zustand „Licht aus, keine Bewegung erkannt, wenn ms = 1.

Rückwärtszähler zeigt an:

„Seg 10“(id = 1010)

Die Siebensegmentanzeige zeigt eine 10.

  • Ausgänge: bin = „1010“und td = 0.
  • Geht in den Zustand „Seg 9“, wenn Timer = 1.
  • Geht in den Zustand „Blank 2“, wenn Timer = 0.

„Seg 9“(id = 1001)

Die Siebensegmentanzeige zeigt eine 9.

  • Ausgänge: bin = „1001“und td = 0.
  • Geht in den Zustand „Seg 8“, wenn Timer = 1.
  • Geht in den Zustand „Blank 2“, wenn Timer = 0.

(Zustände "Seg 8" bis hin zu "Seg 2" werden weggelassen, da sie dem gleichen Muster wie "Seg 10" und "Seg 9" folgen und zur Erklärung nicht notwendig sind)

„Segment 1“(id = 0001)

Die Siebensegmentanzeige zeigt eine 1.

  • Ausgänge: bin = „0001“und td = 0.
  • Geht bei der nächsten steigenden Taktflanke in den Zustand „Blank 2“(keine Eingabe erforderlich).

„Leerzeichen 2“(id = 1111)

Die Siebensegmentanzeige zeigt eine 0 an. Der Zweck eines zweiten leeren Zustands besteht darin, dass für td = 1 aus Sicherheitsgründen ein separater Zustand vorliegt.

  • Ausgänge: bin = „1111“und td = 1.
  • Geht bei der nächsten steigenden Taktflanke in den Zustand „blank 1“(keine Eingabe erforderlich).

„Leerzeichen 1“(id = 0000)

Die Siebensegmentanzeige zeigt eine 0. Dies ist der Zustand, in dem das System bleibt, wenn sich die Hauptzustandsmaschine im Zustand „Licht aus, keine Bewegung erkannt“befindet.

  • Ausgänge: bin = „0000“und td = 0.
  • Geht in den Zustand „Seg 10“, wenn Timer = 1.

Schritt 3: Zustandsmaschinen-Wahrheitstabellen, Anregungsgleichungen und Ausgabegleichungen

Zustandsmaschinen-Wahrheitstabellen, Anregungsgleichungen und Ausgabegleichungen
Zustandsmaschinen-Wahrheitstabellen, Anregungsgleichungen und Ausgabegleichungen
Zustandsmaschinen-Wahrheitstabellen, Anregungsgleichungen und Ausgabegleichungen
Zustandsmaschinen-Wahrheitstabellen, Anregungsgleichungen und Ausgabegleichungen
Zustandsmaschinen-Wahrheitstabellen, Anregungsgleichungen und Ausgabegleichungen
Zustandsmaschinen-Wahrheitstabellen, Anregungsgleichungen und Ausgabegleichungen
Zustandsmaschinen-Wahrheitstabellen, Anregungsgleichungen und Ausgabegleichungen
Zustandsmaschinen-Wahrheitstabellen, Anregungsgleichungen und Ausgabegleichungen

Der nächste Schritt besteht darin, Wahrheitstabellen für die beiden Zustandsautomaten und Anregungsgleichungen zu erstellen und Gleichungen für jede fsm auszugeben. Für jede fsm-Anregungsgleichung müssen Gleichungen für jedes im nächsten Zustand codierte Bit in Bezug auf den aktuellen Zustand und seine Eingangssignale vorhanden sein. Für jede fsm-Ausgangsgleichung müssen Gleichungen für jedes Ausgangssignal in Bezug auf den aktuellen Zustand vorliegen. Alle vier Gleichungssätze können aus den abgebildeten Wahrheitstabellen gezogen werden. (qn ist das nächste zustandscodierte Bit für jede Zustandsmaschine und q ist der aktuelle Zustand)

(000) entspricht q(2)'q(1)'q(0)' und (0000) entspricht q(3)'q(2)'q(1)'q(0)'

(zB (0101) ist q(3)'q(2)q(1)'q(0) und (110) ist q(2)q(1)q(0)')

Anregungsgleichungen für die Haupt-fsm:

  • qn(2) = (ms)'(ns)
  • qn(1) = (ms)'(ns)' + (ms)(orx)'[(td)(001) + (010)] + (ms)[(011) + (100)]
  • qn(0) = (ms)'(ns)' + (ms)(orx)'[(000) + (td)'(001)]

Ausgabegleichungen für die Haupt-fsm:

  • Lichter = (000) + (001) + (100)
  • Timer = (001)

Anregungsgleichungen für den Rückwärtszähler fsm:

  • qn(3) = t[(0000) + (1010) + (1001) + (0001)]
  • qn(2) = t[(1000) + (0111) + (0110) + (0101) + (0001)]
  • qn(1) = t[(0000) + (1000) + (0111) + (0100) + (0011) + (0001)]
  • qn(0) = t[(1010) + (1000) + (0110) + (0100) + (0010) + (0001)]

Ausgangsgleichungen für den Abwärtszähler fsm:

  • td = (1111)
  • bin(3) = (1010) + (1001) + (1000) + (1111) + (0000)
  • bin(2) = (0111) + (0110) + (0101) + (0100) + (1111) + (0000)
  • bin(1) = (1010) + (0111) + (0110) + (0011) + (0010) + (1111) + (0000)
  • bin(0) = (1001) + (0111) + (0101) + (0011) + (0001) + (1111) + (0000)

Schritt 4: Wrapper, Submodule und Einschränkung

Wie bereits in Schritt 1 erklärt, werden diese Module für dieses Projekt benötigt und sind alle mit dem Wrapper-Modul mit dem Titel "final_proj.vhd" verbunden. Die Constraint-Datei mit dem Titel "Basys3_Master.xdc" wird verwendet, um alle Wrapper-Ein- und -Ausgänge mit Switches, den sieben Segmenten und I/O-Ports auf der Basys 3-Platine zu verbinden. Der Hauptschalter sollte der Schalter auf der Platine sein, der der Seite der Drähte am nächsten ist, der normale / manuelle Schalter ist der zweitnächste und die drei Schalter, die die drei Bewegungssensoren darstellen, sind die drei Schalter direkt neben dem normalen / manuellen Schalter. Der gesamte Code (boolesche Gleichungen, Moduldeklarationen usw.) ist bereits in die Dateien geschrieben, sodass Sie nichts mehr schreiben müssen, damit dies funktioniert.

Schritt 5: I/O-Ports für LED

I/O-Ports für LED
I/O-Ports für LED
I/O-Ports für LED
I/O-Ports für LED

Der letzte Schritt für dieses Projekt besteht darin, eine LED zu verwenden, um anzuzeigen, ob (Lichter) tatsächlich ein- und ausgeschaltet werden. Die Verkabelung ist in den beiden Bildern dargestellt. Stellen Sie sicher, dass ein Widerstand in Reihe mit der LED (mindestens 330 Ohm) vorhanden ist, um die LED nicht durchzubrennen, und stellen Sie sicher, dass der lange Stift der LED mit derselben Buchsenleiste auf der Basisplatine verbunden ist, wie der rote Draht gezeigt wird (oben) ganz rechts) und der kürzere Pin ist mit Masse verbunden, die gleiche Buchsenleiste wie das schwarze Kabel (oben, zweiter von links).