+ All Categories
Home > Documents > Indrumator Circ Intel_5 (1)

Indrumator Circ Intel_5 (1)

Date post: 24-Jul-2015
Category:
Upload: joe-mrjoe
View: 223 times
Download: 3 times
Share this document with a friend
84
Universitatea Aurel Vlaicudin Arad Facultatea de Inginerie Conf. dr. ing. Marius M. LAŞ Îndrumător pentru dezvoltarea circuitelor inteligente - FPGA - pentru uzul studenţilor - 2011
Transcript
Page 1: Indrumator Circ Intel_5 (1)

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

Page 2: Indrumator Circ Intel_5 (1)

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

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.

ELECTRONICA INFORMATICA

MECANICA

CHIMIA

OPTICA

Page 3: Indrumator Circ Intel_5 (1)

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

Page 4: Indrumator Circ Intel_5 (1)

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-

Page 5: Indrumator Circ Intel_5 (1)

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.

Page 6: Indrumator Circ Intel_5 (1)

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

Page 7: Indrumator Circ Intel_5 (1)

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

Page 8: Indrumator Circ Intel_5 (1)

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.

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

Canal de

rutare

Pad

I/O

CLB

Page 9: Indrumator Circ Intel_5 (1)

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.

Page 10: Indrumator Circ Intel_5 (1)

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.

Fig. 2.7. Topologia unui bloc de conexiuni

Canal de

rutare

Conector programabil

CLB Bloc de conexiune Canal de rutare

Page 11: Indrumator Circ Intel_5 (1)

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

Page 12: Indrumator Circ Intel_5 (1)

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]

Page 13: Indrumator Circ Intel_5 (1)

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.

Page 14: Indrumator Circ Intel_5 (1)

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.

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.

Citire/scriere

Date

Comandă confugurare

Page 15: Indrumator Circ Intel_5 (1)

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

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

Bloc defect

Page 16: Indrumator Circ Intel_5 (1)

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

Page 17: Indrumator Circ Intel_5 (1)

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.

Rezultat

Page 18: Indrumator Circ Intel_5 (1)

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

Page 19: Indrumator Circ Intel_5 (1)

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.

Page 20: Indrumator Circ Intel_5 (1)

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.

Page 21: Indrumator Circ Intel_5 (1)

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.

Page 22: Indrumator Circ Intel_5 (1)

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.

Page 23: Indrumator Circ Intel_5 (1)

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.

Page 24: Indrumator Circ Intel_5 (1)

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

Page 25: Indrumator Circ Intel_5 (1)

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.

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 ;

f <= (a OR b) AND c

a

b

c

f

Page 26: Indrumator Circ Intel_5 (1)

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 ;

d

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.

a

b

c f

g1

g2

Page 27: Indrumator Circ Intel_5 (1)

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

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.

HLS VIN VOUT

Rezervor LLS H TC TH

Regulator

A

Alarma

Page 28: Indrumator Circ Intel_5 (1)

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;

Page 29: Indrumator Circ Intel_5 (1)

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;

Page 30: Indrumator Circ Intel_5 (1)

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;

Page 31: Indrumator Circ Intel_5 (1)

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

Denumire

Porţi

Celule

logice

echiva-

lente

CLB-uri Multi-

plica-

toare

DCM

I/O

utili-

zator

I/O

perechi

diferen-

ţiale

Rân-

duri

Coloa

-ne

CLB

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.

Page 32: Indrumator Circ Intel_5 (1)

Fig. 4.1. Placa Spartan 3 FPGA

Elementele sale sunt:

1. Conector VGA (HD-15)

2. Conector de 9 pini (DB-9)

3. Conector de alimentare

4. Extensie A1

5. Extensie A2

6. Extensie B1

7. Port PS2

8. Display cu 7 segmente LED

9. Comutatoare (8)

10. Butoane (4)

11. LED-uri (8)

12. LED de putere

13. Circuitul Spartan 3 FPGA

