Spisu treści:

ŚWIATŁO: 5 kroków
ŚWIATŁO: 5 kroków

Wideo: ŚWIATŁO: 5 kroków

Wideo: ŚWIATŁO: 5 kroków
Wideo: NA ULICY piosenka W PODSKOKACH | POKAZYWANKA 2024, Listopad
Anonim
ŚWIATŁA
ŚWIATŁA

Celem tego finalnego projektu było stworzenie czegoś, co skupiałoby się na zrównoważonym rozwoju i wdrażaniu koncepcji projektowania cyfrowego, i aby to zrobić, postanowiłem zaprojektować skalowalny system oszczędzania energii przy użyciu vhdl i wykonany dla płyty Basys 3 (seria Artix-7 35T). Skalowalny, ponieważ w pomieszczeniu można umieścić dowolną liczbę czujników i dowolną liczbę tych systemów można rozmieścić wokół budynku lub domu. To, co ten system mógłby zrobić, to teoretycznie zaoszczędzić tysiące dolarów w budynkach komercyjnych i zmniejszyć duży procent zużycia energii w mniejszych społecznościach mieszkaniowych poprzez wdrożenie połączonego systemu aktywnie i pasywnie sterowanych świateł, czujników ruchu, timerów wyświetlanych na wyświetlaczach siedmiosegmentowych i przełączniki sterujące. Ten przykład dotyczy pojedynczego systemu z trzema czujnikami ruchu, wyłącznikiem głównym, wyłącznikiem ręcznym/normalnym, czterema wyświetlaczami siedmiosegmentowymi i pojedynczym światłem, które kontroluje system.

Na przykład w wybranym pomieszczeniu kilka czujników ruchu zostałoby umieszczonych wokół (ta przykładowa konstrukcja ma trzy), a każdy z nich wyśle sygnał (1), jeśli wykryje ruch, i (0), jeśli nie. Jeśli co najmniej jeden z czujników ruchu wykryje ruch, światła włączą się, jeśli jeszcze nie są włączone, i pozostaną włączone, jeśli są już włączone. W dowolnym momencie wszystkie detektory ruchu niczego nie wykrywają, timer zaczyna odliczać przez określony czas (możliwy do ustawienia w kodzie), a światła pozostają włączone podczas odliczania czasu. Gdy timer zakończy odliczanie, stoper zatrzymuje się, a światła gasną. Jeśli co najmniej jeden czujnik ruchu wykryje ruch podczas odliczania czasu, zegar zatrzymuje się i resetuje. A jeśli przynajmniej jeden czujnik ruchu wykryje ruch, gdy światła są wyłączone, światła natychmiast się włączają.

Ten system ma dwa tryby, jeden z zegarem, jak wspomniano powyżej, a drugi, w którym znajduje się przełącznik, który steruje światłami ręcznie (ignorując czujniki). Istnieje główny przełącznik, który pozwala użytkownikowi wybrać tryb, z którego chce korzystać, w zależności od tego, który według niego pozwoli zaoszczędzić więcej energii. Były. Pomieszczenie takie jak korytarz może skorzystać z trybu pasywnego timera - użytkownicy nie są pewni, kiedy ludzie będą przechodzić, ale włączanie i wyłączanie światła za każdym razem, gdy wchodzą i wychodzą, byłoby niedogodnością, podczas gdy pokój taki jak korytarz jako sypialnia z jednym użytkownikiem byłaby lepiej obsługiwana ręcznie. A wyłącznik główny byłby pomocny w przypadkach, gdy osoba mieszkająca w sypialni miałaby wyjść na dłuższy czas, wówczas wyłącznik główny mógłby zostać wyłączony, a tryb timera działałby bardziej efektywnie oszczędzając energię.

