Sunteți pe pagina 1din 84

Universitatea „Aurel Vlaicu”din Arad

Facultatea de Inginerie

Conf. dr. ing. Marius M. BĂLAŞ

Îndrumător pentru dezvoltarea


circuitelor inteligente - FPGA
- pentru uzul studenţilor -

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

Fig. 1.1. Poziţionarea tehnologiilor în planul capacităţii de manipulare a energiei/materiei şi informaţiei

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.

Cercetătorii electronişti au căutat în permanenţă să extindă paleta tehnologiilor compatibile cu


IA. Rezultate promiţătoare se anunţă de exemplu din domeniul circuitelor nanometrice. Totuşi
singura realizare notabilă în acest sens, care s-a impus decisiv în industria electronică şi are un
impact esenţial asupra industriei actuale o constituie circuitele digitale de mare complexitate.
Aşa cum se va vedea în capitolul următor, există două versiuni principale ale tehnologiei circui-
telor integrate de mare complexitate, care permit dezvoltarea aplicaţiilor inteligente: ASIC (cir-
cuite integrate electronice de mare capacitate cablate) şi FPGA (circuite integrate electronice de
mare capacitate programabile). Din punctul de vedere al utilizatorilor circuitele FPGA sunt de
departe cele mai interesante, deoarece oferă atât performanţe excepţionale cât mai ales prin fap-
tul că sunt programabile.

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.

2.1.2. Principalii producători


Principalii producători de circuite FPGA sunt Xilinx cu 50% şi Altera cu 30% din această piaţă
[5]. Xilinx furnizează software de proiectare gratuit pentru Windows şi Linux [6], iar Altera pen-
tru Windows. Software Solaris şi Linux poate fi obţinut şi pe calea ofertelor asociate produselor
sau închiriere [7]. Pentru a favoriza dezvoltarea continuă a circuitelor FPGA principalii produ-
cători au lansat familiile de cost redus Spartan de la Xilinx şi Cyclone de la Altera, extrem de
populare în mediile academice. Alţi competitori sunt Lattice Semiconductor, Actel, Silicon Blue
Technologies, Achronix şi QuickLogic.

2.1.3. Dezvoltări recente


Tendinţele recente continuă dezvoltarea arhitecturilor granulare tradiţionale (formate din ansam-
bluri mari de blocuri logice) cu microprocesoare încorporate şi periferice, în vederea realizării
unor „cipuri-sistem programabile”. Această direcţie a fost iniţiată de Ron Perlof şi de Hana
Potash de la Burroughs Advanced Systems Group, care încă din 1982 au dezvoltat o arhitectură
reconfigurabilă de CPU pe un singur cip, numit SB24. Astfel de arhitecturi hibride pot fi găsite
în dispozitivele Virtex-II PRO şi Virtex-4. Atmel FPSLIC este un alt dispozitiv de acest gen,
care include un procesor AVR. O alternativă la utilizarea procesoarelor hardware sunt procesoa-
rele soft care pot fi implementate prin logica FPGA. Cele mai multe FPGA-uri moderne dispun
de implementări hardware sau software ale funcţiilor de nivel înalt: sumatoare, multiplicatoare,
decodoare, circuite cu calare pe fază PLL(phase-locked loops) sau pe întârziere DLL (delay-
locked loops) sau funcţii matematice precum şi de diferite tipuri de memorii.
Multe FPGA-uri moderne pot fi reprogramate în timpul funcţionării, ceea ce a dus la ideea calcu-
lului reconfigurabil sau a sistemelor reconfigurabile – unităţi centrale capabile de autoconfigu-
rare dinamică. O astfel de aplicaţie este Procesorul Virtual Mitrion, care nu realizează o reconfi-
gurare dinamică propriu zisă în timp real, dar se poate reconfigura prin comenzi directe din pro-
gram. Sunt posibilele şi reconfigurările parţiale, în care unele părţi din circuit continuă să lucreze
în timp ce altele sunt configurate. Pentru a face posibile reconfigurările parţiale arhitecturile tre-
buie să permită accesul selectiv la resursele de configurare disponibile. Astfel de arhitecturi
reconfigurabile pot fi realizate şi în tehnologii hibride, ca şi în cazul microprocesorului Stretch
S5000 care oferă microprocesoare şi arii FPGA pe acelaşi cip.
2.1.4. Date referitoare la piaţa circuitelor FPGA
Numărul de porţi
 1987: 9.000 de porţi, Xilinx
 1992: 600.000 de porţi, Naval Surface Warfare Department
 Anii 2000: zece milioane de porţi, cu 1000 de pini I/O, la frecvenţe de 500MHz.
Dimensiunea pieţei
 1985: primul FPGA comercial, Xilinx
 1987: 14 milioane $
 ~1993: >385 milioane $
 2005: 1.9 miliarde $
 2010 estimare: 2.75 miliarde $
Aplicaţii incluzând FPGA
 2005: 80.000
 2008:90.000
 2010 estimare: 110.000 [3]

Fig. 2.1. Circuitul FPGA Stratix IV GX produs de Altera


Fig. 2.2. Placa Xilinx S6-SP601

2.1.5. O comparaţie a FPGA cu alte tehnologii


