Documente Academic
Documente Profesional
Documente Cultură
În acest context, circuitele FPGA (Field Programmable Gate Array) reprezintă la momentul actual
platforme pentru sisteme digitale complexe şi oferă elemente computaţionale din ce în ce mai sofisticate şi
mai numeroase. Termenul FPGA, tradus în româneşte prin matrice sau arie de porţi logice re-programabilă,
are o conotaţie mai mult istorică, pentru că dispozitivele FPGA nu mai sunt doar circuite reconfigurabile
ce pot implementa funcţii logice complexe, cum erau inițial la apariţia lor, când se utilizau doar ca logică
de legătură în sistemele cu procesor.
Acum, pe un circuit FPGA se integrează blocuri de memorie RAM (Random Access Memory) şi
multiplicatoare hardware sau chiar celule DSP bazate pe operaţia combinată înmulţire-acumulare (MAC –
Multiply-Accumulate). Pe lângă faptul că densitatea de integrare a dus la construirea de FPGA-uri cu
milioane de porţi logice echivalente, aceste elemente computaţionale avansate (pe un FPGA pot fi de la
câteva zeci la câteva mii de celule DSP) permit transformarea FPGA-ului într-o maşină de calcul cu putere
de procesare extrem de mare și cu timpi de execuție foarte mici. Aşadar, tehnologia circuitelor FPGA va
constitui pe viitor unitatea principală de procesare în structura unui sistem încorporat.
Aceasta se poate realiza prin implementarea algoritmului de control direct în hardware la nivel de circuit
FPGA, sau chiar mergând mai departe, prin abordarea unei variante oarecum clasică, adică în circuitul
FPGA se poate implementa chiar un procesor software, iar pe acesta va rula algoritmul software
implementat pentru o anumită aplicație.
Faptul că dispozitivele FPGA pot constitui maşini de calcul performante, a condus la interesul acordat
acestor dispozitive în domeniul controlului automat, ce necesită lucru în timp real, domeniu în care
algoritmii se pretează la paralelizare, iar timpul de calcul poate fi o componentă critică.
Deși sunt mai multe firme care dezvoltă circuite FPGA, există 2 mari companii importante și de referință
din industria electronică de top ce sunt producători de circuite FPGA: Altera şi Xilinx. Aceste firme au
dezvoltat adevărate familii de circuite FPGA, evidenţiindu-se faptul că aceste dispozitive nu mai sunt
simple arii de porţi logice interconectabile, ci integrează elemente complexe de procesare.
O concluzie importantă este faptul că dispozitivele FPGA actuale au “virtual” o putere de calcul
fantastică. Aceasta este “virtuală” deoarece trebuie folosită prin proiectarea unui adevărat sistem “software
în hardware” care să utilizeze resursele disponibile, altfel acestea ne-având însemnătate. Lucrurile stau la
fel cu un procesor capabil să execute un anumit număr de operaţii pe secundă: trebuie dezvoltat software-
ul care să facă acest lucru. Diferenţa este însă crucială: proiectarea de software pentru un procesor este un
domeniu matur, cunoscut, studiat de foarte mult timp şi stabilit în direcții de abordare clare. Proiectarea de
hardware pentru FPGA, deşi utilizând de foarte mult timp unelte şi metode “clasice”, cum ar fi limbaje low-
level de tip HDL(Hardware Description Language) şi proiectarea la nivel de transfer între registre, are parte
de o reinventare în ultimul timp prin introducerea unor metode şi unelte noi, la un nivel de abstractizare
mult mai înalt: limbaje de tip C sau scheme bloc în Matlab/Simulink, Labview-FPGA.
Se merge la momentul actual chiar la implementarea de procesoare software direct în circuite FPGA.
Prin procesor software se înţelege un procesor implementat în resursele de uz general ale unui FPGA. Au
existat chiar şi FPGA-uri ce conţineau procesoare hard, adică nuclee fixe, ne-reconfigurabile, dar capabile
să se interfaţeze uşor cu restul resurselor din FPGA.
O idee interesantă este dată de faptul că, la momentul actual, cele mai noi tipuri de procesoare sunt
dezvoltate/testate/emulate mai înainte pe dospozitive FPGA, înainte de a fi introduse în producția de serie.
Este normal că prototiparea unui procesor nou, implică proiectare și teste laborioase, ceea ce conduce la
faptul că primul procesor nou dintr-o familie, are costuri cu proiectarea de peste 1 milion de EU. Dacă s-a
omis un “gate”(o simplă poartă logică) în arhitectura acestuia, va trebui reluată validarea/testarea de la
capăt, cu aceleași costuri. De aceea, există deja consacrată practica actuală, ca procesoarele noi ce se
lansează pe piață, să fie inițial emulate într-un circuit FPGA în procesul de prototipare.
După cum se poate observa în Fig.1, elementele funcționale de bază pentru un circuit FPGA sunt:
• Blocuri logice (Logic Blocks) ce sunt blocurile fizice elementare, implementate la nivelul circuitelor
FPGA. În principiu, acestea sunt porți logice fizice sau blocuri de memorie ce implementează
diverse funcții logice standard sau speciale. Mai mult, un anumit număr de blocuri elementare este
grupat din fabricație, sau mai bine-zis sunt optimizate legăturile, astfel încât să implementeze o
arhitectură dedicată de DSP(Digital Signal Procesor). Astfel grupul de blocuri poate fi folosit efectiv
ca un DSP sau ca blocuri elementare.
• Conexiunile programabile (Programmable Interconect), ce este reprezentată de așa numita matrice
programabilă de rutare care este configurată prin programare și realizează conexiunile între
blocurile hardware logice. Este echivalentul traseelor care leacă componentele electronice pe un
cablaj imprimat PCB(Printed Circuit Board). Frumusețea tehnică este că, în cazul circuitelor FPGA,
aceste conexiuni sunt programabile și astfel ne putem dezvolta diverse arhitecturi hardware….doar
prin programare (…fără pistolul de lipit).
• Blocurile de Intrare/Ieșire (I/O Blocks) sunt formate din grupuri de blocuri elementare conectate la
pinii de I/O astfel încât să relizeze conectări configurabile cu diverse circuite sau echipamente
exteriore (Traductoare sau Elemente de Execuție). La fel și aceste blocuri pot fi folosite/programate
ca blocuri compacte de prelucrare (pentru diverse funcții de condiționare de semnal) sau ca blocuri
elementare cu care să realizăm o multitudine de funcții logice de care are nevoie aplicația.
De reținut, dezvoltarea unei aplicații folosind programarea unui circuit FPGA, înseamnă de fapt să realizăm
efectiv (prin programare) conexiunile între blocurile logice elementare sau grupurile de blocuri dedicate(de
tip DSP). Practic, programarea unui circuit FPGA, este achivalentă simultan cu realizarea componentei
hardware și software din dezvoltarea unei aplicații standard cu microprocesor. Se mai spune chiar că, la
nivelul unui circuit FPGA, implementăm programul direct… hardware.
Fig.2. flip-flops
Diferite familii FPGA diferă în modul în care flip-flop-urile și LUT-urile sunt ambalate împreună
la nivel hardware, adică trebuie să știm cum le vom putea conecta prin programare, folosind evident
matricea de rutare. Astfel este foarte important să înțelegem ce înseamnă aceste blocuri, cum pot fi legate
și cum sunt organizate.
De reținut, toate aceste detalii arhitecturale sunt descrise în fișierul datasheet.pdf ce contine toată
documentația aferentă circuitului FPGA ales.
De exemplu, banala funcție logică AND, prezentată în Fig.4, poate fi implementată fizic într-o
tabelă de memorie LUT, conform tabelei de adevăr din Fig.5.
Fig.4. Funcția logică AND
Mulți algoritmi de procesare de semnal implică inmultiri cu numere mari si astfel, FPGA-urile cu
performanțe superioare, cum ar fi Xilinx Virtex-5 FPGA, au circuitele de multiplicare-acumulare
predefinite. Aceste blocuri de procesare pre-construite, sunt cunoscute și sub denumirea de DSP48 Slice,
ce integrează un rezultat de multiplicare pe 25 biți, adică realizeaza operatii in virgula fixa pe 18 biți, la
care se adaugă și circuite de insumare.
➢ Blocuri de memorie RAM
Resursele de memorie efectivă, sunt o altă specificație cheie de luat în considerare atunci când se
selecteaza un circuit FPGA. Memoria RAM definită de utilizator, încorporată pe întregul cip FPGA, este
utilă pentru stocarea seturilor de date sau transmiterea valorilor între task-uri executate în mod paralel sau
iterativ. În funcție de familia FPGA, se poate configura memoria RAM integrată în blocuri de 16 sau 36
kb. Există în continuare opțiunea de a implementa seturi de date de tip tablouri, folosind celule de tip flip-
flops, dar cu toate acestea, matricile mari devin rapid prea extinse pentru resursele logice FPGA. De
exemplu, o matrice de 100 de elemente de numere pe 32 de biți poate consuma mai mult de 30% din flip-
flop-uri într-un Virtex-II 1000 FPGA, sau poate ocupa mai puțin de 1% din blocul RAM încorporat.
Algoritmii de procesare a unui semnal digital trebuie adesea să țină evidența unui bloc mare de date sau a
coeficienților unei ecuații complexe și, fără o zonă de memorie consistentă disponibilă, multe funcții de
procesare pot să nu se încadreze în logica configurabilă a unui circuit FPGA.
De reținut, Execuția inerent paralelă la nivelul unui circuit FPGA, permite ca elemente independente de
logică hardware să fie coordonate/sincronizate cu semnale de ceas diferite. Trecerea datelor între o logică
care rulează componente la viteze diferite poate fi dificilă, iar memoria disponibilă poate fi utilizată pentru
a permite transferul folosind buffere de memorie FIFO (first-in-first-out).
În figura de mai jos se poate observa folosirea resurselor hardware ale circuitului FPGA, Xilinx
Kintex-7 7K325T, diponibil în sistemul prezentat la laborator, NI cRIO 9039, pentru aplicația de
achiziție/prelucrare vibrații. Detaliile de potrivire a algoritmilor de prelucrare peste arhitectura FPGA a fost
realizată automat de către mediul de dezvoltare Labview-FPGA, ceea ce ne-a scutit pe noi, ca programatori,
de această proiectare extrem de laborioasă.
Care ar fi diferența?
Descrierea pur principială a unor elemente din arhitectura circuitelor FPGA de la Xilinx
Compania Xilinx oferă deja mai multe familii principale de dispozitive FPGA: Spartan, Artix,
Virtex, și cea mai nouă Kintex. Fără a avea pretenția unei prezentări detaliate, în continuare se prezintă, ca
exemplu, câteva caracteristici arhitecturale principale ale acestor circuite.
Arhitectura familiei Spartan 6 se bazează pe felii logice (slice), grupate în mai multe blocuri logice
elementare configurabile (CLB – Configurable Logic Block). Fiecare CLB conţine 2 felii alăturate. Fiecare
felie conţine 4 LUT-uri, 8 bistabili şi logică complementară. Există 3 tipuri de felii logice în arhitectura
Spartan 6: SLICEM, SLICEL şi SLICEX.
Un sfert din feliile logice ale unui dispozitiv Spartan 6 sunt de tipul SLICEM. Fiecare din cele 4
LUT-uri ale unui SLICEM poate fi configurat ca un singur LUT cu 6 intrări şi o ieşire sau ca 2 LUT-uri cu
câte 5 intrări şi ieşiri independente. LUT-urile pot fi folosite şi ca memorie RAM distribuită de 64 de biţi,
configurată ca 64x1 sau 32x2, sau ca registre de deplasare: un registru de 32 de biţi (SRL32 – Shift Register
Logic) sau 2 registre de 16 biţi (SRL16). Ieşirea fiecărui LUT poate fi salvată într-un bistabil. Pentru operaţii
aritmetice, un lanţ de propagare a transportului de mare viteză leagă între ele feliile logice de pe aceeaşi
coloană din FPGA. Arhitectura unui slice de tip SLICEM al familie Spartan 6, este prezentată în Fig.8.
Fig.8. Arhitectura unui slice de tip SLICEM al familie Spartan 6
Încă un sfert din feliile logice (slice) ale unui dispozitiv Spartan 6 sunt de tipul SLICEL. Acestea au
aceeaşi structură ca şi SLICEM, cu excepţia posibilităţii de configurare ca memorie distribuită sau registru
de deplasare. Celelalte felii logice dintr-un Spartan 6 sunt de tipul SLICEX, care elimină din structura
SLICEL logica de generare a transportului şi multiplexoarele.
FPGA-urile Spartan 6 conţin şi blocuri de memorie RAM cu port dual de 18 kbiţi. Accesurile la
memorie sunt sincrone cu semnalul de tact. Fiecare port poate fi configurat ca 16Kx1, 8Kx2, 4Kx4, 2Kx8
(sau x9), 1Kx16 (sau x18), sau 512x32 (sau x36). Cele două porturi de acces la un bloc de memorie pot
avea lăţimi diferite. Configuraţiile x9, x18 şi x36 includ biţi de paritate. Fiecare bloc de RAM poate fi
configurat ca două jumătăţi de 9kbiţi independente.
Unele dispozitive ale familiei includ blocuri de control al memoriei externe (MCB – Memory
Controller Block), fiecare putându-se interfaţa la un cip de memorie DRAM de tipul DDR, DDR2, DDR3
sau LPDDR (Low Power DDR) şi putând atinge rate de transfer de 800 Mb/s.
Dispozitivele Spartan 6 dispun şi de blocuri dedicate operaţiilor DSP, numite DSP48A1. Fiecare
astfel de bloc este alcătuit dintr-un multiplicator dedicat 18x18, ce lucrează cu numere reprezentate în
complement faţă de 2, şi un acumulator de 48 de biţi şi poate opera la o frecvenţă de lucru de 250 MHz.
Arhitectura internă a unui DSP48A1 este prezentată în Fig.9.
Blocul DSP48A1 oferă posibilitatea folosirii registrelor interne pentru implementarea de pipeline-
uri. De asemenea, astfel de blocuri pot fi cascadate datorită multiplelor facilităţi de înlănţuire a propagării
transportului. Acumulatorul poate fi folosit şi pe post de numărător sincron, iar multiplicatorul poate fi
folosit pentru implementarea unui circuit de deplasare cu pas selectabil (barrel shifter).
Dispozitivele familiei Spartan 6 dispun și de circuite speciale pentru generarea semnalelor de tact.
Acestea sunt numite blocuri de gestionare a tactului (CMT – Clock Management Tile) şi sunt alcătuite
fiecare din câte un circuit PLL şi două circuite digitale de gestionare a tactului (DCM – Digital Clock
Manager). Aceste componente pot fi conectate între ele prin trasee dedicate, dar pot opera şi independent.
Circuitul PLL poate fi folosit pentru sintetizarea frecvenţelor de tact şi filtrarea fluctuaţiilor semnalelor de
tact externe sau interne.
Unele circuite din familia Spartan 6, de exemplu sub-familia Spartan 6 LXT, conţin circuite dedicate
de transmisie/recepţie serială de mare viteză. Acestea suportă rate de transfer între 614 Mbps şi 3,125 Gbps.
Familia de dispozitive FPGA de înaltă performanţă a firmei Xilinx este numită Virtex 6. Comparativ
cu familia Spartan 6, şi familia Virtex 6 are la bază LUT-uri cu 6 intrări grupate în felii de tipul SLICEM
sau SLICEL, grupate la rândul lor în CLB-uri. Tipul SLICEX lipseşte de la familia Virtex 6.
Blocurile de memorie RAM ale circuitelor familiei Virtex 6 sunt de 36 kbiţi, cu accesare prin port
dual şi operare sincronă. Fiecare port poate fi configurat ca 32Kx1, 16Kx2, 8Kx4, 4Kx8 (sau x9), 2Kx16
(sau x18), 1Kx32 (sau x36), 512x64 (sau 72). Cele două porturi de acces ale aceluiaşi bloc pot avea lăţimi
diferite. Fiecare bloc poate fi împărţit în două blocuri complet independente de 18 kbiţi. Două blocuri de
36 kbiţi pot fi cascadate pentru a forma un bloc 64Kx1 fără altă logică suplimentară.
La familia Virtex 6, în jurul blocurilor de memorie RAM sunt implementate circuite logice de
control al accesului de tip FIFO. Acestea elimină nevoia ocupării de CLB-uri pentru implementarea
numărătoarelor de adrese, a comparatoarelor şi logicii de generare a indicatorilor de stare (flags) pentru
implementarea de tampoane de memorie FIFO. Logica FIFO dedicată poate opera sincron sau asincron, cu
tact dual, separat pentru citire şi scriere. În Fig.10, se prezintă schema-bloc, a unui bloc de memorie de tip
FIFO, dedicat al familiei Virtex 6.
Dispozitivele familiei Virtex 6 dispun de 200 până la 2000 de blocuri dedicate pentru operaţii DSP,
numite DSP48E1. Acestea sunt grupate câte două, împreună cu magistrale locale de interconectare pentru
optimizarea vitezei şi minimizarea puterii disipate. Arhitectura unui bloc DSP48E1 este prezentată în
Fig.11. Acesta este construit în jurul unui motor de multiplicare-acumulare, foarte folositor în aplicaţiile de
procesare de semnal. Pe lângă operaţia de multiplicare-acumulare (MACC – multiply-accumulate), blocul
DSP48E1 permite şi operaţii de multiplicare, multiplicare-adunare, adunare de 3 termeni, deplasare
multiplă,
Fig.11. Arhitectura unui bloc DSP48E1 al familiei Virtex 6
Rafinarea algoritmului este un pas necesar în proiectarea sistemelor de control cu FPGA. Implementarea
operaţiilor aritmetice în virgulă mobilă este posibilă în FPGA, dar utilizarea resurselor nu este optimă în
acest caz, datorită arhitecturii de tip “matrice de celule logice”. Această “matrice de celule logice” este
foarte potrivită pentru implementarea de operaţii aritmetice simple de tipul sumator/scăzător pentru numere
reprezentate în complement faţă de 2, dar utilizarea reprezentării în virgulă mobilă implică structuri mult
mai complexe, cu căi multiple de date, logică de luare a deciziilor şi activare a anumitor căi, registre de
deplasare pentru normalizare, etc. Aceste structuri complexe consumă foarte multe resurse, în vreme ce
reprezentarea numerelor în virgulă fixă nu necesită niciun fel de resurse adiţionale faţă de reprezentarea
numerelor întregi în complement faţă de 2. Din aceste motive s-au formulat două direcţii de lucru:
1. Simplificarea computaţională: mai ales la începutul dezvoltării dispozitivelor FPGA, când
densitatea celulelor logice era limitată, au apărut algoritmi ce propuneau soluţii inteligente de
evitare a folosirii operatorilor a căror implementare necesita ocuparea unui procent semnificativ
din resursele disponibile (înmulţire, împărţire). În general, atunci când nu se folosesc astfel de
algoritmi speciali, simplificarea computaţională se poate obţine prin remodelarea algoritmului de
implementat pentru a reduce numărul operaţiilor ce trebuie realizate.
2. Folosirea unui format optimizat de reprezentare a numerelor în virgulă fixă: aşa cum s-a menţionat
mai sus, reprezentarea în virgulă fixă este foarte potrivită pentru implementare în FPGA, dar trebuie
găsit cel mai avantajos compromis între numărul de biţi ai fiecărei variabile de control şi respectarea
specificaţiilor de control, De exemplu, există un toolbox Matlab pentru analiza efectelor
implementării filtrelor digitale şi a sistemelor de control folosind reprezentarea numerică în virgula
fixă, ce permite optimizarea alegerii reprezentării.
Modularitatea este esențială pentru dezvoltarea sistemelor complexe. Acest principiu se bazează pe
conceptele de ierarhizare şi regularitate. Ierarhizarea împarte un sistem mare sau complex în entităţi mai
uşor realizabile denumite module. Regularitatea este direcţionată spre maximizarea reutilizării modulelor
deja proiectate. O bună modelare şi ierarhizare a unui sistem, precum şi folosirea de module deja existente,
poate reduce timpul de proiectare mult mai mult decât o stăpânire perfectă a uneltelor de proiectare. Un
modul poate fi definit ca un element al unei biblioteci, ce poate fi instanţiat direct, fără a trebui re-proiectat
sau modificat. Astfel, reutilizabilitatea constă în folosirea elementelor de bibliotecă cele mai potrivite
pentru o anumită aplicaţie. Modulele pot fi împărţite în biblioteci de diferite nivele de abstracţie,
Reutilizabilitatea poate fi întâlnită la nivel de descriere HDL, dar și pentru limbaje de dezvoltare de nivel
înalt.
Potrivirea optimă dintre algoritmul ce trebuie implementat şi structura hardware, mai ales atunci când
aceasta din urmă nu este fixată, este o problemă cheie. O metodologie de găsire a acestei potriviri optime
este metodologia AAA (sau A3 ). Prescurtarea AAA provine de la Algorithm Architecture Adequation, iar
termenul adequation are sensul de potrivire eficientă, nu sensul doar potrivirea suficientă. Atunci când
vorbim despre proiectare în FPGA, scopul metodologiei AAA este de a găsi o arhitectură hardware
optimizată pentru un anumit algoritm, respectând în acelaşi timp constrângerile de timp de execuţie şi arie
ocupată. Metodologia AAA se bazează pe modelarea algoritmilor cu ajutorul grafurilor, analiza pe graf a
paralelismului potenţial al algoritmului şi potrivirea acestuia pe paralelismul disponibil al arhitecturii
hardware alese.
Toate informaţiile prezentate în acest capitol au rolul de a evidenţia o mică parte principială din
extraordinarele posibilităţi oferite de circuitele FPGA actuale. Ele au caracter introductiv, iar documentația
completă se găsește disponibilă la firmele producătoare, aferentei fiecărei familii de circuite FPGA
abordată.
Din cele prezentate în această secţiune se pot extrage câteva concluzii:
✓ Dispozitivele FPGA au devenit într-adevăr platforme pentru implementarea de sisteme complexe în
întregime pe un singur cip. Chiar şi familiile cu preţ scăzut integrează destule componente pentru a
permite prelucrări destul de complexe.
✓ Dezvoltarea unei aplicații cu circuite FPGA, folosind limbaje Low-Level(de tip HDL), necesită studiul
în amănunt a arhitecturii pentru a putea “mapa” optim aplicația software peste partea hardware.
✓ Dezvoltarea unei aplicații cu circuite FPGA, folosind limbaje High-Level(de ex. Labview-FPGA),
este foarte simplă, deoarece nu ne mai interesează detaliile arhitecturale ale circuitului. Prețul plătit
pentru acest lucru este faptul că prelucrarea nu este implementată în mod optim în raport cu proiectul
gândit de noi. Mai precis, nu prea avem controlul total al implementării.
✓ Folosirea resurselor disponibile implică cunoştinţe din multe domenii conexe, de la procesare de
semnal la microcontrolere şi proiectare de software pentru sisteme încorporate, de la proiectare de
structuri digitale la descriere în limbaje HDL şi simulare a acestora. De aici presiunea foarte mare
asupra producătorilor de dispozitive FPGA pentru a aduce uneltele software de proiectare la un nivel
cât mai înalt, cât mai abstract, pentru a permite dezvoltarea cât mai rapidă de proiecte complexe. Se
pune chiar problema că, la ce bun o multitudine de resurse, dacă nimeni nu reuşeşte să le folosească în
întregime?
Ca o concluzie finală, dezvoltarea de aplicații de timp real, folosind sisteme FPGA, se pretează foarte
bine unui inginer electronist, deoarece, deși se folosește doar “tastatura” pentru implementare, sunt
necesare abilități și cunoștințe consistente în domeniul electronicii.
Totodată, datorită limbajelor de nivel înalt dezvoltate în ultimii ani, ideea folosirii circuitelor FPGA de
către un inginer automatist este foarte valoroasă. De toate detaliile de arhitecturare hardware se ocupă
mediul de dezvoltare, cum este de exemplu Labview, Matlab.
SUCCES !!!