Tak więc w tym systemie są dwie maszyny stanowe, jedna jest główną maszyną stanową, a druga dla licznika czasu. Główny automat stanów ma pięć stanów zdefiniowanych jako: 1. „Światła włączone, wykryto ruch” (id = 000), 2. „Światła włączone, nie wykryto ruchu” (id = 001), 3. „Światło wyłączone, brak ruchu wykryto” (id = 010), 4. „włączony ręcznie” (id = 011) oraz 5. „ręcznie wyłączony” (id = 100). Ta maszyna stanu głównego ma cztery wejścia: przełącznik główny (ms), przełącznik ręczny/normalny (ns), sygnał, który jest wysoki, gdy co najmniej jeden przełącznik wykryje ruch, a w przeciwnym razie jest niski (orx) oraz sygnał, który jest wysoki po zakończeniu timera i niski w przeciwnym razie (td). Automat główny posiada dwa wyjścia: światła (światła) oraz sygnał, który wskazuje, kiedy włączyć odliczanie (timer) lub (t) (oba używane zamiennie).

Druga maszyna stanów, licznik czasu, ma 12 stanów: 10 z nich ma identyfikatory powiązane z liczbą, na której wyświetlany jest siódemka – „seg 10” (id = 1010), „seg 9” (id = 1001), […], „seg 2” (id = 0010), „seg 1” (id = 0001), a pozostałe dwa stany wyświetlają zero, co oznacza, że timer jest wyłączony, więc jest pierwsze puste „puste 1” (id = 1111) i drugie puste "puste 2" (id = 0000). Timer odliczający posiada jedno wejście: timer (t) oraz trzy wyjścia: liczbę wyświetlaną binarnie z czterema bitami (bin) oraz sygnał informujący o wykonaniu timera (td).

Krok 1: Schemat czarnej skrzynki

Schemat czarnej skrzynki
Schemat czarnej skrzynki

Jest to przegląd tego, jak ma działać cały system, i jest opisany za pomocą diagramu czarnej skrzynki.

  • Zegar jest używany do taktowania głównej maszyny stanu i dekodera siedmiosegmentowego; wolniejszy zegar jest potrzebny dla licznika w dół, więc istnieje moduł dzielnika zegara, który pobiera wejście zegara i wyprowadza wolniejszy zegar dla licznika w dół.
  • Zmienna pośrednia (orx) w owijce jest powiązana z czujnikami ruchu i będzie wysoka, jeśli co najmniej jeden z czujników coś wykryje, a niska w przeciwnym razie; równanie logiczne to po prostu orx = s(2) lub s(1) lub s(0).
  • Główny fsm kontroluje, w jakim ogólnym stanie znajduje się system, w zależności od wejść (orx, ms, ns, td) i wyprowadza aktualny stan (sm) przedstawiony w uproszczeniu z dwoma sygnałami, do których jest używany (timer i światła).

    • (timer) to sygnał opakowujący, który jest wysyłany do licznika fsm w dół jako jego wejście i jest kontrolowany przez bieżący stan głównego fsm. Wskazuje, kiedy włączyć timer.
    • (światła) to sygnał opakowujący, który służy do sterowania diodą LED i jest kontrolowany przez bieżący stan głównego fsm.
  • Licznik w dół fsm kontroluje to, co wyświetla siedem segmentów w zależności od wejścia (timer) i wysyła aktualny stan, w którym się znajduje (sd), pokazany w uproszczeniu z dwoma sygnałami, do których jest używany (td i bin).

    • (td) to sygnał opakowujący, który jest wysyłany do głównego fsm jako jego wejście i jest kontrolowany przez bieżący stan licznika fsm w dół. Działa jako sygnał zwrotny, który wskazuje, kiedy timer jest wykonany.
    • (bin) to czterobitowy sygnał opakowania, który jest połączony z czterema bitami zera („0000” i bin), a połączone osiem bitów jest wysyłanych do (q), ośmiobitowego sygnału opakowania, który z kolei jest wysyłany do siedmiu dekoder segmentu pod (ALU_VAL).
  • Moduł siedmiosegmentowy jest taki sam jak w Polylearn; jego główne wejścia przyjmują 8-bitową liczbę (bin) do (ALU_VAL), która jest wyświetlana na czterech różnych wyświetlaczach siedmiosegmentowych, wykorzystując wyjścia (SEGMENTY) do sygnału opakowania (seg) i (DISP_EN) do opakowania (disp_en).

    • Ponieważ dwa lub więcej wyświetlacze siedmiosegmentowe nie mogą wyświetlać różnych cyfr w tym samym czasie, potrzebny jest zegar, aby przechodzić przez cztery segmenty, wyświetlając odpowiednią cyfrę na raz dla każdego segmentu włączanego indywidualnie, a cyklowanie wystarczająco szybko sprawia, że segs wydają się być włączone naraz.
    • (znak i ważny) są stałe w całym tym programie, więc (znak) jest na stałe ustawiony w stanie niskim, a (ważny) jest na stałe ustawiony na wysokim poziomie.
    • (ALU_VAL) przyjmuje jako wejście sygnał opakowania (q), który reprezentuje liczbę, która będzie wyświetlana na siedmiosegmentowym wyświetlaczu w postaci binarnej.
    • Wyjście (SEGMENTS) jest wysyłane do ośmiobitowego sygnału opakowującego (seg) i (DISP_EN) do czterobitowego sygnału opakowującego (disp_en).
  • Istnieje również moduł D flip flop, który nie jest wyraźnie pokazany na schemacie, ale jest potrzebny dla dwóch automatów stanowych jako podmoduły i pomaga synchronicznie przechodzić stany.

    • (3) z nich są potrzebne do głównego fsm, ponieważ 2^(3) = 8 > 5 stanów do kodowania
    • (4) z nich są potrzebne do licznika w dół fsm, ponieważ 2^4 = 16 > 12 stanów do kodowania