ASIC este conceptul cel mai apropiat de FPGA. Primele FPGA-uri erau mai lente, mai puţin efi-
ciente energetic şi în general mai puţin funcţionale decât echivalentele lor fixe ASIC. În urma
creşterii volumului producţiei şi aplicaţiilor, a eforturilor de cercetare-dezvoltare şi a perfecţio-
nărilor tehnologice, performanţele FPGA s-au apropiat tot mai mult de cele ASIC.
Avantajele include un timp de acces la piaţă foarte scurt, reprogramarea şi depanarea de către
utilizator şi costuri scăzute de cercetare, dezvoltare, proiectare şi testare (non-recurring engine-
ering costs). O strategie extrem de avantajoasă constă din dezvoltarea produselor în tehnologie
FPGA (rapid prototyping) şi realizarea versiunii finale în ASIC.
Mai precis, FPGA-urile reprezintă modalitatea cea mai sigură de validare a sistemelor complexe,
(validări pre-siliciu şi post-siliciu) şi a dezvoltărilor de tip firmware. În acest fel producătorii pot
evita costurile asociate testării directe a prototipurilor, caz în care fiecare greşeală de proiectare
necesită realizarea unui nou prototip.
Un alt concept asemănător este CPLD (complex programmable logic device). Circuitele CPLD
au o complexitate mai mică decât a celor FPGA, dar mai mare decât a circuitelor PAL (program-
mable array logic). Unitatea lor componentă de bază este macrocelula, care implementează func-
ţii logice booleene în forma canonică disjunctivă, precum şi alte operaţii logice mai specializate.
Faţă de FPGA, circuitele CPLD au o capacitate mai redusă (zeci de mii de porţi faţă de sute de
mii sau milioane). Pe lângă acesta, FPGA sunt mult mai flexibile. Se poate afirma că FPGA con-
tinuă linia de dezvoltare a PAL – CPDL nu atât prin creşterea numărului de arii cât mai ales prin
atenţia acordată circuitelor de reconfigurare, care sunt de mare complexitate şi performanţă.
2.1.6. Arhitecturi FPGA
Cel mai adesea arhitectura FPGA constă dintr-o arie de blocuri logice configurabile CLB, pad-
uri intrare-ieşire I/O şi canale de rutare. În general toate canalele de rutare sunt de aceeaşi capa-
citate (au acelaşi număr de fire).
O implementare FPGA trebuie să dispună de resurse adecvate. În timp ce numărul de CLB-uri şi
de I/O sunt uşor de determinat din proiect, numărul de căi de rutare poate varia considerabil,
chiar şi în cazul unor proiecte foarte asemănătoare din punct de vedere logic. De exemplu, o
matrice de comutare (matrix switch sau crossbar switch) necesită mult mai multe rutări decât o
arie sistolică, o formă particulară de arhitectură paralelă, organizată ca o reţea (pipe network).
Căile de rutare neutilizate cresc costul şi scad performanţele circuitului, fără a aduce nici un
beneficiu, producătorii de FPGA încearcă să optimizeze numărul lor, astfel încât majoritatea
proiectelor să fie posibile în termeni de LUT şi I/O. Această optimizare poate fi realizată fie prin
experimentarea şi analizarea unor proiecte semnificative fie aplicând regula lui Rent: T = t  gp
unde T este numărul de terminale, g numărul de componente interne, iar t şi p constante.

Canal de
rutare

Pad
I/O

CLB

Fig. 2.3. Structura generică FPGA

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.

Fig. 2.5. Amplasarea terminalelor

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

Fig. 2.6. Principiul de rutare FPGA

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

Fig. 2.7. Topologia unui bloc de conexiuni


2.2. Resurse hardware şi software
Familiile moderne FPGA extind această capacitate de conectare prin realizarea cablată a unor
funcţii de înalt nivel, crescând astfel performanţele (viteză de lucru crescută, arie de siliciu mai
mică, etc.) şi scăzând efortul de proiectare[8]. Astfel de blocuri pot fi: blocuri generice DSP,
multiplicatoare, blocuri PLL şi/sau DLL, circuite I/O de mare viteză, memorii, registre de depla-
sare, numărătoare, etc. Resursele hardware investite în FPGA sunt extrem de diverse, în funcţie
de producători şi de arhitectura aleasă. Pe de altă parte, resursele software, de care depind în
mare măsură şi performanţele hardware-ului, sunt extrem de specifice, într-o continuă dezvoltare
şi evoluţie [8].

2.2.1. Resurse hardware

A. Blocuri funcţionale integrate


1) Memorii: memoriile interne permit creşterea vitezei de operare şi utilizarea mai eficientă a
pinilor I/O. Pe lângă acesta structura sistemului este mult simplificată. Capacităţile de memorie
utilizate sunt destul de mari, de exemplu Altera Stratix II conţine până la 9 Mb. Se pot întâlni
diferite configuraţii. Pentru RAM se întâlnesc variantele single port, simple dual port, true dual
port şi bidirectional dual port. Se întâlnesc şi memorii ROM şi registre de deplasare. Pornind de
aici se pot implementa şi alte structuri, cum ar fi memoriile FIFO (first-in-first-out) sau memorii
asociative.
2) PLL/DLL: circuite PLL şi DLLs pot fi utilizate pentru compensarea întârzierii de propagare a
semnalului de sincronizare clock de-a lungul circuitului. Alte aplicaţii interesante sunt sintetiza-
rea de frecvenţe prin multiplicare/divizare şi condiţionarea clock-ului (factor de umplere şi defa-
zaj). Circuitele DLL sunt ieftine, consumă puţină energie şi sunt imune la zgomote, în timp ce
PLL-urile sunt mai versatile şi permit operaţii mai complexe cum ar fi implementarea filtrelor
acordabile, pe un domeniu de frecvenţe mai larg. În figura 2.8 se prezintă arhitectura Spartan-3
Xilinx având patru circuite DCM (digital clock managers) bazate pe blocuri DLL.
3) Circuite aritmetice: unele FPGA-uri dispun de număr mare de blocuri aritmetice simple. De
exemplu familia Virtex-5 LX Xilinx include multiplicatoare, prin care se pot realiza operaţii de
până la 25 × 18 biţi în complement faţă de doi. Blocuri mult mai complexe, DSP-uri, se pot găsi
în circuite mai avansate, cum ar fi Stratix II Altera. La acest produs DSP-urile sunt cuprinse într-
o structură registru + multiplicator + sumator/scăzător (36-biţi)/acumulator (52-biţi). În arhitec-
tura Stratix II Altera sunt vizibile blocurile PLL, RAM (M-RAM, M-512 şi M-4 K) şi blocuri
DSP (vezi figura 2.9).
4) Transceivere: dispozitive de emisie-recepţie (transceiver) pentru diferite standarde (10-Gb
Ethernet şi10-Gb canal cu fibră optică), ca şi protocoale de comunicaţie definite de utilizator pot
fi uşor implementate prin blocuri de codare/decodare şi serializare/deserializare a datelor, buffere
de transmisie/recepţie şi sincronizare. De exemplu, circuitul ORCA ORT82G5 (Lattice) include
transceivere cu opt canale, fiecare operând în domeniul 600 Mb/s - 3.7 Gb/s, cu o interfaţă du-
plex de sincronizare cu clock încorporat şi memorare temporară a datelor.

