Sunteți pe pagina 1din 16

Cap.5.

Sisteme programabile bazate pe circuite FPGA


Introducere
Sistemele încorporate (embedded systems) au devenit deja o direcție de bază în electronică și
automatică. Prin sistem încorporat se înţelege un sistem electronic digital de dimensiuni reduse, proiectat
pentru o aplicaţie specifică, lucrând sub incidenţa unor constrângeri de timp real. Termenul “încorporat”,
este o traducere aproximativă a mult mai cunoscutului şi acceptatului termen “embedded” din limba engleză
și se poate aplica unui sistem din mai multe puncte de vedere:
➢ Aceste sisteme electronice încorporează, din punct de vedere fizic, o soluție de control automat sau
un algoritm de prelucrare într-un produs efectiv, formând un tot unitar cu elementele electronice,
electrice şi mecanice cu care interacţionează.
➢ Dintr-o altă perspectivă, termenul se aplică adesea cu privire la sistemul de calcul ce formează
centrul sistemului digital: acesta nu este un procesor obişnuit, de tipul celor utilizate în
calculatoarele personale, ci încorporează pe un singur cip şi memorie de program, de date şi circuite
periferice. De obicei, aceste cipuri sunt microcontrolere (un calculator într-un chip) sau controlere
digitale de semnal (DSC – Digital Signal Controller). Acest din urmă termen este folosit recent
pentru desemnarea unor circuite complexe de tip microcontroler, dotate cu periferice puternice
(interfețe hardware de proces), al căror procesor este însă proiectat special pentru a realiza eficient
operaţii specifice domeniului prelucrării digitale de semnal. DSC-urile sunt aşadar o combinaţie
între microcontrolere şi procesoare digitale de semnal (DSP – Digital Signal Processor).
➢ O a treia accepţiune a termenului “încorporat” se referă la faptul că aceste sisteme sunt de obicei
bazate pe un procesor, iar acesta rulează un program ce execută sarcinile sistemului. Aşadar,
sistemul încorporat nu este reprezentat doar de circuitele hardware ce-l compun, ci încorporează şi
algoritmul software ce se execută pe el.

Î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.

Evoluția dispozitivelor bazate pe tehnologia circuitelor FPGA