Krok 2: Maszyny stanowe

Maszyny państwowe
Maszyny państwowe

Aby właściwie zaprojektować dwie maszyny stanowe, poszczególne stany muszą być jasno zdefiniowane, wraz z ich wyjściami i stanem, do którego przechodzi w oparciu o różne możliwe dane wejściowe.

Główne stany fsm:

„Światła włączone, wykryto ruch” (id = 000)

Światła są włączone, co najmniej jeden z detektorów ruchu wykrywa ruch, więc orx musi być wysoki, a ms jest włączony.

  • Wyjścia: światła = 1 i timer = 0
  • Pozostaje w tym stanie, gdy ms = 1 i orx = 1.
  • Przechodzi do stanu „światła włączone, nie wykryto ruchu”, jeśli ms = 1 i orx = 0.
  • Przechodzi do stanu „ręcznie włączone”, jeśli ms = 0 i ns = 1.
  • Przechodzi do stanu „ręcznie wyłączone”, jeśli ms = 0 i ns = 0.

„Światła włączone, nie wykryto ruchu” (id = 001)

Światła są włączone, żaden czujnik ruchu nie wykrył ruchu, więc orx musi być niski, a ms jest włączone. Również na początku tego stanu licznik czasu ustawiony na wysoki mówi fsm odliczanie, aby rozpocząć odliczanie w dół, kontynuuje odliczanie i przestaje odliczać, gdy odliczanie fsm mówi temu fsm, że odliczanie zostało zakończone.

  • Wyjścia: światła = 1 i timer = 1.
  • Pozostaje w tym stanie, gdy ms = 1 i orx = 0 i td (odliczanie czasu) = 0.
  • Przechodzi do stanu „światła włączone, wykryto ruch”, jeśli ms = 1 i orx = 1.
  • Przechodzi do stanu „światła wyłączone, nie wykryto ruchu”, jeśli ms = 1 i orx = 0 i td = 1.
  • Przechodzi do stanu „ręcznie włączone”, jeśli ms = 0 i ns = 1.
  • Przechodzi do stanu „ręcznie wyłączone”, jeśli ms = 0 i ns = 0.