Fig. 2.8. Arhitectura Spartan 3 Xilinx [8]

Fig. 2.9. Arhitectura Stratix II Altera [8]


5) Procesoare integrate: cele mai complexe arhitecturi FPGA ajung să includă şi procesoare
însoţite de perifericele aferente, în vederea materializării conceptului System-on-Chip (aşa numi-
tele SoC solutions) prin care tot sistemul de calcul este implementat pe un singur cip de Siliciu.
De exemplu circuitul Virtex-4 FX (Xilinx) include procesoare RISC (reduced instruction set
computer) de tipul IBM PowerPC 405 de 32 de biţi, capabile să funcţioneze la 450 MHz, cu con-
trolere de acces la memorii RAM, o unitate aritmetică hardware pentru multiplicare/divizare, trei
timere diferite, interfaţă directă pentru reţea Ethernet, registre de configurare MAC, o unitate de
procesare auxiliară pentru interfaţarea resurselor logice FPGA în vederea conectării la accelera-
toare hardware, a introducerii de instrucţiuni definite de utilizator sau unităţi de coprocesor în
virgulă mobilă [8].

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.

B. Condiţionarea semnalelor intrare/ieşire

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

1) Dispozitive programabile o singură dată OTP (One-time-programmable): dispozitivele


nevolatile sunt uneori preferate celor volatile, care utilizează celule SRAM.

Comandă
confugurare
Citire/scriere
Date

Fig. 2.11. Celulă SRAM pentru configurare

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

Fig. 2.12. Exemplu de configuraţie tolerantă la defecte


Pentru a răspunde acestor solicitări au fost dezvoltate familii de FPGA de tip antifuse cu rezis-
tenţă sporită la radiaţie cum ar fi RTSX/RTAX sau Aeroflex Eclipse. Există şi versiuni protejate
împotriva perturbaţiilor radio: familiile Atmel AT40KEL040 sau Xilinx QPRO-R Virtex-II.

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.

2.2.2. Resurse software

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

Procesoarele soft au fost aplicate In acest domeniu de Xilinx (PicoBlaze şi MicroBlaze) şi de


Altera (Nios şiNios II). PicoBlaze este un microcontroler de 8 biţi de capacitate mică dar imple-
mentat cu un număr redus de blocuri logice. MicroBlaze corespunde unei arhitecturi RISC de 32
biţi cu un set standard de periferice. Procesorul Nios are o funcţionare mai complexă, cuprinzând
chiar şi posibilitatea adăugării de instrucţiuni noi de către client (custom logic).
Rezultat

Fig. 2.13. Instrucţiuni client în cazul procesorului Nios II

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.

2.4. Aplicaţii FPGA

Aplicaţiile FPGA includ unele domenii esenţiale pentru electronica modernă:


- DSP (digital signal processing) o categorie vastă de aplicaţii de procesare digitală a semnalelor,
dintre care cele mai cunoscute sunt: procesarea semnalelor audio şi radio, recunoaşterea vorbirii,
a vocilor şi a sunetelor, radar şi sonar, procesarea ariilor de senzori, analiză spectrală, analiza
statistică a semnalelor, telecomunicaţii, procesarea semnalelor biomedicale, seismice, etc.
- Aplicaţii în aviatică, aparatură militară, criptografie şi radioastronomie;
- Realizarea rapidă a prototipurilor ASIC;
- Imagistică, etc.;
FPGA se utilizează cu bune rezultate în cazul aplicaţiilor de calcul de înaltă performanţă, cum ar
fi în cazul procesărilor FFT (Fast Fourier Transform), a calculului convoluţional şi procesărilor
paralele, având performanţe superioare microprocesoarelor convenţionale.
În general circuitele FPGA sunt recomandabile aplicaţiilor de tip „vertical”, care nu sunt obiectul
producţiei de masă. În cazul produselor de masă este preferabilă apelarea la ASIC, FPGA fiind
utile doar în faza de realizare şi testare a prototipurilor.
Se poate afirma că aplicaţiile FPGA pot înlocui cu succes orice aplicaţie de tip microprocesor
sau DSP care nu necesită prelucrări în virgulă mobilă [8]. Avantajele lor strategice sunt calculul
hardware paralel, reconfigurarea şi capacitatea de a îngloba cu uşurinţă produse hardware şi soft-
ware eterogene. Uşurinţa de adaptare la orice tip de periferice conferă circuitelor FPGA statutul
de principală platformă de dezvoltare a aplicaţiilor SoC (system on chip).
În continuare se propune o clasificare a aplicaţiilor FPGA.

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.

B. Sisteme reconfigurabile dinamic


Reconfigurarea FPGA poate fi obţinută prin două procedee principale:
1) Reconfigurarea prin compilare, care poate fi făcută în afara funcţionării normale, cu scopul
de a adăuga sau şterge componente noi sau pentru depanare.
2) Reconfigurarea dinamică RTR (run-time-reconfiguration), executată în timpul rulării. Ea
poate fi lansată din interiorul aplicaţiilor sau prin stimuli externi. La rândul ei RTR poate fi glo-
bală sau locală.
RTR se aplică de obicei în cazul folosirii mai multor variante de periferice (mobile/wireless)
pentru optimizarea conectării sau cu scopul reducerii consumului de energie, prin deconectarea
circuitelor care nu sunt necesare la un moment dat. Reconfigurări dinamice în timp real cum ar fi
de exemplu cele necesare autoadaptărilor sistemelor de conducere sunt de asemenea posibile, dar
ele necesită o mare atenţie, pentru a evita pericolul unor răspunsuri tranzitorii necontrolate.

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.

E. Prelucrarea digitală a semnalelor


