Opis projektu
Projekt dla układu FPGA składa się z kilku plików w języku VHDL oraz pliku ADC.qsys, w którym jest konfigurowany blok przetwornika analogowo-cyfrowego. Schemat blokowy projektu z podziałem na elementy opisane za pomocą języka VHDL pokazano na rysunku 4.
Blok Distance2 jest plikiem najwyższym w hierarchii oraz zawiera wszystkie bloki niezbędne do poprawnego działania projektu. Dodatkowo, w pliku Distance2 jest zaimplementowany automat sterujący, który uruchamia czujnik oraz steruje rejestrami zawierającymi się w bloku Distance2.
Moduły funkcjonalne
Blok Distance2 jest głównym blokiem hierarchii. Zawiera w sobie bloki niezbędne do pracy projektu oraz implementację maszyny stanów sterującą rejestrami reg_12 oraz reg_15. Jego wejścia oraz wyjścia są opisane w tabeli 1.
Automat zaczyna cykl pracy od stanu idle, w którym się znajduje, dopóki użytkownik nie naciśnie przycisku „R” na nakładce MAXimator Expander. Po wciśnięciu przycisku automat przechodzi do stanu set_en, w którym wyjście en ustawia się w stan wysoki, co uruchamia pomiar odległości czujnikiem. Jednocześnie, ustawia się licznik zliczający w dół Counter_26m w stan początkowy (same jedynki) oraz resetuje się rejestr reg_15. Dodatkowo, w tym stanie jest resetowany licznik Counter_3bit, używany do zliczania numeru próbki ładowanej do akumulatora.
W następnym stanie wait_26ms automat zostaje do chwili aż na wyjściu licznika Counter_26m pojawią się same zera, co zachodzi po upłynięciu około 26 ms, gdy licznik jest taktowany zegarem 10 MHz. W tym stanie wejście en jest nadal utrzymywane w stanie wysokim, co jest potrzebne do poprawnej pracy czujnika.
Po załadowaniu ośmiu próbek do akumulatora automat przechodzi do stanu load_display_reg, w którym starsze 12 bitów z rejestru reg_15 są ładowane do rejestru reg_12, co jest dzieloną przez 8 wartością przechowywaną w akumulatorze, czyli wartością średnią ośmiu zmierzonych próbek. Następnie automat wraca do stanu idle.
Wyjście rejestru reg_12 jest połączone z wejściem address bloku v_to_cm, który jest pamięcią typu ROM, zawierającą skalibrowane dane długości odpowiadających poszczególnym wartościom napięć z przetwornika analogowo-cyfrowego. Pamięć zawiera 4096 słów 8-bitowych. Dane skalibrowane przechowuje się w ten sposób, że 12-bitowa wartość napięcia, mierzona przez przetwornik analogowo-cyfrowy, jest adresem odpowiadającej jej 8-bitowej wartość długości w cm. Zawartość pamięci jest przechowywana w pliku ROM8.mif.
Wyjście q bloku v_to_cm jest podłączone do wejścia x bloku x7seg, obsługującego wyświetlacz ośmiosegmentowy, w tym konwersję wartości binarnej na kod BCD. Plik x7seg jest wzięty ze strony maximator-fpga.org.
Żeby skalibrować czujnik od nowa, należy uruchomić miernik odległości w trybie kalibracji. W tym celu należy zakomentować/odkomentować odpowiednie sekcję w pliku Distance2. W trybie kalibracji wyjście rejestru reg_12 jest podłączone bezpośrednio do bloku obsługi wyświetlacza x7seg, czyli na wyświetlaczu ośmiosegmentowym są wyświetlane wartości 12-bitowe zmierzonego napięcia. Należy przeprowadzić szereg pomiarów odległości oraz odpowiadających im napięć, a następnie przeprowadzić aproksymacje (np. za pomocą pliku generate_ROM.m) oraz przenieść uzyskane wartości do pliku ROM8.mif.
Aleh Halauko
Więcej informacji:
Projekt powstał w Instytucie Systemów Elektronicznych WEiTI Politechniki Warszawskiej, pod kierunkiem dra inż. Mariusza Suchenka. Kody źródłowe projektu prezentowanego w artykule są dostępne do pobrania na stronie http://www.maximator-fpga.org.