Edytor graficzny, który poznaliśmy w poprzedniej części kursu podstaw FPGA jest bardzo prosty i przyjazny - szczególnie dla początkujących.
Oczywiście spisuje się on równie dobrze przy trochę bardziej rozbudowanych projektach. W tej części kursu zajmiemy się rysowaniem układów, które korzystają z kilku bramek i magistral.
Pora na kolejną aplikację. Tym razem wykorzystamy wielowejściową bramkę OR oraz 4 przyciski (SW1, SW2, SW3, SW4). Wyjściem układu będzie dioda D8.
Ilustracja realizowanego zadania.
Zaczynamy od stworzenia nowego projektu i dodania pliku typu Schematic (identycznie jak w poprzedniej części kursu). Klikamy na narzędzie Add Symbol, wybieramy kategorię Logic i z dostępnych symboli wybieramy or4. Układamy element na schemacie i przechodzimy do stworzenia magistrali. W tym celu wybieramy narzędzie Add wire.
Narzędzie Add Wire.
Na schemacie rysujemy pionową linię, aby uzyskać efekt zgodny z poniższym zrzutem ekranu. W celu narysowania magistrali klikamy lewym przyciskiem myszy na jej początku, a następnie końcu. Rysowanie kończymy wciskając klawisz Esc. Linia ta będzie stanowiła magistrale wejść dla bramki OR.
Schemat po umieszczeniu bramki OR i umieszczeniu przewodu-magistrali.
Po wybraniu narzędzia do zaznaczania można kliknąć na narysowany przewód i go przesunąć. Z kolei klikając na końcach przewodów można zmienić długość magistrali.
Wybieramy teraz narzędzie do podpisywania przewodów:
Narzędzie do podpisywania przewodów - Add Net Name.
Po lewej stronie Xilinx ISE pojawi się zakładka Options, którą należy wypełnić zgodnie z poniższym zrzutem ekranu. Szczególną uwagę należy zwrócić na pole "Name"!
Zawartość zakładki "Options" - podczas podpisywania - przewodu, magistrali wejść.
Po wpisaniu nazwy do naszego kursora "przyklei" się nazwa wpisana w pole Name. Klikamy wtedy na narysowany wcześniej przewód. W tym momencie schemat powinien wyglądać następująco:
Schemat po podpisaniu magistrali.
Teraz łączymy bramkę z magistralą za pomocą narzędzia Add Bus Tap.
Narzędzie do tworzenia podczepień do przewodów - Add Bus Tap.
Narzędzie to służy do tworzenia połączeń między magistralą, a konkretnym wyprowadzeniem układu (w tym przypadku bramki logicznej). Teraz warto zwrócić uwagę na zakładkę Options. Powinna być tam zaznaczona opcja Left. Następnie klikamy blisko przewodu Switch(0:3) na wysokości jednego z wejść bramki OR. Operację powtarzamy dla wszystkich 4 wejść, aż do uzyskania następującego schematu:
Gdy będziemy klikać "blisko" magistrali, a nie bezpośrednią na niej to ISE samo doczepi połączenie oraz doda mu odpowiednią nazwę.
Doczepianie połączeń do magistrali.
Teraz musimy jeszcze dodać bramki NOT na każdym wejściu naszej bramki OR. Robimy to, ponieważ na zestawie ElbertV2 przyciski po ich naciśnięciu zwierają do masy. Oznacza to, że domyślnie wejścia z przyciskami wystawiają jedynkę logiczną. Umieszczenie bramek NOT odwróci to działanie.
Gotowe zestawy do kursów Forbota
Komplet elementów Gwarancja pomocy Wysyłka w 24h
Zestaw uruchomieniowy Elbert v2 - Spartan 3A z wszystkimi niezbędnymi peryferiami do wykonania ćwiczeń z kursu FPGA!
Masz już zestaw? Zarejestruj go wykorzystując dołączony do niego kod. Szczegóły »
Po dodaniu bramek NOT łączymy je z wyprowadzeniami magistrali oraz z bramki za pomocą narzędzia Add Wire. Połączenia wykonuje się przez klikanie na kwadraciki umieszczone na końcach przewodów.
Zamiast rysowania linii można również nasunąć na siebie wyprowadzenia funktorów, połączą się one wtedy automatycznie. Nam pozostanie rozsunąć elementy, aby schemat był przejrzysty.
W tym momencie schemat powinien wyglądać mniej więcej tak, jak na poniższym zrzucie ekranu:
Schemat po umieszczeniu bramek NOT i połączeniu odczepów.
Jeśli odczepy nie zostały wcześniej podpisane (tak jak na powyższym zrzucie) to należy podpisać je teraz ręcznie korzystając z narzędzia Add Net Name. Odczepy nazywamy kolejno Switch(0)...Switch(3).
Teraz została nam do przeprowadzenia ostatnia operacja na schemacie - zaetykietowanie magistrali, do której przed momentem tworzyliśmy odczepy. Wystarczy wybrać narzędzie Add I/O Marker i kliknąć na górnym kwadraciku magistrali - etykieta z właściwym oznaczeniem zostanie utworzona automatycznie.
Przed kliknięciem upewniamy się, że w Options zaznaczone jest Add an automatic marker.
Na koniec dodajemy etykietę dla wyjścia bramki OR - tutaj nadajemy nazwę LED0 (identycznie jak w poprzedniej części kursu). Ostatecznie schemat powinien wyglądać następująco:
Tak jak zawsze konieczne jest przygotowanie pliku UCF. Tym razem powinien wyglądać następująco:
CONFIG VCCAUX = "3.3" ;
####################################################################################################
# LED
####################################################################################################
#
NET "LED0" LOC = P46 | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
#
####################################################################################################
# Switches
####################################################################################################
#
NET "Switch[0]" LOC = P80 | PULLUP | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
NET "Switch[1]" LOC = P79 | PULLUP | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
NET "Switch[2]" LOC = P78 | PULLUP | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
NET "Switch[3]" LOC = P77 | PULLUP | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
Po wgraniu na płytkę program powinien działać zgodnie z oczekiwaniami. Czyli wciśnięcie dowolnego przycisku (lub kilku jednocześnie) spowoduje włączenie diody:
Efekt działania opisywanego programu.
Łączenie bramek - projekt automatycznych drzwi
W kursie #3 odcinku kursu techniki cyfrowej budowaliśmy prosty sterownik drzwi automatycznych. Spróbujmy odtworzyć go teraz na naszym FPGA. Dla przypomnienia:
Wyobraźmy sobie automatycznie otwierane drzwi. Aby je otworzyć, należy stanąć na platformie przed nimi i wcisnąć przycisk po lewej lub po prawej stronie. Taki sposób otwierania powstał po to, aby przypadkowo przechodzący przed nimi ludzie (czyli stąpający po platformie) nie otwierali ich. Jednocześnie nie może ich otworzyć małe dziecko, ponieważ jest zbyt lekkie, aby wcisnąć platformę.
Przycisk po lewej, prawej i platforma przed drzwiami.
Funkcja, którą będziemy implementować wygląda następująco:
LED0 = S0 AND (S1 OR S2)
Dla zapewnienia, że nasz układ działa intuicyjnie - musimy na wejściach naszego układu wstawić bramki NOT, by po naciśnięciu przycisku nasz układ widział to jako jedynkę logiczną.
W praktyce wyjdzie nam więc z tego bardziej rozbudowana funkcja:
LED0 = (NOT S0) AND ((NOT S1) OR (NOT S2))
Tworzymy nowy projekt z plikiem typu Schematic. Wykorzystując zdobytą już wiedzę rysujemy schemat układu realizującego powyższą funkcję. Gotowy schemat może wyglądać tak jak na poniższym zrzucie ekranu (przycisk SW1 z zestawu ElbertV2 odpowiada Switch(0) itd).
Gotowy schemat zawierający układ automatycznego otwierania drzwi.
Koniecznie pamiętaj, aby magistralę z wejściami najpierw nazwać narzędziem Add Net Name, w przeciwnym razie program uniemożliwi dodanie odczepów.
Dodawanie pliku UCF
Poniżej plik UCF dla tego projektu:
CONFIG VCCAUX = "3.3" ;
####################################################################################################
# LED
####################################################################################################
#
NET "LED0" LOC = P46 | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
#
####################################################################################################
# Switches
####################################################################################################
#
NET "Switch[0]" LOC = P80 | PULLUP | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
NET "Switch[1]" LOC = P79 | PULLUP | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
NET "Switch[2]" LOC = P78 | PULLUP | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
Po wgraniu program powinien działać zgodnie z przyjętymi założeniami. Dioda zaświeci się tylko, gdy wciśniemy przycisk SW1 oraz SW2 i/lub SW3.
Efekt działania opisanego programu.
Tworzenia projektu w VHDL vs. rysowanie schematu
Na zakończenia, w ramach ciekawostki, umieszczamy kod VHDL, który robi dokładnie to samo, co powyższy schemat.
-- dodajemy biblioteki
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity automatyczne_drzwi is
Port ( Switch : in STD_LOGIC_VECTOR(2 downto 0); -- przyciski SW1, SW2 i SW3
LED0 : out STD_LOGIC); -- Dioda D8 jako wyjscie
end automatyczne_drzwi;
architecture Behavioral of automatyczne_drzwi is
begin
LED0 <= (not Switch(0)) and ((not Switch(1)) or (not Switch(2)));
end Behavioral;
W małych i średnich projektach wybór metody zależy w dużej mierze od gustu konstruktora. Jednak w większych aplikacjach schematy stają się zbyt nieczytelne, a ewentualne modyfikacje bardzo niewygodne, stąd metoda ta raczej stosowana jest tylko przy małych i średnich projektach.
Podsumowanie
Za nami kolejne eksperymenty z edytorem graficznym. Koniecznie dajcie znać w komentarzu, które podejście (kod vs. grafika) jest dla Was wygodniejsze! Zachęcamy również do testów we własnym zakresie i dzielenia się swoimi projektami na naszym forum. W kolejnym odcinku przyjdzie pora na sprawdzenie zdobytych umiejętności.
Autor kursu: Adam Bemski Redakcja: Damian Szymański
Ilustracje, testy: Piotr Adamczyk
Autorem kursu jest Adam Bemski, specjalista od systemow wbudowanych. Pracuje w obszarze automatycznego testowania urządzeń z funkcjonalnością IoT. Adam dodatkowo prowadzi zajęcia z techniki mikroprocesorowej na wyższej uczelni DHBW Stuttgart. Więcej szczegółów o Adamie na blogu adambemski.com.
Dołącz do 30 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY na bazie Arduino i Raspberry Pi.
Dołącz do 30 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY z Arduino i RPi.
Trwa ładowanie komentarzy...