Circuitele specializate în prelucrarea digitală a semnalelor DSP au unele dezavantaje: memorie
şi format pentru date fixe, magistrale puţine şi neperformante, număr redus de unităţi aritmetice
cum ar fi cele de tip MAC (multiply accumulate), resurse limitate intrare/ieşire, etc. În această
privinţă FPGA ridică unele probleme de programare, dar oferă în schimb configuraţii flexibile,
procesări paralele şi interfeţe de calitate. În figura următoare este ilustrată deosebirea dintre teh-
nologia DSP cu un singur MAC şi FPGA în domeniul filtrării numerice.
Fig. 2.14. Implementarea unui filtru FIR (finite impulse response) cu 256 coeficienţi printr-un
DSP cu o unitate MAC a) respectiv cu un FPGA cu MAC-uri multiple [8]

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

 Independenţă faţă de procesul şi tehnologia de implementare fizică.

3.2. Proiectarea „top-down” a sistemelor digitale


Metodologia „top-down” este proprie sistemelor cu grad crescut de complexitate. Descrierea
unui sistem electronic poate fi făcută la diverse nivele ierarhice. Nivelul inferior corespunde
descrierii circuitelor integrate, după care urmează nivelele plăcii (pe care sunt mai multe circuite
integrate), a modulului (compus din mai multe plăci) şi a sistemului în întregul său.

Î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

Noţiunile de bază din domeniul sintezei sistemelor electronice sunt:


- Specificarea: descrierea neambiguă şi deterministă a intrărilor, ieşirilor şi relaţiilor dintre ele;
- Implementarea: modul în care se realizează fizic legăturile dintre intrări şi ieşiri;
- Sinteza: procesul automat prin care se realizează o implementare plecând de la specificaţii;
- Verificarea: procesul prin care proiectantul se asigură că implementarea este conformă cu spe-
cificaţiile;

Prin recurgerea la conceptul de descriere a hardware-ului devine posibilă şi abordarea de sus în


jos (top-down). În cadrul acestei metodologii este posibilă dezvoltarea sistemelor chiar dacă nu
se dispune de implementări ale componentelor sale, operând în schimb cu descrierile lor funcţio-
nale. Aceasta permite proiectanţilor o flexibilitate maximă în partiţionarea proiectelor şi studie-
rea lor prin simulări chiar înainte de fazele de implementare. Se reduce astfel la maximum numă-
rul de cicluri de depanare-îmbunătăţire a prototipurilor. De asemenea se facilitează reutilizarea
unor părţi din proiecte anterioare, care sunt deja validate funcţional.
Metodologia top-down presupune ca toate nivelele de implementare să fie documentate atât
structural (netlist) cât şi funcţional. Limbajul VHDL a fost conceput tocmai în acest sens. În plus,
fiecare entitate VHDL trebuie să aibă asociat un set de metode de testare (test bench) pe baza
căruia să se poată asigura simularea corectă a proiectului.
Desigur, metodologia top-down nu este folosită exclusiv, abordările uzuale fiind de fapt mixte,
echilibrul dintre dezvoltările bazate pe descrierile prin specificaţii de nivel înalt şi cele de la nivel
de componentă standardizată fiind dinamic.
3.3. Elemente de VHDL

3.3.1. Terminologia VHDL

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

3.3.1. Cum arată o descriere VHDL

În VHDL o componentă hardware (începând de la o poartă până la un microprocesor) este repre-


zentată prin conceptul de entitate, căreia i se asociază o arhitectură. Entitatea are în primul rând
scopul de a defini conexiunile exterioare, denumite porturi. Pe lângă definirea numelor porturilor
se definesc direcţia datelor (IN, AUT, INOUT) şi tipul lor (INTEGER, BIT, etc.)
Descrierea arhitecturii poate fi funcţională - func (se descrie comportamentul entităţii) sau struc-
turală – struc (se descrie schema electrică a entităţii). Caracteristic VHDL-ului este posibilitatea
utilizării simultane ,sub aceeaşi interfaţă, a două sau chiar a mai multor descrieri.
În cele ce urmează se exemplifică modul de descriere a unui circuit logic simplu. În prima sec-
ţiune se defineşte entitatea exemplu.
ENTITY exemplu IS
-- declaraţia porturilor
PORT(a, b, c : IN Bit; f : OUT Bit) ;
END exemplu;
În continuare se defineşte comportamentul entităţii (descriere funcţională).
ARCHITECTURE ex_func OF exemplu IS
BEGIN
F <= (a OR b) AND c AFTER 5 ns ;
END ex_func ;
Entitatea exemplu conţine 4 conexiuni externe, toate de tip binar (bit). Pe lângă funcţia logică F
propriu zisă se mai specifică şi valoarea întârzierii introdusă de circuit, de 5 ns. Reprezentarea
grafică a descrierii apare în Fig. 3.2.

a
b f <= (a OR b) AND c f
c

Fig. 3.2. Descrierea funcţionă

Varianta structurală a aceluiaşi circuit este următoarea.


ARCHITECTURE ex_struct OF exemplu IS
-- declaraţia de componente
COMPONENT and_gate PORT (a1, a2 : IN Bit ; a3 : OUT Bit) ;
END COMPONENT ;
COMPONENT or_gate PORT (o1, o2 : IN Bit ; o3 : OUT Bit) ;
END COMPONENT ;
-- declaraţia de semnal local
SIGNAL d : Bit ;
BEGIN
-- descriere structurală
g1 : or_gate PORT MAP (a, b, d) ;
g2 : and_gate PORT MAP (c, d, f) ;
END ex_struct ;
După cum se observă arhitectura ex_struct constă dintr-o listă de componente definite la rândul
lor prin binomul entitate – arhitectură. Definirea porţii ŞI este prezentată în continuare, cea a
porţii SAU fiind asemănătoare.
ENTITY and_gate IS
PORT(a1, a2 : IN Bit; a3 : OUT Bit) ;
END and_gate;
ARCHITECTURE and_gate OF and_gate IS
BEGIN
a3 <= a1 AND a2 AFTER 2 ns ;
END and_gate ;

a g1 d
b f
g2
c

Fig. 3.3. Descrierea structurală

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

3.4.1. Regulator pentru un rezervor de lichide

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

HLS VIN VOUT


Regulator
Rezervor
Alarma A
LLS
H TC TH

Fig. 3.4. Schema bloc a sistemului de reglare a lichidului din rezervor


