Streszczenie
FPGA jest naturalnym narzędziem do dwóch zadań, które w aparaturze pomiarowej często występują razem: deterministycznego generowania sekwencji oraz równoległej akwizycji szybkich danych. Mikrokontroler wykonuje instrukcje po kolei; FPGA buduje sprzęt, w którym licznik czasu, komparatory, rejestry wyjściowe, bufor próbek i znaczniki czasu działają równolegle.1,2
W tym artykule FPGA jest traktowane jako rdzeń bezpiecznego stanowiska laboratoryjnego: wyzwala pomiary, synchronizuje moduły, zbiera impulsy z detektorów, porządkuje próbki i przekazuje dane do komputera. Nie jest to instrukcja budowy układów uzbrajania ani sterowania ładunkami; nacisk pada na radiometrię, dydaktykę, akwizycję danych, diagnostykę i kontrolę jakości pomiaru.3,4
Rozszerzenie tematu
Dwa zadania: wystawić sygnał i zapisać zdarzenie
W aparaturze jądrowej i pokrewnej często trzeba zrobić dwie rzeczy naraz. Po pierwsze, w zadanej chwili wystawić sygnał: start pomiaru, bramkę akwizycji, impuls testowy, znacznik czasu, reset układu albo synchronizację kilku urządzeń. Po drugie, trzeba odebrać odpowiedź: impuls z detektora, próbki z ADC, status komparatora, licznik zdarzeń albo obraz z kamery.
To jest dokładnie miejsce, w którym FPGA ma przewagę nad mikrokontrolerem. W mikrokontrolerze jedna instrukcja konkuruje z drugą, przerwania wprowadzają jitter, a wiele kanałów trzeba obsługiwać przez ten sam rdzeń. W FPGA każdy kanał może mieć własny licznik, własny komparator i własny bufor. Wszystkie działają równolegle, synchronicznie z zegarem.1
Najprostszy model stanowiska wygląda tak:
- sygnał
STARTtrafia do synchronizatora, - licznik czasu zaczyna zliczać takty,
- tabela progów określa, kiedy wystawić sygnały wyjściowe,
- wejścia detektorów są próbkowane albo zliczane,
- zdarzenia dostają znaczniki czasu,
- próbki trafiają do bufora,
- komputer odczytuje dane i metadane pomiaru.
To jest architektura aparaturowa, a nie receptura na konkretny układ wojskowy. Te same bloki można wykorzystać do ćwiczeń z licznikiem GM, spektrometrii scyntylacyjnej, testowania toru analogowego, synchronizacji szybkiej kamery albo dydaktycznego modelu czasu martwego.
Generator sekwencji
Generator sekwencji w FPGA można zbudować z kilku prostych elementów. Licznik czasu zlicza takty od sygnału startu. Rejestry konfiguracyjne przechowują moment początku i końca impulsu dla każdego kanału. Komparatory porównują licznik z tymi progami. Rejestry wyjściowe ustawiają albo kasują kanały w odpowiednim takcie.
Takie rozwiązanie jest bardzo przewidywalne. Jeśli zegar ma okres 5 ns, podstawowa rozdzielczość sekwencji wynosi 5 ns. Jeśli potrzebna jest drobniejsza regulacja, można użyć wielofazowych zegarów, bloków SERDES, ODELAY albo zewnętrznych generatorów opóźnień. Zawsze jednak trzeba pamiętać, że rozdzielczość nastawy to nie to samo co dokładność. Dokładność ograniczają jitter zegara, skew między kanałami, opóźnienia wyjść, złącza, kable i odbiorniki.2,5
W bezpiecznym zastosowaniu laboratoryjnym kanałami generatora mogą być:
| Kanał | Przykład bezpiecznej funkcji |
|---|---|
gate |
otwarcie okna zliczania |
trigger |
wyzwolenie oscyloskopu albo rejestratora |
test pulse |
pobudzenie wejścia testowego wzmacniacza małą amplitudą |
camera sync |
sygnał synchronizacji kamery albo lampy LED |
marker |
znacznik czasu zapisany równolegle z danymi |
Kluczowa zasada redakcyjna: opisujemy strukturę generatora sekwencji dla pomiarów, ale nie opisujemy jego integracji z materiałami wybuchowymi, układami odpalania ani procedurami kwalifikacji takich systemów. To rozdzielenie zachowuje wartość dydaktyczną bez tworzenia instrukcji operacyjnej.
Akwizycja próbek
Druga połowa zadania to akwizycja. FPGA może przyjmować dane z szybkiego ADC, wejść logicznych, komparatorów, TDC albo gotowych modułów cyfrowych. Dane zwykle przechodzą przez kilka etapów:
- synchronizacja wejścia do domeny zegarowej,
- próbkowanie albo detekcja zbocza,
- opcjonalne filtrowanie lub dyskryminacja,
- dodanie znacznika czasu,
- zapis do bufora,
- transfer do komputera albo procesora ARM.
W torze radiometrycznym można użyć FPGA jako szybkiego licznika impulsów, rejestratora kształtu impulsu albo prostego analizatora zdarzeń. W wersji minimum FPGA liczy impulsy w zadanym oknie. W wersji bardziej zaawansowanej zapisuje czas każdego zdarzenia. W wersji z ADC próbuje rozpoznać maksimum impulsu, pole pod impulsem, linię bazową albo pile-up.
Nie trzeba od razu budować kompletnego spektrometru. Bardzo wartościowe dydaktycznie jest już stanowisko, które generuje syntetyczne impulsy, wprowadza kontrolowany pile-up i pokazuje, kiedy prosty licznik zaczyna gubić zdarzenia. To naturalne rozszerzenie artykułu o czasie martwym i pile-upie.4
Znacznik czasu jako podstawowy wynik
W aparaturze wielokanałowej sama liczba zliczeń często nie wystarcza. Trzeba wiedzieć, kiedy zdarzenie nastąpiło. FPGA może przypisać zdarzeniu znacznik czasu pochodzący z licznika taktowanego wspólnym zegarem. Jeśli kilka kanałów korzysta z tego samego licznika, ich znaczniki są porównywalne.
Prosty format zdarzenia może wyglądać logicznie tak:
| Pole | Znaczenie |
|---|---|
channel_id |
numer kanału |
timestamp |
licznik czasu w taktach |
flags |
informacje o pile-up, saturacji, błędzie |
amplitude |
opcjonalna amplituda albo energia |
baseline |
opcjonalny poziom odniesienia |
Taki rekord jest dużo cenniejszy niż goła liczba zliczeń. Pozwala po pomiarze odtworzyć częstość zdarzeń w czasie, szukać koincydencji, odrzucać impulsy przeciążone, analizować drift i wykrywać okresowe zakłócenia.
Bufory i utrata danych
Szybka akwizycja prawie zawsze ma problem nierównych prędkości. Detektor może wygenerować serię impulsów w krótkim czasie. ADC może produkować stały strumień próbek. Komputer odbiera dane porcjami, czasem z opóźnieniami systemu operacyjnego. FPGA musi więc mieć bufor.
Typowe rozwiązania:
| Bufor | Zastosowanie |
|---|---|
| FIFO | przejście między domenami zegarowymi i chwilowe kolejki |
| ring buffer | zapis próbek przed i po triggerze |
| dual-port RAM | jednoczesny zapis przez logikę i odczyt przez procesor |
| DDR | długie rejestracje albo strumienie ADC |
Ważnym parametrem jest nie tylko średnia przepływność, ale przepływność chwilowa. System może mieć wystarczające MB/s średnio, a mimo to gubić dane w krótkich seriach, jeśli bufor jest za mały. Dlatego każdy poważniejszy projekt powinien mieć liczniki przepełnień, znaczniki utraty danych i metadane o czasie martwym akwizycji.
Trigger przed i po zdarzeniu
Oscyloskop jest dobrym wzorem myślenia: rejestruje próbki przed triggerem i po triggerze. FPGA może robić to samo. Ring buffer stale zapisuje najnowsze próbki. Gdy przychodzi trigger, układ zamraża część bufora sprzed zdarzenia i dopisuje próbki po zdarzeniu. Dzięki temu widzimy nie tylko skutek, ale także stan przed wyzwoleniem.
To jest szczególnie przydatne w diagnostyce:
- czy impuls miał poprawną linię bazową przed zdarzeniem,
- czy nie było wcześniejszego pile-upu,
- czy trigger nie przyszedł od zakłócenia,
- czy kilka kanałów zareagowało w oczekiwanej kolejności,
- czy po zdarzeniu tor zdążył wrócić do stanu spoczynkowego.
Implementacja ring buffera w FPGA jest prosta. Licznik adresu zapisuje dane cyklicznie do BRAM. Trigger zamraża wskaźnik i układ dopisuje jeszcze N_post próbek, zatem bufor zawiera N_pre próbek przed triggerem i N_post po triggerze. Typowe wartości: N_pre = 128, N_post = 512 przy 125 MHz próbkowaniu → okno pre-trigger: 1,02 μs, post-trigger: 4,10 μs. Wystarczy do uchwycenia całego kształtu impulsu jądrowego (kilka μs) z kilkusekundowym marginesem przed zdarzeniem do oceny linii bazowej.
Ważnym aspektem jest obsługa wielu wyzwoleń: jeżeli trigger przychodzi zanim poprzedni bufor post-trigger został wypełniony, nowy trigger może być odrzucony (FIFO triggers), zapisany na stos (deep trigger buffer) lub natychmiast zainicjować nowe okno (re-trigger). Wybór ma znaczenie dla ciągłości danych w środowiskach o dużej częstości zdarzeń.
W ćwiczeniach z radiometrii można pracować na danych syntetycznych albo na niskoaktywnych, legalnych źródłach dydaktycznych zgodnie z regulaminem pracowni. W artykule wystarczy model danych: celem jest nauczyć struktury akwizycji, sposobu znacznikowania zdarzeń i diagnostyki błędów toru, a nie procedury pracy ze źródłem promieniowania ani specyfiki jego obsługi. Rozdzielenie tych dwóch poziomów (struktura akwizycji vs. procedura pracy ze źródłem) jest samo w sobie ważną lekcją inżynierii systemów pomiarowych.
FPGA i komputer: podział pracy
FPGA nie zastępuje komputera. Dobrze zaprojektowane stanowisko dzieli zadania:
| FPGA | Komputer / procesor ARM |
|---|---|
| deterministyczny timing | konfiguracja eksperymentu |
| szybkie próbkowanie | wizualizacja danych |
| liczniki i znaczniki czasu | zapis na dysk |
| wstępne filtrowanie | analiza statystyczna |
| reakcja w czasie rzeczywistym | interfejs użytkownika |
Platformy typu Zynq, Red Pitaya czy Eclypse Z7 są wygodne dlatego, że łączą procesor ARM z logiką FPGA. Procesor obsługuje sieć, pliki i aplikację, a FPGA wykonuje szybkie fragmenty pomiaru. Moduły USB/PCIe robią podobny podział, tylko komputer jest zewnętrzny.1,6
W dydaktyce warto pokazać minimalny protokół sterowania: komputer zapisuje rejestry start, gate_width, threshold, channel_mask, a potem odczytuje event_count, overflow_count, dead_time_counter i blok danych. Taki interfejs uczy, że aparatura to nie tylko „sygnał na pinie”, ale także metadane o jakości pomiaru.
Najważniejsza lekcja z podziału pracy FPGA/komputer: FPGA jest maszyną czasu, a komputer jest maszyną danych. FPGA wie dokładnie, kiedy coś się stało (do pojedynczego taktu, 5 ns przy 200 MHz). Komputer wie, co z danymi zrobić — wyświetlić, skalibrować, dopasować do biblioteki izotopów, zapisać, przetransmitować. Połączenie obu daje aparaturę, która jest jednocześnie szybka i inteligentna. Próba przeniesienia zadań czasu-rzeczywistego na komputer z systemem operacyjnym (Linux, Windows) skończy się jitterem setek mikrosekund, który zamaże każdą precyzyjną synchronizację. Próba przeniesienia zadań analizy danych na samo FPGA bez procesora skończy się ograniczonym interfejsem i trudnością kalibracji. Właściwy projekt zawsze dzieli te odpowiedzialności w sposób naturalny.
Kontrola jakości pomiaru
FPGA może liczyć więcej niż sam wynik. Może równolegle prowadzić diagnostykę:
- liczba triggerów,
- liczba zapisanych zdarzeń,
- liczba odrzuconych zdarzeń,
- przepełnienia FIFO,
- czas aktywnego okna,
- czas zablokowania akwizycji,
- liczba saturacji ADC,
- liczba impulsów pile-up,
- minimalny i maksymalny odstęp między zdarzeniami.
To są dane, które chronią przed fałszywą pewnością. Jeśli widmo wygląda poprawnie, ale licznik przepełnień rośnie, wynik nie jest wiarygodny. Jeśli liczba triggerów różni się od liczby ramek, gubimy zdarzenia. Jeśli czas martwy akwizycji rośnie z częstością impulsów, trzeba zmienić geometrię pomiaru albo parametry toru.4
Zastosowania w serwisie atomowym
Bezpieczne i wartościowe zastosowania FPGA dla tego serwisu:
| Temat | Możliwa forma dydaktyczna |
|---|---|
| czas martwy | syntetyczny generator impulsów i licznik utraconych zdarzeń |
| spektrometria gamma | bufor próbek ADC i detekcja piku na danych przykładowych |
| koincydencje | znaczniki czasu i okno koincydencji dla danych syntetycznych |
| monitoring środowiskowy | licznik impulsów z metadanymi jakości |
| szybka kamera/czujniki | wspólny trigger i znane opóźnienia kanałów |
| ćwiczenia studenckie | analiza bufora, overflow, jitter i pile-up |
W każdym z tych przypadków da się przygotować ćwiczenie bez niebezpiecznych materiałów. Student analizuje architekturę, dane i błędy pomiaru. To wzmacnia dział Metrologia jądrowa i Elektronika, a jednocześnie omija instruktaż operacyjny.
Numeryczne i obliczeniowe przykłady projektowania generatora sekwencji
Dla konkretności: zaprojektujmy generator dwóch sygnałów laboratoryjnych w FPGA pracującym z zegarem 200 MHz (okres T_clk = 5 ns).
Sygnał GATE (bramka akwizycji):
- Opóźnienie od START: 200 ns = 200/5 = 40 taktów
- Szerokość: 500 ns = 100 taktów
- Zatem GATE jest aktywny w cyklach [40, 139]
Sygnał TEST_PULSE (impuls testowy do wzmacniacza):
- Opóźnienie: 1 000 ns = 200 taktów
- Szerokość: 20 ns = 4 takty
- Aktywny w cyklach [200, 203]
Implementacja: 32-bitowy licznik counter_reg zlicza od 0 do MAX. Dwa komparatory: GATE_n = '1' gdy counter >= 40 AND counter <= 139. TEST_PULSE_n = '1' gdy counter >= 200 AND counter <= 203. Zasoby: 1 licznik 32-bitowy (32 FF), 2 komparatory (2×6 LUT).
Rozdzielczość: 5 ns (1 takt). Jeśli potrzeba 1 ns, można użyć OSERDES w trybie SDR przy 1 GHz lub zewnętrznego układu opóźnień SY89296.
Dokładność absolutna (vs teoretycznej): zależy od jittera zegara (typowo < 100 ps RMS dla PLL), różnic opóźnień ścieżek sygnałowych (routing skew, 50–200 ps w FPGA 7-serii), opóźnień buforów wyjściowych (OBUF: 1–3 ns). Dla pomiaru opóźnień między kanałami: kalibracja oscyloskopem.
Skalowanie do wielokanałowego generatora:
Przy 16 kanałach niezależnych, każdy z własnym opóźnieniem i szerokością: 16 × 2 rejestrów 32-bitowych = 1024 bitów konfiguracji. Rejestry konfiguracji ładowane przez AXI-Lite z procesora ARM lub przez UART/SPI z komputera. Całe zasoby FPGA: ~200 LUT + 200 FF + 1 licznik główny. Zajmuje < 1% zasobów małego FPGA (Artix-7 35T).
Modele akwizycji: histogram vs. list mode
Dane z detektora można zapisywać na dwa sposoby — i wybór ma poważne konsekwencje:
Histogram mode (MCA):
FPGA buduje histogram bezpośrednio w BRAM. Każde zdarzenie jest zliczone do właściwego kanału energetycznego bez zapisywania indywidualnych rekordów. Zalety: małe wymagania na pamięć (np. 4096 kanałów × 32 bit = 16 kB), możliwa praca z bardzo dużymi częstościami (do kilku MHz), proste przesyłanie wyniku do komputera. Wady: nie można „odtworzyć" historii zdarzeń, nie ma informacji o czasie zdarzenia, nie można retrospektywnie zmienić parametrów analizy.
List mode (event-by-event):
FPGA zapisuje rekord dla każdego zdarzenia: timestamp, kanał, amplituda, flagi. Zalety: pełna informacja o każdym zdarzeniu, możliwa analiza post-hoc (zmiana okna energetycznego, koincydencje, analiza martwego czasu), możliwe budowanie histogramów w dowolnych oknach czasowych. Wady: wymaga dużej pamięci (100 000 zdarzeń/s × 16 B/zdarzenie = 1,6 MB/s → 96 MB na minutę), wymagana szybka magistrala do komputera.
W nowoczesnych DPP (CAEN, ORTEC) oba tryby są dostępne. List mode jest konieczny w zastosowaniach, gdzie: aktywność zmienia się w czasie (koincydencje, pomiary kaskad), potrzebna jest wysoka rozdzielczość czasu (TOF), analiza on-line nie nadąża za zdarzeniami i dane mają być przeanalizowane offline.
Koincydencje i anti-koincydencje w FPGA
W spektrometrii gamma, fizyce cząstek i dozymetrii często interesuje nas, czy dwa zdarzenia wystąpiły jednocześnie (koincydencja) lub czy jedno wykluczyło drugie (antykoincydencja):
Proste okno koincydencji:
Kanał A wykrywa zdarzenie i otwiera okno czasowe (np. 100 ns). Jeżeli kanał B wykryje zdarzenie w tym oknie, para jest zaraportowana jako koincydencja.
Implementacja FPGA: FF z 100-taktowym (5 ns × 100 = 500 ns) licznikiem resetowanym przez detekcję zbocza w kanale A. Antykoincydencja: zdarzenie w kanale B odrzuca bieżące zdarzenie A.
Zastosowania:
- Aktywna osłona antykoincydencyjna w laboratorium HPGe: plastikowy scyntylator otacza kryształ HPGe i weto-je zdarzenia gamma, które przeszły przez osłonę ołowiową i są kosmicznym tłem (muony). Redukcja tła o 10–50×.
- Spektrometria TOF (Time-of-Flight): w reakcjach jądrowych detektor referencyjny START + detektor STOP → energia cząstki przez czas przelotu. Okno koincydencji rzędu 50–500 ns.
- Detekcja par (PET tomografia): dwa fotony 511 keV z anihilacji muszą zostać wykryte w oknie koincydencji 10–20 ns. Cały system PET jest oparty na FPGA do obsługi 10⁶–10⁷ koincydencji/s.
Wejście ADC: interfejs i pobór próbek
Szybki ADC (np. 14-bit, 500 MHz, LTC2268-14 lub AD9680) wymaga specyficznego interfejsu z FPGA:
LVDS lub SLVS: szybkie ADC dają dane na interfejsie różnicowym (LVDS: ±350 mV). FPGA musi mieć bank I/O skonfigurowany jako LVDS z terminations 100 Ω różnicową. W Xilinx 7-series: blok ISERDESE2 przyjmuje dane LVDS przy 500 MHz i deseriuje do magistrali 4-bitowej przy 125 MHz lub 7-bitowej przy ~71 MHz.
Synchronizacja z zegarem ADC: ADC wysyła dane na własnym zegarze wyjściowym (DCO, Data Clock Out). FPGA musi przyswoić ten zegar jako referencję i zsynchronizować go z własnym PLL. Typowe rozwiązanie: IDELAY2 (kalibracja opóźnienia wejścia z dokładnością 78 ps) + ISERDES.
Próbkowanie nieciągłe (decimation): przy 500 MHz ADC i kształtowaniu trapezoidalnym z L=2 μs, czas trwania sygnału to 400 próbek. Zamiast przetwarzać 400 próbek/zdarzenie, można desymować × 4 → 100 próbek przy efektywnym 125 MHz, tracąc minimum informacji (Nyquist: szybkość próbkowania > 2× pasmo sygnału; impuls jądrowy ma pasmo < 10 MHz, więc 125 MHz próbkowania jest nadmiarowe 12×).
Transfer danych do komputera
Różne magistrale transfer danych z FPGA do komputera mają dramatycznie różne przepływności:
| Interfejs | Przepływność | Zastosowanie |
|---|---|---|
| UART (115200 baud) | ~11 kB/s | Konfiguracja, debug |
| USB 2.0 HS (FTDI) | 20–40 MB/s | Lekka akwizycja |
| USB 3.0 | 200–300 MB/s | Strumienie ADC |
| PCIe × 4 Gen2 | ~1,6 GB/s | Szybka akwizycja fizyki |
| Gigabit Ethernet UDP | 100–800 MB/s | Red Pitaya, sieciowa akwizycja |
| 10GbE | ~8 GB/s | LHC, duże detektory |
W dydaktycznym systemie Red Pitaya: GbE Ethernet przez IP socket (TCP/IP) do komputera z Jupyter Notebook. Przepływność: ~50 MB/s (limitowane przez overhead TCP). Dla list mode przy 100 000 zdarzeń/s i 16 B/zdarzenie: 1,6 MB/s — daleko poniżej limitu GbE, wynik jest wiarygodny.
Lista projektów dydaktycznych FPGA dla aparatury jądrowej
Poniżej zestawienie gotowych lub łatwo implementowalnych projektów FPGA/dydaktycznych dla laboratoriów:
Projekty open-source dostępne na GitHub:
pavel-deregowski/mcpha— Multi-Channel Pulse Height Analyzer dla Red Pitaya (VHDL)pavel-deregowski/sdr— Software Defined Radio z przetwarzaniem cyfrowym (Zynq)pavel-deregowski/red-pitaya-notes— szeroka kolekcja projektów SDR i instrumentów pomiarowychniwis/openspectrometer— spektrometr gamma open-source dla FPGA + PMT/SiPMjabber/NIMbox— logika koincydencji NIM implementowana w małym FPGA
Projekty dydaktyczne proponowane w serwisie:
- Generator sekwencji 4-kanałowej z interfejsem UART i wizualizacją w Python
- Licznik zdarzeń z modelem czasu martwego (paralizowalny vs nieparalizowalny)
- Akwizycja list-mode z syntetycznego źródła (pseudo-losowy generator jako symulacja detektora)
- Koincydencja dwóch kanałów z oknem nastawalnym z 10 ns do 10 μs
- Spektrometr prosty (histogram 256-kanałowy w BRAM, podgląd przez UART)
Każdy z tych projektów może być wykonany przez studenta z doświadczeniem FPGA (min. 2 tygodnie kursu) używając Red Pitaya (~600 EUR) lub ZedBoarda (~600 EUR) i narzędzi Xilinx Vivado (bezpłatna wersja WebPACK dla małych FPGA).
Standardy NIM i VME: kontekst historyczny dla FPGA
Elektronika jądrowa przez dziesięciolecia opierała się na standardzie NIM (Nuclear Instrumentation Module), zdefiniowanym przez USAEC w 1964 roku. NIM to mechaniczny i elektryczny standard modułów: zasilacz ±6V/±12V, sloty 1,75 cala wysokości, interfejs dyskryminatora ±700 mV / 50 Ω. System NIM pozwalał na elastyczne składanie toru pomiarowego z gotowych modułów: dyskryminator → opóźniacz → bramka koincydencji → liniowy sumator → MCA. Każdy moduł był zbudowany na dyskretnych tranzystorach lub układach ECL (Emitter-Coupled Logic), dając czasy przełączania poniżej 10 ns.
W latach 80. pojawił się standard CAMAC (Computer Automated Measurement And Control, 1969–1972), a następnie VME (Versa Module Europa, 1981). VME dawał 32-bitową magistralę i szybki transfer danych do komputera, ale logika modułów była nadal analogowa lub na układach ECL/TTL.
FPGA wkroczyło do fizyki jądrowej w latach 1995–2005. Pierwsze zastosowania: trigger logics (LHC CMS, ATLAS), pattern recognition w detektorach driftowych, skalery w spektrometrii gamma. Korzyść: jeden chip FPGA mógł zastąpić dziesiątki modułów NIM i dawał możliwość rekonfiguracji oprogramowaniem. Wada: konieczność znajomości HDL (Hardware Description Language) i dłuższa krzywa uczenia niż dla NIM.
Dziś FPGA jest standardem w nowej aparaturze jądrowej. Producenci DPP (CAEN, ORTEC, Mirion) wbudowują FPGA we wszystkie produkty. Red Pitaya, Eclypse Z7, ZCU111 — gotowe platformy SoC (System on Chip) integrujące FPGA z procesorem ARM — obniżają próg wejścia dla laboratoriów dydaktycznych.
Stare tory NIM są jednak nadal w użyciu. W Polsce instytuty (IFJ, CLOR, AGH) mają skrzynki NIM z lat 80.–90. jako podstawowe wyposażenie laboratoriów. Interoperacyjność NIM i FPGA jest możliwa przez moduł wejściowy/wyjściowy zgodny z logiką NIM (konwerter LVTTL-NIM, np. na Op-Amp LT1394 lub ADCMP600). Takie adaptery pozwalają podłączyć stary dyskryminator NIM do nowoczesnego FPGA do akwizycji list-mode — co jest tanim sposobem modernizacji bez wymiany całego toru.
Przykład praktyczny: laboratorium spektrometrii alfa w IFJ Kraków używa dyskryminatorów NIM Ortec (SCA 551) z lat 80. jako pierwszego stopnia. Wyjście logiczne NIM podłączone przez konwerter do modułu FPGA umożliwia rejestrację czasu zdarzenia w rozdzielczości 10 ns. Koszt modernizacji: < 1 000 zł (moduł FPGA + konwerter) zamiast 30 000–50 000 zł za pełny nowy DPP. Jakość pomiaru czasu: porównywalna dla typowych zastosowań spektrometrii alfa środowiskowej.
Architektura FPGA: co jest w środku
Rozumienie FPGA zaczyna się od jego podstawowych bloków. W typowym Xilinx/AMD (dawniej Xilinx) Artix-7 lub Zynq:
LUT (Look-Up Table): podstawowy element logiczny. 6-wejściowa LUT realizuje dowolną funkcję boolowską 6 zmiennych. Miliony LUT tworzą logikę kombinacyjną: dekodery, arytmetykę, muxery. Konfiguracja jest w pamięci SRAM, co pozwala na rekonfigurację.
FF (Flip-Flop): każda LUT jest sparowana z jednym lub dwoma przerzutnikami D. FF rejestruje wartość sygnału na zboczu zegara. Kombinacja LUT+FF tworzy synchroniczną logikę sekwencyjną. Czas przełączania FF w nowoczesnym FPGA (28 nm): < 0,5 ns.
BRAM (Block RAM): wbudowane bloki dwuportowej pamięci RAM (18 kbit lub 36 kbit na blok). Pozwalają budować FIFO, ring buffery, tablice konfiguracyjne i bufor danych bez zajmowania LUT. Typowo 250–1000 bloków BRAM w FPGA 7-serii.
DSP48E1 (Digital Signal Processing slice): blok mnożnika-akumulatora (25×18 bit + 48 bit akumulator). Używany do filtrów FIR, trapezoidalnych kształtowników impulsów, DFT. Typowo 200–2000 DSP słajsów w FPGA 7-serii.
PLL/MMCM: synteza zegarów. Wejście: kryształ 100–200 MHz. Wyjście: dowolna wielokrotność lub ułamek częstotliwości z jitterem < 100 ps RMS. Wielofazowe wyjścia (0°, 90°, 180°, 270°) dla oversamplingu i wejść DDR.
I/O: piny wejścia-wyjścia z konfigurowalnymi standardami (LVCMOS33, LVDS25, SSTL, HSTL). Wbudowane ISERDES/OSERDES do 1,6 Gb/s na pin (standardy DDR, SERDES). Idealne do odczytu szybkich ADC i transmisji do komputera.
Języki opisu sprzętu: VHDL, Verilog i HLS
Projektowanie FPGA odbywa się w językach HDL (Hardware Description Language):
VHDL (VHSIC Hardware Description Language): silna typizacja, verbosity (długie konstrukcje), popularny w Europe i aplikacjach obronnych. Przykład generatora pulsu:
signal counter : unsigned(31 downto 0) := (others => '0');
process (clk) begin
if rising_edge(clk) then
counter <= counter + 1;
if counter < pulse_width then output <= '1';
else output <= '0'; end if;
end if;
end process;
Verilog: mniej verbose, popularny w USA i Azji, standardowy w OpenSource (Yosys, Verilator). Analogiczny kod:
always @(posedge clk) begin
counter <= counter + 1;
output <= (counter < pulse_width) ? 1'b1 : 1'b0;
end
HLS (High Level Synthesis): Xilinx Vitis HLS lub Intel HLS Compiler pozwalają pisać w C/C++ i kompilować do HDL. Szybsze projektowanie, ale mniej optymalne zasoby i trudniejsza kontrola timingu. Używane do implementacji algorytmów DSP (filtry, FFT) gdy szybkość projektowania ważniejsza niż efektywność zasobów.
SystemVerilog: nowoczesny nadzbiór Verilog z typami danych (struct, union, interface), parametrycznymi modułami i rozszerzoną weryfikacją (UVM). Standard de facto w nowoczesnym FPGA.
Algorytmy cyfrowego kształtowania impulsu w FPGA
W DPP sygnał z przedwzmacniacza jest digitalizowany przez ADC (14–16 bit, 125–500 MHz), a następnie przetwarzany cyfrowo przez FPGA. Dwa główne algorytmy:
Filtr trapezoidalny (Moving Summing Difference, algorytm Jordanova):
- Oblicz różnicę sum ruchomych: d[n] = sum(x[k], n-L-M..n-M) - sum(x[k], n..n+M+L)
- Scałkuj: e[n] = e[n-1] + d[n]
- Normalizuj (flat top): p[n] = p[n-1] + e[n] - e[n-M] - (2×e[n-M-L]) + e[n-2M-L]
Gdzie L = rise time, M = flat top duration. Wynik p[n] jest trapezoidalnym filtrem na sygnale x — szczytowa wartość p jest proporcjonalna do energii zdarzenia.
Implementacja w FPGA: przesuwające się sumy są łatwe na DSP48E1 (akumulator + odejmowanie opóźnionego wejścia). Całe kształtowanie przy 125 MHz dla 16-kanałowego systemu zajmuje ~100 DSP48E1.
Algorytm Moving Average Difference (prosty CR-RC):
RC-CR w dziedzinie cyfrowej:
- Różniczkowanie: y[n] = x[n] - x[n-tau_d] (CR)
- Całkowanie: z[n] = z[n-1] + (y[n] - z[n-1])/tau_i (RC)
Prostszy algorytm, ale mniejsza elastyczność kształtu impulsu.
Pulse Shape Discrimination (PSD) w FPGA
PSD pozwala odróżnić cząstki alfa od gamma na podstawie kształtu impulsu w scyntylatorach organicznych (EJ-301, EJ-309, CLYC). Neutrony dają dłuższy ogon impulsu niż gamma. Mierzy się dwa parametry:
- Q_total: pole pod całym impulsem (długa całka)
- Q_tail: pole pod ogonem impulsu (krótka całka od t₀+50 ns do t₀+200 ns)
Wskaźnik PSD = Q_tail / Q_total. Zdarzenia gamma mają PSD < 0,2, neutrony > 0,3 (przykładowe wartości dla EJ-301).
W FPGA: po detekcji zbocza narastającego (threshold crossing) uruchamiany jest timer. Po 50 ns zaczyna się akumulacja Q_tail, równolegle działa akumulacja Q_total (od t=0). Po zakończeniu okna, oba akumulatory są dzielone (DSP48E1) i wynik PSD + Q_total tworzą event record. Cały algorytm PSD dla 8-kanałowego systemu przy 250 MHz zajmuje < 5000 LUT.
Synchronizacja z zewnętrznymi sygnałami: GPS i White Rabbit
W rozległych sieciach stacji pomiarowych (monitoring CTBT, koincydencje między detektorami w różnych budynkach) czasy zdarzeń muszą być synchronizowane globalnie. Dwie metody:
GPS 1PPS (pulse-per-second): odbiornik GPS daje sygnał 1 Hz z dokładnością ±100 ns (zwykły) lub ±10 ns (high-precision, np. Trimble Thunderbolt). FPGA kalibruje wewnętrzny licznik do 1PPS, tworząc absolutny znacznik czasu UTC z dokładnością ~100 ns. Standard w sieci CTBT IMS (każda stacja ma odbiornik GPS).
White Rabbit: protokół synchronizacji oparty na IEEE 1588 PTP, rozszerzony przez CERN i GSI dla fizyki cząstek. Dokładność synchronizacji poniżej 1 ns między węzłami. Stosowany w LHC-ALICE, FAIR w Darmstadcie, projektach CERN. Implementacja w FPGA przez IP core White Rabbit PTP Core (open source, Xilinx). W polskiej infrastrukturze badawczej stosowany przez NCBJ (praca z akceleratorami Sołtan).
Konkretny przykład: Red Pitaya STEMlab w spektrometrii
Red Pitaya STEMlab 125-14 to tania (~600 EUR) platforma SoC (Xilinx Zynq 7010: ARM Cortex-A9 + FPGA Artix-7), z:
- 2× ADC 14-bit, 125 MHz
- 2× DAC 14-bit, 125 MHz
- LVDS I/O, SPI, I2C
- Gigabit Ethernet do komputera
Do spektrometrii gamma: detektor scyntylacyjny (np. NaI + SiPM) podłączony przez przedwzmacniacz do wejścia ADC. W FPGA (VHDL): detekcja progu, pomiar amplitudy szczytowej, budowanie histogramu w BRAM, transfer przez AXI do ARM. Procesor ARM uruchamia serwer Python, który przez TCP/IP udostępnia widmo do przeglądarki internetowej.
Projekt MCPHA (Multi-Channel Pulse Height Analyzer) autorstwa Pawła Deręgowskiego (pl) jest takim właśnie oprogramowaniem open-source dla Red Pitaya — dostępnym na GitHub. Używany na uczelniach w Polsce (AGH, WAT) jako tani, dydaktyczny analizator MCA.
Polska perspektywa: zastosowania FPGA w instytutach
IFJ PAN (Kraków): własne systemy akwizycji oparte na FPGA do spektrometrii gamma w dziedzinie czasu (TOF-PET dla fizyki medycznej). Projekty z Xilinx Spartan-6 i Kintex-7. Współpraca z CERN przy systemach readout dla eksperymentu NA61/SHINE.
NCBJ (Świerk): systemy sterowania i monitoringu reaktora MARIA oparte na PLC (nie FPGA), ale nowe projekty akwizycji eksperymentalnej używają platformy Red Pitaya i własnych modułów NIM z FPGA Altera (CYCLONE). Udział w projekcie SANDA (Supporting a New nuclear Data Assurance).
WAT (Warszawa): badania nad szybkimi detektorami do diagnostyki impulsowego promieniowania. Własne systemy akwizycji listmode dla TDC (Time-to-Digital Converter) oparte na Xilinx Virtex. Prace nad FPGA-based EMP sensors.
AGH (Kraków): zajęcia dydaktyczne ze studnentami z systemem FPGA + Red Pitaya jako tani system dla studentów. Projekt PCB z SiPM + Red Pitaya dla dydaktycznej spektrometrii gamma.
Wymagania dotyczące timingu i metoda STA (Static Timing Analysis)
Projektowanie FPGA dla aplikacji czasu rzeczywistego wymaga weryfikacji, czy sygnały dotarły do rejestrów na czas. Narzędzia syntezy (Xilinx Vivado, Intel Quartus) przeprowadzają STA (Static Timing Analysis), który sprawdza:
Setup time violation: sygnał musi ustabilizować się na wejściu FF przed zboczem zegara o czas t_setup (typowo 0,1–0,3 ns w nowoczesnym FPGA). Jeżeli czas propagacji ścieżki logicznej > (1/f_clk - t_setup - t_skew), mamy naruszenie setup i dane mogą być niepoprawnie zatrzaśnięte.
Hold time violation: sygnał musi pozostać stabilny po zboczu zegara przez czas t_hold (typowo 0–0,1 ns). Naruszenie hold powoduje metastabilność — FF może zatrzasnąć nieokreśloną wartość (nie 0 ani 1).
WNS (Worst Negative Slack): najgorszy zapas czasu w projekcie. WNS = t_period - t_path_max. Jeżeli WNS < 0, projekt nie spełnia wymagań timingowych i może działać niepoprawnie.
Dla generatora sekwencji pracującego przy 200 MHz (t_period = 5 ns), typowe ścieżki krytyczne to: licznik → komparator → bufor wyjściowy. Przy 32-bitowym liczniku i kombinatorycznym komparatorze, czas propagacji może wynosić 3–4 ns — co daje zapas 1–2 ns. Dla 500 MHz (t_period = 2 ns) to samo zdanie wymaga pipeline'owania (podzielenia ścieżki przez dodatkowy FF).
Timing constraints (plik XDC/SDC): projektant musi podać narzędziom wymagania: create_clock -period 5.0 [get_ports CLK], set_input_delay -max 2.0 [get_ports DATA_IN]. Bez constraints STA nie wie, czego oczekiwać i może zaraportować WNS = 0 przy faktycznie błędnym projekcie.
Ochrona przed błędami aparaturowymi: watchdog, CRC i redundancja
W bezpiecznych zastosowaniach (systemy ochrony reaktora, kontrola urządzeń medycznych, awaryjna aparatura pomiarowa) FPGA musi być chroniony przed błędami sprzętu:
Watchdog timer: FPGA zlicza takty. Jeżeli procesor ARM nie resetuje licznika watchdog co X ms, FPGA samoczynnie resetuje system lub wydaje alarm. Zapobiega zawieszeniu systemu przy błędzie oprogramowania.
CRC (Cyclic Redundancy Check): każda paczka danych (rekord zdarzenia, pakiet konfiguracji) ma dołączone pole CRC. Odbiorca sprawdza CRC i odrzuca paczki ze błędami. Standard w komunikacji UART, SPI, Ethernet. W FPGA blok CRC-32 zajmuje < 200 LUT.
Redundancja logiki: w systemach bezpieczeństwa (SIL-2/SIL-3, np. sterowanie reaktorem) stosuje się trojkowe redundancje: trzy niezależne FPGA głosują na wartość wyjścia (majority voting). Niezgodność sygnalizuje awarię jednego kanału. Kosztowne, ale wymagane przez IEC 61511.
Single-Event Upset (SEU): w promieniowaniu jonizującym (reaktory, przestrzeń kosmiczna) pojedynczy foton lub ciężki jon może przekształcić bit SRAM konfiguracji FPGA (flip z 0→1 lub 1→0). FPGA staje się wówczas bez ostrzeżenia źle skonfigurowane. Rozwiązania: FPGA flash-based (Microsemi ProASIC, Lattice MachXO — niezmienne konfiguracja), scrubbing (regularne odświeżanie konfiguracji ze złotej kopii FLASH) lub rad-hard FPGA (Xilinx Virtex-4QV, Microsemi RTG4).
W dydaktycznych stanowiskach laboratoryjnych i środowiskach radiologicznych niskim poziomem promieniowania (< 1 mGy/h) SEU jest pomijalny dla FPGA 7-serii lub Zynq. Przy promieniowaniu reaktorowym (> 10 Gy/h) temat staje się krytyczny.
Granice bezpieczeństwa
FPGA może generować sygnały z bardzo małym jitterem. To samo w sobie jest neutralne. Niebezpieczna staje się dopiero integracja z układami energetycznymi, materiałami wybuchowymi, wysokim napięciem bez kontroli energii albo procedurami odpalania. Dlatego w tym serwisie warto trzymać konsekwentną granicę:
| Omawiamy | Nie omawiamy jako instrukcji |
|---|---|
| architekturę generatora sekwencji | parametry układów uzbrajania |
| znaczniki czasu i buforowanie danych | integrację z detonatorami lub ładunkami |
| LVDS/SERDES i zegary | sekwencje operacyjne firesetów |
| ćwiczenia na danych syntetycznych | testy inicjacji materiałów wybuchowych |
| diagnostykę błędów akwizycji | praktyczne progi dla systemów broni |
Taka granica nie blokuje nauki. Wręcz pomaga: zmusza do opisania tego, co jest najważniejsze akademicko, czyli zależności między czasem, danymi, buforem i błędem pomiarowym. Wszystkie kluczowe koncepcje — deterministyczny timing, logika koincydencji, wykrywanie pile-upu, buforowanie ring i listy zdarzeń, diagnostyka przepełnień — mogą być wyjaśnione na tle bezpiecznych zastosowań pomiarowych: spektrometria promieniowania, synchronizacja kamer do badań fali podmuchowej, monitoring środowiskowy z automatycznym flagowaniem anomalii. W każdym z tych kontekstów wartość dydaktyczna jest pełna, a granica do niebezpiecznych zastosowań operacyjnych jest wyraźna. Uczeń uczący się buforowania ring-bufferem czy wykrywania pile-upu w kontekście spektrometrii gamma nie jest w żaden sposób bliżej budowy systemu inicjacji uzbrojenia — tak jak student uczący się regulacji PID nie jest bliżej budowy sterownika rakiety.
Dodatkowe materiały multimedialne
Warto dodać schemat blokowy FPGA jako stanowiska pomiarowego: trigger -> synchronizer -> timestamp counter -> sequencer -> acquisition FIFO -> host. Druga wizualizacja może pokazywać ring buffer z próbkami przed i po triggerze oraz flagi overflow, pile-up i dead time.
Najkrótsze podsumowanie: FPGA jest dobre wtedy, gdy czas i dane muszą być obsługiwane równolegle. W aparaturze pomiarowej jego największą wartością nie jest „szybkość” sama w sobie, ale deterministyczna struktura, która pozwala jednocześnie generować, mierzyć, znakować i kontrolować jakość zdarzeń.
Ćwiczenia praktyczne
Pierwsze ćwiczenie projektowe: narysować blokowy projekt generatora czterech sygnałów laboratoryjnych. Każdy kanał ma mieć niezależny czas startu i szerokość impulsu, wyrażone w taktach zegara. Student ma wskazać licznik, komparatory, rejestry konfiguracji i wyjścia oraz policzyć podstawową rozdzielczość dla zegara 100 MHz, 200 MHz i 500 MHz.
Drugie ćwiczenie akwizycji: zaprojektować format rekordu zdarzenia dla licznika impulsów. Rekord ma zawierać numer kanału, timestamp, flagę pile-up, flagę przepełnienia oraz opcjonalną amplitudę. Student ma oszacować, ile bajtów zajmie milion takich zdarzeń i jaką przepływność trzeba zapewnić przy 100 000 zdarzeń na sekundę.
Trzecie ćwiczenie kontroli jakości: dany jest pomiar z 1 000 000 triggerów, 997 000 zapisanych zdarzeń, 2 500 odrzuconych zdarzeń pile-up i 500 przepełnień FIFO. Student ma policzyć procent utraconych lub podejrzanych zdarzeń, opisać możliwe przyczyny i zaproponować, które parametry stanowiska należałoby zmienić.
Przejdź do ćwiczenia interaktywnego