Avtor: Klemen Bravhar
Programabilna logična vezja oziroma v angleščini Field Programmable Gate Array (FPGA) so integrirana vezja, ki preko konfiguracijskega pomnilnika dinamično spreminjajo svojo digitalno strukturo in posledično vplivajo na obnašanje vhodno-izhodnih enot.
Za razliko od namenskih integriranih vezij (angl. Application-Specific Integrated Circuit (ASIC)), ki so ob proizvodnji fiksno določena, FPGA vezja omogočajo večkratno rekonfiguracijo tudi po končani proizvodnji, kar jih uvršča med najprilagodljivejše platforme za implementacijo digitalnih sistemov. Prav ta lastnost jih dela privlačne, tako za hitro prototipiranje, kot tudi za aplikacije, kjer so zahteve podvržene pogostim spremembam.
Arhitektura FPGA vezja temelji na različnih komponentah, ki so integrirane v silicijevo rezino in med seboj povezane preko programabilnih povezovalnih matrik. Slednje uporabniku omogočajo, da med konfiguracijo določi, kako so posamezne komponente med seboj logično povezane, s čimer se oblikuje želena digitalna struktura. Kakovost in gostota povezovalnih matrik sta ključni lastnosti, ki vplivata na zmogljivost in fleksibilnost celotnega vezja.
Ta vsebina je samo za naročnike
Najbolj osnovni komponenti znotraj FPGA arhitekture sta iskalna tabela (angl. Look-Up Table (LUT)), preko katere v FPGA vezju realiziramo kombinacijske Boolove funkcije, ter sekvenčni elementi, kot je D-flip-flop, ki omogočajo shranjevanje stanja in implementacijo sekvenčne logike. Omenjeni komponenti sta po navadi združeni v logični blok, znan pod imenom angl. Configurable Logic Block (CLB) pri proizvajalcu Xilinx oziroma angl. Adaptive Logic Module (ALM) pri proizvajalcu Intel/Altera. Takšna zasnova omogoča visoko stopnjo vzporednega procesiranja, saj je na posamezni silicijevi rezini prisotnih lahko več deset tisoč tovrstnih logičnih blokov.



Z evolucijo FPGA vezij so razvijalci v silicijevo rezino začeli integrirati tudi druge specializirane komponente, ki jih uporabnik med razvojem uporablja za realizacijo kompleksnejših digitalnih struktur. Med najpogostejše sodijo blokovni pomnilnik (angl. Block RAM (BRAM)), ki omogoča učinkovito shranjevanje večjih količin podatkov neposredno znotraj vezja, digitalne procesne enote (angl. Digital Signal Processing (DSP)), ki so optimirane za izvajanje matematičnih operacij, kot so množenje in seštevanje, ter visokopretočni podatkovni vmesniki (angl. SERDES), ki omogočajo zanesljiv prenos podatkov pri visokih hitrostih med FPGA vezjem in zunanjimi napravami. Novejše generacije FPGA vezij vključujejo tudi trdo jedro procesorja (angl. Hard Processor System (HPS)), kot je ARM Cortex, ki v kombinaciji s programabilno logiko tvori t. i. heterogeni sistem na čipu (angl. System on Chip (SoC)), primeren za zahtevnejše vgrajene aplikacije.
Osrednja tema pričujočega članka je analiza dveh temeljnih gradnikov moderne FPGA arhitekture, iskalne tabele (LUT) in sekvenčnega elementa D-flip-flop (DFF), ki sta osnovni komponeti razvojnika FPGA digitalnih vezji. Poznavanje njunega delovanja predstavlja osnovo za razumevanje sinteznega procesa, v katerem orodja za načrtovanje pretvorijo opis digitalnega sistema, zapisan v strojnem opisnem jeziku VHDL ali Verilog, v fizično implementacijo na programabilnem vezju. Ob predstavitvi posameznih komponent bomo najprej podali analitično rešitev, ki bo matematično opisala delovanje komponente, ter jo nato podprli s praktično implementacijo v strojnem opisnem jeziku VHDL.
LUT tabela
FPGA vezja se lahko na digitalnem nivoju prilagajajo uporabnikovim zahtevam in osrednji element, ki omogoča to prilagodljivost, je iskalna tabela (angl. Look-Up Table (LUT)), ki v kombinaciji s sekvenčnimi elementi tvori osnovno celico za procesiranje podatkov.
LUT je v bistvu majhen, ultra hiter statični pomnilnik (SRAM), ki omogoča realizacijo poljubne Boolove funkcije. Tipično arhitekturo definira k-vhodna LUT struktura (npr. LUT4, LUT5 ali LUT6), kjer je število razpoložljivih pomnilniških celic določeno z izrazom Enačba 1.
Vsaka kombinacija vhodnih signalov deluje kot naslov, ki v pomnilniku izbere natanko eno lokacijo, v kateri je shranjena izhodna vrednost funkcije. Zaradi te zasnove je zakasnitev skozi LUT konstantna, ne glede na to, kako kompleksno logično funkcijo implementiramo (dokler število vhodov ne preseže k). Za poljubno število vhodov lahko enačbo zapišemo v kompaktnejši obliki vsote mintermov:


Enačba 1
Kjer je:
mi:minterm, ki ustreza binarni kombinaciji vhodov za indeks .
pi+1:vrednost, shranjena v -ti pomnilniški celici.
Primer: LUT z dvema vhodoma
Za implementacijo logičnih operacij z dvema vhodnima krmilnima signaloma (C1 in C2) uporabimo 2-vhodni LUT (LUT2), ki vsebuje 22=4 pomnilniške lokacije (p0, p1, p2, p3), ki ga lahko opišemo z sledečo logično funkcijo:
Enačba 2
Kjer je:
c1,c2:sta vhodna signala, ki delujeta kot naslovni liniji.
Pn:so fiksne vrednosti (0 ali 1), shranjene v konfiguracijskem pomnilniku.
.,V,C so operacije IN, ALI ter NE.
Logična funkcija ALI
Funkcija »ALI« vrne logično enico, če je vsaj eden izmed vhodov aktiven. Za konfiguracijo LUT v tem načinu morajo biti v pomnilniške lokacije zapisane naslednje vrednosti:
Konfiguracija: enačba 3


Pravilnostna tabela podpira ALI funkcijo, če parameter v Enačbi 2 zamenjamo z konfiguracijskimi konstantami dobimo sledečo enačbo: q=C1 V C2



Naslednji primer je IN funkcija, ki vrne logično 1 samo v primeru ko sta oba vhoda hkrati aktivna. V tem primeru pomnilnik LUT tabele ima sledečo konfiguracijo:
Konfiguracija: enačba 4
Vpeljava parametrov pn v Enačbo 2 na poenostavi enačbo, ki opiše logično funkcijo IN v enačbo: q=C1*C2. Glej tabelo 2.
V sodobnih FPGA arhitekturah, ki temeljijo na naprednejših polprevodniških tehnologijah, prevladujejo LUT strukture s štirimi ali šestimi krmilnimi vhodi. Število potrebnih pomnilniških celic je določeno z izrazom 2k, kar za LUT4 znaša 24=16 pomnilniških celic in za LUT6 26=64 pomnilniških celic.
Uporabo LUT tabele v strojnem opisnem jeziku VHDL lahko realiziramo na dva načina. Prvi pristop temelji na stavku process, znotraj katerega z uporabo pogojnih stavkov (kot sta if-else ali case) opišemo želeno logično funkcijo, sintezno orodje pa iz tega opisa samodejno generira ustrezno LUT konfiguracijo. Drugi pristop pa temelji na neposrednem opisu kombinatorne logike, kjer želeno Boolovo funkcijo zapišemo kot logični izraz z operatorji AND, OR in NOT neposredno v arhitekturnem telesu. Oba pristopa sta funkcionalno enakovredna, saj sintezno orodje v obeh primerih generira identično LUT konfiguracijo, razlikujeta pa se predvsem v preglednosti in berljivosti kode.
Kot je razvidno s Slike 1 in Slike 2, sta prikazana dva različna pristopa opisa iste logične funkcije v strojnem opisnem jeziku VHDL. Kljub razliki v načinu opisa, bodisi z uporabo stavka process bodisi z neposrednim zapisom kombinatorne logike, sintezno orodje oba opisa pretvori v identično RTL shemo. To nazorno potrjuje, da je končni rezultat sinteze neodvisen od izbranega sloga pisanja kode, temveč je odvisen izključno od opisane funkcionalnosti. Razlika med pristopoma se tako kaže predvsem v preglednosti, berljivosti in vzdržljivosti kode, kar postane še posebej pomembno pri načrtovanju kompleksnejših digitalnih sistemov.