14. LED program (indică existenţa programului

15. Portul JTAG (utilizat pentru programare)

Page 33: Indrumator Circ Intel_5 (1)

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

Denumire

Porţi

Celule

logice

echiva-

lente

CLB-uri Multi-

plica-

toare

DCM

I/O

utili-

zator

I/O

perechi

diferen-

ţiale

Rân-

duri

Co-

loa-

ne

CLB

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.

Page 34: Indrumator Circ Intel_5 (1)

Fig

. 4.3

.1.

Nav

igat

oru

l IS

E (

Pro

ject

Nav

igat

or)

Page 35: Indrumator Circ Intel_5 (1)

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)

Page 36: Indrumator Circ Intel_5 (1)

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

Page 37: Indrumator Circ Intel_5 (1)

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

Page 38: Indrumator Circ Intel_5 (1)

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

Page 39: Indrumator Circ Intel_5 (1)

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

Page 40: Indrumator Circ Intel_5 (1)

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

Page 41: Indrumator Circ Intel_5 (1)

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;

Page 42: Indrumator Circ Intel_5 (1)

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

Page 43: Indrumator Circ Intel_5 (1)

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.

Page 44: Indrumator Circ Intel_5 (1)

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.

Page 45: Indrumator Circ Intel_5 (1)

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

Page 46: Indrumator Circ Intel_5 (1)

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.

Page 47: Indrumator Circ Intel_5 (1)

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

Page 48: Indrumator Circ Intel_5 (1)

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.

Page 49: Indrumator Circ Intel_5 (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].

Page 50: Indrumator Circ Intel_5 (1)

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

Page 51: Indrumator Circ Intel_5 (1)

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

Page 52: Indrumator Circ Intel_5 (1)

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)

Page 53: Indrumator Circ Intel_5 (1)

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

Page 54: Indrumator Circ Intel_5 (1)

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

Page 55: Indrumator Circ Intel_5 (1)

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

Page 56: Indrumator Circ Intel_5 (1)

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.

Page 57: Indrumator Circ Intel_5 (1)

Fig. 4.3.27. Crearea fişierului PROM cu iMPACT

Page 58: Indrumator Circ Intel_5 (1)

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.

Page 59: Indrumator Circ Intel_5 (1)

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

Page 60: Indrumator Circ Intel_5 (1)

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.

Page 61: Indrumator Circ Intel_5 (1)

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;

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

Page 62: Indrumator Circ Intel_5 (1)

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;

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

Page 63: Indrumator Circ Intel_5 (1)

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

Page 64: Indrumator Circ Intel_5 (1)

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;

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

Page 65: Indrumator Circ Intel_5 (1)

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

Page 66: Indrumator Circ Intel_5 (1)

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;

Page 67: Indrumator Circ Intel_5 (1)

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

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

Page 68: Indrumator Circ Intel_5 (1)

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;

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

Page 69: Indrumator Circ Intel_5 (1)

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;

Page 70: Indrumator Circ Intel_5 (1)

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

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"

Page 71: Indrumator Circ Intel_5 (1)

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;

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

Page 72: Indrumator Circ Intel_5 (1)

Fig. 4.5.6. Testarea modelului funcţional al multiplexorului

Fig. 4.5.7. Modelul structural

Page 73: Indrumator Circ Intel_5 (1)

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

Page 74: Indrumator Circ Intel_5 (1)

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;

Page 75: Indrumator Circ Intel_5 (1)

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;

Page 76: Indrumator Circ Intel_5 (1)

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

Page 77: Indrumator Circ Intel_5 (1)

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

Page 78: Indrumator Circ Intel_5 (1)

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;

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

Page 79: Indrumator Circ Intel_5 (1)

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

Page 80: Indrumator Circ Intel_5 (1)

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;

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

Page 81: Indrumator Circ Intel_5 (1)

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

Page 82: Indrumator Circ Intel_5 (1)

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.

Page 83: Indrumator Circ Intel_5 (1)

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

Page 84: Indrumator Circ Intel_5 (1)

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.


Recommended