Etapele dezvoltării aplicaţiei sunt următoarele:
1) Descrierea funcţionării regulatorului, în acest caz printr-un tabel de adevăr cu patru intrări LH,
LL, TH şi TC şi cu patru ieşiri VIN, VOUT, H şi A.
2) Identificarea funcţiilor logice ale fiecărui dintre cele patru ieşiri.
3) Minimizarea funcţiilor logice cu diagrame Veitch-Karnaugh.
În continuare, în cazul în care dorim să implementăm aceste funcţii logice printr-un circuit
electronic integrat, mai urmează următoarele etape:
4) Sinteza circuitelor utilizând numai porţi ŞI-NU (NAND) şi inversoare.
5) Combinarea celor patru componente funcţionale într-un singur circuit.
6) Programarea circuitului în VHDL şi implementarea FPGA.
1) Tabelul de adevăr
Intrări Ieşiri
LH LL TH TC VIN VOUT H A

0 0 0 0 1 0 0 0 Umplere / încălzire oprită


0 0 0 1 1 0 1 0 Umplere / încălzire pornită
0 0 1 0 1 0 0 1 Umplere / încălzire pornită / alarmă
0 0 1 1 0 0 0 1 Senzor temperatură defect / alarmă
0 1 0 0 1 1 0 0 Umplere (rezervor gol) / încălzire oprită
0 1 0 1 1 0 1 0 Umplere (rezervor gol)/încălzire pornită
0 1 1 0 1 0 0 1 Umplere (gol) / încălzire oprită / alarmă
0 1 1 1 0 0 0 1 Senzor de temperatură defect / alarmă
1 0 0 0 0 0 0 1 Senzor de nivel defect / alarmă
1 0 0 1 0 0 0 1 Senzor de nivel defect / alarmă
1 0 1 0 0 0 0 1 Senzor de nivel defect / alarmă
1 0 1 1 0 0 0 1 Mai mulţi senzori defecţi / alarmă
1 1 0 0 0 1 0 0 Senzor LL defect / încălzire oprită
1 1 0 1 0 0 1 0 Încălzire
1 1 1 0 0 0 0 1 Încălzire oprită / alarmă
1 1 1 1 0 0 0 1 Senzor de temperatură defect / alarmă

Schema obţinută în final este prezentată în fig. 3.5.

2) Codul VHDL care realizează aplicaţia începe cu declararea bibliotecilor de componente:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
IEEE.STD_LOGIC_UNSIGNED.ALL;
--Uncomment the following library declaration if instantiaitng
--any Xilinx primitives in this code.
--library UNISIM;
--useUNISIM.VComponents.all;
Fig. 3.5. Schema electrică a sistemului de reglare a lichidului din rezervor

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

Fig. 4.2. Placa Spartan 3E FPGA


Începând din 2009 familia Spartan s-a completat cu Spartan-6, în tehnologie de 45nm, ca soluţie
cu costuri scăzute pentru aplicaţii din domeniul interfeţelor inteligente, comunicaţii wireless,
supraveghere video, transporturi inclusiv avionică, etc.
Fig. 4.3.1. Navigatorul ISE (Project Navigator)
4.3. ISE Design Suite

4.3.1. Desfăşurarea unui proiect ISE

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.

Fig. 4.3.6. Sinteza XST


Varianta VHDL a schemei din Fig. 4.3.5 este prezentată în continuare:

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

Fig. 4.3.7. Simulatorul ISim


După ce sinteza aplicaţiei este validată prin obţinerea rezultatelor dorite în etapa de simulare, se
poate trece la implementarea aplicaţiei pe una dintre plăcile de care dispunem. Plăcile dispun de
sisteme de conectare la PC-ul cu care lucrăm, de exemplu kit-ul Spartan-3E Starter este dotat cu
un conector JTAG cu terminal USB de tip B. Software-ul implicit prin care proiectul compilat
este instalat în memoria PROM a plăcii este iMPACT.

Fig. 4.3.8. Fereastra destinată implementării din Project Navigator

4.3.2. Sinteza şi simularea exemplificate pentru un circuit simplu: latch-ul RS


În această secţiune se exemplifică sinteza, simularea şi implementarea unui proiect simplu, pe
care îl numim RSlatch, sintetizat pornind de la schema sa electronică, modelat în VHDL şi imple-
mentat pe o placă Spartan 3. Se utilizează versiunea ISE Design Suite 13.4 [18] care este asemă-
nătoare cu versiunea 12.2.
Bistabilul RS asincron (latch) este circuitul fundamental de la care începe dezvoltarea circuitelor
logice secvenţiale. Intrările sale de comandă sunt Set (memorare 1) şi Reset (memorare 0). Ieşi-
rile sunt Q şi inversa sa Q . Vom considera următorul tabel de adevăr.

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

Fig. 4.3.11. Fereastra Design a proiectului RSlatch în mod Implementation


Fig. 4.3.12. Test bench-ul VHDL - RSlatch_tb.vhd
Şablonul VHDL al test bench-ului, respectiv fişierul RSlatch _tb.vhd, în care se remarcă utiliza-
rea bibliotecilor UNISIM, este generat automat. În secţiunea Test bench-User Defined Section ne
putem defini semnalele de test dorite. Pentru testarea bistabilului alegem să aplicăm succesiv la
intrările XLN_3 şi XLN_4 cele patru combinaţii de stări care apar în tabelul de adevăr, respectiv
0-0, 0-1, 1-0, şi în final 1-1. Fiecare stare va dura 100 ns.
Fig. 4.3.13. Fereastra Design a proiectului RSlatch în modul Simulation
Simulările se execută în modul Simulation (Fig. 4.3.13). Simulatorul ISim [19, 20] poate verifica
sintaxa fişierului RSlatch_tb.vhd, după care prin click dreapta pe Simulate Behavioral Model se
pot stabili parametrii simulării, în primul rând durata şi tipurile de semnale de test (Fig. 4.3.14).
Pe lângă definirea directă a semnalelor de test, utilizatorii pot opta pentru semnalele predefinite
din biblioteca ISE, de intrare: start/stop, reset, clock, mode, lap-load, etc. sau de ieşire lcd_e,
lcd_rs, lcd_rw sau sf_d[7:0] pentru afişajul LCD [19, 20].

Fig. 4.3.14. Setarea parametrilor simulării


Fig. 4.3.15. Rezultatul simulării
Verificarea funcţionării tabelului de adevăr se realizează vizual, fără mari dificultăţi. După cum
s-a observat în Fig. 4.3.12, definirea celor două semnale de intrare XLN_3 şi XLN_4 se face prin
următoarea secvenţă de cod VHDL:

-- *** Test Bench - User Defined Section ***


tb : PROCESS
BEGIN
XLN_3 <= ’0’;
XLN_4 <= ’0’;
wait for 100 ns;
XLN_3 <= ’0’;
XLN_4 <= ’1’;
wait for 100 ns;
XLN_3 <= ’1’;
XLN_4 <= ’0’;
wait for 100 ns;
XLN_3 <= ’1’;
XLN_4 <= ’1’;
wait for 100 ns;
END PROCESS;
-- *** End Test Bench - User Defined Section ***

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

Fig. 4.3.17. Fereastra Design a proiectului RSlatch în timpul procesului de implementare


Fig. 4.3.18. Ilustrarea unor operaţii de definire a constrângerilor în domeniul timp
O operaţie pregătitoare pentru sinteza XST propriu zisă este precizare constrângerilor tehnolo-
gice impuse de utilizator – User Constraints, operaţie materializată prin fişierul RSlatch.ucf.
Primele constrângeri se referă la temporizări şi întârzieri în timp Timing Constraints. Fiecărui
element din componenţa schemei îi poate fi impusă o comportare impusă în domeniul timpului:
timpul de propagare, durata frontului crescător, durata frontului descrescător, etc. (Fig 4.3.18).
Importanţa constrângerilor în timp creşte o dată cu complexitatea schemelor şi cu gradul de pre-
cizie cerut de sincronizarea funcţionării lor. Desigur în cazul exemplului nostru RSlatch impor-
tanţa constrângerilor în timp este redusă faţă de următoarele operaţii, care privesc alocarea pini-
lor de conexiune intrare/ieşire Package Pins şi configurarea suprafeţei active ocupate de circuit
pe suprafaţa FPGA-ului Place and Route. În aplicaţii mai complexe, în această fază se rezolvă şi
interconexiunile între module mai mari de circuit, proiectate direct sau preluate din alte proiecte,
precum şi conectarea la facilităţile disponibile pe placa FPGA utilizată (semnale de clock,
elemente de comandă şi semnalizare, interfeţe de reţea, modem-uri de radiofrecvenţă, etc.)

Fig. 4.3.19. Alocarea pinilor de conectare - Package Pins (Pre-Synthesis şi Post-Synthesis)


Fig. 4.3.20. Blocul RSlatch în reprezentare comportamentală
Operaţiile de până acum au fost realizate cu proiectul reprezentat sub forma sa comportamentală
(behavior), în care se pot aloca pinii şi se pot realiza simulările funcţionale
Implementarea pe placă necesită reprezentarea circuitului sub formă structurală (architecture).
Pentru aceasta se generează o schemă RTL (Register Transfer Level) reprezentată în Fig. 4.3.22,
fază comandată manual pornind de la căsuţa de dialog din Fig. 4.3.21 şi materializată printr-un
fişier .ngr. ISE recomandă cu această ocazie completare schemei cu unele componente utile din
punct de vedere tehnologic, cum ar fi porţile buffer la intrări şi ieşiri. În această fază se pot ana-
liza şi optimiza performanţele circuitului proiectat (Post Synthesis Simulation Model). Realizarea
schemei tehnologice pornind de la fişierul RSlatch.ngr, cu respectarea constrângerilor din fişierul
RSlatch.ucf, se numeşte mapare, declanşată de comanda map. Dacă schema RTL nu a fost reali-
zată anterior, la comanda map ea se execută automat.

Fig. 4.3.21. Cutia de dialog View RTL Schematic


Fig. 4.3.22. Schema RTL
Maparea realizează alocarea resurselor FPGA cerute de schema RTL, respectiv porţile cu logică
configurabilă CLB şi blocurile de intrare/ieşire IOB, cu luarea în consideraţie a constrângerilor
tehnologice. Odată cu maparea se poate face o analiză mai precisă a întârzierilor în timp care
sunt introduse pe fiecare dintre traseele logice ale circuitului (Generate Post-Map Static Timing
şi Analyze Post-Map Static Timing).
După realizarea mapării se poate trece la etapa de configurare nemijlocită a aplicaţiei FPGA: am-
plasarea în cadrul ariei de porţi (precizarea şi configurarea CLB-urilor şi IOB-urilor utilizate) şi
rutarea (conectarea) acestora. Amplasarea şi rutarea oferite implicit de ISE pot fi modificate de
utilizator prin procedurile Manually Place and Route.

Fig. 4.3.23. Etapa Place and Route


Fig. 4.3.24. Alocarea pinilor, amplasarea şi rutarea pentru un proiect mai complex
După terminarea cu succes a plasării şi rutării se poate definitiva schema electrică şi se pot face
analizele finale ale performanţelor aplicaţiei: comportarea în timp (de exemplu Analyze Post-
Place & Route Static Timing), putere consumată, resursele utilizate, etc., operaţii care fac posibile
validarea aplicaţiei şi includerea ei în bibliotecile HDL în vederea constituirii ca element de pro-
prietate intelectuală pentru reutilizarea ulterioară în alte aplicaţii. Aceste analize pot fi realizate şi
cu instrumente software asociate cu ISE, cum ar fi PlanAhead.

Fig. 4.3.25. Schema revizuită a circuitului RS latch


Fig. 4.3.26. Configurarea dispozitivului ţintă din PROM File Formatter
Faza finală este implementarea proiectului prin intermediul fişierului rslatch.bit de tip bitstream,
care are rolul de a configura circuitul FPGA conform specificaţiilor cuprinse în fişierul generat
de faza de amplasare şi rutare RSlatch.ncd. Acest fişier este produs de comanda lansată din me-
niul Generate Programming file.
Înainte de instalarea sa în memoria EEPROM acest fişier trebuie adaptat la tipul şi varianta de
execuţie a dispozitivului ţintă FPGA (Fig. 4.3.26).
Instrumentul software inclus în ISE Design Suite pentru dialogul cu sistemul FPGA ţintă este
iMPACT (Fig. 4.3.27). iMPACT este activat din meniul Create PROM File (PROM File Format-
ter) şi are ca produs final fişierul RSlatch.ipf.
Fig. 4.3.27. Crearea fişierului PROM cu iMPACT
Fig. 4.3.28. Traseul proiectului RSlatch până la etapa finală, de implementare pe placă
În tabelul următor sunt centralizate principalele faze ale dezvoltării unui proiect (RSlatch) şi fişi-
erele asociate.

Faza proiectului Fişier asociat


Sinteza RSlatch.prj
Translaţia RSlatch.bld
Maparea RSlatch_map.ncd, RSlatch.ngd, RSlatch.pcf
Amplasare şi rutare RSlatch_map.ncd, RSlatch.ncd, RSlatch.pcf
Post Place and Route Static Timing Report RSlatch.ncd
Generarea bitstream-ului RSlatch.bit, RSlatch.ipf

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;

-----------------------------------

architecture behv1 of Driver is


begin

process(x)
begin
-- compare to truth table
if (x='1') then
F <= '1';
else
F <= '0';
end if;
end process;

end behv1;

architecture behv2 of Driver is


begin

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

Fig. 4.5.1. Testarea driverului prin simulare

4.5.2. Poartă SAU_EXCUSIV (XOR)

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;

--------------------------------------

architecture behv1 of XOR_ent is


begin

process(x, y)
begin
-- compare to truth table
if (x/=y) then
F <= '1';
else
F <= '0';
end if;
end process;

end behv1;

architecture behv2 of XOR_ent is


begin

F <= x xor y;
end behv2;

--------------------------------------

Fig. 4.5.2. Testarea porţii XOR prin simulare


4.5.3. Circuit combinaţional generic

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

library ieee; -- component #1


use ieee.std_logic_1164.all;

entity OR_GATE is
port( X: in std_logic;
Y: in std_logic;
F2: out std_logic
);
end OR_GATE;

architecture behv of OR_GATE is


begin
process(X,Y)
begin
F2 <= X or Y; -- behavior des.
end process;
end behv;

-------------------------------------------------------------

library ieee; -- component #2


use ieee.std_logic_1164.all;

entity AND_GATE is
port( A: in std_logic;
B: in std_logic;
F1: out std_logic
);
end AND_GATE;

architecture behv of AND_GATE is


begin
process(A,B)
begin
F1 <= A and B; -- behavior des.
end process;
end behv;

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

architecture struct of comb_ckt is

component AND_GATE is -- as entity of AND_GATE


port( A: in std_logic;
B: in std_logic;
F1: out std_logic
);
end component;

component OR_GATE is -- as entity of OR_GATE


port( X: in std_logic;
Y: in std_logic;
F2: out std_logic
);
end component;

signal wire: std_logic; -- signal just like wire

begin

-- use sign "=>" to clarify the pin mapping

Gate1: AND_GATE port map (A=>input1, B=>input2, F1=>wire);


Gate2: OR_GATE port map (X=>wire, Y=>input3, F2=>output);

end struct;

----------------------------------------------------------------

Fig. 4.5.3. Descrierea structurii circuitului combinaţional


Codul test bench este următorul:

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

entity CKT_TB is -- empty entity


end CKT_TB;

-------------------------------------------------------------------

architecture TB of CKT_TB is

-- declare the whole circuit(entity of comb_ckt.vhd) as a component

component comb_ckt is
port( input1: in std_logic;
input2: in std_logic;
input3: in std_logic;
output: out std_logic
);
end component;

-- declare all I/O ports from unit under test as signals.


-- signals are usually declared within architecture

signal T_input1, T_input2, T_input3, T_output: std_logic;

begin

U_UT: comb_ckt port map (T_input1,T_input2,T_input3,T_output);

process

variable err_cnt: integer := 0;

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;

-- summary of all the tests to see if any errors

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;

wait; -- stop running

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

Fig. 4.5.5. Testarea modelului structural combinaţional

4.5.4. Multiplexor 4:1

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;

-------------------------------------------------

architecture behv1 of Mux is


begin
process(I3,I2,I1,I0,S)
begin

-- use case statement


case S is
when "00" => O <= I0;
when "01" => O <= I1;
when "10" => O <= I2;
when "11" => O <= I3;
when others => O <= "ZZZ";
end case;

end process;
end behv1;

architecture behv2 of Mux is


begin

-- use when.. else statement


O <= I0 when S="00" else
I1 when S="01" else
I2 when S="10" else
I3 when S="11" else
"ZZZ";

end behv2;
--------------------------------------------------

Codul test bench este următorul:


---------------------------------------------------------------
-- Test Bench for Multiplexer (ESD figure 2.5)
-- four operations are tested in this example.
---------------------------------------------------------------

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;

entity Mux_TB is -- empty entity


end Mux_TB;
---------------------------------------------------------------

architecture TB of Mux_TB is

-- initialize the declared signals


signal T_I3: std_logic_vector(2 downto 0):="000";
signal T_I2: std_logic_vector(2 downto 0):="000";
signal T_I1: std_logic_vector(2 downto 0):="000";
signal T_I0: std_logic_vector(2 downto 0):="000";
signal T_O: std_logic_vector(2 downto 0);
signal T_S: std_logic_vector(1 downto 0);

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

variable err_cnt: integer :=0;

begin

T_I3 <= "001"; -- I0-I3 are different signals


T_I2 <= "010";
T_I1 <= "101";
T_I0 <= "111";

-- case select eqaul "00"


wait for 10 ns;
T_S <= "00";
wait for 1 ns;
assert (T_O="111") report "Error Case 0" severity error;
if (T_O/="111") then
err_cnt := err_cnt+1;
end if;

-- case select equal "01"


wait for 10 ns;
T_S <= "01";
wait for 1 ns;
assert (T_O="101") report "Error Case 1" severity error;
if (T_O/="101") then
err_cnt := err_cnt+1;
end if;

-- case select equal "10"


wait for 10 ns;
T_S <= "10";
wait for 1 ns;
assert (T_O="010") report "Error Case 2" severity error;
if (T_O/="010") then
err_cnt := err_cnt+1;
end if;

-- case select equal "11"


wait for 10 ns;
T_S <= "11";
wait for 1 ns;
assert (T_O="001") report "Error Case 3" severity error;
if (T_O/="001") then
err_cnt := err_cnt+1;
end if;

-- case equal "11"


wait for 10 ns;
T_S <= "UU";

-- summary of all the tests


if (err_cnt=0) then
assert (false)
report "Testbench of Mux completed sucessfully!"
severity note;
else
assert (true)
report "Something wrong, try again!"
severity error;
end if;

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

Fig. 4.5.7. Modelul structural


Fig. 4.5.8. Testarea modelului structural

4.5.5. Bistabil J-K

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;

-----------------------------------------------

architecture behv of JK_FF is

-- define the useful signals here

signal state: std_logic;


signal input: std_logic_vector(1 downto 0);
begin

-- combine inputs into vector


input <= J & K;

p: process(clock, reset) is
begin

if (reset='1') then
state <= '0';
elsif (rising_edge(clock)) then

-- compare to the truth table


case (input) is
when "11" =>
state <= not state;
when "10" =>
state <= '1';
when "01" =>
state <= '0';
when others =>
null;
end case;
end if;

end process;

-- concurrent statements
Q <= state;
Qbar <= not state;

end behv;

-------------------------------------------------

Test bench-ul bistabilului J-K este următorul:


---------------------------------------------------------------------
-- Test Bench for JK flip-flop (ESD 2.3.1)
-- we use another process to offer the concurrent clock signal
---------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;

entity jkff_TB is -- entity declaration


end jkff_TB;

---------------------------------------------------------------------

architecture TB of jkff_TB is

signal T_J, T_K: std_logic;


signal T_clock: std_logic;
signal T_reset: std_logic;
signal T_Q, T_Qbar: std_logic;

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

-- concurrent process to offer clock signal


process
begin
T_clock <= '0';
wait for 5 ns;
T_clock <= '1';
wait for 5 ns;
end process;

process

variable err_cnt: integer := 0;

begin

T_reset <= '1';


wait for 25 ns;

T_reset <= '0';


wait for 10 ns;

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

Fig. 4.5.9. Testarea modelului funcţional al bistabilului K-K


Descrierea structurală a bistabilului 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_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

port( clock, J, K, reset : in std_logic; Q, Qbar : out std_logic);

end JK_FF;

architecture SYN of JK_FF is

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;

signal n45 : std_logic;

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;

Fig. 4.5.10. Testarea modelului structural al bistabilului K-K


4.5.6. Numărător binar

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

generic(n: natural :=2);


port( clock: in std_logic;
clear: in std_logic;
count: in std_logic;
Q: out std_logic_vector(n-1 downto 0)
);
end counter;
----------------------------------------------------
architecture behv of counter is

signal Pre_Q: std_logic_vector(n-1 downto 0);

begin

-- behavior describe the counter

process(clock, count, clear)


begin
if clear = '1' then
Pre_Q <= Pre_Q - Pre_Q;
elsif (clock='1' and clock'event) then
if count = '1' then
Pre_Q <= Pre_Q + 1;
end if;
end if;
end process;

-- concurrent assignment statement


Q <= Pre_Q;
end behv;
-----------------------------------------------------
bench-ul numărătorului este următorul.
-----------------------------------------------------------------------
-- Test Bench for counter
-----------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity counter_TB is -- entity declaration


end counter_TB;
-----------------------------------------------------------------------

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;

signal T_clock: std_logic;


signal T_clear: std_logic;
signal T_count: std_logic;
signal T_Q: std_logic_vector(1 downto 0);
begin

U_counter: counter port map (T_clock, T_clear, T_count, T_Q);

process
begin
T_clock <= '0'; -- clock cycle is 10 ns
wait for 5 ns;
T_clock <= '1';
wait for 5 ns;
end process;

process

variable err_cnt: integer :=0;

begin
T_clear <= '1'; -- start counting
T_count <= '1';
wait for 20 ns;

T_clear <= '0'; -- clear output

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

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

generic( n : Integer := 2);


port( clock, clear, count : in std_logic; Q : out std_logic_vector (1
downto 0));

end counter;

architecture SYN of counter is

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

U31 : IV port map( A => clear, Z => n150);


U32 : EO port map( A => Q_0_port, B => count, Z => n152);
U33 : EO port map( A => n149, B => net9, Z => n151);
U34 : ND2 port map( A => count, B => Q_0_port, Z => n149);
Pre_Q_regx1x : FD2 port map( D => n151, CP => clock, CD => n150, Q =>
Q_1_port, QN => net9);
Pre_Q_regx0x : FD2 port map( D => n152, CP => clock, CD => n150, Q =>
Q_0_port, QN => n153);

end SYN;

Fig. 4.5.12. Schema corespunzătoare modelului structural al numărătorului


Din exemplele de mai sus se observă utilitatea bibliotecilor de tip share, prin apelarea cărora pro-
iectarea noilor circuite este uşurată substanţial. Biblioteca IEEE.std_logic_1164.all a fost deja
prezentată pe scurt în §4.5.1. Iată şi alte câteva dintre bibliotecile utilizate frecvent.
► IEEE.std_logic_arith.all
Acest standard include definirea unor operaţii aritmetice de uz general, cele mai uzuale fiind:
- operaţiile de schimbare de semn: Abs şi -;
- operatorii aritmetici: +, -, *, /, rem, mod;
- operatori de comparaţie: >, <, <=, >=, =, /=;
- deplasări şi rotaţii: SHIFT_LEFT, SHIFT_RIGHT, ROTATE_LEFT, ROTATE_RIGHT, sll,
srl, rol, ror;
- funcţia de redimensionare: RESIZE(v,n)
- funcţii de conversie: TO_INTEGER, TO_UNSIGNED, TO_SIGNED;
- operatori logici: not, and, or, nand, nor, xor, xnor;
- funcţia de comparare: STD_MATCH;
- funcţia de translaţie specială: TO_01.

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.

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