Sekvenčna vezja
Poleg kombinacijske logike vsak logični blok FPGA običajno vsebuje tudi sekvenčni element, najpogosteje v obliki D-flip-flop celice. Ta omogoča sinhrono shranjevanje podatkov glede na rob signala ure in s tem realizacijo registrov, števcev, avtomatov stanja ter drugih sinhronih struktur. Kombinacija LUT in D-flip-flopa znotraj istega logičnega bloka omogoča učinkovito implementacijo tako kombinacijskih kot sekvenčnih delov digitalnega sistema.
Sekvenčna vezja so ključna pri časovno sinhronizirani implementaciji več funkcionalnosti v eni strojni komponenti. Omogočajo, da se izhodi različnih logičnih funkcij uskladijo glede na uro oziroma krmilne signale, kar omogoča njihovo združevanje brez motenj ali napačnih izhodov.
Pri združevanju dveh funkcionalnosti v eno se sekvenčna vezja uporabljajo za:
Uskladitev časovnega nastopa izhodov – vsak izhod funkcije je lahko generiran ob različnih časovnih trenutkih. Sekvenčni elementi (npr. flip-flopi ali registri) omogočajo, da se ti izhodi sinhronizirajo s skupnim uro signalom.
Preprečevanje hazardov in meta-stabilnosti – z uporabo sekvenčnih členov se zmanjša možnost, da bi nepredvideni prehodi ali zamude v logičnih signalih povzročile napačen rezultat pri združevanju.
Enostavna kombinacija funkcionalnosti – ko so izhodi časovno usklajeni, jih je mogoče združiti s preprostimi kombinacijami logičnih funkcij, kar poenostavi zasnovo in poveča zanesljivost.
Na praktičnem primeru si lahko zamislimo LUT, ki generira dve različni logični funkciji, npr. »ALI« in »IN«. Če želimo izhod obeh funkcij združiti, bi brez sekvenčnih elementov lahko prišlo do neskladij, saj se spremembe na vhodih LUT ne pojavijo hkrati na izhodih. Z uporabo sekvenčnih vezij se izhoda obeh funkcij sinhronizirata glede na uro, kar omogoča njihovo varno kombinacijo v eno funkcijo, npr. za nadaljnjo logično obdelavo ali krmiljenje.