✓ Primul dispozitiv de tip FPGA a fost lansat de firma Xilinx în 1984. Acesta conţinea 64 de blocuri
logice interconectate printr-o matrice de conexiuni programabile, avea 58 de pini de intrare/ieşire şi
era implementat în tehnologie de 2μm, folosind în jur de 85000 de tranzistoare. Avantajul acestei
arhitecturi era scalabilitatea: odată cu îmbunătăţirea procesului de fabricaţie, mai multe elemente de
bază puteau fi integrate pe acelaşi cip, crescând posibilităţile oferite de acesta. Astfel, de-a lungul a
câtorva ani, producătorii de FPGA-uri au continuat să crească numărul de blocuri logice, numărul
nivelelor de interconectare şi numărul pinilor de intrare/ieşire. Astfel, perioada 1985 – 1991 poate
fi considerată perioada “copilăriei” dispozitivelor FPGA. Aceasta este caracterizată prin faptul că
FPGA-urile erau folosite ca logică de legătură în sisteme mai mari, iar programele software ce
implementau circuitele proiectate în FPGA erau relativ simple şi uşor de îmbunătăţit.
✓ În curând însă s-a dovedit că această abordare nu era suficientă: odată cu creşterea numărului de
blocuri logice, interconexiunile lungi şi complexe dintre ele deveneau factorul limitativ al
performanţelor dispozitivului. De aceea, având în vedere că tehnologia de fabricaţie permitea
integrarea a tot mai multor tranzistoare, a apărut ideea încorporării de hardware dedicat. Astfel, la
mijlocul anilor 1990 apar primele FPGA-uri cu blocuri de memorie RAM încorporate. Tot atunci
apar primele tehnici de creştere pe cip a frecvenţei de lucru, prin integrarea de circuite cu calare pe
fază (PLL – Phase Locked Loop) de multiplicare a frecvenţei. Astfel, perioada 1992 – 1999 poate
fi considerată o perioadă de expansiune a dispozitivelor FPGA. La începutul acestei perioade, multe
firme producătoare se retrag din domeniu (Plessey, Toshiba, Motorola, IBM) pentru că arhitecturile
propuse de ele nu fac faţă scalabilităţii permise de avansarea rapidă a tehnologiei de producţie. În
această perioadă, creşterea rapidă a complexităţii circuitelor pune presiune pe dezvoltarea de
software de sinteză automată care să permită proiectarea uşoară şi folosirea eficientă a resurselor
hardware. Totodată, FPGA-urile încep să fie folosite în aplicaţii tot mai complexe, în domeniul
comunicaţiilor şi calculelor aritmetice.
✓ Perioada 2000 – 2007 poate fi considerată perioada de acumulare a dispozitivelor FPGA, timp în
care se integrează din ce în ce mai multe şi mai sofisticate blocuri hardware: de la microprocesoare
la circuite de comunicaţie rapidă, de la funcţii aritmetice specializate la blocuri dedicate procesării
digitale de semnal (DSP - Digital Signal Processing), bazate pe multiplicatoare hardware şi
acumulatoare. În 2000 apare primul FPGA cu procesor hardware încorporat, bazat pe arhitectura
ARM. De asemenea, odată cu creşterea numărului de blocuri logice integrate, a apărut tendinţa
producătorilor de FPGA-uri de a dezvolta procesoare soft, implementabile economic în blocurile
logice din FPGA.
✓ În prezent, FPGA-urile au devenit adevărate platforme sistem: ambii mari producători de FPGA-uri
(Altera și Xilinx) îşi descriu dispozitivele complexe în astfel de termeni. De exemplu, familia Virtex
6 de la Xilinx este descrisă ca FPGA platformă. Familia Stratix IV de la Altera este comercializată
ca FPGA “high end”, capabilă să implementeze un întreg sistem pe un cip (SoC - System on a Chip).
Astfel, de la epoca blocurilor logice interconectate prin conexiuni programabile, s-a ajuns la
dispozitive configurabile complexe, capabile să implementeze un întreg sistem digital pe un cip,
sistem compus din mai multe procesoare hard sau soft, din motoare de procesare dedicate DSP,
coprocesoare matematice, periferice de control al memoriei sau de comunicaţie.
✓ Ce rezervă viitorul?... Se pare că începând din 2007 am intrat în perioada specializării foarte strictă
a sistemelor bazate pe circuitele FPGA: familii diverse de FPGA-uri, sunt bazate pe arhitecturi
diferite, ce oferă adevărate sisteme specializate pentru diferite tipuri de aplicaţii din diverse domenii,
cum ar fi criptare de date, automotive, avionică, automatizări industriale generale(bucle de
reglare), etc. De asemenea, programele software High-Level de sinteză s-au specializat pe aceste
domenii diferite de aplicaţii.

Elemente generale ale circuitelor FPGA actuale


Orice circuit FPGA dispune de un numar finit de elemente hardware predefinite cu interconexiuni
între ele programabile, ce pot realiza chiar o reconfigurare digitală a blocurilor I/O prin care interacționează
cu exteriorul. Arhitectura generală este prezentată în Fig.1. Specificațiile resurselor FPGA includ un număr
de blocuri logice configurabile, un număr de blocuri logice cu funcții fixe, cum ar fi multiplicatorii și blocuri
de memorie RAM încorporate. Dintre numeroasele specificații ale unui circuit FPGA, acestea sunt foarte
importante atunci când se selectează un FPGA pentru o anumită aplicație.
Fig.1. Arhitectura generală a unui circuit FPGA

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.

Fără a intra în detaliile de implementare arhitecturală, Blocurile Logice Configurabile (denumite și


CLB - configurable logic blocks) sunt unitatea logică de bază a unui FPGA. Standard sunt
referite/organizate ca felii logice (slice) la nivelul unui circuit FPGA, deoarece un semnal care apare la pinii
de intrare a circuitului trebuie să ajungă cumva (evident prelucrat) la pinii de ieșire.
➢ Blocurile CLB sunt alcătuite din două componente de bază:
o flip-flops (bistabile de tip Latch)
Flip-flop-urile sunt registre de deplasare binare utilizate pentru sincronizarea logicii și salvarea stărilor
logice între ciclurile de ceas dintr-un circuit FPGA. Pe fiecare cuantă de ceas, un flip-flop memorează
valoarea 1 sau 0 (TRUE sau FALSE) pe intrarea sa și menține această valoare constantă până la următoarea
cuanta de ceas, Fig.2.

Fig.2. flip-flops

o tabele de căutare (LUT- lookup tables).


