Documente Academic
Documente Profesional
Documente Cultură
Facultatea de Inginerie
2011
1. Circuite inteligente
De-a lungul timpului oamenii au dezvoltat numeroasele tehnologii, cu scopul construirii unui
mediu favorabil de existenţă şi perpetuare a propriei specii, dar şi cu scopul cercetării şi cunoaş-
terii mediului înconjurător. Toate aceste tehnologii pot fi clasificate în funcţie de natura acţiunii
lor. Cele două dimensiuni prin care putem defini această clasificare sunt gradul de prelucrare a
energiei şi materiei EM şi gradul de prelucrare a informaţiei INF. Prin prelucrare înţelegem pro-
ducerea, transmiterea şi diferitele manipulări care pot fi aplicate energiei/materiei respectiv infor-
maţiei. În Fig. 1.1 este schiţată o poziţionare a principalelor noastre tehnologii din punctul de ve-
dere al capacităţii de prelucrare a energiei/materiei respectiv a informaţiei.
INF
INFORMATICA
ELECTRONICA
OPTICA
MECANICA
CHIMIA EM
După cum se observă, singura tehnologie fundamentală care permite prelucrarea atât a energiei
cât şi a informaţiei la nivele superioare de performanţă este, cel puţin până astăzi, electronica.
Interesul nostru este orientat în acest cadru înspre inteligenţa artificială IA, care este prin exce-
lenţă o prelucrare a informaţiei, de aceea nu vom urmări latura energetică a electronicii. Trebuie
totuşi să menţionăm că datorită capacităţii tehnologiilor moderne de a concentra pe acelaşi cristal
atât circuitele de forţă cât şi cele de comandă, aplicaţiile din domeniul conversiei energiei înglo-
bează tot mai multă inteligenţă.
O primă discuţie în domeniul IA este tocmai ce înţelegem de fapt prin IA! Desigur, în faza actu-
ală nu ne putem încă pune problema realizării cu circuite electronice a tuturor aplicaţiile de mare
capacitate şi înaltă performanţă care au fost realizate cu ajutorul staţiilor de lucru şi a instrumen-
telor software specializate: prelucrările în domeniul limbajelor naturale, învăţarea artificială, etc.
Ne vom limita la aplicaţii mai simple, care totuşi pot fi incluse în IA, deoarece constau din prelu-
crări ale cunoştinţelor ştiinţifice şi tehnologice din diferite domenii de activitate umană: sistemele
de tip expert.
După cum se ştie, primele aplicaţii de succes din domeniul IA au fost realizate cu ajutorul calcu-
latoarelor numerice CN, în perioada anilor 60. După circa 20 de ani de dezvoltări hardware şi
mai ales software ale calculatoarelor numerice, aplicaţiile IA au cucerit în anii 80 - 90 domeniul
microprocesoarelor P şi microcontrolerelor C, care sunt în esenţă calculatoare numerice mini-
male. Deşi foarte avantajoase din punctele de vedere al gabaritului, preţului, vitezei şi consumu-
lui de energie, P şi C nu sunt în esenţă diferite de maşina de calcul clasică. Principalul avantaj
al acesteia, programabilitatea, care îi conferă flexibilitate şi capacitate de adaptare şi învăţare,
este plătit prin funcţionarea în serie, cu cicluri maşină încărcate, având în vedere necesitatea ope-
raţiilor transfer de date, comenzi şi adrese prin magistrale, intrări-ieşiri, citiri-înscrieri în memorii
şi registre, operaţiile aritmetico-logice, etc. Calculul în paralel compensează parţial aceste deza-
vantaje, dar cu preţul creşterii complexităţii şi preţului.
Configuraţia ajustabilă prin tehnologie software de tip FPGA reprezintă o îmbunătăţire funda-
mentală faţă de principiul CN. Circuitele FPGA sunt programabile în sensul că legăturile elec-
trice dintre circuite sunt configurate prin software, dar odată stabilite, aceste legături rămân sta-
bile, astfel că funcţiile logice îndeplinite de circuite sunt implementate direct, fără a mai fi nevoie
de ciclurile complicate care însoţesc execuţia operaţiilor numerice în CN.
În continuare vom aborda principiile de bază ale tehnologiei FPGA şi a dezvoltării în acest cadru
a aplicaţiilor cu specific de Inteligenţă Artificială.
2. Arii de porţi programabile
2.1. Introducere în conceptul FPGA
Un circuit FPGA (field programmable gate array) este un circuit integrat destinat a fi configurat
de către utilizator. Configuraţia FPGA este in general specificată prin limbajul HDL (hardware
description language), utilizat şi în cazul circuitelor ASIC (application specific integrated cir-
cuit). Reprezentarea prin scheme electrice este mai rară. FPGA poate fi utilizat la implementarea
oricărei funcţii logice pe care un circuit ASIC ar putea-o produce. În multe aplicaţii circuitele
FPGA sunt avantajoase prin preţul mai mic decât al circuitelor ASIC şi mai ales prin capacitatea
de a fi configurate sau modificate chiar de către utilizator [1].
Circuitele FPGA conţin componente logice programabile, numite „blocuri logice” şi o structură
ierarhică de conexiuni reconfigurabile care permite interconectarea blocurilor logice. Ele pot fi
asemănate cu plăcile de încercare a prototipurilor de circuite electronice care nu necesită lipituri
(breadboards), dar la care interconectarea blocurilor nu se face cablat, cu fire şi conectori, ci prin
software. Blocurile logice pot fi configurate pentru o multitudine de scopuri, pornind de la reali-
zarea unor porţi logice (AND, XOR, etc.) până la circuite combinaţionale complexe. De regulă
FPGA-urile actuale dispun şi de memorii, fie simple circuite basculante bistabile fie blocuri de
memorie mai complicate, prin care se pot implementa şi circuitele secvenţiale.
2.1.1. Istoric
Industria FPGA a apărut în mediile implicate în producerea de circuite PROM (programmable
read only memory) şi a dispozitivelor logice programate PLD (programmable logic devices).
PROM-urile şi PLD-urile aveau două opţiuni [2]:
- opţiunea clasică a configurării de către producător, pe loturi mari;
- opţiunea configurării de către client, chiar la locul aplicaţiei (field programming); de fapt pri-
mele astfel de arii programabile erau configurate fizic, prin diferite metode de cablare.
Co-fondatorii companiei Xilinx, Ross Freeman şi Bernard Vonderschmitt, au inventat prima arie
de porţi programabilă în 1985 – circuitul XC2064. Circuitul XC2064 avea porţi programabile şi
interconexiuni programabile între porţi, şi prin succesul său comercial a deschis calea unei noi
tehnologii şi unei pieţe aferente. Mai precis, circuitul îngloba 64 de blocuri logice configurabile
CLB (configurable logic blocks) simple precum şi două tabele de căutare LUT (look-up-tables)
cu câte trei intrări.
Spre sfârşitul anilor ’80 Marina Militară USA a finanţat un experiment propus de Steve Cassel-
man, de realizare a unui computer ce însuma 600000 de porţi reprogramabile.
Până în perioada mijlocului anilor ’90 Xilinx a fost unicul producător de FPGA după care a apă-
rut şi o puternică concurenţă. De exemplu în 1993 firma Actel deţinea deja 18% din piaţă. Înce-
pând cu telecomunicaţiile şi cu reţelele, noi domenii au fost acoperite: bunuri de larg consum,
mijloace de transport şi aplicaţii industriale.
O realizare marcantă a apărut în 1997 când Adrian Thompson a aplicat calculul evolutiv (algo-
ritmi genetici) în FPGA, realizând primul circuit capabil să recunoască sunete. Algoritmul lui
Thomson implica o matrice de 64 x 64 celule într-un cip Xilinx FPGA, care se puteau reconfi-
gura în vederea operaţiei de recunoaştere a sunetelor.
Canal de
rutare
Pad
I/O
CLB
Un CLB clasic FPGA constă dintr-un tabel de căutare cu 4 intrări (4LUT) şi un bistabil D (flip-
flop), conectate ca în figura următoare. În ultimii ani a apărut o tendinţă de trecere înspre 6LUT,
cu scopul creşterii performanţelor [4].
Fig. 2.4. Un CLB tipic
Există patru intrări şi o intrare de sincronizare Clock. Ieşirea este furnizată de LUT, putând fi
înregistrată sau neînregistrată. Semnalele de sincronizare, precum şi alte semnale cu fanout ridi-
cat care sunt specifice fiecărei aplicaţii în parte, sunt tratate în mod separat, prin reţele de rutare
dedicate. Amplasarea terminalelor (pinilor) CLB-ului este ilustrată în figura următoare.
Fiecare intrare in este accesibilă dintr-o latură (jos, stânga, sus şi dreapta) iar ieşirea out poate fi
conectată la căile de rutare atât prin canalul din dreapta cât şi prin cel de jos. Fiecare pin CLB
poate fi conectat la oricare dintre căile de rutare adiacente.
În mod similar, un pad I/O poate fi conectat la fiecare dintre traseele canalelor adiacente. Mai
precis, dacă sub un pad I/O din partea superioară a cip-ului trece un canal orizontal cu W fire,
padul poate fi conectat la oricare dintre cele W fire.
În general sistemele de rutare FPGA sunt nesegmentate, adică fiecare segment de cablaj este
conectabil la un bloc de comutaţie prin cel mult un CLB. Căile de conectare mai lungi se obţin
cu ajutorul blocurilor de comutaţie. Totuşi, pentru realizarea unor interconexiuni de mare viteză
unele arhitecturi sunt prevăzute şi cu căi de rutare care se întind pe lungimea mai multor blocuri.
CLB Bloc de conexiune Canal de rutare
Blocurile de conexiune (switching boxes) apar oriunde un canal vertical se intersectează cu unul
orizontal. Un fir care intră într-un bloc de conexiuni poate fi conectat, prin trei conectoare pro-
gramabile cu alte trei fire din canalele adiacente. Topologia (modelul spaţial) al conectoarelor
programabile este topologia planară, bazată pe organizarea traseelor de rutare. Firul numărul 1
dintr-un canal poate fi conectat numai la firul numărul 1 din canalele adiacente, firul numărul 2
poate fi conectat numai la firele numărul 2 şi aşa mai departe. Funcţionarea unui bloc de conexi-
uni este prezentată în figura următoare.
Conector programabil
Canal de
rutare
Familia Excalibur (Altera) include un procesor RISC standard ARM922T de 32 de biţi la frec-
venţa de 200 MHz, 8-kB de memorie cache şi de instrucţiuni, cu periferice programabile, un
transciever asincron UART şi două timere. Magistrala este de tip AMBA (advanced micro-
controller bus architecture) cu acces la memoriile interne SRAM (static RAM) cu un port şi
două porturi.
Familia QuickMIPS (QuickLogic) incorporează un procesor RISC de 32 de biţi de 175 MHz iar
familia Atmel FPSLIC combină un AT40K FPGA cu un microcontroler RISC de tip AVR de 8
biţi, cu 16 kB × 16 SRAM de program şi 16 kB × 8 SRAM de date. Dintre perifericele AVR se
pot menţiona interfaţa serială industrială de două fire, două UART, două timere/numărătoare de
8 biţi şi PWM (pulsewidth modulation). Toate aceste FPGA-uri incorporează resurse hardware
prin interfaţare JTAG (Joint Test Action Group), bazată pe standardul IEEE 1149.1 (Standard
Test Access Port and Boundary-Scan Architecture) pentru diagnosticare şi depanare.
Alte dispozitive adoptă strategia inversă: combinarea microcontrolerelor standard cu circuite
FPGA. De exemplu familia de microcontrolere STMicroelectronics μPSD incorporează un
microcontroler rapid 8051 de 8 biţi cu multe periferice: un convertor analog-digital de 8 biţi cu 4
canale, două UARTS, 5 ieşiri PWM de 8 biţi, 3 timere de 16 biţi la care se adaugă un PLD sim-
plu cu 16 macrocelule.
Resurse specifice trebuiesc alocate pinilor I/O pentru ca FPGA-urile să poată fi conectate cu uşu-
rinţă cu alte dispozitive, la tensiuni diferite, fără a fi nevoie de interfeţe suplimentare. Pinii I/O
sunt de obicei grupaţi în funcţie de diferitele standarde: conectare între cipuri (chip-to-chip sem-
nale diferenţiale de joasă tensiune sau circuite cuplate prin emitor de tensiune pozitivă), conec-
tare de tip backplane în care mai mulţi pini se conectează în paralel sau interfeţe pentru memorii.
Un exemplu, corespunzător familiei Virtex, este prezentat în fig. 2.10.
Fig. 2.10. Tensiunile de referinţă internă şi externă în cazul blocurilor I/O Virtex
C. Dispozitive speciale
Comandă
confugurare
Citire/scriere
Date
Celulele SRAM sunt cel mai des utilizate (Xilinx, Altera, Atmel) pentru că oferă o mare flexibi-
litate în vederea reconfigurării. Dispozitivele OTP nevolatile sunt totuşi aplicate în anumite situ-
aţii în care primează avantajele lor: nu au nevoie de resurse externe pentru configurarea la ali-
mentare (pornesc foarte repede), consum foarte redus de putere, rezistenţe şi capacităţi de contact
foarte mici, imunitate foarte bună la zgomote. În tehnologiile Actel şi Quicklogic configurarea se
realizează prin arderea selectivă a unor micro trasee fuzibile (antifuse devices) realizate fie din
oxid-nitrit-oxid ONO fie metalice (tungsten).
2) Dispozitive de putere mică: scăderea puterii consumate de către circuite este un imperativ
puternic, atât pentru a îmbunătăţi performanţele funcţionale ale produselor prin creşterea efici-
enţei utilizării energiei (mai ales a bateriilor) cât şi prin scăderea temperaturilor de funcţionare.
FPGA sunt de obicei mai puţin eficiente la acest capitol din cauza resurselor alocate programării.
Din acest punct de vedere soluţiile bazate pe OTP sunt cele mai avantajoase. Ele reuşesc să trea-
că din modul de aşteptare (idle) în care se consumă foarte puţină energie (10 A de exemplu) în
modul de lucru foarte rapid (sec) şi oferă şi rezistenţe mici de comutare.
Şi circuitele SRAM pot fi eficientizate din punctul de vedere al consumului prin unele măsuri
constructive cum ar fi:
- distribuirea de tranzistoare de diferite mărimi pe suprafaţa de siliciu, astfel ca ele să poată fi uti-
lizate în subcircuite de mare sau mică viteză, optimizând consumul dinamic;
- suplimentarea izolării componentelor, de exemplu straturi subţiri suplimentare de oxid;
3) Dispozitive tolerante la radiaţie: aplicaţiile aerospaţiale în care FPGA au fost incluse, Staţia
Spaţială Internaţională, Telescopul Spaţial Hubble, Mars Pathfinder şi altele, ridică probleme
speciale de lucru în mediu radioactiv.
Bloc defect
Un alt demers face apel la capacitatea FPGA-urilor SRAM de reconfigurare, prin dezvoltarea de
soluţii tolerante la defecţiuni. Prin operaţiuni de diagnosticare a zonelor defecte şi înlocuire a lor
cu ajutorul reconfigurării se pot obţine circuite de mare fiabilitate (vezi fig. 2.12).
4) Circuite securizate: aplicaţiile în care FPGA sunt conectate în reţele ridică problema securi-
zării IP-urilor. Pe de o parte în aplicaţiile mai simple pot fi utilizaţi biţi de securizare care previne
citirea de către utilizator a configuraţiilor. În cazul aplicaţiilor foarte complexe (multiprocesor,
interfeţe de comunicaţie, codecuri, etc.) se adaugă un FPGA nonvolatil care să gestioneze acce-
sul la componentele interne.
Complexele structuri hardware ale FPGA-urilor nu ar putea fi utilizate fără un întreg arsenal de
instrumente software specifice. Acest domeniu este în plină dezvoltare dar există deja o ofertă
bogată de resurse software.
A. Nuclee IP
Pentru simplificarea proiectării sistemelor FPGA complexe există biblioteci de funcţii predefinite
complexe, în multe cazuri parametrizabile, precum şi de circuite care au fost deja testate şi opti-
mizate. Aceste elemente sunt de regulă protejate ca nuclee de proprietate intelectuală (IP cores),
fiind vândute fie direct de producătorul circuitului fie de firme terţe specializate cum ar fi
Modelware sau QuickFlex. Pe de altă parte alte circuite predefinite sunt oferite pe gratis de
comunităţile free and open source, ca produse deschise (open cores) de tipul GPL (general
public license) sau BSD (Berkeley software distribution).
Astfel de biblioteci acoperă largi domenii de aplicaţii: comunicaţii (de exemplu High-level Data
Link Control, PCI-X, Viterbi decoder), multimedia (video codecuri), procesoare de semnal
(transformarea fast Fourier, filtre FIR, transporturi (Controller Area Network Bus), etc.
B. Procesoare Soft
C. Instrumente software
Vânzătorii de FPGA au dezvoltat în timp multe instrumente soft originale adresate tuturor activi-
tăţilor cerute de aplicarea FPGA-urilor. În general aceste produse includ nuclee IP periferice,
instrumente pentru configurarea procesoarelor soft, instrumente pentru dezvoltarea de software
(editoare, compilatoare, asambloare, editoare de legături şi depanatoare), depanatoare şi testoare
hardware/software şi instrumente software şi hardware pentru plăcile de dezvoltare. Câteva astfel
de produse sunt Embedded Development Kit (EDK) Xilinx, SOPC Builder şi Nios II IDE (inte-
grated development environment) Altera, System Designer Atmel şi QuickWorks de la Quick
Logic. De exemplu Xilinx EDK uşurează integrarea nucleelor IP hard utilizând tehnologia on-
chip IBM CoreConnetBus şi permite accelerarea algoritmilor prin Fast Simplex Link. Permite de
asemenea depanări combinând două instrumente specifice: Sw Debugger şi ChipScope Pro.
Altera IDE include instrumente de dezvoltare (editare, construcţie şi depanare) pentru Nios II iar
SOPC Builder este orientată spre integrarea automată a componentelor sistem IP.
O politică de succes în domeniu este adaptarea instrumentelor tradiţionale din domeniul ASIC.
implementations have been adapted for FPGA. Aceste instrumente sunt focalizate în special pe
RTOS (Real Time Operating Systems), depanatoare Hw/Sw şi proiectare în C. În ceea ce priveşte
RTOS, unele produse de succes sunt MontaVistaLinux, Mentor Graphics Nucleus şi Wind River
VxWorks, care sunt compatibile cu procesoarele Xilinx şi Altera.
Pe lângă sistemul de operare în sine toate aceste instrumente includ software de modelare şi de
dezvoltare, cel mai adesea scris în limbajele VHDL, Verilog, C sau C++. Astfel de produse sunt
Seamless FPGA şi Catapult C Synthesis de la Mentor Graphics şi Active-HDL de la Aldec.
2.3. Proiectarea şi programarea FPGA
Definirea comportării FPGA de către utilizator se face fie prin limbaje de tip HDL (hardware
description language) fie, ca şi în cazul majorităţii circuitelor electronice, prin scheme. Avanta-
jul HDL apare în cazul structurilor foarte mari, deoarece ele pot fi definite doar prin specificarea
numerică, fără a fi nevoie de desenarea manuală a elementelor. Pe de altă parte reprezentarea
schematică oferă o vizualizare mult mai bună a proiectului.
În continuare, utilizând un software din categoria EDA (electronic design automation), cum ar fi
de exemplu Sistem Generator elaborat de Xilinx, se generează o listă de conexiuni tehnologică
(netlist). Lista de conexiuni este convertită în arhitectura circuitului printr-un proces numit place-
and-route prin care se definesc poziţiile componentelor şi legăturile electrice dintre ele. Etapa
place-and-route este realizată de obicei cu ajutorul unui software furnizat de către compania pro-
ducătoare a FPGA. Utilizatorul validează rezultatul obţinut prin analiza răspunsurilor în timp,
simulări şi alte metode de verificare. Odată ce fazele de proiectare şi de validare sunt terminate,
se generează fişierul binar sursă de (re)configurare a FPGA, tot cu software-ul producătorului.
În continuare fişierul sursă este prelucrat de software-ul producătorului, fişierul rezultat fiind
transferat circuitului FPGA prin interfaţa serială JTAG.
În cursul tuturor acestor faze rezultatele sunt verificate prin simulare. De fapt însuşi Xilinx
System Generator admite Simulink Matlab ca sursă a descrierii funcţionării circuitului proiectat.
Cele mai des utilizate HDL-uri sunt VHDL şi Verilog, deşi în încercarea de a reduce complexi-
tatea proiectelor, care este mai mult sau mai puţin echivalentă cu proiectarea în limbaje de asam-
blare, există actualmente o tendinţă de abstractizare, prin introducerea unor limbaje alternative.
A. Calculul configurabil
Calculul configurabil face apel la conceptul de calculator configurat de utilizator FCCM (full
custom computing machine), a cărui hardware poate fi reorganizat pentru a fi adaptat la algorit-
mii şi la fluxurile de date prelucrate într-un anumit moment. FCCM sunt utilizaţi pentru algo-
ritmi cu multe calcule aritmetice, cu multe procesări în paralel sau care presupun multiple sec-
venţe de operare. Astfel de aplicaţii pot fi exemplificate printr-un sistem fuzzy cu implementare
FPGA pentru conducerea automată a unui robot mobil [9] sau printr-un un sistem de conducere
microprogamabil a proceselor, în care predomină circuitele bistabile, multiplexoarele, numără-
toarele şi blocurile de memorie [10]. Un astfel de sistem realizează în fapt un automat programa-
bil pe un singur cip, cu avantajele care decurg din această tehnologie: miniaturizare extremă, fia-
bilitate, consum energetic redus, etc.
Un coprocesor de achiziţii şi generare de date reconfigurabil, care poate fi conectat la PC prin
USB este descris în referinţa [11]. El poate fi configurat pentru a implementa o serie de instru-
mente de măsură cum ar fi osciloscopul sau analizorul de stări logice. Procesele rapide sunt pro-
cesate de FPGA în timp ce vizualizarea şi panoul de comandă sunt rezidente în PC.
National Instruments oferă platforme FPGA care pot fi integrate în mediul LabView pentru apli-
caţii cum ar fi generatoare de semnal, variatoare de turaţie, etc. care depăşesc în mod clar perfor-
manţele altor tehnologii.
C. Prototipare rapidă
Prototiparea FPGA constă din emularea schemelor circuitelor digitale complexe prin dispozitive
programabile, în vederea testării lor. Avantajele acestei abordări sunt evidente:
- cost redus şi posibilitatea modificărilor/îmbunătăţirilor rapide;
- scurtarea ciclului de proiectare datorită utilizării simulărilor;
- posibilitatea migrării imediate înspre ASIC.
Există şi unele inconveniente relativ minore:
- viteza de funcţionare a prototipurilor FPGA este mai mică decât a circuitelor ASIC.
- în aplicaţiile complexe sunt necesare mai multe platforme FPGA; conectarea la instrumente de
nivel înalt, de exemplu Simulink/Matlab, necesită conversii pretenţioase [12].
- unele structuri hardware sunt greu de emulat, de exemplu memoriile de mare capacitate.
- compatibilitatea codurilor HDL între ASIC şi FPGA nu este garantată.
D. Comunicare şi interfaţare
Aplicaţiile din domeniul comunicaţiilor necesită viteză, consum redus, calitate şi adaptabilitate la
noi standarde şi la protocoale care evoluează rapid. FPGA-urile aduc în acest domeniu reducerea
timpului de acces la piaţă a produselor şi adaptabilitatea rapidă fără modificări hardware.
O altă variantă de abordare este înglobarea blocurilor DSP în sisteme complexe FPGA.
Dintre aplicaţiile de prelucrare digitală a semnalelor care sunt menţionate în literatură [8] putem
enumera:
- variatoare de turaţie de mare precizie pentru motoare asincron de mare turaţie;
- generatoare PWM trifazate;
- filtre active adaptive;
- viziune artificială, etc.
3. Limbajul VHDL
3.1. Istoric
VHDL (Very high speed integrated circuits Hardware Description Language) este un limbaj uti-
lizat pentru descrierea sistemelor electronice hardware pornind de la structura lor de blocuri şi
interconexiunile dintre ele sau de la modul de funcţionare. El a devenit cel mai important instru-
ment software din domeniul proiectării circuitelor electronice digitale pentru că permite descri-
erea executabilă şi portabilă a proiectelor.
Istoria VHDL este legată de Departamentul Apărării din SUA care a decis în 1980 să lanseze un
limbaj unificator în domeniul descrierii circuitelor electronice. În 1985apare prima versiune
numită VHDL 7.2, produsă de un consorţiu Intermetrics, IBM şi Texas Instruments. Începând
din 1986 toate drepturile asupra VHDL au fost transferate către IEEE (the Institute of Electrical
and Electronics Engineers), care îl standardizează în 1987 (VHDL IEEE 1076-1987).
VHDL permite descrierea unui sistem electronic de la nivelul structural/arhitectural până la nive-
lul porţilor logice. El permite simularea funcţionării sistemelor precum şi specificarea tehnologi-
ilor şi detaliilor de fabricaţie.
Dintre avantajele acestui limbaj se pot enumera [13]:
Disponibilitatea publică. VHDL a extins în domeniul public un concept provenit din tehnica
militară, producând un efect profund asupra electronicii, declanşând o etapă de progrese semnifi-
cative.
Suport pentru toate metodologiile de proiectare (top-down sau bottom-up cu variantele lor) şi
toate tehnologiile de proiectare (asincrone, sincrone, PLA sau random logic).
În mod tradiţional dezvoltarea unui sistem electronic se face de jos in sus (bottom-up), fiecare
nou nivel fiind validat prin testare, conform specificaţiilor.
Fig. 3.1. Sinteza sistemelor electronice
În continuare prezentăm elementele de bază ale limbajul HDL prin intermediul primei interfeţe
care a fost realizată, şi care şi-a păstrat un loc privilegiat în aplicaţii. O altă interfaţă HDL popu-
lară mai ales în SUA, Verilog, a fost lansată ulterior. Ea va fi prezentată în secţiunea următoare.
VHDL are o terminologie specifică, unii termeni utilizaţi având un conţinut care necesită o defi-
nire precisă.
Entitatea (Entity) este blocul de bază dintr-un proiect. Entităţile pot fi ierarhizate, cele de nivel
înalt (top-level-entity) conţinându-le pe cele de nivel jos (low-level-entity).
Arhitectura (Architecture) are rolul de a descrie entitatea, din punct de vedere funcţional sau/
şi structural. O entitate poate avea mai multe arhitecturi, legătura dintre ele făcându-se prin in-
strucţiuni de configurare.
Configuraţia (Configuration) este folosită pentru a lega declaraţia unei componente de o pere-
che entitate-arhitectură. O configuraţie poate fi considerată ca o listă de componente pentru pro-
iect.
Pachetul (Package) este o colecţie de tipuri de date şi subprograme folosite uzual în proiect,
utilizată ca un toolbox.
Bus este un grup de semnale sau o metodă particulară de comunicaţie.
Driver este denumirea unei surse de semnal.
Atributul (Attribute) este o dată ataşată sau predefinită referitoare la obiectele VHDL, ca de
exemplu fan-out-ul unei porţi.
Generic este un parametru care transmite o informaţie despre o entitate, cum ar fi de exemplu
timpii de creştere sau de cădere.
Proces (Process) este unitatea de bază a execuţiei în VHDL. Toate operaţiile care se efectuează
într-o simulare a unei descrieri VHDL sunt compuse dintr-unul sau mai multe procese.
a
b f <= (a OR b) AND c f
c
a g1 d
b f
g2
c
Datele despre componente şi modul lor de interconectare sunt conţinute într-un fişier netlist. Este
de observat că deşi în electronica clasică modalitatea standardizată de reprezentare a circuitelor
era schema, alcătuită din simboluri unite prin trasee care marchează semnalele, în VHDL este
preferată reprezentarea sistemelor prin fişiere de tip netlist, având în vedere complexitatea extra-
ordinară a aplicaţiilor. În plus, acest mod de modelare a circuitelor facilitează simulările. Repre-
zentările schematice nu dispar, dar ele se restrâng mai ales la nivelele ierarhice inferioare.
În instrumentele software mai noi trecerea de la codul HDL la scheme sau invers se poate face
automat, dar nu trebuie să uităm ca direct executabil este codul.
3.4. Exemple aplicaţii VHDL
Următoarea aplicaţie prezintă implementarea unui regulator al nivelului lichidului dintr-un rezer-
vor [5]. Admisia şi evacuarea lichidului sunt comandate prin electroventilele, VIN şi VOUT. Pe
lângă aceasta, regulatorul are şi rolul de a regla temperatura lichidului, prin intermediul unui ele-
ment de încălzire electric H. Dacă fie nivelul fie temperatura lichidului ies din domeniile stabilite
se va genera un semnal de alarmă A. Pentru realizarea scopului propus instalaţia are nevoie de
câte doi senzori de nivel (jos LLS şi sus HLS) şi de temperatură (rece TC şi cald TH).
ENTITY FSTLogic IS
PORT(LH : IN STD_LOGIC;
LL : IN STD_LOGIC;
TH : IN STD_LOGIC;
TC : IN STD_LOGIC;
VIN : OUT STD_LOGIC;
VOUT : OUT STD_LOGIC;
H : OUT STD_LOGIC;
A : OUT STD_LOGIC;
END FSTLogic;
ARCHITECTURE Behavioral OF FSTLogic IS
COMPONENT inv
PORT (I : IN STD_LOGIC;
O : OUT STD_LOGIC);
END COMPONENT ;
COMPONENT nand2
PORT (I0: IN STD_LOGIC;
I1: IN STD_LOGIC;
O: OUT STD_LOGIC;
END COMPONENT ;
COMPONENT nand3
PORT (I0: IN STD_LOGIC;
I1: IN STD_LOGIC;
I2: IN STD_LOGIC;
O: OUT STD_LOGIC;
END COMPONENT ;
SIGNAL w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11: STD_LOGIC;
BEGIN
g1 : inv PORT MAP (I=>LH, O=>w1);
g2 : inv PORT MAP (I=>LL, O=>w7);
g3 : inv PORT MAP (I=>TH, O=>w3);
g4 : inv PORT MAP (I=>TC, O=>w2);
g5 : nand2 PORT MAP (I0=>w1, I1=>w2, O=>w4);
g6 : nand2 PORT MAP (I0=>w1, I1=>w3, O=>w5);
g7 : nand2 PORT MAP (I0=>w4, I1=>w5, O=>VIN);
g8 : nand3 PORT MAP (I0=>LL, I1=>w3, I2=>w2, O=>w6);
g9 : nand2 PORT MAP (I0=>LL, I1=>w6, O=>VOUT);
g10 : nand3 PORT MAP (I0=>LL, I1=>w3, I2=>TC, O=>w8);
g11 : nand2 PORT MAP (I0=>w8, I1=>w9, O=>H);
g12 : nand3 PORT MAP (I0=>w3, I1=>w1, I2=>TC, O=>w9);
g13 : nand2 PORT MAP (I0=>TH, I1=>TH, O=>w10);
g14 : nand2 PORT MAP (I0=>LH, I1=>w7, O=>w11);
g15 : nand2 PORT MAP (I0=>w10, I1=>w11, O=>A);
END Behavioral;
4. Sistemele Spartan 3/3E
4.1. Familia Spartan-3 FPGA
Familia Spartan-3 FPGAs produsă de Xilinx are 5 membri şi este realizată într-o tehnologie de
90 nm care îi asigură densităţi de la 500.00 până la 1.000.000 porţi. Aceste circuite, cu un preţ
extrem de scăzut, au fost dezvoltate pentru a uşura cât mai mult accesul la aplicaţiile FPGA. O
comparaţie între cele 8 variante Spartan-3 este prezentată în tabelul următor [17].
Tabel 4.1
Celule CLB-uri Multi- I/O I/O
logice plica- utili- perechi
Denumire Porţi Rân- Coloa CLB DCM
echiva- toare zator diferen-
duri -ne
lente ţiale
XC3S50A 50K 1.728 16 12 192 4 2 124 56
XC3S200A 200K 4.320 24 20 480 12 4 173 76
XC3S400A 400K 8.064 32 28 896 16 4 264 116
XC3S1000A 1M 17.280 48 40 1.920 24 4 391 175
XC3S1500A 1,5M 29.962 64 52 3.328 32 4 487 221
XC3S2000A 2M 46.080 80 64 5.120 40 4 565 270
XC3S4000A 4M 62.208 96 72 3.912 96 4 633 300
XC3S5000A 5M 74.880 104 80 8.320 104 4 633 300
Familia Spartan-3 continuă linia de succes începută de Xilinx prin Spartan-IIE aducând noi îm-
bunătăţiri ale performanţelor simultan cu scăderea costului. Pe lângă variantele din tabelul de
mai sus familia extinsă mai cuprinde sistemul nevolatil Spartan-3 N şi sistemul de mare densitate
Spartan-3 DSP. Dintre datele tehnice ale familiei se pot menţiona: alimentare de 3,3V cu mod de
hibernare pentru reducerea consumului, sistem I/O multistandard cu până la 502 pini sau 227 pe-
rechi diferenţiale, 640 Mb/s viteză de transfer la intrările/ieşirile diferenţiale, etc. O ultimă cate-
gorie de produse Spartan o constituie familia Spartan-3 Automotive XA FPGA cu specificaţii
orientate înspre aplicaţii din domeniul transporturilor.
Placa Spartan 3 FPGA este prezentată în fig. 4.1.
Fig. 4.1. Placa Spartan 3 FPGA
Elementele sale sunt:
1. Conector VGA (HD-15) 9. Comutatoare (8)
2. Conector de 9 pini (DB-9) 10. Butoane (4)
3. Conector de alimentare 11. LED-uri (8)
4. Extensie A1 12. LED de putere
5. Extensie A2 13. Circuitul Spartan 3 FPGA
6. Extensie B1 14. LED program (indică existenţa programului
7. Port PS2 15. Portul JTAG (utilizat pentru programare)
8. Display cu 7 segmente LED
4.2. Familia Spartan-3E FPGA
Familia Spartan 3E FPGA a apărut în 2006. Practic aceste produse au cel mai bun raport calitate/
preţ în cadrul tehnologiei de 90 nm. Viteza oferită de Spartan 3E este potrivită pentru aplicaţii de
bandă largă, reţele, display-uri, televiziune digitală, etc.
Tabel 4.2
Celule CLB-uri Multi- I/O I/O
logice plica- utili- perechi
Denumire Porţi Rân- Co- CLB DCM
echiva- toare zator diferen-
duri loa-
lente ţiale
ne
XC3S100E 100K 2.160 22 16 240 960 2 108 40
XC3S250E 250K 5.508 34 26 612 2.448 4 172 68
XC3S500E 500K 10.476 46 34 1.164 4.656 4 232 92
XC3S1200E 1,2M 19.512 60 46 2.618 8.672 8 304 124
XC3S1600E 1,6M 33.192 76 58 3.688 14.752 8 376 156
Firma Xilinx a dezvoltat în timp un pachet software - Xilinx ISE - destinat analizei şi sintezei
aplicaţiilor HDL (CPLD, DSP, FPGA, ASIC). Xilinx ISE este disponibil în mai multe variante şi
versiuni (ediţii). În primele exemplificări, pentru sistemele Spartan 3/3E FPGA utilizăm ISE De-
sign Suite 12. Detalii despre pachetele Xilinx ISE se pot găsi pe site-ul firmei. Toate aceste pro-
duse sunt oferite şi în variante gratuite, iar pentru variantele cu plată se pot obţine on-line gratui-
tăţi [6]. Lucrul cu ISE este structurat pe proiecte. În cadrul unui proiect se pot realiza elaborarea
circuitului, simularea funcţionării sale şi implementarea sa precum şi documentaţia aferentă.
Fig. 4.3.2. Zona pentru gestionarea proiectelor (generarea schemei, simularea şi implementarea)
Fig. 4.3.3. Fereastra de lucru ISE (vizualizare codurilor, schemelor şi documentaţiei)
Pentru exemplificarea desfăşurării unui proiect, să considerăm chiar unul dintre exemplele ofe-
rite de ISE: un frecvenţmetru (proiectul freqm). Descrierea succintă a proiectului este disponibilă
în fişierul readme asociat. Pentru început vom exemplifica implementarea în VHDL
Schema implică un numărător BCD şi un display cu 7 segmente LED. Măsurarea se bazează pe
compararea frecvenţei semnalului de intrare cu frecvenţa de referinţă a unui semnal de ceas. Ea
începe când semnalul START este trecut în '1'. Din acest moment numărătorul este activat, nu-
mărând impulsurile de ceas (tact), a căror frecvenţă este evident mai mare decât a semnalului de
intrare. Măsurarea se încheie la trecerea în '0' a semnalului START, după care rezultatul este afi-
şat. Următoarea măsurătoare se poate porni după resetare. Circuitul este alcătuit din trei blocuri
descrise funcţional în VHDL.
Intrările frecvenţmetrului vor fi: FINPUT (semnalul de intrare), FPATTERN (semnalul de ceas),
START (semnalul de comandă, activ pe starea HIGH) şi RESET (semnalul de reset asincron,
activ tot în HIGH). Ieşirile vor fi: cele 4 celule de afişare LED cu 7 segmente (LED_D[6:0] – cea
mai semnificativă cifră zecimală, LED_C[6:0], LED_B[6:0] şi LED_A[6:0] - cea mai puţin sem-
nificativă cifră zecimală) şi FULL (semnalizarea depăşirii capacităţii frecvenţmetrului).
Fig. 4.3.4. Fereastra de proprietăţi ale proiectului
Înaintea intrării în procesul de analiză şi sinteză a unui circuit, din fereastra de dialog a proprie-
tăţilor unui proiect trebuie setate principalele sale caracteristici:
- tipul de reprezentare (Top-Level Source Type): HDL, schemă, etc.
- categoria de produs (Product category): generic, de uz general, pentru vehicule, militar/de înal-
tă fiabilitate, tolerant la radiaţii;
- familia (Family): Spartan 3/3E şi alte variante, Spartan 6 (diferite variante, inclusiv Defence
Grade 6Q Low power, varianta cea mai performantă, cu specificaţie militară, de înaltă fiabilitate
şi de consum redus), Virtex (diferite variante), etc.
- tipul de placă (Device), tipul de execuţie (Package) şi viteza (Speed);
- instrumentul de sinteză (Synthesis tool): XST – Xilinx Synthesis Technology (VHDL/Verilog);
- instrumentul de simulare (Simulator): ISim (VHDL/Verilog), Modelsim (diferite variante), etc.
- limbajul preferat (Preferred language): VHDL/Verilog şi varianta aleasă (de exemplu pentru
VHDL variantele 93 şi 200X) şi altele. Este de remarcat compatibilitatea perfectă dintre VHDL
şi Verilog, ambele fiind construite pe baza standardului HDL, ceea ce permite chiar utilizarea lor
simultană în cadrul aceluiaşi proiect (mixed VHDL/Verilog).
Fig. 4.3.5. Reprezentarea schematică a frecvenţmetrului (fişierul freqm.sch)
Sinteza XST se lansează din fereastra următoare, reuşita acestei faze fiind semnalată grafic (ver-
de) şi comunicată prin mesajul Process "Synthesize - XST" completed successfully.
--Command: sch2hdl -intstyle ise -family spartan3e -flat -suppress -vhdl C:/Users/… /freqm/freqm.sch
--Design Name: freqm, Device: spartan3e
library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.Vcomponents.ALL;
entity freqm is
port ( F_INPUT : in std_logic;
F_PATTERN : in std_logic;
RESET : in std_logic;
START : in std_logic;
FULL : out std_logic;
LED_A : out std_logic_vector (6 downto 0);
LED_B : out std_logic_vector (6 downto 0);
LED_C : out std_logic_vector (6 downto 0);
LED_D : out std_logic_vector (6 downto 0));
end freqm;
architecture BEHAVIORAL of freqm is
signal BCD_D : std_logic_vector (3 downto 0);
signal BCD_H : std_logic_vector (3 downto 0);
signal BCD_T : std_logic_vector (3 downto 0);
signal BCD_U : std_logic_vector (3 downto 0);
signal END_RESET : std_logic;
signal GATE : std_logic;
component hex2led
port ( HEX : in std_logic_vector (3 downto 0);
LED : out std_logic_vector (6 downto 0));
end component;
component cnt_bcd
port ( CLK : in std_logic;
ENABLE : in std_logic;
RESET : in std_logic;
BCD_D : out std_logic_vector (3 downto 0);
BCD_H : out std_logic_vector (3 downto 0);
BCD_T : out std_logic_vector (3 downto 0);
BCD_U : out std_logic_vector (3 downto 0);
FULL : out std_logic);
end component;
component control
port ( CLK : in std_logic;
RESET : in std_logic;
START : in std_logic;
END_MEASURE : out std_logic;
GATE : out std_logic);
end component;
begin
I1 : hex2led
port map (HEX(3 downto 0)=>BCD_T(3 downto 0), LED(6 downto 0)=>LED_D(6 downto 0));
I2 : hex2led
port map (HEX(3 downto 0)=>BCD_H(3 downto 0), LED(6 downto 0)=>LED_C(6 downto 0));
I3 : hex2led
port map (HEX(3 downto 0)=>BCD_D(3 downto 0), LED(6 downto 0)=>LED_B(6 downto 0));
I4 : hex2led
port map (HEX(3 downto 0)=>BCD_U(3 downto 0), LED(6 downto 0)=>LED_A(6 downto 0));
I5 : cnt_bcd
port map (CLK=>F_INPUT,
ENABLE=>GATE,
RESET=>END_RESET,
BCD_D(3 downto 0)=>BCD_D(3 downto 0),
BCD_H(3 downto 0)=>BCD_H(3 downto 0),
BCD_T(3 downto 0)=>BCD_T(3 downto 0),
BCD_U(3 downto 0)=>BCD_U(3 downto 0),
FULL=>FULL);
I6 : control
port map (CLK=>F_PATTERN,
RESET=>RESET,
START=>START,
END_MEASURE=>END_RESET,
GATE=>GATE);
end BEHAVIORAL;
Simularea funcţională a unui proiect se realizează prin utilizarea unui test bench a cărui şablon
(template) este generat automat de către ISE prin intermediul instrumentului de simulare ales. În
cazul frecvenţmetrului fişierul de simulare este freqm_tb.vhd, prezentat în continuare.
LIBRARY ieee;
--LIBRARY generics;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
--USE generics.components.ALL;
ENTITY testbench IS
END testbench;
ARCHITECTURE behavior OF testbench IS
COMPONENT freqm
PORT(
F_INPUT : IN std_logic;
F_PATTERN : IN std_logic;
RESET : IN std_logic;
START : IN std_logic;
FULL : OUT std_logic;
LED_A : OUT std_logic_vector(6 downto 0);
LED_B : OUT std_logic_vector(6 downto 0);
LED_C : OUT std_logic_vector(6 downto 0);
LED_D : OUT std_logic_vector(6 downto 0)
);
END COMPONENT;
SIGNAL F_INPUT : std_logic;
SIGNAL F_PATTERN : std_logic;
SIGNAL FULL : std_logic;
SIGNAL LED_A : std_logic_vector(6 downto 0);
SIGNAL LED_B : std_logic_vector(6 downto 0);
SIGNAL LED_C : std_logic_vector(6 downto 0);
SIGNAL LED_D : std_logic_vector(6 downto 0);
SIGNAL RESET : std_logic;
SIGNAL START : std_logic;
BEGIN
uut: freqm PORT MAP(
F_INPUT => F_INPUT,
F_PATTERN => F_PATTERN,
FULL => FULL,
LED_A => LED_A,
LED_B => LED_B,
LED_C => LED_C,
LED_D => LED_D,
RESET => RESET,
START => START
);
-- *** Test Bench - User Defined Section ***
F_INPUT1 : PROCESS
BEGIN
F_INPUT <= '1'; wait for 25 ns;
F_INPUT <= '0'; wait for 25 ns;
END PROCESS;
F_PATTERN1 : PROCESS
BEGIN
F_PATTERN <= '1'; wait for 2.640 ns;
F_PATTERN <= '0'; wait for 2.640 ns;
END PROCESS;
RESET1 : PROCESS
BEGIN
RESET <= '1'; wait for 4.975 us;
RESET <= '0'; wait for 60 us;
RESET <= '1'; wait for 10 us;
RESET <= '0'; wait;
END PROCESS;
START1 : PROCESS
BEGIN
START <= '1'; wait for 30.001 us;
START <= '0'; wait for 5.0005 us;
START <= '1'; wait;
END PROCESS;
-- *** End Test Bench - User Defined Section ***
END;
După cum se observă, în secţiunea destinată utilizatorilor User Defined Section, aceştia au posi-
bilitatea să genereze propriile lor semnale de test, prin definirea unei succesiuni de stări logice
ale semnalelor de intrare şi a duratelor fiecărei stări.
Fişierul de simulare poate fi testat cu diferite instrumente software, cel implicit în ISE fiind ISim,
a cărui fereastra principală, din care se dirijează simularea, este prezentată în fig. 4.3.7.
S R Qn+1 Qn+1
0 0 1 1 stare „interzisă”
0 1 1 0 înscriere 1
1 0 0 1 înscriere 0
1 1 Qn Qn stare de memorare
În continuare adoptăm pentru intrări şi ieşiri notaţiile implicite din ISE, prezentate în Fig. 4.3.9.
Fig. 4.3.9. Schema bistabilului RS asincron (latch) NAND – fişierul RSlatch.sch
Un proiect nou se începe prin intermediul căsuţei de dialog a comenzii New Project, din care se
precizează numele şi locaţia proiectului, precum şi modalitatea aleasă pentru sinteză: schematic,
HDL, EDIF, etc. Modalitatea de editare a proprietăţilor proiectului este ilustrată în Fig. 4.3.4.
Pentru realizarea schemelor dispunem de o fereastră de editare, care cuprinde şi o bibliotecă de
circuite digitale elementare care pot fi amplasate, configurate, interconectate şi marcate cu instru-
mentele prevăzute în bara de comenzi din stânga ferestrei (Fig. 4.3.9).
Fişierul sursă RSlatch.sch trebuie în continuare transformat într-un fişier HDL, care poate fi scris
în oricare dintre limbajele din familia HDL (VHDL, Verilog, etc.) în funcţie de preferinţele pro-
iectantului. Desigur, orice aplicaţie poate fi direct editată în HDL, caz în care nu mai este nece-
sară această etapă şi se poate pune eventual problema în sens invers: cum putem reprezenta sche-
matic un model de circuit electronic scris după standardul HDL.
Pentru generarea fişierului RSlatch.vhd şi a test bech-ului său RSlatch_tb.vhd se utilizează fereas-
tra New Source Wizard (fig. 4.3.10) din meniul Design al navigatorului. După cum se observă în
Fig. 4.3.2 navigatorul dispune de patru meniuri: Start, Design, Files şi Libraries.
Fig. 4.3.10. Generarea fişierelor proiectului, în acest caz test bench-ul în varianta VHDL
Cititorul este invitat să imagineze semnale de intrare mai complexe, care să testeze distinct pro-
prietatea de memorare a combinaţiei de intrare XLN_3=1 şi XLN_4=1.
Fig. 4.3.16. Personalizarea rezultatelor simulării (wave configuration)
După cum se observă în Fig. 4.3.15, în care cele patru oscilograme au culori diferite, rezultatele
grafice ale simulărilor pot fi personalizate cu uşurinţă: nu numai în ce priveşte culorile lor, ci şi
prin ordinea oscilogramelor, introducerea de separatori şi de diferite tipuri de cursoare şi mar-
cheri, etc. [19, 20].
4.3.3. Implementarea exemplificată prin latch-ul RS
În urma creării schemei RSlatch.sch şi a testării sale cu succes se pune problema generării unui
fişier netlist care să poată fi implementat în placa FPGA pe care să o poată configura conform
schemei. În această secţiune vom ilustra această etapă finală a implementării aplicaţiei din §4.3.2
utilizând tehnologia XST [21]. Acest standard se găseşte în ISE Design Suite dar şi în aplicaţia
PlanAhead, care este destinată să uşureze şi să optimizeze gestionarea proiectelor mari ISE [22].
Operaţiile care ţin de această etapă sunt:
- Sinteza: conversia modelului HDL (VHDL sau Verilog) într-un netlist.
- Prelucrarea fişierului netlist în sensul transformării sale într-o reprezentare fizică a circuitului,
cu controlul întârzierilor, cu adăugarea paduri de intrare-ieşire şi a conexiunilor la alte circuite
existente pe placă, etc. şi apoi conversia într-un bitstream care poate fi încărcat în memoria plăcii
FPGA.
XST separă informaţiile referitoare la design-ul circuitului (un fişier HDL) de cele referitoare la
procesare, care se materializează prin mai multe fişiere XST de tip script.
În continuare se vor exemplifica principalele faze ale implementării proiectului RSlatch. Vom
respecta itinerariul implicit propus de ISE Design Suite (Fig. 4.3.17).
Parcurgerea fiecărei faze este documentată prin rapoarte ataşate automat proiectului, cuprinse în
tabelul Detailed Reports din fereastra ISE Design Suite InfoCenter.
Fig. 4.3.29. Fereastra ISE Design Suite InfoCenter a proiectului RSlatch
Din cuprinsul documentelor proiectului RSlatch putem observa (Fig. 4.3.28) de exemplu că nu au
fost impuse constrângeri de timp şi nu a fost analizat consumul de energie al circuitului, operaţii
fără de care proiectul poate continua fără riscuri, mai ales în cazul unei aplicaţii extrem de sim-
ple, care solicită doar o mică parte a resurselor FPGA-ului (vezi Device Utilization Sumary).
4.4. Bibliotecile din componenţa ISE Design Suite
În această secţiune vom investiga pe scurt resursele oferite de ISE Design Suite prin bibliotecile
aflate în componenţa sa, precum şi alte resurse din categoria IP.
4.5. Exemple în VHDL preluate din literatură
În această secţiune vom reda mai multe exemple de circuite modelate în VHDL, extrase din lu-
crarea „VHDL Tutorial: Learn by Example” de Weijun Zhang, care pot fi accesată pe Internet la
adresa http://esd.cs.ucr.edu/labs/tutorial/#gates. Aceste exemple sunt extrase la rândul lor din
cartea „Embedded System Design” de Frank Vahid şi Tony Givargis (John Wiley & Sons, 2002).
Vom relua pentru început câteva circuite simple, urmate de câteva exemple mai complexe.
4.5.1. Driver
Driverul este un circuit care are rolul adaptare din punct de vedere electric: semnalul logic de la
intrare este reprodus la ieşire identic din punct de vedere logic, dar la alţi parametri electrici, de
exemplu la putere mai mare decât a circuitelor obişnuite, sau adaptat la terminalul de comandă al
unui dispozitiv electronic de putere. Exemplul este preluat din lucrarea [18].
-----------------------------------
library ieee;
use ieee.std_logic_1164.all;
-----------------------------------
entity Driver is
port( x: in std_logic;
F: out std_logic
);
end Driver;
-----------------------------------
process(x)
begin
-- compare to truth table
if (x='1') then
F <= '1';
else
F <= '0';
end if;
end process;
end behv1;
F <= x;
end behv2;
-----------------------------------
După declararea intrării x şi a ieşirii F se remarcă definirea a două arhitecturi, behv1 şi behv2.
Prima, mai detaliată, constă din descrierea tabelului de adevăr a funcţiei logice. Această metodă
poate fi aplicată în cazul oricărei funcţii logice. Varianta a doua este directă, bazată pe identitatea
logică a ieşirii cu intrarea în cazul driverului.
► IEEE Standard 1164 defineşte modul de reprezentare a valorilor logice în VHDL. Tipurile de
date sunt simbolizate în std_ulogic (standard unresolved logic) prin nouă litere:
'U' – neiniţializat; starea iniţială a tuturor obiectelor din declararea cărora lipseşte tipul
'X' – driver puternic, cu valoare logică necunoscută
'0' – driver puternic, cu valoare logică zero; utilizată pentru interfaţare
'1' – driver puternic, cu valoare logică unu; utilizată pentru interfaţare
'Z' – impedanţă ridicată; utilizată în cazul circuitelor cu trei stări logice
'W' – driver slab, cu valoare logică necunoscută; utilizată pentru logica cablată
'L' – driver slab, cu valoare logică zero; utilizată pentru logica cablată
'H' – driver slab, cu valoare logică unu; utilizată pentru logica cablată
'-' – indiferent
Descrierea altor porţi simple se face în acelaşi mod. Exemplificăm numai poarta XOR, care are
două intrări, x şi y şi o ieşire F. Exemplul este preluat din lucrarea [18].
--------------------------------------
library ieee;
use ieee.std_logic_1164.all;
--------------------------------------
entity XOR_ent is
port( x: in std_logic;
y: in std_logic;
F: out std_logic
);
end XOR_ent;
--------------------------------------
process(x, y)
begin
-- compare to truth table
if (x/=y) then
F <= '1';
else
F <= '0';
end if;
end process;
end behv1;
F <= x xor y;
end behv2;
--------------------------------------
Acest exemplu ne arată cum se scrie un program care încorporează mai multe componente. Pen-
tru simularea funcţionării sale se scrie un cod de tip test bench, care aplică o secvenţă de semnale
de intrare (Stimulators) circuitului testat (UUT). Interacţiunea dintre ieşirea test bench şi UUT se
poate observa în fereastra de simulare. Exemplul este preluat din lucrarea [18].
Este de remarcat că în variantele noi de software generarea test bench-urilor este automată.
------------------------------------------------------------
-- A simple example of VHDL Structure Modeling
-- we might define two components in two separate files,
-- in main file, we use port map statement to instantiate
-- the mapping relationship between each components
-- and the entire circuit.
------------------------------------------------------------
entity OR_GATE is
port( X: in std_logic;
Y: in std_logic;
F2: out std_logic
);
end OR_GATE;
-------------------------------------------------------------
entity AND_GATE is
port( A: in std_logic;
B: in std_logic;
F1: out std_logic
);
end AND_GATE;
--------------------------------------------------------------
library ieee; -- top level circuit
use ieee.std_logic_1164.all;
use work.all;
entity comb_ckt is
port( input1: in std_logic;
input2: in std_logic;
input3: in std_logic;
output: out std_logic
);
end comb_ckt;
begin
end struct;
----------------------------------------------------------------
--------------------------------------------------------------------
-- Test Bench for comb_ckt.vhd
-- Testbench is used to ensure the design is working properly
-- according to the specification.
-- assert statements are used to test the wrong value against
-- our desired one. we should test as many cases as possible,
-- particularly, we should include upper and lower limits
-- of the operations.
--------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
-------------------------------------------------------------------
architecture TB of CKT_TB is
component comb_ckt is
port( input1: in std_logic;
input2: in std_logic;
input3: in std_logic;
output: out std_logic
);
end component;
begin
process
begin
-- Test case 1
T_input1 <= '0';
T_input2 <= '0';
T_input3 <= '0';
wait for 10 ns;
assert (T_output=((T_input1 or T_input2) and T_input3))
report "Failed Case1!" severity error;
if (T_output/=((T_input1 or T_input2) and T_input3)) then
err_cnt := err_cnt +1;
end if;
-- Test case 2
T_input1 <= '1';
T_input2 <= '1';
T_input3 <= '1';
wait for 10 ns;
assert (T_output=((T_input1 or T_input2) and T_input3))
report "Failed Case1!" severity error;
if (T_output/=((T_input1 or T_input2) and T_input3)) then
err_cnt := err_cnt +1;
end if;
-- Test case 3
T_input1 <= '1';
T_input2 <= '0';
T_input3 <= '1';
wait for 10 ns;
assert (T_output=((T_input1 or T_input2) and T_input3))
report "Failed Case1!" severity error;
if (T_output/=((T_input1 or T_input2) and T_input3)) then
err_cnt := err_cnt +1;
end if;
-- Test case 4
T_input1 <= '0';
T_input2 <= '1';
T_input3 <= '0';
wait for 10 ns;
assert (T_output=((T_input1 or T_input2) and T_input3))
report "Failed Case1!" severity error;
if (T_output/=((T_input1 or T_input2) and T_input3)) then
err_cnt := err_cnt +1;
end if;
if (err_cnt=0) then
assert false report "Testbench completed successfully!"
severity note;
else
assert true
report "Something wrong, try again pls!"
severity error;
end if;
end process;
end TB;
-------------------------------------------------------------------
configuration CFG_TB of CKT_TB is
for TB
end for;
end CFG_TB;
--------------------------------------------------------------------
Fig. 4.5.4. Testarea modelului funcţional combinaţional
Acest exemplu ne ilustrează un circuit combinaţional tipic, multiplexorul. Exemplul este preluat
din lucrarea [18].
-------------------------------------------------
-- VHDL code for 4:1 multiplexor
-- Multiplexor is a device to select different
-- inputs to outputs. we use 3 bits vector to
-- describe its I/O ports
-------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
-------------------------------------------------
entity Mux is
port( I3: in std_logic_vector(2 downto 0);
I2: in std_logic_vector(2 downto 0);
I1: in std_logic_vector(2 downto 0);
I0: in std_logic_vector(2 downto 0);
S: in std_logic_vector(1 downto 0);
O: out std_logic_vector(2 downto 0)
);
end Mux;
-------------------------------------------------
end process;
end behv1;
end behv2;
--------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
architecture TB of Mux_TB is
component Mux
port( I3: in std_logic_vector(2 downto 0);
I2: in std_logic_vector(2 downto 0);
I1: in std_logic_vector(2 downto 0);
I0: in std_logic_vector(2 downto 0);
S: in std_logic_vector(1 downto 0);
O: out std_logic_vector(2 downto 0)
);
end component;
begin
U_Mux: Mux port map (T_I3, T_I2, T_I1, T_I0, T_S, T_O);
process
begin
wait;
end process;
end TB;
----------------------------------------------------------------
configuration CFG_TB of Mux_TB is
for TB
end for;
end CFG_TB;
-----------------------------------------------------------------
Fig. 4.5.6. Testarea modelului funcţional al multiplexorului
Următorul bistabil J-K cu reset [18] este descris în primul rând prin tabelul de adevăr‚ dar şi prin
expresii concurente şi descrierea semnalelor.
----------------------------------------------
-- JK Flip-Flop with reset
-- the description of JK Flip-Flop is based
-- on functional truth table
-- concurrent statement and signal assignment
-- are using in this example
----------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
----------------------------------------------
entity JK_FF is
port ( clock: in std_logic;
J, K: in std_logic;
reset: in std_logic;
Q, Qbar: out std_logic
);
end JK_FF;
-----------------------------------------------
p: process(clock, reset) is
begin
if (reset='1') then
state <= '0';
elsif (rising_edge(clock)) then
end process;
-- concurrent statements
Q <= state;
Qbar <= not state;
end behv;
-------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
---------------------------------------------------------------------
architecture TB of jkff_TB is
component JK_FF is
port ( clock: in std_logic;
J, K: in std_logic;
reset: in std_logic;
Q, Qbar: out std_logic
);
end component;
begin
U_JKFF: JK_FF port map (T_clock, T_J, T_K, T_reset, T_Q, T_Qbar);
process
begin
-- case 1
T_J <= '0';
T_K <= '1';
wait for 15 ns;
assert (T_Q='0') report "Error1!" severity error;
if (T_Q/='0') then
err_cnt := err_cnt + 1;
end if;
-- case 2
wait for 5 ns;
T_J <= '1';
T_K <= '0';
wait for 15 ns;
assert (T_Q='1') report "Error2!" severity error;
if (T_Q/='0') then
err_cnt := err_cnt + 1;
end if;
-- case 3
wait for 5 ns;
T_J <= '1';
T_K <= '1';
wait for 15 ns;
assert (T_Q='0') report "Error3!" severity error;
if (T_Q/='0') then
err_cnt := err_cnt + 1;
end if;
-- summary of all the tests
if (err_cnt=0) then
assert false
report "Testbench of Adder completed successfully!"
severity note;
else
assert true
report "Something wrong, try again"
severity error;
end if;
wait;
end process;
end TB;
--------------------------------------------------------------------
configuration CFG_TB of jkff_TB is
for TB
end for;
end CFG_TB;
---------------------------------------------------------------------
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_textio.all;
use lsi_10k.COMPONENTS.all;
package CONV_PACK_JK_FF is
-- define attributes
attribute ENUM_ENCODING : STRING;
end CONV_PACK_JK_FF;
library IEEE,lsi_10k;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_textio.all;
use lsi_10k.COMPONENTS.all;
use work.CONV_PACK_JK_FF.all;
entity JK_FF is
end JK_FF;
component FJK2P
port( J, K, CP, CD : in std_logic; Q, QN : out std_logic);
end component;
component IVA
port( A : in std_logic; Z : out std_logic);
end component;
begin
state_reg : FJK2P port map(J => J, K => K, CP => clock, CD => n45, Q => Q,
QN => Qbar);
U23 : IVA port map( A => reset, Z => n45);
end SYN;
Un circuit secvenţial tipic, numărătorul binar de n biţi este prezentat în continuare [18], în acelaşi
stil ca şi circuitele anterioare. În cazul acestui circuit apare un nou concept: generics, necesar în
cazul componentelor parametrizate. Parametrizarea este necesară deoarece numărătorul trebuie
să aibă capacitatea variabilă, n. Parametrizarea mai oferă avantajul fundamental al bibliotecilor
standardizate, cu modele puse în comun (shared models). În descrierea funcţională tranziţiile
sunt în general sincronizate pe frontul crescător al semnalului de tact (clock), printr-o combinaţie
de expresii condiţionale (clock'event şi clock='1').
----------------------------------------------------
-- VHDL code for n-bit counter
-- this is the behavior description of n-bit counter
-- another way can be used is FSM model.
----------------------------------------------------
library ieee ;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
----------------------------------------------------
entity counter is
begin
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
architecture TB of counter_TB is
component counter
port( clock: in std_logic;
clear: in std_logic;
count: in std_logic;
Q: out std_logic_vector(1 downto 0)
);
end component;
process
begin
T_clock <= '0'; -- clock cycle is 10 ns
wait for 5 ns;
T_clock <= '1';
wait for 5 ns;
end process;
process
begin
T_clear <= '1'; -- start counting
T_count <= '1';
wait for 20 ns;
-- test case 1
wait for 10 ns;
assert (T_Q=1) report "Failed case 1" severity error;
if (T_Q/=1) then
err_cnt := err_cnt+1;
end if;
-- test case 2
wait for 10 ns;
assert (T_Q=2) report "Failed case 2" severity error;
if (T_Q/=2) then
err_cnt := err_cnt+1;
end if;
-- test case 3
wait for 10 ns;
assert (T_Q=3) report "Failed case 3" severity error;
if (T_Q/=3) then
err_cnt := err_cnt+1;
end if;
-- test case 4
wait for 10 ns;
assert (T_Q=0) report "Failed case 4" severity error;
if (T_Q/=0) then
err_cnt := err_cnt+1;
end if;
-- test case 5
wait for 20 ns;
T_clear <= '1';
wait for 10 ns;
assert (T_Q=0) report "Failed case 5" severity error;
if (T_Q/=0) then
err_cnt := err_cnt+1;
end if;
wait;
end process;
end TB;
----------------------------------------------------------------
configuration CFG_TB of counter_TB is
for TB
end for;
end CFG_TB;
----------------------------------------------------------------
Fig. 4.5.11. Testarea modelului funcţional al numărătorului
Descrierea structurală este următoarea:
library IEEE,lsi_10k;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_textio.all;
use lsi_10k.COMPONENTS.all;
package CONV_PACK_counter is
-- define attributes
attribute ENUM_ENCODING : STRING;
end CONV_PACK_counter;
library IEEE,lsi_10k;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_textio.all;
use lsi_10k.COMPONENTS.all;
use work.CONV_PACK_counter.all;
entity counter is
end counter;
component IV
port( A : in std_logic; Z : out std_logic);
end component;
component EO
port( A, B : in std_logic; Z : out std_logic);
end component;
component ND2
port( A, B : in std_logic; Z : out std_logic);
end component;
component FD2
port( D, CP, CD : in std_logic; Q, QN : out std_logic);
end component;
signal Q_1_port, Q_0_port, n149, n150, net9, n151, n152, n153 : std_logic;
begin
Q <= ( Q_1_port, Q_0_port );
end SYN;
IEEE.std_logic_textio.all;
IEEE.std_logic_unsigned.all;
lsi_10k.COMPONENTS.all;
library IEEE,lsi_10k;
Bibliografie
[1]. http://en.wikipedia.org/wiki/FPGA
[2]. http://www.eecg.toronto.edu/~vaughn/challenge/fpga_arch.html
[3]. http://www.eetimes.com/conf/dac/showArticle.jhtml?articleID=164302400
[4]. http://www.xilinx.com/bvdocs/whitepapers/wp245.pdf
[5]. http://seekingalpha.com/article/85478-altera-and-xilinx-report-the-battle-continues
[6]. Xilinx ISE WebPACK, http://www.xilinx.com/ise/logic_design_prod/webpack.htm
[7]. Quartus II Web edition software, https://www.altera.com/support/software/download/altera_ design/
quartus_we/dnl-quartus_we.jsp.
[8]. J.J. Rodriguez-Andina, M.J. Moure, M.D. Valdes. “Features, Design Tools, and Application Do-
mains of FPGAs,” IEEE Transactions on Industrial Electronics, vol. 54, nr. 4, august 2007, pag.
1810-1823.
[9]. T.H.S. Li, S.J. Chang, Y.X. Chen. “Implementation of human-like driving skills by autonomous
fuzzy behavior control on an FPGA-based car-like mobile robot,” IEEE Trans. Ind. Electron., vol.
50, nr. 5, oct. 2003, pag. 867–880.
[10]. B.W. Bomar. “Implementation of microprogrammed control in FPGAs,” IEEE Trans. Ind. Elec-
tron., vol. 49, nr. 2, aprilie 2002, pag. 415–422.
[11]. C. Quintáns, M.J. Moure, M.D. Valdés, E. Mandado. “A virtual instrumentation laboratory based on
a reconfigurable coprocessor,” IEEE Trans. Instrum. Meas., vol. 55, nr. 2, apr. 2006, pag. 635–645.
[12]. C. Dufour, S. Abourida, J. Bélanger. “Real-time simulation of permanent magnet motor drive on
FPGA chip for high-bandwidth controller tests and validation,” Proc. IEEE ISIE, iul. 2006, pag.
2591–2596.\
[13]. Gh. Toacşe, D. Nicula. “Circuite integrate digitale. Limbajul de descriere hard – VHDL,” Teora,
Bucureşti, 1996.
[14]. D. Fritz. „Spartan 3 FPGA Tutorial”, Oklahoma State University, 2005.
[15]. M. Salazar. „Design of Control Logic For a Fluid Storage Tank,” Project UNM Intelligent Distri-
buited Multi-Agent Robotics Laboratory, Albuquerque, supervised by D. Zrilic, 2006.
[16]. Xilinx. “Targeting Spartan-3E Starter Kit - Lab 1: Xilinx Tool Flow Lab”.
[17]. Xilinx. “Spartan 6”.
[18]. Xilinx. “ISE In-Depth Tutorial”. 18. Ian. 2012.
[19]. Xilinx. “ISim In-Depth Tutorial”. 18. Ian. 2012.
[20]. Xilinx. “ISim User Guide”. 27. Ian. 2012.
[21]. Xilinx. “XST User Guide for Virtex-6,Spartan-6, and 7 Series Devices”. 18. Ian. 2012.
[22]. Xilinx. “Quick Front-to-Back Overview Tutorial PlanAhead Design Tool”. 16. Ian. 2012.
[23]. Weijun Zhang „VHDL Tutorial: Learn by Example”, http://esd.cs.ucr.edu/labs/tutorial.