DFF vezje ima navadno dva vhodna priključka, to sta podatkovni vhod D in vhod ure CLK, ter en izhodni priključek Q. To pomeni, da se bo vrednost podatkovnega vhoda D preslikala na izhod Q ob vsakem pozitivnem ali negativnem robu takta ure, odvisno od tipa DFF vezja, kjer se bo vrednost ohranila za eno periodo takta ure. Poleg že omenjenih vhodov ima lahko DFF vezje tudi vhod Reset, ki ob aktivnem stanju izhod Q ponastavi na logično vrednost 0.
Spodnje slike prikazujejo postopek implementacije DFF vezja v strojnem opisnem jeziku VHDL. V vrstici, kjer se nahaja ukaz »rising_edge(ura)«, definiramo, da je trenutni stavek process sekvenčne narave in ne kombinatorne, kot smo uporabili v primeru na Sliki 4. Poleg tega ima opisano sekvenčno vezje asinhroni reset, kar pomeni, da se bo izhod Q ponastavil takoj, ko bo vhod Reset aktiven, neodvisno od signala ure.
Združena logična in sekvenčna funkcionalnost
Sedaj, ko poznamo način opisa kombinatorne logike in sekvenčne funkcionalnosti v strojnem opisnem jeziku VHDL, lahko naredimo korak naprej ter oba pristopa združimo v enem digitalnem vezju oziroma eni VHDL opisni datoteki. Opisani projekt bo vseboval že predstavljeno logično funkcijo »IN«, ki bo služila kot kombinatorni del vezja, tej pa bo sledila sekvenčna stopnja, realizirana z vezjem D-flip-flop. Takšna zasnova je v praksi zelo pogosta, saj večina realnih digitalnih sistemov združuje tako kombinatorno logiko za procesiranje podatkov kot sekvenčne elemente za shranjevanje stanja in sinhronizacijo signalov.
Zaključek
Sedaj, ko smo osvojili osnove načrtovanja digitalnih vezij za FPGA v jeziku VHDL, kot so osnovna logična vrata, osnovne aritmetične operacije ter enostavna sekvenčna vezja, lahko nadaljujemo z bolj kompleksnimi in naprednimi digitalnimi vezji. V nadaljevanju bomo spoznali seštevnike in odštevalnike, ki predstavljajo temeljne gradnike aritmetično-logičnih enot (ALE), preklopne avtomate (angl. Finite State Machine – FSM), ki so ključni pri načrtovanju krmilnih vezij in protokolov, pomikalne registre (levo in desno), ki se pogosto uporabljajo pri serijski komunikaciji in obdelavi podatkov, ter mnoga druga napredna vezja. Vsa ta vezja bomo načrtovali v jeziku VHDL, jih simulirali ter implementirali na razvojni plošči s tehnologijo FPGA, kar nam bo omogočilo praktično razumevanje in poglobljeno znanje s področja digitalnega načrtovanja.


Toda načrtovanje FPGA vezij se ne ustavi samo pri jeziku VHDL. Podobno kot pri načrtovanju tiskanega vezja (PCB), kjer moramo poleg shematike obvladati tudi postavitev komponent, usmerjanje signalov ter električne lastnosti vezja, moramo tudi pri načrtovanju FPGA vezij obvladati uporabo t.i. Constraintov (omejitev). Constrainti so datoteke, najpogosteje v formatu XDC (Xilinx Design Constraints), v katerih podrobno opišemo naše vezje in s tem natančno definiramo njegovo delovanje. V njih določimo dodelitev fizičnih priključkov (angl. Pin Assignment), kjer povežemo logične signale iz VHDL kode z dejanskimi fizičnimi priključki na FPGA čipu, časovne omejitve (angl. Timing Constraints), ki zagotavljajo pravilno delovanje vezja pri željeni taktni frekvenci, ter električne lastnosti priključkov, kot so napetostni nivoji in standardni vmesniki (npr. LVCMOS, LVDS). Brez pravilno nastavljenih Constraintov orodje za sintezo in implementacijo ne more zagotoviti pravilnega in zanesljivega delovanja našega vezja na fizičnem FPGA integriranemu vezju, zato je njihovo poznavanje ključnega pomena za vsakega načrtovalca digitalnih vezij.
Načrtovanje digitalnih vezij za FPGA platformo je široko in fascinantno področje, ki združuje teoretično znanje digitalnih sistemov s praktičnimi veščinami načrtovanja in implementacije. V tem članku smo spoznali, da uspešno načrtovanje ne zahteva le obvladovanja jezika VHDL, temveč tudi poznavanje orodij za sintezo. Prav kombinacija vseh teh znanj in veščin načrtovalca digitalnih vezij loči od izkušenega inženirja, ki je sposoben načrtovati kompleksne in zanesljive digitalne sisteme. Področje FPGA načrtovanja se nenehno razvija in napreduje, saj proizvajalci kot sta AMD (Xilinx) in Intel (Altera) neprestano izboljšujejo svoje platforme in orodja, kar odpira nove možnosti na področjih kot so umetna inteligenca, obdelava signalov, telekomunikacije ter vesoljska in obrambna industrija. Upamo, da vam je ta članek služil kot koristen uvod in spodbuda za nadaljnje raziskovanje tega zanimivega in perspektivnega področja.