„Światła wyłączone, nie wykryto ruchu” (id = 010)

Światła są wyłączone, żaden czujnik ruchu nie wykrył ruchu, a zegar zakończył odliczanie, więc orx musi być niski, ms jest włączone, a td jest wyłączone.

  • Wyjścia: światła = 0 i timer = 0.
  • Pozostaje w tym stanie, gdy ms = 1 i orx = 0.
  • Przechodzi do stanu „światła włączone, wykryto ruch”, jeśli ms = 1 i orx =1.
  • Przechodzi do stanu „ręcznie włączone”, jeśli ms = 0 i ns = 1.
  • Przechodzi do stanu „ręcznie wyłączone”, jeśli ms = 0 i ns = 0.

„Włączony ręcznie” (id = 011)

Światła są włączone, czujniki ruchu nie mają znaczenia, więc ms jest wyłączone, a ns włączone.

  • Wyjścia: światła = 1 i timer = 0.
  • Pozostaje w tym stanie, gdy ms = 0 i ns = 1.
  • Przechodzi do stanu „ręcznie wyłączone”, jeśli ms = 0 i ns = 0.
  • Przechodzi do stanu „światła wyłączone, nie wykryto ruchu, jeśli ms = 1.

„Wyłączony ręcznie” (id = 100)

Światła są wyłączone, czujniki ruchu nie mają znaczenia, więc ms jest wyłączone, a ns wyłączone.

  • Wyjścia: światła = 0 i timer = 0.
  • Pozostaje w tym stanie, gdy ms = 0 i ns = 0.
  • Przechodzi do stanu „ręcznie włączone”, jeśli ms = 0 i ns = 1.
  • Przechodzi do stanu „światła wyłączone, nie wykryto ruchu, jeśli ms = 1.

Stan licznika w dół:

„Seg 10” (id = 1010)

Wyświetlacz siedmiosegmentowy pokazuje 10.

  • Wyjścia: bin = „1010” i td = 0.
  • Przechodzi do stanu „seg 9”, jeśli zegar = 1.
  • Przechodzi do stanu „puste 2”, jeśli zegar = 0.

„Seg 9” (id = 1001)

Wyświetlacz siedmiosegmentowy pokazuje 9.

  • Wyjścia: bin = „1001” i td = 0.
  • Przechodzi do stanu „seg 8”, jeśli zegar = 1.
  • Przechodzi do stanu „puste 2”, jeśli zegar = 0.

(Pominięto stany od „Seg 8” do „Seg 2”, ponieważ przebiegają według tego samego wzorca co „Seg 10” i „Seg 9” i nie są konieczne do wyjaśnienia)

„Seg 1” (id = 0001)

Wyświetlacz siedmiosegmentowy pokazuje 1.

  • Wyjścia: bin = „0001” i td = 0.
  • Przechodzi do stanu „puste 2” przy następnym narastającym zboczu zegara (wejście nie jest potrzebne).

„Puste 2” (id = 1111)

Wyświetlacz siedmiosegmentowy pokazuje 0. Celem drugiego stanu pustego jest to, że istnieje oddzielny stan, gdy td = 1 dla bezpieczeństwa.

  • Wyjścia: bin = „1111” i td = 1.
  • Przechodzi do stanu „puste 1” przy następnym narastającym zboczu zegara (wejście nie jest potrzebne).

„Puste 1” (id = 0000)

Wyświetlacz siedmiosegmentowy pokazuje 0. Jest to stan, w którym system pozostaje, gdy główny automat stanu jest w stanie „świeci się, nie wykryto ruchu”.

  • Wyjścia: bin = „0000” i td = 0.
  • Przechodzi do stanu „seg 10”, jeśli zegar = 1.