O mare parte din logica unui CLB este implementată nu numai hardware (bloc de circuit fizic), ci și
folosind blocuri fizice foarte mici de memorie RAM sub formă de tabele, denumite LUT-uri (Lookup ables,
Fig.4.). Este ușor să ne imaginăm că numărul de porți de sistem dintr-un FPGA se referă la numărul de
porți NAND și porți NOR dintr-un anumit cip. Dar, în realitate, toată logica combinatorie de bază (AND,
OR, NAND, XOR), dar și funcții logice combinatoriale dedicate unei anumite prelucrări, este implementată
și ca tabele de adevăr în blocuri de memorie RAM, adică acele blocuri denumite LUT. După cum se știe, o
tabelă de adevăr este o listă predefinită de ieșiri pentru fiecare combinație de intrări.

Fig.3. LUT cu 4 intrari

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

Fig.5. Tabela de adevăr a funcției logice AND


➢ Multiplicatoare si DSP-Slice
Sarcina, aparent simplă, de a înmulți două numere poate deveni extrem de intensivă/laborioasă în
resurse și complexă de implementat direct la nivelul unui circuit digital. Pentru a furniza un anumit cadru
de referință, în Fig.6 este prezintată schema hardware de implementare a unei inmulțiri pe 4 biți utilizând
logica combinatorie. Ne putem imagina ce inseamna să înmulțim două numere de 32 de biți și vom ajunge
la mai mult de 2000 de operații pentru o singură multiplicare. Din acest motiv, circuitele FPGA au circuite
speciale de multiplicare predefinite pentru a economisi/optimiza utilizarea componentelor de tip LUT și
flip-flop, în aplicații complexe de calcul matematic și procesare de semnal.

Fig.6. Înmulțirea a 2 numere pe 4 biți


folosind circuite digitale

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ă.

Arhitectura resurselor folosite în urma compilării la nivel de Circuit FPGA

Instrumente de proiectare traditională FPGA


În primii 20 de ani de dezvoltare FPGA, limbajele de descriere hardware de tip HDL (Hardware
Description Languages), cele mai importante sunt:
o VHDL(mai precis VHSIC-HDL, Very High Speed Integrated Circuit Hardware Description
Language)
o Verilog(standardizat ca IEEE 1364), cu versiuni bazate pe instrucțiuni asemănătoare cu cele ale
limbajului C.
Aceste limbaje de tip HDL, au evoluat ca limbaje principale pentru proiectarea algoritmilor/aplicațiilor care
rulează pe circuite FPGA produse de toate firmele. Aceste limbaje Low-Level integrează unele dintre
beneficiile oferite de alte limbaje textuale(prezintă instrucțiuni text pentru programare) cu specificația că,
pe un circuit FPGA, practic “arhitecturăm” un circuit hardware. Sintaxa unor astfel de limbaje de
programare este hibridă (adică instrucțiunile se referă și la hardware și la software), ceea ce necesită
maparea sau conectarea semnalelor de la porturile I/O externe la semnale interne, care în cele din urmă sunt
conectate la blocurile de funcții care găzduiesc/implementează algoritmii. Aceste funcții, în mod teoretic se
execută secvențial și eventual pot face referință/apel la alte funcții din cadrul FPGA. Cu toate acestea,
adevărata natură paralelă a execuției fizice pentru Task-urile rulate pe un circuit FPGA, face greu de
vizualizat/gândit execuția într-un flux secvențial linie cu linie. Limbajele de tip HDL reflectă unele dintre
atributele altor limbaje textuale, dar diferă substanțial deoarece se bazează pe un model de flux de date, în
care Intrările și Ieșirile sunt conectate la o serie de blocuri funcționale prin semnale.
Pentru a verifica apoi logica creată de un programator de circuite FPGA, o practică obișnuită este
să se scrie biblioteci de testare în HDL pentru a incapsula proiectarea in arhitectura FPGA prin
asignarea/conectarea intrărilor și ieșirilor. Procesul de creare a bancului de test HDL și executarea simulării
necesită adesea mai mult timp decât crearea propriu-zisă a proiectului final FPGA HDL.
Odată ce ați creat un proiect FPGA utilizând HDL și a fost testat/validat, trebuie introdus într-un
instrument de compilare care să ia logica bazată pe text și, prin mai mulți pași complecsi, să sintetizeze
HDL-ul într-un fișier de configurare sau un flux de biți care conține informații despre modul în care
componentele ar trebui să fie conectate împreună. Un exemplu de cod scri în VHDL, este prezentat în Fig.6.

Fig.6. exemplu de cod scri în VHDL

Instrumente de proiectare a sintezei la nivel înalt


