Avtor: Klemen Bravhar
Sodobni trg polprevodniških komponent ponuja širok spekter integriranih vezij, namenjenih realizaciji analognih, digitalnih ter mešanih (angl. mixed-signal) elektronskih sistemov.
Tehnološki napredek na področju mikro- in nanoelektronike je omogočil visoko stopnjo integracije, povečanje zmogljivosti ter zmanjšanje porabe energije in fizičnih dimenzij vezij. Posledično lahko sodobna integrirana vezja združujejo več funkcionalnih sklopov na enem integriranemu vezju, vključno z obdelavo signalov, krmilnimi enotami, komunikacijskimi vmesniki in napajalnimi moduli. Takšna stopnja integracije predstavlja temelj razvoja naprednih elektronskih sistemov v industriji, telekomunikacijah, avtomobilski elektroniki, medicinski tehnologiji ter mnogih drugih področjih.
Ta vsebina je samo za naročnike
Integrirana vezja imajo fiksno strukturo, ki je določena že v fazi načrtovanja in proizvodnje. To še posebej velja za analogna vezja, kjer je vsaka komponenta natančno prilagojena za opravljanje določene naloge. Posledično je njihova funkcionalnost omejena na specifičen namen, za katerega so bila zasnovana.
Nekateri tipi digitalnih integriranih vezij pa so zasnovani z večjo stopnjo prilagodljivosti. Takšna vezja, kot so na primer programirljiva logična vezja (PLD angl.: Programmable Logic Devices) ali programirljiva polprevodniška polja (FPGA angl.: Field Programmable Gate Arrays), omogočajo uporabniku, da po potrebi prilagodi njihovo funkcionalnost glede na specifično aplikacijo, ki jo podpirajo. To jih naredi izjemno uporabne v situacijah, kjer so zahteve aplikacije spremenljive ali še niso dokončno določene.


FPGA vezja uporabniku omogočajo konfiguracijo notranje logične strukture po izdelavi čipa. Z uporabo strojnih opisnih jezikov (angl. Hardware Description Languages – HDL), kot sta VHDL ali Verilog, je mogoče definirati želeno logično funkcionalnost ter medsebojne povezave med logičnimi gradniki znotraj vezja. Na ta način FPGA ne predstavlja zgolj naprave za izvajanje programske kode, temveč omogoča realizacijo prilagojene digitalne arhitekture, ki deluje paralelno in je optimizirana za specifično aplikacijo.
Struktura FPGA vezja
Pomembna prednost FPGA vezij je možnost ponovne konfiguracije implementirane logične strukture brez kakršnih koli škodljivih posledic za samo vezje. Logično funkcionalnost je mogoče kadar koli spremeniti z nalaganjem nove konfiguracije, kar omogoča visoko stopnjo prilagodljivosti in skrajšuje razvojni cikel sistema.
Omenjena lastnost temelji na uporabi pomnilniških tehnologij, saj shranjeno stanje v posameznih pomnilniških celicah določa funkcionalnost notranjih logičnih blokov ter medsebojnih povezav. Te pomnilniške elemente v FPGA vezjih imenujemo konfiguracijski pomnilnik.
Na trgu sta trenutno uveljavljeni predvsem dve tehnologiji konfiguracijskega pomnilnika: statični pomnilnik SRAM ter Flash pomnilnik. Večina sodobnih FPGA vezij temelji na SRAM celicah, ki omogočajo hitro rekonfiguracijo in visoko zmogljivost, vendar zahtevajo ponovno nalaganje konfiguracije ob vsakem vklopu napajanja. FPGA vezja na osnovi Flash tehnologij ob ponovnem zagonu ne potrebujejo nalaganje konfiguracije, saj je konfiguracija že shranjena v lokalnem konfiguracijskem pomnilniku. Toda so zaradi svojih lastnosti (počasnega nalaganja) manj prisotni na trgu v primerjavi z FPGA vezji na osnovi SRAM celic.
Če se podrobneje posvetimo arhitekturi FPGA, ugotovimo, da so ta vezja sestavljena iz več medsebojno povezanih gradnikov, ki omogočajo realizacijo kompleksnih digitalnih sistemov. Med ključne komponente sodijo kombinacijska logična vezja (implementirana z uporabo iskalnih tabel – LUT ), sekvenčna vezja (obliki D-flip-flop celic), pomnilniški bloki (Block RAM), namenske digitalne procesne enote (npr. DSP bloki) ter številni drugi specializirani gradniki.
Vse omenjene komponente so med seboj povezane preko programabilnih povezovalnih matrik, ki omogočajo prilagodljivo usmerjanje signalov znotraj vezja. Funkcionalnost posameznih gradnikov ter njihova medsebojna povezljivost sta določeni s konfiguracijskim pomnilnikom, ki definira logične funkcije in topologijo povezav v FPGA strukturi.
Kombinacija LUT (logičnih) vrat in sekvenčnih vezij predstavlja osnovo za implementacijo digitalnih sistemov. LUT-i omogočajo realizacijo kombinacijskih logičnih funkcij, medtem ko sekvenčna vezja z uporabo pomnilnih elementov omogočajo shranjevanje trenutnega stanja sistema. Na ta način je mogoče opisati in realizirati tudi časovno odvisno delovanje logičnih funkcij, kar je bistveno pri načrtovanju sodobnih digitalnih vezij.
V nadaljnjih člankih se bomo osredotočili predvsem na realizacijo kombinacijskih logičnih funkcij in sekvenčnih vezij, saj ti predstavljata osnovna gradnika vsake digitalne arhitekture znotraj FPGA.