Krok 3: Tabele prawdy maszyny stanów, równania wzbudzenia i równania wyjściowe

Tabele prawdy maszyny stanów, równania wzbudzenia i równania wyjściowe
Tabele prawdy maszyny stanów, równania wzbudzenia i równania wyjściowe
Tabele prawdy maszyny stanów, równania wzbudzenia i równania wyjściowe
Tabele prawdy maszyny stanów, równania wzbudzenia i równania wyjściowe
Tabele prawdy maszyny stanów, równania wzbudzenia i równania wyjściowe
Tabele prawdy maszyny stanów, równania wzbudzenia i równania wyjściowe
Tabele prawdy maszyny stanów, równania wzbudzenia i równania wyjściowe
Tabele prawdy maszyny stanów, równania wzbudzenia i równania wyjściowe

Następnym krokiem jest utworzenie tabel prawdy dla dwóch maszyn stanowych oraz równań wzbudzenia i równań wyjściowych dla każdego fsm. Dla każdego równania wzbudzenia fsm muszą być równania dla każdego następnego zakodowanego bitu stanu w odniesieniu do bieżącego stanu i jego sygnałów wejściowych. Dla każdego równania wyjściowego fsm muszą istnieć równania dla każdego sygnału wyjściowego w odniesieniu do aktualnego stanu. Wszystkie cztery zestawy równań można wyciągnąć z przedstawionych tabel prawdy. (qn jest kolejnym zakodowanym bitem stanu dla każdego automatu stanów, a q jest stanem bieżącym)

(000) równoważne q(2)'q(1)'q(0)' i (0000) równoważne q(3)'q(2)'q(1)'q(0)'

(np. (0101) to q(3)'q(2)q(1)'q(0), a (110) to q(2)q(1)q(0)')

Równania wzbudzenia dla głównego 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)]

Równania wyjściowe dla głównego fsm:

  • światła = (000) + (001) + (100)
  • minutnik = (001)

Równania wzbudzenia dla licznika dolnego 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)]

Równania wyjściowe dla licznika dolnego fsm:

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

Krok 4: Opakowanie, podmoduły i ograniczenie

Jak wyjaśniono już w kroku 1, te moduły są potrzebne do tego projektu i wszystkie są powiązane z modułem opakowującym zatytułowanym „final_proj.vhd”. Plik ograniczenia zatytułowany "Basys3_Master.xdc" jest używany do łączenia wszystkich wejść i wyjść opakowujących z przełącznikami, siedmioma segmentami i portami we/wy na płycie Basys 3. Przełącznik główny powinien być przełącznikiem na płycie najbliżej strony, po której są przewody, przełącznik normalny/ręczny jest drugim najbliższym, a trzy przełączniki reprezentujące trzy czujniki ruchu to trzy przełączniki bezpośrednio obok przełącznika normalnego/ręcznego. Cały kod (równania logiczne, deklaracje modułów itp.) jest już zapisany w plikach, więc nie musisz nic więcej pisać, aby to zadziałało.

Krok 5: Porty we/wy dla diody LED

Porty we/wy dla diod LED
Porty we/wy dla diod LED
Porty we/wy dla diod LED
Porty we/wy dla diod LED

Ostatnim krokiem w tym projekcie jest użycie diody LED, aby pokazać, czy (światła) faktycznie włączają się i wyłączają. Okablowanie pokazano na dwóch zdjęciach. Upewnij się, że dioda LED jest połączony szeregowo z rezystorem (co najmniej 330 omów), aby nie przepalić diody LED i upewnij się, że długi pin diody LED jest podłączony do tego samego złącza żeńskiego na płycie podstawy, co pokazano na czerwonym przewodzie (góra najbardziej na prawo), a krótszy pin jest podłączony do uziemienia, ta sama żeńska główka, co pokazano na czarnym przewodzie (góra, druga od lewej).

Zalecana: