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:

  1. sygnał START trafia do synchronizatora,
  2. licznik czasu zaczyna zliczać takty,
  3. tabela progów określa, kiedy wystawić sygnały wyjściowe,
  4. wejścia detektorów są próbkowane albo zliczane,
  5. zdarzenia dostają znaczniki czasu,
  6. próbki trafiają do bufora,
  7. 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:

  1. synchronizacja wejścia do domeny zegarowej,
  2. próbkowanie albo detekcja zbocza,
  3. opcjonalne filtrowanie lub dyskryminacja,
  4. dodanie znacznika czasu,
  5. zapis do bufora,
  6. 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 pomiarowych
  • niwis/openspectrometer — spektrometr gamma open-source dla FPGA + PMT/SiPM
  • jabber/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):

  1. Oblicz różnicę sum ruchomych: d[n] = sum(x[k], n-L-M..n-M) - sum(x[k], n..n+M+L)
  2. Scałkuj: e[n] = e[n-1] + d[n]
  3. 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:

  1. Różniczkowanie: y[n] = x[n] - x[n-tau_d] (CR)
  2. 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

Powiązane artykuły