Uporaba FPGA vezji
Kot je bilo že omenjeno v uvodu, se FPGA vezja uporabljajo v številnih industrijskih področjih, kjer omogočajo zajem podatkov iz okolja, njihovo obdelavo ter posredovanje obdelanih podatkov drugim sistemskim enotam. Zaradi fleksibilne vhodno-izhodne (I/O) infrastrukture je na FPGA mogoče priključiti različne senzorje in druga integrirana vezja, kar omogoča visoko stopnjo prilagodljivosti pri načrtovanju elektronskih sistemov.
Poleg tega je v FPGA mogoče implementirati tudi kompleksne procesorske arhitekture, kot je odprtokodna arhitektura RISC-V. Takšne implementacije običajno realiziramo kot t. i. mehka procesorska jedra (soft-core procesorje), katerih arhitektura je opisana v jeziku za opis strojne opreme (HDL) in sintetizirana v programabilno logiko.
Glavna omejitev takšnih rešitev je, da praviloma delujejo pri nižjih delovnih frekvencah v primerjavi z namensko izdelanimi integriranimi vezji tipa ASIC (Application-Specific Integrated Circuit), ki imajo fiksno, vnaprej določeno strukturo in so optimizirana za specifično aplikacijo. Pri ASIC rešitvah ima uporabnik na voljo vnaprej definiran nabor perifernih enot, arhitekturnih značilnosti in komunikacijskih vmesnikov, pri čemer dodatne prilagoditve po izdelavi vezja niso več mogoče.
Nasprotno pa implementacija procesorske arhitekture v FPGA omogoča visoko stopnjo prilagodljivosti, saj lahko uporabnik arhitekturo procesorja, nabor perifernih enot, širino podatkovnih poti, velikost predpomnilnikov ter druge sistemske komponente prilagodi specifičnim zahtevam aplikacije. Takšen pristop omogoča optimizacijo sistema z vidika porabe virov, zmogljivosti in energetske učinkovitosti.
Primerjava FPGA proti mikrokontrolerju
FPGA ne smemo enačiti z mikrokontrolerjem, saj se njuno delovanje, arhitekturna zasnova ter sam pristop k načrtovanju in integraciji aplikacij bistveno razlikujejo. Mikrokontroler temelji na fiksni procesorski arhitekturi, ki izvaja programsko kodo zaporedno, medtem ko FPGA omogoča implementacijo prilagodljive strojne logike, kjer se funkcionalnost definira na ravni digitalnih vezij.
Posledično se razlikuje tudi način razmišljanja pri razvoju sistema. Pri mikrokontrolerju razvijalec razmišlja predvsem v smislu zaporednega izvajanja programske kode in upravljanja perifernih enot, medtem ko je pri FPGA pristop usmerjen v načrtovanje paralelnih strojnih struktur, časovno analizo, razporeditev virov ter optimizacijo podatkovnih poti.
Sodelovanje FPGA vezja in procesorja
Pomembno je tudi sodelovanje med FPGA vezjem in procesorjem, saj lahko njuna kombinacija bistveno izboljša zmogljivost sistema. FPGA zaradi svoje prilagodljive arhitekture omogoča učinkovito zajemanje in predobdelavo podatkov iz okolice v realnem času, medtem ko procesor izvaja kompleksnejše algoritme in nadzor nad sistemom. Medsebojna komunikacija med obema integriranima vezjema običajno poteka preko hitrih podatkovnih vodil, kot je sodobno vodilo PCI Express.
Sodobna FPGA vezja omogočajo implementacijo kompleksnih mikroelektronskih arhitektur, pri katerih sta v istem ohišju integriranega vezja združena prilagodljiva FPGA logika in zmogljiv procesorski podsistem. Takšna integracija omogoča tesno sodelovanje med programirljivo logiko in splošnonamenskim procesorjem, kar bistveno poveča fleksibilnost in zmogljivost sistema. FPGA del sistema je primeren predvsem za izvajanje časovno kritičnih operacij, paralelno obdelavo podatkov ter neposredno povezovanje z zunanjimi napravami, medtem ko procesorski del omogoča izvajanje kompleksnejših algoritmov, nadzor nad sistemom ter upravljanje komunikacijskih protokolov. Kombinacija obeh pristopov omogoča učinkovito razdelitev nalog med strojno in programsko implementacijo, kar vodi do večje učinkovitosti, nižje latence ter boljše prilagodljivosti celotnega sistema glede na zahteve aplikacije.
FPGA razvojno okolje
Razvoj aplikacij za FPGA vezja predstavlja zahteven in večstopenjski proces. Ta vključuje načrtovanje električne sheme, razvoj tiskanega vezja (PCB) ter končno integracijo FPGA vezja s procesorskim sistemom. Ker je celoten razvojni proces precej kompleksen, se bomo v tem članku osredotočili predvsem na kratek pregled razvoja RTL aplikacije za FPGA vezja. V nadaljnji seriji člankov se bomo podrobneje obravnavali tudi druge faze razvoja, vključno z načrtovanjem strojne opreme, integracijo sistema ter optimizacijo delovanja FPGA vezje.
Pri razvoju digitalnih vezij se pogosto uporablja modeliranje na ravni prenosa registrov, znano kot Register-Transfer Level (RTL). RTL predstavlja nivo abstrakcije, pri katerem je digitalni sistem opisan kot skupek registrov, med katerimi se podatki prenašajo preko kombinacijskih logičnih funkcij. Registri predstavljajo pomnilne elemente, ki shranjujejo stanje sistema in so običajno sinhronizirani s taktnim signalom. Kombinacijska logika pa določa, kako se vhodni podatki obdelujejo in kako se izračunani rezultati prenesejo v naslednje stanje sistema.
Prvi korak pri razvoju vgrajenega sistema z FPGA vezjem je temeljita raziskava razpoložljivih možnosti na trgu. Ker trg trenutno ponuja veliko različnih FPGA vezij — od preprostih, cenovno dostopnih različic, do zmogljivih in specializiranih čipov za zahtevnejše aplikacije — je ključno, da izberemo tisto vezje, ki najbolje ustreza zahtevam naše specifične aplikacije. Pri tem moramo upoštevati več dejavnikov: zahtevano procesorsko zmogljivost, število logičnih elementov, porabo električne energije, razpoložljive vhodno-izhodne priključke ter seveda ceno.
Cenovni razpon FPGA vezij je izjemno širok — od nekaj deset evrov za enostavnejše čipe, namenjene prototipiranju in učenju, pa vse do nekaj tisoč evrov za visoko zmogljiva vezja, ki se uporabljajo v telekomunikacijah, obrambi in industriji. Skrbna analiza teh parametrov nam omogoča, da vgrajeni sistem optimiziramo tako po porabi električne energije, kot po skupnih stroških razvoja in proizvodnje. Napačna izbira FPGA vezja v tej fazi lahko namreč povzroči visoke stroške preoblikovanja sistema v kasnejših fazah razvoja, zato se tej začetni raziskavi splača posvetiti dovolj časa in pozornosti.
Nasljednji korak razvoja RTL aplikacije je potrebno razmisliti, kateri strojni opisni jezik (hardware description language – HDL) je najprimernejši za razvoj. Danes poznamo tudi pristope na višjem nivoju abstrakcije, znane kot sinteza na visoki ravni (High-Level Synthesis – HLS). Med takšna orodja sodijo na primer MATLAB HDL Coder, SystemC in NI LabVIEW, ki omogočajo opis funkcionalnosti sistema na višjem nivoju ter samodejno generiranje RTL kode.
Na drugi strani poznamo tudi klasične HDL jezike nižjega nivoja abstrakcije, kot so Verilog, SystemVerilog in VHDL. Njihova glavna prednost je, da omogočajo natančnejši opis digitalnega vezja na nivoju logičnih funkcij in sekvenčnih elementov, kar razvijalcu omogoča večji nadzor nad končno arhitekturo in časovnim obnašanjem vezja. V primerjavi s pristopi HLS, kjer je opis pogosto podan na nivoju funkcionalnih blokov ali algoritmov, klasični HDL jeziki omogočajo bolj neposredno načrtovanje digitalne logike.
Takšen pristop omogoča jasno ločevanje med sekvenčnim delom vezja (registri in stanje sistema) ter kombinacijskim delom (logične operacije nad podatki). RTL opis zato predstavlja pomemben vmesni nivo med visokim algoritmičnim opisom sistema in končno implementacijo na nivoju logičnih vrat, ki jo generirajo sintezna orodja. Zaradi svoje preglednosti, determinističnega časovnega obnašanja in dobre podpore v razvojnih orodjih je RTL modeliranje danes eden ključnih pristopov pri razvoju digitalnih sistemov na FPGA vezjih.
Z vidika prilagodljivosti in nadzora nad implementacijo so zato HDL jeziki v številnih primerih še vedno zelo uporabni, predvsem pri razvoju časovno kritičnih ali visoko optimiziranih digitalnih sistemov. V nadaljevanju te serije člankov bomo za razvoj RTL aplikacij uporabljali strojni opisni jezik VHDL.
Ko izberemo ustrezen tip FPGA vezja in HDL jezik, s katerim bomo razvijali predvideno aplikacijo, lahko pričnemo s podrobnim načrtovanjem funkcionalnosti. Ta faza se pogosto začne s klasičnim pristopom — s svinčnikom in papirjem — s pomočjo katerega na abstraktnem nivoju narišemo blokovni diagram naše aplikacije. Ta diagram prikazuje glavne funkcionalne bloke sistema ter povezave in tokove podatkov med njimi, kar nam omogoča jasen pregled nad celotno arhitekturo še preden začnemo s pisanjem kode.
Ko je abstraktna zasnova sistema dovolj dorečena, jo prenesemo v HDL jezik. Opis digitalnega vezja zapišemo v ustreznem urejevalniku besedila, kot so Notepad++, Visual Studio Code ali vgrajeni urejevalnik, ki je del razvojnega orodja proizvajalca FPGA vezja (npr. Vivado pri podjetju Xilinx oziroma AMD, ali Quartus Prime pri podjetju Intel oziroma Altera). Vsak od teh urejevalnikov ima svoje prednosti — specializirani vgrajeni urejevalniki na primer pogosto ponujajo samodejno dopolnjevanje sintakse, označevanje napak in neposredno integracijo s simulacijskimi ter sintetizacijskimi orodji, medtem ko splošni urejevalniki, kot je Visual Studio Code, z ustreznimi razširitvami omogočajo prijetnejše in bolj prilagodljivo razvojno okolje.
Ko opišemo vezje v izbranem HDL jeziku, je naslednji ključni korak funkcionalna simulacija. S tem korakom preverimo in potrdimo, da je RTL opis, zapisan v izbranem jeziku (npr. VHDL ali Verilog), pravilno zasnovan ter da vse integrirane funkcionalnosti izpolnjujejo zahteve vgrajenega sistema, ki ga razvijamo. Simulacija se izvede na podlagi testnih okolij, imenovanih testbench, ki generirajo vhodne signale in preverjajo ustreznost izhodnih signalov glede na pričakovano obnašanje vezja. Omenjeni testbench-i so v večini primerov prav tako razviti v jezikih VHDL ali Verilog, saj to omogoča enotno razvojno okolje in lažjo integracijo v obstoječ projekt.
Za izvedbo simulacije lahko uporabimo različna orodja. Med odprtokodnimi simulatorji sta najbolj razširjena GHDL, namenjen simulaciji vezij, opisanih v jeziku VHDL, ter Verilator, ki je optimiziran za jezik. Ti orodji sta priljubljeni zlasti med hobisti in v akademskem okolju, saj sta brezplačni in dobro dokumentirani. Poleg odprtokodnih rešitev na trgu obstajajo tudi komercialni simulatorji, kot sta ModelSim in QuestaSim podjetja Siemens EDA, ki ponujajo naprednejše zmogljivosti za razhroščevanje in analizo signalov ter so pogosto izbira v profesionalnem in industrijskem okolju. Številna razvojna okolja proizvajalcev FPGA vezij, kot je Xilinx Vivado vključujejo lastne simulatorje, kar poenostavi razvojni proces, saj ni potrebe po namestitvi ločenih orodij.
Ko smo zadovoljni s simulacijo, lahko pričnemo z integracijo razvite RTL kode v razvojno okolje, ki podpira izbrano FPGA vezje. Ne glede na to, katero okolje izberemo, vsa orodja sledijo enakim temeljnim korakom — od sinteze RTL vezja vse do generacije konfiguracijske datoteke, ki je na koncu naložena na izbrani FPGA. Ti koraki si sledijo v naslednjem vrstnem redu:
Sinteza vezja (Synthesis): V tem koraku orodje prevede RTL opis, zapisan v HDL jeziku, v mrežo logičnih vrat (ang. netlist). Sinteza je prvi korak, pri katerem se abstraktni opis vezja pretvori v konkretne logične elemente.
Preslikava na FPGA tehnologijo (Technology Mapping): Sintetizirano vezje se preslika na dejanske logične elemente, ki so na voljo v izbranem FPGA čipu, kot so LUT (Look-Up Table) elementi, flip-flopi in pomnilniški bloki.
Optimizacija vezja (Optimization): Orodje optimizira preslikano vezje z namenom zmanjšanja porabe logičnih virov, izboljšanja hitrosti delovanja ter zmanjšanja porabe električne energije.
Razmeščanje komponent (Placement): Logični elementi vezja se fizično razporedijo znotraj FPGA čipa ob upoštevanju časovnih in prostorskih omejitev.
Povezovanje (Routing): Razmeščeni elementi se med seboj povežejo z uporabo razpoložljivih povezovalnih virov znotraj FPGA arhitekture.
Generacija poročil (Timing & Resource Report): Orodje izdela podrobna poročila o izkoriščenosti virov FPGA vezja ter o časovnih lastnostih implementiranega vezja, kar razvijalcu omogoča oceno pravilnosti in učinkovitosti implementacije.
Generiranje konfiguracijske datoteke (Bitstream Generation): V zadnjem koraku orodje generira konfiguracijsko datoteko (.bit oziroma .bin), ki vsebuje popoln opis konfiguracije FPGA vezja in se neposredno naloži na čip.
Ko razvojno okolje uspešno generira konfiguracijsko datoteko (.bit), jo prenesemo na FPGA vezje, kjer v realnem času preverimo, ali razviti RTL izpolnjuje vse zahteve sistema. Prenos konfiguracijske datoteke na čip je mogoč preko različnih vmesnikov, pri čemer je izbira odvisna od uporabljenega razvojnega okolja in strojne opreme. Najpogosteje se za ta namen uporabljata vmesnika JTAG in UART, ki sta prisotna na večini razvojnih plošč. Vmesnik JTAG je zlasti razširjen, saj omogoča ne le programiranje FPGA čipa, temveč tudi razhroščevanje in spremljanje notranjih signalov vezja med delovanjem v realnem času.
Testiranje na realnem strojnem sistemu je ključni korak v procesu razvoja, saj simulacijsko okolje ne more v celoti nadomestiti dejanskih razmer delovanja. Na fizičnem vezju se namreč pokažejo učinki, ki jih simulacija ne zajame — kot so časovne zakasnitve na ravni strojne opreme, elektromagnetne motnje, nihanja napajalne napetosti in drugi fizikalni pojavi. Če v tej fazi ugotovimo, da razviti RTL ne izpolnjuje vseh zahtev sistema, se vrnemo na ustrezni korak v razvojnem procesu, popravimo HDL kodo ali prilagodimo konfiguracijo ter postopek sinteze in implementacije ponovimo.
Poleg tega je priporočljivo, da ob vsakem pomembnejšem implementacijskem koraku izvedemo tudi simulacijo. Ta pristop nam omogoča sproten nadzor nad pravilnostjo delovanja vezja in bistveno olajša razhroščevanje, saj lahko natančneje določimo, v katerem koraku je prišlo do nezaželene napake.
Zaključek
FPGA vezja predstavljajo izjemno prilagodljivo kategorijo integriranih vezij, ki uporabniku omogočajo visoko stopnjo arhitekturne in funkcionalne prilagoditve. Njihova temeljna prednost je možnost konfiguracije strojne strukture glede na specifične zahteve aplikacije, kar omogoča optimizacijo z vidika zmogljivosti, porabe virov in časovnih karakteristik.
S pomočjo FPGA je mogoče implementirati tako preproste logične funkcije, ki temeljijo na Boolovi algebri, kot tudi kompleksne in računsko zahtevne digitalne sisteme, vključno z digitalno obdelavo signalov, komunikacijskimi protokoli ter procesorskimi arhitekturami.
Zaradi svoje paralelne narave delovanja, prilagodljive povezovalne infrastrukture in možnosti integracije specializiranih strojnih blokov FPGA predstavlja zmogljivo platformo za razvoj naprednih digitalnih sistemov, kjer klasične sekvenčne arhitekture pogosto ne zadoščajo zahtevam po visoki prepustnosti, nizki latenci ali determinističnem odzivu.