Apariția instrumentelor grafice de proiectare de nivel inalt, cum ar fi LabVIEW-FPGA, a eliminat
unele dintre obstacolele majore ale procesului tradițional de proiectare HDL. Mediul de programare
LabVIEW este potrivit pentru programarea FPGA, deoarece reprezintă în mod clar paralelismul și fluxul
de date, astfel încât utilizatorii care sunt atât experimentați, cât și fără experiență în procesele tradiționale
de proiectare FPGA, pot utiliza tehnologia FPGA în dezvoltarea de aplicații complexe.
În plus, pentru a nu se pierde aplicatii vechi, se poate utiliza LabVIEW pentru a integra VHDL
existent în proiectele noi, LabVIEW-FPGA. Deoarece LabVIEW-FPGA este extrem de integrat cu
hardware-ul, nu este nevoie să se rescrie codul în VHDL pentru a îndeplini constrângerile de timp sau de
resurse, așa cum poate fi cazul în multe generatoare de cod HDL. În Fig.7. este prezentat un task de achiziție
a unui semnal. dezvoltat în Labview-FPGA, comparativ cu același Task scris în VHDL. Se poate observa
avantajul că dezvoltarea de cod în VHDL este mult mai laborioasă. Mai mult, dezvoltarea de cod în
limbajele Low-Level VHDL și Verilog este echivalentă cu dezvoltarea de cod în limbajul de asamblare
pentru un sistem cu microprocesor. Dezvoltarea de cod în limbajele High-Level Labview sau Matlab pentru
FPGA, este echivalent cu dezvoltarea de cod în limbaje High-Level pentru programarea sistemelor cu
microprocesoare (Limbajul C, Phyton, Visual C, etc.). La fel cum pentru sistemele cu microprocesoare se
lucrează în cea mai mare parte cu limbaje de nivel superior (mult mai apropiate de gândirea umană), la fel
stă lucrurile în tendința programării circuitelor FPGA.

Care ar fi diferența?

➢ Pentru un sistem cu microprocesor:


o Limbajul de asamblare generează un cod sursă foarte mare, greu de scris și timp de dezvoltare a
aplicației foarte mare dar codul executabil este foarte mic și se execută foarte rapid
o Limbajul de nivel superior generează un cod sursă semnificativ mai mic, ușor de scris și timp de
dezvoltare a aplicației foarte mic dar codul executabil este foarte mare și se execută mai lent
OBS: Codul executabil obținut prin compilare dintr-un limbaj de nivel superior este mai mare deoarece
traducerea codului în limbajul cod mașină(executabil) nu se face optim. De aceea și timpul de execuție a
programului executabil este mai mare(conține multe instrucțiuni NOP-Not Operațion).

➢ Pentru un sistem cu FPGA:


o Limbajul de tip HDL generează un cod sursă foarte mare, greu de scris și timp de dezvoltare a
aplicației foarte mare dar codul executabil este foarte bine mapat peste circuitul FPGA și
folosește optim arhitectura FPGA. Efectul este că încape cod de dimensiune mult mai mare în
circuitul FPGA, cu posibilitate de prelucrare foarte complexă.
o Limbajul de nivel superior generează un cod sursă foarte mic, ușor de scris și timp de dezvoltare
a aplicației foarte mic dar codul executabil NU este foarte bine mapat peste circuitul FPGA și
NU folosește optim arhitectura FPGA în raport cu prelucrarea dorită. Efectul este că încape
cod de dimensiune mult mai mică în circuitul FPGA, cu posibilitate de prelucrare mai puțin
complexă.
Fig.7. Task dezvoltat în Labview-FPGA, comparativ cu același Task scris în VHDL

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).

Fig.9. Arhitectura internă a unui DSP48A1 al familiei Spartan 6

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.

Fig.10. Schema-bloc, a unui bloc de memorie de tip FIFO 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

Metodologia de proiectare a unui sistem de control implementat în hardware pe FPGA


Dispozitivele FPGA permit proiectarea de arhitecturi hardware specializate, cu avantajul
flexibilităţii mediului programabil în care se realizează implementarea. Acest lucru oferă un grad de
libertate mare în proiectarea de sisteme de control numeric faţă de folosirea microprocesoarelor, deoarece
arhitectura hardware a sistemului de control nu e impusă a priori. De multe ori, însă, proiectarea acestei
arhitecturi este realizată intuitiv şi euristic şi nu este adaptată implementării de algoritmi din ce în ce mai
complecşi. Din acest motiv se impune folosirea unei metodologii de proiectare eficiente. O astfel de
metodologie se bazează pe trei principii majore:
❖ rafinarea algoritmului de control,
❖ modularitatea;
❖ potrivirea optimă între algoritmul ce trebuie implementat și arhitectura hardware aleasă.

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 !!!

S-ar putea să vă placă și