
1. Dlaczego powstał ten projekt? Założenia.
Od paru lat fascynowało mnie zbudowanie własnego oscyloskopu i poznanie pewnych problemów tej tematyki "od podszewki". Pierwsze praktyczne próby realizacji tego tematu podjąłem w czasie studiów, gdy w moje ręce pierwszy raz trafił zestaw maXimator - wyposażony w układ Intel FPGA (dawniej Altera) MAX10 10M08DAF256C8G, który na pokładzie posiada wbudowany przetwornik ADC.
Założeniami pierwszej, jak i kolejnych wersji projektu była maksymalna prostota, bazowanie na zasobach dostępnych na płytce maXimator http://maximator-fpga.org/ oraz przede wszystkim walory dydaktyczno-edukacyjne - tak abym sam coś wyniósł z projektu, oraz abym mógł zaprezentować pewien prosty model oscyloskopu cyfrowego innym.
2. Jak zbudowany jest oscyloskop?

Podstawowy oscyloskop cyfrowy zaraz za wejściem sygnału posiada odpowiedni układ wejściowy oraz kondycjonujący. Pierwszy z nich ma za zadanie zapewnić odpowiednie parametry wejścia, zaś drugi ma za zadanie tak dopasować sygnał, aby w optymalny sposób wykorzystać zakres pracy przetwornika (w tym zapobiegać aliasingowi). Od razu zdradzę, że tego bloku w swoim oscyloskopie... nie zrealizowałem.
Następnie sygnał podawany jest na wejście przetwornika, z którego dane cyfrowe kierowane są do pamięci akwizycji. Jak się domyślamy w tych okolicach będzie realizowane także wyzwalanie.
Później dane są zwykle przetwarzane (np. uśredniane, wyliczanie funkcji matematycznych) i kierowane dalej do pamięci wyświetlania, na podstawie zawartości której generowany jest obraz na ekranie.
3. Pierwsza wersja oscylo(
Pierwsza wersja projektu była bardzo uboga - dane z przetwornika (1 kanał) kierowane były bezpośrednio do pamięci wyświetlacza, zaś wyzwalanie realizowane było za pomocą przycisku. Użytkownik nie miał do wyboru żadnych ustawień. Wyświetlaczem zaś stał się monitor z interfejsem VGA. Przy okazji realizacji tego zalążka obecnej wersji projektu poradziłem sobie z kilkoma wyzwaniami. Po pierwsze z samą obsługą przetwornika ADC w układach MAX10, po drugie z generowaniem obrazu przy braku pamięci RAM (wbudowanej w FPGA) mieszczącej całą ramkę obrazu - zaprojektowałem wtedy system generowania obrazu (wyświetlania linii) "w locie" na podstawie zapisanych w pamięci wyświetlania wartości próbek sygnału oraz także w locie udało mi się nałożyć na taki wykres siatkę. Rozwiązanie takie jednak pozostawiało niedosyt...
4. Jak zbudowany jest mój projekt?

Mój docelowy system postanowiłem oprzeć na systemie mikroprocesorowym z rdzeniem Nios II e. Jest to darmowy soft-procesor, czyli procesor syntezowany w układzie FPGA i udostępniający magistralę Avalon Memory Mapped (Avalon-MM), która umożliwia podpięcie do systemu dowolnych (dostarczonych przez producenta i samodzielnie stworzonych) komponentów.
Oprócz rdzenia w systemie znalazły się:
A. Pamięć RAM procesora - stanowiąca pamięć operacyjną oraz pamięć programów. Pamięć ta jest inicjalizowana zawartością stanowiącą kod programu.
B. Timer - używany do odmierzania czasu w różnych okolicznościach
C. Porty GPIO - do prostej sygnalizacji pracy systemu za pomocą diod oraz do obsługi 3 przycisków umożliwiających poruszanie się po menu
D. Moduł UART - mogący służyć do komunikacji z komputerem
E. Moduł wyświetlacza VGA - przygotowany przeze mnie moduł wysyłający obraz za pomocą interfejsu VGA, wyposażony we własną pamięć RAM
F. Moduł akwizycji danych, umożliwiający pobieranie danych z 1 lub 2 kanałów, realizujący wyzwalanie i także wyposażony we własną pamięć RAM
Poniżej omówię budowę 2 ostatnich komponentów
5. Moduł akwizycji danych

Do modułu tego podłączony jest przetwornik ADC układu MAX10, z wykorzystaniem magistrali Avalon Streaming (Avalon-ST). Przetwornik pracuje z maksymalną możliwą prędkością 1MSPS, zaś w przypadku wyboru przez użytkownika innych podstaw czasowych zachodzi decymacja próbek (zatem przy jednym kanale próbujemy 1MSPS, zaś przy 2 dzielimy tę prędkość na 2). Moduł kontroluje przetwornik, w szczególności w trybie 2 kanałów odpowiednio przełącza multiplekser przetwornika, aby pobierać dane naprzemiennie z obu kanałów (tryb CHOP znany ze starszych oscyloskopów). Tu także realizowane jest po stronie cyfrowej wyzwalanie.

Wyzwanie z którym spotkałem się na tym etapie to zaszumiony przebieg - proste wykrywanie przejścia przez próg wyzwalania nie dawało zadowalających efektów. Dlatego też wprowadziłem histerezę, dzięki której wyzwalanie jest stabilne. Próbki są zbierane od momentu wyzwolenia aż do zapełnienia pamięci. Nie stosowałem bufora kołowego, dlatego też moment wyzwolenia zawsze znajduje się na początku zebranych danych.
Konfiguracja pracy tego modułu jak i zebrane dane są dostępne za pośrednictwem magistrali Avalon-MM
6. Moduł wyświetlania

Jak już wspomniałem moduł wyświetlania stanowił wyzwanie z powodu mocno ograniczonej ilości pamięci RAM, i obraz o rozdzielczości 1024x768 generowany jest przez to w locie. Generator sygnałów synchronizacyjnych VGA w trakcie skanowania ramki udostępnia adres aktualnie wyświetlanego piksela. Adres ten jest porównywany z odpowiednimi wartościami przez generatory wykresów, tekstu, poziomu wyzwalania oraz siatki. Jeśli dany moduł stwierdzi (na podstawie danych zawartych w jego pamięci bądź zakodowanych na stałe (siatka), że dany piksel należy do obsługiwanego przez niego obrazu, przesyła informację do multipleksera priorytetowego. On z kolei decyduje o tym, który obraz ma pierwszeństwo (będzie na wierzchu) i podaje dane piksela modułowi VGA.
Dane wykresów przechowywane są jako wartości próbek do wyświetlenia (3 wykresy: 2 kanały + kanał matematyczny), mapa pikseli (tekst) lub pojedyncza wartość (poziom wyzwalania). Także tu konfiguracja modułu i zapis danych odbywa się za pośrednictwem magistrali Avalon-MM
7. Jakie funkcje ma oscyloskop, czyli o oprogramowaniu kilka słów


Sam sprzęt, zaprojektowany w języku VHDL nie robiłby nic ciekawego, gdyby nie oprogramowanie.
A. System udostępnia możliwość wyboru dowolnego jednego lub 2 kanałów
B. Wyzwalanie na zboczu narastającym/opadającym z programowanym poziomem i histerezą, z wyborem kanału
C. Tryby wyzwalania: auto, normal, single
D. Możliwość zmiany podstawy czasu
E. Dla każdego kanału zmieniane wzmocnienie i offset (cyfrowy - wszak nie ma układu kondycjonującego) i możliwość wyłączenia
F. Kanał matematyczny (konfigurowany również jako powyżej) z funkcjami +, -, *, /
Menu użytkownika wyświetlane jest w górnej linii ekranu w formie tekstowej. Za pomocą jednego przycisku przechodzi się pomiędzy opcjami, a za pomocą 2 kolejnych można zwiększać i zmniejszać dany parametr (wskazywany znakiem >)
8. Podsumowanie i refleksja.
Ostatecznie udało mi się zrealizować założenia, które miałem. Wiele nauczyłem się przy tym projekcie, o czym najlepiej chyba świadczy fakt, że gdybym teraz miał taki zrobić to wiele rzeczy zrobiłbym lepiej, co jednak nie umniejsza satysfakcji i zadowolenia z obecnego stanu rzeczy. Co najciekawsze chyba, to fakt, że cały oscyloskop jest realizowany... jednoukładowo, od przetwornika aż po wyświetlacz.
9. Materiały
Rzecz jasna udostępniam cały projekt wszystkim zainteresowanym:
https://gitlab.com/piotrva/maximator-scope
Informacje o płytce:
http://maximator-fpga.org/
Artykuł z opisem w j. angielskim:
http://pak.info.pl/index.php?menu=artykulSzczegol&idArtykul=4718
10. Parametry
Oszałamiające nie są:
A. Próbkowanie: 1MSPS (1 kanał), 0.5MSPS (2 kanały)
B. Zakres napięć wejściowych: 0-2.5V
C. Pasmo: a kto to wie - na wejściach goldpin są przed układem FPGA rezystory i diody zabezpieczające przed zbyt wysokim napięciem - uznałem określanie pasma za nieistotne
D. Ilość próbek: 1024
E. Rozdzielczość: 9-bit
PS. Jakość obrazu jest w rzeczywistości dużo lepsza niż na załączonych "zrzutach" - ich rozmazanie i słaba rozdzielczość są spowodowane kiepskim systemem przechwytywania złożonym z konwertera VGA->S-VIDEO oraz urządzenia do przechwytywania sygnału wideo na USB.
Cool? Ranking DIY