W odróżnieniu od wcześniej prezentowanych projektów, projekt prezentowany w artykule wymaga dołączenia nie tylko shielda maXimator Expander (na którym umieszczono wyświetlacze LED oraz sensor temperatury STLM20 – fotografia 1), ale także linijki z 8 diodami LED-RGB WS2812B. W przykładzie użyto modułu KAmodWS2812-8, który dołączono do układu FPGA za pomocą pinów UART-a (fotografia 2):
- GND " GND,
- +VDD " +5V,
- Din " TxD.
Wszystkie oznaczenia są umieszczone na płytkach, jak widać na fotografii. Układ zacznie działać od razu po włączeniu zasilania.
Opis projektu
Projekt składa się z czterech plików napisanych w języku VHDL. Plik główny rgb_termometr (najwyższy poziom w hierarchii) zawiera wszystkie niezbędne elementy do odczytania wartości napięcia z przetwornika analogowo-cyfrowego oraz przekazuje te wartości do bloków obsługujących wyświetlacz i diody RGB.
Blok opisany w pliku wysw (rysunek 3) odpowiada za obsługę wyświetlacza siedmiosegmentowego oraz algorytmy do uśredniania i obliczania temperatury w stopniach Celsjusza. Blok opisany w pliku led_gen pobiera wartość temperatury z bloku wysw i na tej podstawie ustala ile i jakich kolorów powinno być wyświetlonych na diodach RGB. Blok opisany w pliku led_sterownik zamienia kod koloru podawany przez led_gen na sygnał szeregowy, który jest wysyłany na linijkę diod.
Moduły funkcjonalne
led_sterownik (tabela 2). Blok led_sterownik zrealizowano jako maszynę stanów. Przechodzi ona przez 5 stanów: wysoka jedynka (h1), niska jedynka (l1), wysokie zero (h0), niskie zero (l0) oraz stan reset (resett).
Moduł wybiera nowy kolor, kiedy sygnał load_next – pochodzący z modułu led_sterownik – jest równy 1. Na podstawie 4 najwyższych bitów wartości temperatury wejściowej temperature_b_2 określa, w jakim kolorze będzie wyświetlana temperatura. Progi kolorów wyglądają następująco: 12…15,5– ciemnoniebieski, 16…19,5– jasnoniebieski, 20…23,5 – zielony, 24…27,5 – żółty, 28…31,5 – czerwony, 32,0…35,5 – różowy. Kod koloru jest zapisywany do sygnału temp_color. Na podstawie wartości 3 najmłodszych bitów ustalane jest, ile z ośmiu diod modułu KAmodWS2812-8 powinno być włączonych. Dla wartości 0 jest to 1 dioda. Kiedy na 3 najmniej znaczących bitach w sygnale temperature_b_2 są same jedynki, to włączone są wszystkie diody.
Kody kolorów są wysyłane jeden po drugim. Licznik count_diodes odlicza, ile kolorów diod powinno być jeszcze wysłanych i ustala na wyjściu selected_color wartość temp_color, jeżeli dioda ma się świecić lub same zera, jeżeli dioda nie powinna się świecić. Po ośmiu kolorach licznik count_diodes przyjmuje wartość 8 i ustawia bit if_last, który sygnalizuje, że więcej kolorów nie będzie wysyłanych.
wysw (tabela 4). Moduł wysw jest odpowiedzialny za konwertowanie temperatury z przetwornika A/C do zadanych formatów oraz wyświetlaniu jej na wyświetlaczu siedmiosegmentowym. W module występuje sygnał slow_clk, który jest inkrementowany przy każdym zboczu narastającym zegara. Służy on jako wejście ‚clock enable’ do wyzwalania procesów, które należy włączać z dużo mniejszą częstotliwością niż częstotliwość głównego sygnału zegarowego.
temperature_temp2 = 3047 – temperature_temp1;
temperature_b_10 = t_przejściowa * 8 + temperature_temp2/4 + temperature_temp2/32 + temperature_temp2/64;
W ten sposób otrzymana jest temperatura w stopniach Celsjusza, gdzie bity temperature_b_10(12 downto 4) oznaczają temperaturę pomnożoną przez 10 (np. 0x018 to 2,4 stopnia).
W tym samym miejscu jest wyliczana temperatura przestawiona jako binarna wartość w stopniach Celsjusza, gdzie najmniej znaczący bit to 0,5 stopnia (temperature_b_2). Przekazywana jest ona do modułu, gdzie jest wykorzystywana do wyświetlania temperatury na diodach RGB. W procesie tym przeliczana jest także temperatura z postaci binarnej do kodu BCD za pomocą funkcji to_bcd - najwyższe bity sygnału temperature_b_10(12 downto 4) przekształcane do sygnału BDC temperature_decimal_10. Po cztery kolejne bity odpowiadają za kolejne cyfry.
Moduł daje możliwość wybrania jasności wyświetlacza siedmiosegmentowego poprzez wybranie na wejściu brightness odpowiedniej wartości od 0 do 15. Zrealizowane jest poprzez sprawdzanie czy 4 bity rejestru slow_clk(7 downto 4) są mniejsze, czy większe od wartości brightness. Jeżeli warunek jest spełniony, to wyświetlacz jest gaszony. W projekcie termometru jasność na stałe jest ustawiona na wartość maksymalną.
termometr_rgb (tabela 5). Najwyżej położony w hierarchii moduł opisowy w VHDL, łączy wszystkie wyżej wymienione modułu oraz zawiera przetwornik ADC, który pobiera wartość z pinu wejścia analogowego numer 0. Jest on podłączony do kanału 15. Przetwornik zawiera moduły adc, fingertemp_adc_sequencer oraz pętlę pll generującą zegary na podstawie zegara wejściowego 10 MHz. Wartość z przetwornika jest zapisywana do sygnału counter, który jest wysyłany do bloku wysw. Blok ten zwraca sygnały, które są kierowane na piny do obsługi wyświetlacza siedmiosegmentowego oraz przekazuje sygnał z informacją o temperaturze do bloku led_gen. Blok ten przekazuje i dobiera sygnały z bloku led_sterownik, który na podstawie otrzymanej wartości koloru tworzy sygnał diodes_LED, który jest wyprowadzony na pin do sterowania diodami RGB.
Piotr Klasa, AGH