Sunteți pe pagina 1din 28

Capitolul 3 3 INTRODUCERE N LIMBAJUL DE DESCRIERE HARDWARE VHDL

3.1 Generaliti
Acest limbaj a fost dezvoltat la mijlocul anilor 80 de ctre departamentul de aprare al Statelor Unite n colaborare cu IEEE (Institute of Electrical and Electronical Enginner). Abrevierea VHDL deriv din VHSIC Hardware Description Language (limbajul de descriere hard VHSIC), abrevierea VHSIC nsemnnd la rndul ei Very High Speed Integrated Circuit. n continuare sunt enumerate cteva din caracteristicile limbajului: - proiectele pot fi descompuse ierarhic; - fiecare element al proiectului are o interfa bine definit (pentru a se asigura conectivitatea cu celelalte elemente ale proiectului) i specificaii comportamentale precise (pentru a putea fi simulat); - specificaiile comportamentale pot fi exprimate sub form de algoritm sau ca i structur hard, aceasta pentru ca funcionarea elementului s fie bine definit; - prin intermediul limbajului VHDL pot fi modelate noiunile de concuren, timing i sincronizare a semnalelor, se permite astfel modelarea circuitelor att sincrone ct i asincrone; - proiectul modelat n VHDL poate fi simulat funcional (dac funcioneaz corect d.p.d.v. logic) ct i din punctul de vedere al comportrii n timp (ntrzierile). Popularitatea i mai ales utilitatea limbajului VHDL a crescut mai ales din momentul din care s-au dezvoltat i un set de unelte pentru sintez (synthesis tools). Acest set de programe poate crea structuri de circuite logice direct din descrierile VHDL comportamentale. Folosind limbajul VHDL pot fi proiectate, simulate i sintetizate att circuitele combinaionale simple ct i sisteme complexe cu microprocesor. Limbajul VHDL a fost standardizat pentru prima dat de IEEE n 1987 (VHDL87) i a fost extins n 1993 (VHDL-93).

3.2 Design Flow


nainte de a studia limbajul n sine este util s studiem puin mediul n care este integrat. ntr-un proiect care are la baz descrierea VHDL a circuitului exist civa pai care trebuie urmai, acetia sunt denumii adesea design flow. Aceti pai sunt evideniai n figura 3.1.

Introducere n limbajul de descriere hardware VHDL

3.1 Fazele urmate pentru descrierea i sintetizarea circuitelor n VHDL

Etapa iniial (de descriere) ncepe prin stabilirea blocurilor funcionale la nivel de diagrame bloc. Proiectele complexe sunt de obicei ierarhizate, VHDL-ul este un mediu care permite definirea modulelor i a interfeelor corespunztoare, urmnd ca detaliile funcionale s fie adugate ulterior. Pasul urmtor const n scrierea codului VHDL pentru fiecare modul . Orice editor text poate fi folosit pentru descrierea modulelor deoarece VHDL este un limbaj bazat pe text. Totui mediile de proiectare includ editoare de text specializate pentru VHDL, editoare care uureaz mult sarcina proiectanilor prin facilitile pe care le ofer: evideniere automat a cuvintelor cheie, tipare cu structurile de program cel mai frecvent folosite, verificare automat a sintaxei codului VHDL i accesarea rapid a compilatorului. Odat scris codul trebuie compilat, aceast operaie este efectuat de un compilator VHDL care va analiza codul att din punctul de vedere al erorilor de sintax ci i din punctul de vedere al compatibilitii modulului cu alte module la care se refer. De asemenea prin compilare sunt create informaii interne care sunt necesare simulatorului pentru analiza ulterioar a proiectului. n simularea proiectului descris n cod VHDL se apeleaz la un simulator de obicei integrat n mediul de proiectare. Un astfel de simulator permite utilizatorului s aplice semnale de intrare circuitului proiectat i s observe comportarea circuitului analiznd semnalele de ieire. n proiecte de anvergur mic semnalele de intrare se pot aplica manual iar cele de ieire pot fi studiate fiecare n parte. Dar pentru proiecte mai mari aceasta poate devenii o sarcin foarte anevoioas astfel c VHDL-ul ofer posibilitatea de a crea aa numitele test-bench-uri care permit generarea automat a semnalelor de intrare i compararea semnalelor de ieire cu semnalele de ieire ateptate. Etapa de simulare este cuprins ntr-o etap mai larg de verificare. Astfel exist dou moduri de a verifica un proiect, primul este verificarea funcional, cnd circuitul este studiat din punct de vedere al funcionrii logice, ntrzierile i parametrii fiind considerai nuli. Cel de al doilea mod de verificare, este cel n care se studiaz comportarea circuitului inndu-se cont de ntrzierile estimate, cum ar fi ntrzieri de setup i hold time n cazul bistabilelor sau ntrzierilor prin pori n cazul circuitelor combinaionale. Este o practic bun ca cele dou tipuri de verificri s fie fcute cu atenie n aceast etap pentru a evita aa numita faz final (vezi figura 27

Capitolul 3

3.1), totui mai pot aprea surprize deoarece ntrzierile dintr-un circuit sunt foarte dependente de rezultatele sintezei i al asamblrii (fitting stage) proiectului pentru un anumit tip de circuit programabil. Dup verificare suntem pregtii s trecem la etapa final. Primul pas n aceast faz este sinteza (synthesis) codului VHDL, care const n convertirea codului ntr-un set de primitive sau componente care pot fi asamblate n tehnologia ctre care este orientat proiectul (FPGA sau CPLD). Pentru PLD-uri sau CPLD-uri sculele de sintez trebuie s genereze dou nivele de ecuaii SOP (Sum-of-Product = suma produselor). n cazul circuitelor ASIC este generat o list de pori i un netlist care specific modul n care aceste pori sun interconectate. Proiectantul poate s ajute sculele de sintez prin specificarea unor constrngeri specifice tehnologiei, cum ar fi numr de nivele logice sau puterea bufferelor logice. n etapa de asamblare (fitting) este folosit un program (fitter) pentru plasarea (mapping stage) primitivelor sau a componentelor sintetizate n spaiul oferit de circuitul programabil. n cazul CPLD-urilor aceasta const n atribuirea ecuaiilor elementelor AND-OR disponibile. Pentru un ASIC acest proces const n ntocmirea unei hri de pori logice i gsirea unei modaliti de plasare a acesteia n cipul fizic, iar procesul este numit place-and-route. n aceast etap se mai pot exercita cteva constrngeri asupra proiectului cum ar fi plasarea anumitor module n chip sau atribuirea de pini intrrilor i ieirilor externe. Faza final este cea de verificarea ntrzierilor (timing verification). Abia n aceast faz apar ntrzierile reale din circuit, ntrzieri datorate lungimi traseelor, ncrcrilor electrice i a altor factori. La fel ca n decursul oricrui proces de proiectare este posibil s avansezi doi pai nainte si apoi s revi un pas napoi sau chiar mai ru. Dup cum se poate observa i n figura 3.1 fiecare etap ofer posibilitatea de a revenii asupra soluiilor. Problema cea mai nedorit este acea de a fi obligat s revii din faza final , de exemplu cnd un proiect sintetizat ocup mai mult spaiu dect cel oferit de circuitul FPGA sau CPLD folosit. n aceste cazuri trebuie revenit asupra proiectului i trebuie regndit, aceasta demonstreaz c orict de performante ar fi uneltele folosite pentru sintez i implementare acestea nu pot substitui gndirea proiectantului.

3.3 Structura unui cod VHDL


VHDL a fost proiectat ca i program structurat, mprumutndu-se unele idei de la limbajele de programare soft Pascal i Ada. O idee de baz este acea de a definii o interfa a modulului hard n timp ce detaliile interne sunt ascunse. Astfel o entitate (entity) VHDL este o simpl declarare a intrrilor i ieirilor modulului n timp ce arhitectura (architecture) VHDL este o descriere structural sau comportamental detailat a funcionrii modulului. Figura 3.2(a) ilustreaz acest concept. Acest concept formeaz bazele proiectrii ierarhice a sistemelor, i anume arhitectura entitii de la nivelul cel mai superior poate conine (instantiate) alte entiti ale cror arhitecturi sunt invizibile de la nivelele superioare. Dup cum se poate observa n figura 3.2(b) o arhitectur de la nivel superior poate folosii entiti de la nivelul inferior de mai multe ori, iar mai multe arhitecturi de la nivel superior pot folosii aceeai entitate de la nivel inferior fiecare la rndul ei. 28

Introducere n limbajul de descriere hardware VHDL

Figura 3.3.a) Conceptul entitate-arhitectur; b)Conceptul de ierarhie

n fiierul text al unui fiier VHDL declararea entitii i definirea arhitecturii se face separat, vezi figura 3.3. n tabelul T3.1 este prezenta un program VHDL simplu care descrie funcionarea porii I (AND) cu o intrare inhibat cunoscut i sub denumirea de poart BUT-NOT.
Tabelul T3.1 Program VHDL pentru poarta BUT-NOT

Figura 3.3 Structura unui fiier VHDL

n proiecte mai complexe este posibil ca entitile i arhitecturile s fie definite n fiiere separate pe care compilatorul le va potrivii n funcie de numele declarate. VHDL-ul ignor spaiile i liniile despritoare, acestea putnd fi folosite pentru a face 29

Capitolul 3

codul mai uor de citit, pentru a comenta o linie de program se folosete simbolizarea prin dou linii succesive (--), dup care se introduce linia de comentariu. n VHDL sunt definite iruri de caractere speciale care sunt denumite i cuvinte cheie (keywords) sau cuvinte dedicate. n exemplu din tabelul T3.1 aceste cuvinte cheie sunt: entity, port, is, in ,out, end, architecture, begin, when, else i and. Codul VHDL mai conine i aa numiii identificatori (Identifires): Inhibit, X,Y, BIT, Z, i Inhibit_arch, aceste litere sau iruri de litere, trebuie s nceap i s se sfreasc cu o liter, dar pot s conin i numere sau linii de picior(?) i sunt definite de programator. Cuvintele cheie i identificatorii pot fi scrii cu att cu majuscule ct i cu litere mici, nu sunt case sensitive. Sintaxa pentru declararea entitii este prezentat n tabelul T3.3.
Tabelul T3.2 Sintaxa VHDL pentru declararea entitii

entity entity-name is port (signal-names : mode signal-type; signal-names : mode signal-type; signal-names : mode signal-type); end entity-name;

Pe lng cuvintele cheie n codul VHDL mai apar urmtoarele elemente: - entity-name = un nume selectat de utilizator pentru a denumi entitatea; - signal-names = o list de unul sau mai muli identificatori selectai de utilizator, separai prin virgul care denumesc semnalele externe; - mode = unul din urmtoarele patru cuvinte rezervate, specificnd direcia semnalului: o in pentru semnal de intrare n entitate; o out pentru semnal de ieire din entitate, cu meniunea c, valoarea semnalului nu poate fi citit nuntrul entitii, ci numai de alte entiti care-l folosesc; o buffer definete un semnal de ieire din entitate, iar valoare lui poate fi citit i n interiorul arhitecturii din entitate; o inout definete un semnal de intrare/ieire din entitate, acest se folosete frecvent pentru a descrie pini three-state. A se observa c dup ultimul semnal definit nu se mai pune punct i virgul. n tabelul T3.3 este prezentat sintaxa pentru declararea arhitecturii. Numele entitii (entity-name) trebuie s fie acelai cu cel folosit la definirea entitii. Numele arhitecturii (architecture-name) este un identificator definit de utilizator, dac se dorete poate fi la fel cu cel al entitii sau diferit. Semnalele externe ale arhitecturii sunt cele motenite de la entitate, de asemenea se pot definii i semnale interne (signal declaration), dar care vor aciona doar local n arhitectur. Declaraiile

30

Introducere n limbajul de descriere hardware VHDL

enumerate n tabelul T3.3 pot aprea n orice ordine. Sintaxa pentru definirea unui semnal este urmtoarea:
signal signal-name: signal-type;
Tabelul T3.3 Sintaxa VHDL pentru declararea arhitecturii

n cadrul unei arhitecturii se pot definii unul sau mai multe semnale interne, iar acestea n cadrul unei diagrame logice au ca i corespondent traseele. Semnalele pot fi att scrise ct i citite n cadrul arhitecturii. n limbajul VHDL variabilele (variables) sunt identice semnalelor doar c ele nu au corespondent fizic ntr-un circuit. n tabelul T3.3 ele nu apar deoarece ele se definesc la nivel mult mai jos n cadrul funciilor, procedurilor i al proceselor, dup cum vom vedea mai trziu. Declararea variabilelor se face identic cu cea a semnalelor:
variable variable-name: variable-type;

3.4 Tipuri i constante


Toate semnalele, variabilele i constantele dintr-un program VHDL trebuie s aib asociat un tip (type). n cadrul tipului se specific un set de valori pe care le poate lua obiectul (semnal, variabil ) i de asemenea exist i un set de operatori (+, AND etc)asociai tipului respectiv. Limbajul VHDL are doar cteva tipuri predefinite, vezi tabelul T3.3.
Tabellu T3.4 Tipuri predefinite n VHDL

Tipurile bit i bit-vector sunt destul de puin folosite, n schimb versiunile definite de utilizator ale tipului respectiv sunt mult mai folositoare dup cum vom vedea mai departe. Tipul integer (ntreg) cuprinde domeniul numerelor ntregi incluznd domeniul (3.147483.647 , + 3.147483.647) adic (2 31 , +231-1). Tipul boolean are 31

Capitolul 3

dou valori true i false. Tipul character (caracter) include toate caracterele din setul de caractere ISO* (International Organization of Standardization) exprimate pe 8 bii, primele 128 fiind caractere ASCII. n tabelul T3.5 sunt prezentai operatorii specifici tipurilor integer i boolean.
Tabelul T3.5 Operatori predefinii specifici tipurilor integer i boolean

+ * / mod rem abs **

Operatori (operanzi ntregi) adunare scdere nmulire mprire mprire modulo mprire modulo cu rest valoare absolut ridicare la putere

and or nand nor xor xnor not

Operatori (operanzi logici) I SAU I-NU SAU-NU SAU-EXCLUSIV SAU-EXCLUSIV-NOT complementare

Cele mai folosite tipuri n programele VHDL sunt aa numitele tipuri definite de utilizator (user defined types), unul dintre acestea este tipul enumerare (enumerated type) definit printr-o niruire de valori. Declararea tipului enumerare se face conform tabelului T3.6.
Tabelul T3.6 Sintaxa VHDL pentru declararea tipului i a constantelor

Value-list (lista de valori) reprezint niruirea (enumerarea) tuturor elementelor posibile pentru respectivul tip, separate prin virgul. Valorile enumerate pot fi att caractere ct i identificatori definii de utilizator. Un tip foarte important este std_logic, vezi tabelul T3.7, care este un tip standard definit de utilizator (standard user defined logic type) i este parte a package-ului standard IEEE 1164 pe care l vom trata ulterior. Acest tip include pe lng valorile logice 0 i 1 alte apte valori care i gsesc utilitate n simularea unui semnal logic dintr-un circuit real. Dup cum se poate observa n tabelul T3.6 limbajul VHDL permite definirea de subtip (subtype) corespunztor unui tip. Valorile unui subtip trebuie s ntr-un domeniu continu fa de valorile tipului de baz. Pentru tipul enumerare, continu se refer la poziia valorilor din lista valorilor corespunztoare tipului de baz. A se

"ISO" este un cuvnt derivat din cuvntul grecesc isos, care nseamn egal i este rdcina prefixului iso- care este folosit n termeni ca: izometric (se spune despre entiti care au dimensiuni egale), izonomie (egalitate a legilor sau a oamenilor n faa legii), etc.

32

Introducere n limbajul de descriere hardware VHDL

observa c ordinea elementelor dintr-un ir trebuie specificat n ordin cresctoare sau descresctoare (to sau downto).
Tabelul T3.7 Valori definite n cadrul tipului std_logic

n orice limbaj constantele contribuie la lizibilitatea, mentenabilitatea, i portabilitatea unui program. Sintaxa VHDL pentru declararea constantelor este prezentat n tabelul T3.6, pentru o mai bun nelegere n continuare se prezint i cteva exemple. constant BUS_SIZE: integer :=32; -- reprezint lime componentei constant MSB: integer := BUS_SIZE-1; -- numrul de bii ai lui MSB constant Z: character := Z; -- sinonim valorii de nalt impedan Se observ c valoarea unei constante poate fi chiar i o expresie. O alt categorie foarte important de tip definit de utilizator este tipul matrice (array type). Acest tip definete o matrice ca fiind un set de elemente de acelai n care fiecare element este selectat printr-un index de matrice (array index) n tabelul T3.8 sunt prezentate cteva versiuni de sintax folosite n declararea unei arii.
Tabelul 3.8 Sintaxa VHDL pentru declararea unei arii

n primele dou exemple start i end sunt definii de tipul integer i stabilesc numrul total de elemente al ariei. n ultimele trei exemple toate valorile unui tip existent sau numai un subset de valori vor fi cuprinse de arie. Exemple de matrici sunt date n tabelul T3.9.

33

Capitolul 3

Tabelul T3.9 Exemple de declaraii de arii

Unul dintre exemplele mai interesante este cel n care o constant WORD_LEN este folosit n cadrul declaraiei de arie, exemplificnd astfel c valoarea domeniului poate fi dat de o expresie. Cel de al treilea exemplu i mai interesant ne art c un element al ariei poate fi la rndul lui o arie, aceasta rezultnd ntr-o matrice bidimensional. Se consider implicit c elementele unei matrici sunt ordonate de la stnga la dreapta la fel ca i domeniul index, astfel cel mai din stnga element al ariilor mountly_count, word,reg_file este 1, 31, 1. Dac se dorete accesarea unui singur element din matrice se va folosii numele matrice iar n paranteze indexul elementului, exemplu mountly_count(11) aceasta pentru a accesa cel de al 11-lea element al ariei mountly_count. O matrice literal se definete (array literals) prin niruirea ntre paranteze a valorilor elementelor. Elementele variabilei B de tipul byte pot primii toate valoarea 1 logic scriind o expresie de forma:
B := (1, 1, 1, 1, 1, 1, 1, 1);

Limbajul VHDL permite de asemenea notaii mai scurte, de exemplu pentru a atribui valoarea 0 logic tuturor biilor variabilei W de tip word, mai puin biilor cei mai puini semnificativi corespunztori fiecrui byte se va scrie expresia:
W := (0=>1, 8=>1, 16=>1, 24=>1, others=>0);

Expresiile anterioare pot fi rescrise folosind irurile de caractere, dup cum urmeaz:
B := 11111111; W:= 11111110111111101111111011111110;

Este posibil de asemenea s se fac referire la un subset de valori (slice) dintr-o matrice, specificnd nceputul i sfritul indicilor elementelor din subset, exemple cu referire la tipurile din tabelul T3.9: M(6 to 9), B(3 downto 0), W(15 downto 8) etc. 34

Introducere n limbajul de descriere hardware VHDL

Folosind operatorul concatenare & (concatenation operator) se pot altura elementele unei matrici n ordinea n care sunt scrise, de la stnga la dreapta., de exemplu prin concatenarea 0 & 1 & 1Z se obine 011Z. Cel mai important tip de matrice des ntlnit n programele VHDL este cel aparinnd standardului logic definit de utilizator IEEE 1164 (std_logic_vector), definiia acestui standard este:
type STD_LOGIC_VECTOR is array (natural range < > ) of STD_LOGIC

3.5 Funcii i proceduri


La fel ca i n alte limbaje de nivel nalt i n VHDL o funcie accept un anumit numr de argumente i returneaz un rezultat. Att argumentele ct i rezultatul returnat de o funcie sunt de un tip predeterminat. Sintaxa VHDL prin care se definete o funcie este prezentat n tabelul T3.10. Dup ce se d un nume funciei (function -name) se poate definii o list de parametri formali care vor fi folosii n structura funciei (signal-names : signal-types;), toi aceti parametrii trebuie s fi de acelai tip. Din tabelul T3.10 se poate observa c n cadrul unei funcii se pot definii local tipuri, constante, variabile i de asemenea funcii i proceduri imbricate (nested). ntre cuvintele cheie begin i end este cuprins o serie de instruciuni secveniale care sunt executate ori de cte ori este apelat funcia . n tabelul T3.11 este prezentat un exemplu de descriere a unei funcii n limbaj VHDL. n cadrul funciei cuvntul cheie return indic momentul din care funcia returneaz o valoare care trebuie s fie de tipul celei definite la declararea funciei.
Tabelul T3.10 Sintaxa VHDL pentru definirea unei funcii Tabelul T3.11 Program VHDL pentru descrierea funciei de interdicie (inhibit)

35

Capitolul 3

Standardul logic IEEE definete multe funcii care lucreaz cu tipurile standard std_logic i std_logic_vector, aceste funcii definesc operaiile logice i aritmetice de baz (and, or, +, - ). Facilitatea overload operators (suprancrcarea operatorilor) oferit de VHDL i permite utilizatorului s apeleze o funcie care este invocat ori de cte ori se folosete unul din operatorii cunoscui (and, or, +, etc). n VHDL pot s existe cteva definiii diferite pentru fiecare operator (overload), dar compilatorul va alege n mod automat definiia care se potrivete tipului de operanzi cu care este asociat operatorul. Un exemplu elocvent de definire a operatorului and din cadrul pachetului (package) standard IEEE definit pentru operanzi de tip std_logic este prezentat n tabelul T3.13.
Tabelul T3.12 Definirea operatorului and pentru valori de tip STD_LOGIC n cadrul package-ului IEEE 1164

Argumentele funciei (intrrile) trebuie s fie de tipul std_ulogic sau de subtipul std_logic. n cod mai este definit subtipul UX01, pentru valoarea returnat de funcie. Tipul stdlogic_table o matrice bidimensional 9 X 9 care are ca i index o pereche de valori de tipul std_ulogic. n tabelul T3.12 (and_table,) valorile sunt astfel aranjate nct atunci cnd ambii indeci (linie(L), coloan (R)), sunt 0 sau L (L= un zero logic mai slab), valoarea returnat este 0, iar cnd ambele valori ale indecilor sunt 1 sau H (H= un unu logic mai slab), valoarea returnat va fi 1, n alte cazuri apar numai valorile U sau X. Se poate observa c denumirea funciei este pus ntre ghilimele, ceea ce denot c operatorul and este suprancrcat (overload operator). Partea executabil a funciei este o simpl declaraie care returneaz elementele indexate ale funciei n funcie de valoarea celor dou intrri L i R. 36

Introducere n limbajul de descriere hardware VHDL

Datorit faptului c VHDL-ul este un limbaj puternic tipizat, adesea apare necesitatea convertiri unui semnal sau variabile dintr-un anumit tip n altul. Packageul IEEE 1164 conine cteva astfel de funcii de conversie, de exemplu din BIT n STD_LOGIC sau invers. O conversie foarte utilizat i care nu este definit, din cauz c proiecte diferite pot avea nevoie de o interpretare diferit a numerelor (ex. numere cu semn sau fr semn), este conversia din STD_LOGIC_VECTOR n integer. n tabelele 3.13 i 3.14 sunt prezentate exemple pentru conversia mai sus amintit. Funcia CONV_INTEGER din tabelul T3.13 folosete un algoritm simplu de iterare. Semnificaiile instruciunilor FOR, CASE i WHEN vor fi descrise mai pe larg ntr-o seciune care urmeaz (momentan ne bazm pe cunotinele d-voastr prealabile de programare), instruciunea null nseamn nu face nimic. Domeniul pe care se manifest instruciunea de ciclare FOR, se specific n cod prin sintaxa Xrange, n care semnul apostrof dat dup numele unui semnal specific folosirea unui atribut (attribute). n cazul nostru atributul este range care este implicit, se aplic numai ariilor i are semnificaia parcurge indexul ariei de la stnga la dreapta. Conversia n sens invers din integer n STD_LOGIC_VECTO este funcia CONV_STD_LOGIC_VECTOR i este prezentat n tabelul T3.13.
Tabelul T3.13 Funcie VHDL pentru conversia din STD_LOGIC_VECTOR n integer

n acest caz pe lng valoarea ntreag care trebuie convertit (ARG) mai trebuie specificat i pe ci bii s fie exprimat rezultatul (SIZE). Variabila (result) declarat local n funcie are o valoare a indexului dependent de valoarea intrrii (SIZE), din acest motiv valoarea atribuit acestei intrri a funciei trebuie s fie o constant sau o mrime care este recunoscut de compilator. Pentru efectuarea conversiei n funcie s-a folosit algoritmul de mpriri succesive. n limbajul VHDL mai este definit noiunea de procedur (procedure) care este similar cu funcia doar c nu returneaz o valoare. La fel cum o funcie poate fi apelat n locul unei expresii i o procedur poate fi apelat n locul unei declaraii. Dac argumentele unei proceduri sunt declarate de tipul out sau inout, va exista totui o valoare returnat.

37

Capitolul 3

Tabelul T3.14 Funcie VHDL pentru conversia din integer n STD_LOGIC_VECTOR

3.6 Biblioteci i package-uri


O bibliotec (library) VHDL este locul unde compilatorul depune toate informaiile despre un anumit proiect i anume toate fiierele intermediare folosite n analiza, simularea i sinteza proiectului. Pentru un proiect VHDL dat compilatorul creeaz i folosete n mod automat o bibliotec numit work. Un proiect complex conine de obicei mai multe fiiere, fiecare incluznd diferite uniti de proiect, cum ar fi entiti i arhitecturi. n momentul n care un compilator analizeaz fiecare fiier din proiect, el plaseaz rezultatele n biblioteca work i de asemenea din aceast bibliotec ia informaii despre alte entiti dac este cazul. Astfel un proiect mai complex va putea fi mprit n mai multe fiiere, iar compilatorul le va analiza pe fiecare n parte. Deoarece nu toate informaiile necesare unui proiect se afl n bibliotec work (care este de obicei un subdirector n cadrul proiectului) trebuie s ne referim la o bibliotec standard care conine elemente (funcii, tipuri, etc) predefinite. n VHDL aceast referire se face folosind directiva library la nceputul codului VHDL, ex. library ieee;. Prin specificarea numelui bibliotecii se obine acces la toate entitile i arhitecturile aflate n biblioteca respectiv, dar nu d acces la tipurile definite acesta fiind rolul package-urilor i al directivei use. Un package este un fiier care conine obiecte definite care pot fi folosite n alte programe. Tipurile de obiecte care se afl ntr-un package sunt: semnale, definiri de tipuri, constante, funcii, proceduri i declarri de componente. Un proiect poate folosii un package dac n codul VHDL se include directiva use, de exemplu pentru a apela toate componentele definite n package-ul standard IEEE 1164 scriem urmtoarea secven de cod: use ieee.std_logic_1163.all;, unde ieee este numele unei librrii care a fost dat mpreun cu directiva library. Sintaxa std_logic_1164 este numele unui fiier care conine componentele definite, iar sufixul all i spune compilatorului s le foloseasc pe toate. n locul respectivului sufix se poate scrie numai numele unei anumite componente care s fie luat n considerare de compilator, ex. use ieee.std_logic_1163.std_ulogic.

38

Introducere n limbajul de descriere hardware VHDL

Definirea package-urilor nu se limiteaz doar la cele standard aflate n biblioteci, utilizatorul poate el nsui s-i defineasc package-uri conform sintaxei din tabelul T3.15.
Tabelul T3.15 Sintaxa VHDL pentru declararea unui package

Toate obiectele declarate ntre cuvntul cheie package i primul cuvnt cheie end sunt vizibile n toate fiierele din proiect care folosesc package-ul respectiv, iar obiectele care urmeaz cuvntului cheie package body sunt vizibile doar local. n prima parte a sintaxei funciile sunt doar declarate (function declarations) nu i definite ceea ce nseamn c este vizibil doar numele funciei, argumentele i tipurile, definiia funciei fiind dat n corpul package-ului (package body) i nu este vizibil pentru utilizatorul funciei.

3.7 Elemente de descriere structural


ncepnd cu acest paragraf vom studia partea executabil a unei arhitecturi, practic inima unui cod scris n limbaj VHDL. Reamintim dintr-un paragraf anterior c o arhitectur este format dintr-o serie de instruciuni concurente (concurrent statement), fiecare astfel de instruciune fiind executat simultan cu celelalte instruciuni din arhitectur. Aceast executare concurenial a anumitor instruciuni distinge limbajul VHDL fa de alte limbaje de programare n care instruciunile se execut secvenial (cte una la un moment dat). Instruciunile concurente sunt necesare pentru a putea simula comportamentul circuitelor modelate, n care componentele interacioneaz unele cu altele n mod continuu i nu numai la anumite momente ordonate n timp. ntr-o arhitectur VHDL dac ultima instruciune modific starea unui semnal care este folosit de prima instruciune din arhitectur atunci simulatorul se va ntoarce la prima instruciune i o va reactualiza cu noua valoare, cu alte cuvinte simulatorul va continua s propage schimbrile i s reactualizeze valorile semnalelor pn cnd circuitul simulat se stabilizeaz. 39

Capitolul 3

Sintaxa VHDL conine cteva instruciuni concureniale i de asemenea un mecanism de grupare a instruciunilor secveniale astfel nct ele s funcioneze ca i o sigur instruciune concurenial. Cea mai elementar instruciune concurenial este instruciunea component, a crei sintax este prezentat n tabelul T3.16.
Tabelul T3.16 Sintaxa VHDL pentru instruciunea component

Numele componentei (component_name) este numele unei entiti definite anterior care trebuie utilizat sau instaniat (multiplicat). Fiecare instruciune component care invoc numele entiti creeaz o clon (instan) respectivei entiti care se va distinge printr-un nume unic dat de o etichet (label). Cuvntul cheie port map introduce o list care asociaz porturile componentelor rezultate din instanierea unei entiti cu arhitectura corespunztoare entitii instaniate. Aceast list se poate scrie n dou moduri: poziional i asociativ. n modul poziional de atribuire semnalele din list sunt asociate cu porturile entitii n aceeai ordine n care apar n entitate. n modul de atribuire asociativ fiecare port al entitii se asociaz unui semnal folosind operatorul =>, iar asocierea poate fi fcut n orice ordine. nainte de a fi instaniat ntr-o arhitectur, o component trebuie s fie declarat n cadrul arhitecturii, sintaxa de declarare este prezentat n tabelul 3.17. Dup cum se poate observa n tabel declararea unei componente este asemntoare cu declararea porturilor entitii ce urmeaz a fi instaniate. Componentele folosite n arhitectur pot s fie de dou tipuri: a) componente descrise anterior care sunt specifice proiectului sau, b) componente care sunt apelate din bibliotecile standard. Pentru a pune cap la cap toate cele discutate pn aici, n tabelul T3.18 este prezentat descrierea VHDL complet a unui detector de numere prime, iar n figura 3.4 este prezentat descrierea simbolic cu pori logice a detectorului de numere prime.
Tabelul T3.17 Sintaxa pentru declararea unei componente

40

Introducere n limbajul de descriere hardware VHDL

Circuitul din figura 3.4 va pune o valoare 1 logic la ieirea F ori de cte ori la intrare se va afla forma binar a unuia dintre numerele prime: 1,3,5,7,11,13, altfel ieirea F va avea valoare 0 logic. Prin declararea entitii se declar intrrile i ieirile circuitului. n cadrul arhitecurii sunt declarate toate semnalele care vor fi folosite de asemenea i numele componentelor (INV, AND2, AND3, AND4) care sunt predefinite i vor fi apelate din biblioteca IEEE. Deoarece descrierea circuitului este concurenial n orice ordine am introduce componentele se va sintetiza acelai circuit, iar funcionarea va fi aceeai.
Tabelul 3.18 Exemplu de descriere structural n limbaj VHDL a unui detector de numere prime

Figura 3.4 Diagrama logic a detectorului de numere prime

41

Capitolul 3

Acest mod de descriere a unui circuit poart numele de descriere structural (structural description), deoarece definete exact elementele i interconexiunile dintre ele. O descriere structural pur este echivalent cu o descriere schematic sau cu un netlist (list de conexiuni ntre elementele unui circuit). Exist proiecte n care este necesar s se creeze copii multiple a unui element n cadrul unei arhitecturi. Dup cum se va studia mai trziu un sumator pe n bii se poate crea din n sumatoare pe un bit. Limbajul VHDL include o instruciune (generate) care permite crearea unei structuri repetitive folosind un fel de bucl, fr a fi necesar s instaniem separat fiecare element. Sintaxa instruciuni generate este prezentat n tabelul T3.19. Identificatorul (indetifier) este implicit declarat ca i variabil compatibil cu domeniul (range), iar instruciunile concurente (concurent statement) se execut odat pentru fiecare valoare din domeniu a identificatorului.

Tabelul T3.19 Sintaxa VHDL pentru bucla for-generate

Identificatorul trebuie folosit n zona de declarare a instruciunilor concureniale. n tabelul T3.20 este prezentat un exemplu de utilizare a instruciunii generate, n cazul crerii unei pori inversoare pe 8-bii. Valoarea constantei trebuie cunoscut n momentul n care programul VHDL este compilat.

Tabelul T3.20 Entitatea i arhitectura VHDL corespunztoare unei pori inversoare pe 8-bii

42

Introducere n limbajul de descriere hardware VHDL Tabelul T3.21 Sintaxa VHDL pentru declararea constantei generic

n unele aplicaii este util s se proiecteze i s se compileze o entitate mpreun cu arhitectura corespunztoare care s conin unii parametrii (cum ar fi limea busului) care nu sunt specificai, aceast facilitate este introdus de constanta generic a crei sintax este prezentat n tabelul T3.21. Rolul constantei generic (vezi constanta width, tabelul T3.22) va fi definit n continuare n cadrul arhitecturii, dar o valoare i va fi atribuit numai cnd entitatea va fi instaniat n cadrul altei arhitecturi (vezi tabelul T3.23). n cadrul definirii componentelor, constantelor generic li se atribuie valori folosind instruciunea generic map, asemntoare cu instruciunea port map. n tabelul T3.22 se d un exemplu de definire a unui bus inversor de lime variabil care combin instruciunile generic i generate. Un exemplu de folosire a instruciunii generic este dat n tabelul T3.23 unde se definesc multiple copii ale unui inversor.

Tabelul T3.22 Descriere n limbaj VHDL a unui bus de lime variabil

43

Capitolul 3

Tabelul T3.23 Entitate i arhitectur VHDL care definesc un bus inversor

3.8 Elemente specifice proiectrii concureniale


Dac instruciunile de declarare a componentelor ar fi singurele instruciuni concureniale ale limbajului VHDL, acesta nu ar fi dect un limbaj puternic tipizat care ar face o descriere ierarhic sub form de netlist a circuitelor. Limbajul VHDL dispune ns de modaliti mai complexe de descriere a circuitelor este vorba de descrierea concurenial a crei introducere am fcut-o n paragraful anterior (urmeaz s fie dezvoltat n continuare) i de descrierea secvenial. n tabelul T3.24 se prezint dou elemente de limbaj VHDL care apar n descrierile de tip concurenial. Primul din cele dou elemente este instruciunea de atribuire concurenial de semnal (signal-name<=expression). Tipul expresiei (expression) trebuie s fie compatibil cu cel al semnalului (signal-name). Pentru a exemplifica atribuirea concurenial de semnal arhitectura detectorului de numere prime prezentat ntr-un paragraf anterior este rescris n stil concurenial (vezi tabelul T3.25). Spre deosebire de descrierea anterioar (descriere structural) porile i conexiunile dintre ele nu mai apar explicit, ci se folosesc operatori VHDL definii implicit n biblioteca IEEE (and, or, not). Se observ c operatorul not are prioritatea cea mai mare, astfel c nu este necesar s se utilizeze paranteze pentru expresii de genul not N(2).

44

Introducere n limbajul de descriere hardware VHDL

Tabelul T3.24 Sintaxa VHDL pentru atribuire concurenial de semnal

Tabelul T3.25 Descriere concurenial a arhitecturii detectorului de numere prime

Conform tabelului 3.24 mai exist o opiune de atribuire concurenial de semnalelor i anume atribuirea condiional folosind cuvintele cheie when i else. n acest caz o expresie boolean (boolean-expression)combin termeni booleeni individuali folosind operatori implicii (and, or, not)Termenii booleeni sunt de obicei variabile sau rezultate ale unor comparaii fcute cu ajutorul operatorilor relaionali (=, /= (inegaliate), >, >=, <, <= (mai mic sau egal)). n tabelul T3.26 este dat un exemplu al utilizrii atribuiri condiionale de semnal secvenial. Comparaia unui bit de tip std_logic cum ar fi N(3) se face n funcie de caracterele literale 1 sau 0, iar rezultatul returnat este de tip boolean. Rezultatul acestor comparaii se combin ntr-o expresie boolean plasat ntre cuvintele cheie when, else. Clauza else este obligatorie deoarece setul de condiii dintr-o expresie trebuie s acopere toate combinaiile posibile. Un alt tip de atribuire concurenial este atribuirea concurenial de semnal selectiv, a crei sintax este prezentat n tabelul T3.26. n acest tip de instruciune, se evalueaz expresia dat (expression), iar cnd una dintre valori se potrivete cu una dintre opiuni (choices) atunci identificatorului signal-name i se va atribui valoarea corespunztoare signal-value. Opiunea choices corespunztoare fiecrei clauze when poate s fie o singur valoare sau o list de valori separate ntre ele prin bara vertical ( | ). Cuvntul cheie others poate fi folosit mpreun cu ultima clauz when pentru a acoperii toate valorile pe care le poate lua expresia de evaluare. n tabelul T3.27 este prezentat o alt arhitectur a detectorului de numere prime n care se folosete atribuirea concurenial selectiv de semnal. Toate

45

Capitolul 3

opiunile pentru care F ia valoarea 1 ar fi putut fi scrise folosind o singur clauz when, dar pentru o nelegere mai bun s-au folosit mai multe clauze.

Tabelul T3.26 Sintaxa VHDL pentru atribuire concurenial selectiv de semnal

Tabelul T3.27 Arhitectura VHDL corespunztoare detectorului de numere prime folosind atribuire concurenial selectiv de semnal

3.9 Elemente specifice proiectrii comportamentale (secveniale)


n paragraful anterior am putut vedea cteva descrieri comportamentale concureniale, dar pentru ca aceste descrieri comportamentale s fie mai complete este necesar s definim noi elemente de limbaj. Un element de descriere comportamental cheie este procesul. Un proces (process) este o colecie de instruciuni secveniale care se execut n paralel cu alte instruciuni concureniale sau alte procese. n cadrul unui proces utilizatorul poate definii interaciuni complexe ale semnalelor i evenimentelor ntr-o manier care n timpul simulrii se execut instantaneu (zero simulated time) i care se sintetizeaz sub forma unui circuit combinaional sau secvenial. Instruciunea process poate fi folosit la fel ca o instruciune concurenial i are sintaxa prezentat n tabelul T3.28. ntr-un proces sunt vizibile numai tipurile, semnalele constantele funciile i procedurile care fac parte din aceeai arhitectur cu procesul, ns toate elementele enumerate mai sus cu excepia semnalelor pot fi definite i local n proces. n cadrul 46

Introducere n limbajul de descriere hardware VHDL

unui proces, variabilele au rolul de a pstra stri, ele nu sunt vizibile n afara procesului, iar corespondentul fizic ntr-un circuit real poate s fie (dar nu ntotdeauna) un semnal aceasta depinznd de felul n care sunt descrise. Sintaxa VHDL pentru definirea unei variabile este asemntoare cu cea pentru definirea unui semnal, variable variable-names: variable-types;.
Tabelul T3.28 Sintaxa VHDL pentru definirea unui proces

Semnalele care se afl n paranteze alturi de cuvntul cheie process, determin dac procesul ruleaz sau dac va fi suspendat, aceast list de semnale poart numele de list de senzitiviti (sensitivity list). Presupunem c un proces este suspendat iniial, dac unul dintre semnalele aflate n lista de senzitiviti i schimb valoarea, procesul se va declana relunduse executarea instruciunilor de la prima pn la ultima. Dac oricare dintre semnalele din lista de senzitiviti i schimb valoarea ca rezultat al rulrii anterioare a procesului, atunci procesul se reia din nou, astfel c acesta va rula pn n momentul n care nici unul dintre semnale nu-i mai schimb valoarea. Toate evenimentele din cadrul unui proces au loc, n cadrul unei simulri ntr-un timp de simulare egal cu zero. Un proces descris corect n VHDL se va suspenda dup una sau mai multe rulri, trebuie s se evite modelarea proceselor care nu se suspend niciodat. Lista de senzitiviti este opional, procesele care nu au list de senzitiviti ncep s ruleze n cadrul simulrii la momentul zero, aceste procese vom vedea ulterior sunt utile pentru modelarea test bench-urilor. Limbajul VHDL are cteva tipuri de instruciuni secveniale. Un prim tip este atribuirea secvenial de semnal (sequential signal-assignment), aceasta are aceeai sintax ca i versiunea concurenial , signal-name<=expression;. Un tip de atribuire similar exist i pentru variabile, dar difer operatorul de atribuire, variable-name := expression. n tabelul T3.29 se prezint o nou arhitectur a detectorului de numere prime rescris ca i proces. n cadrul acestei arhitecturi (prime6_arch) exist doar o singur instruciune concurenial, aceasta este instruciunea process. n lista de senzitiviti a procesului apare intrarea N, iar n cadrul procesului se definesc variabile, definirea de semnale nu este permis. 47

Capitolul 3

O alt instruciune secvenial este instruciunea if, tipurile de sintax care se pot folosii pentru aceast instruciune sunt prezentate n tabelul T3.30. n prima form a acestei instruciuni o expresie boolean este testat (boolean epression) i se va executa o instruciune secvenial (sequeential statement) dac expresia testat este adevrat. n cea de a doua form se mai adaug i clauza else urmat de o alt instruciune secvenial care se execut n cazul n care expresia testat este fals (nu se verific). Pentru a crea un model if-then-else imbricat n limbajul VHDL se introduce cuvntul cheie elsif. O instruciune secvenial care conine clauza elsif se execut dac expresia boolean care-i corespunde este adevrat i toate expresiile precedente sunt false. Instruciunea secvenial corespunztoare clauzei finale else se execut dac toate expresiile booleene precedente au fost false.
Tabelul T3.29 Arhitectura VHDL a detectorului de numere prime descris ca i proces

Tabelul T3.30 Sintaxa VHDL corespunztoare instruciunii if

48

Introducere n limbajul de descriere hardware VHDL

O alt versiune de arhitectur a detectorului de numere prime este prezentat n tabelul T3.31, de aceast dat descrierea VHDL este fcut folosindu-se instruciunea if. n acest caz se folosete o variabil NI de tipul ntreg folosit pentru a pstra valoarea ntreag rezultat n urma convertiri intrrii N. Expresiile booleene din tabelul T3.31 nu se suprapun, aceasta nseamn c numai una dintre ele este adevrat la un moment dat. n acest caz folosirea instruciunii if imbricate s-a fcut doar n scop didactic, era suficient s se foloseasc forma mai simpl a instruciuni. n cazul n care trebuie aleas o singur alternativ din multitudinea de alternative oferite de valorile pe care le poate lua un semnal sau o expresie, se va apela la instruciunea case, care este mai explicit i poate s se sintetizeze ntr-un circuit mai optim. Sintaxa instruciunii case este prezentat n tabelul T3.33. Aceast instruciune evalueaz o expresie dat, alege valoarea care se potrivete din una din alternative (choices) i execut instruciunea secvenial corespunztoare. Alternativele (choices) sunt reprezentate de o singur valoare sau de un set de valori separate prin bare verticale, aceste alternative trebuie s se exclud una pe cealalt i trebuie s includ toate valorile posibile ale expresiei evaluate, altfel se folosete clauza others.
Tabelul T3.31 Arhitectura VHDL a detectorului de numere prime folosind instruciunea if

Tabelul T3.32 Sintaxa VHDL corespunztoare instruciunii case

Tabelul T3.33 Arhitectura VHDL a detectorului de numere prime folosind instruciunea case

49

Capitolul 3

n tabelul T3.33 este prezentat o nou arhitectur pentru detectorul de numere prime, de aceast dat modelarea n limbaj VHDL s-a realizat utiliznd instruciunea case. O alt clas important de instruciuni secveniale sunt instruciunile loop, forma cea mai simpl a sintaxei este prezentat n tabelul T3.33. O alt form mai cunoscut a acestui tip de instruciuni este for loop cu sintaxa prezentat n tabelul T3.35. Variabila identifier se declar implicit i este de acelai tip cu domeniul (range), pe care l parcurge de la stnga la dreapta cte o valoare per iteraie.
Tabelul T3.34 Sintaxa de baz a instruciunii loop Tabelul T3.35 Sintaxa instruciunii for loop

Tabelul T3.36 Arhitectura VHDL a detectorului de numere prime folosind instruciunea for loop

Alte dou instruciuni secveniale care se pot executa n cadrul unei instruciuni loop sunt exit i next. Instruciunea exit are rolul de a transfera 50

Introducere n limbajul de descriere hardware VHDL

executarea programului primei instruciuni aflate dup cuvntul cheie end corespunztor ncheierii buclei. Cea de a doua instruciune, next are rolul de a abandona executarea instruciunilor din bucl care urmeaz dup ea i de a trece la o nou iteraie (parcurgere a buclei). Un exemplu de arhitectur n care se folosete instruciunea for loop este prezentat n tabelul T3.36. Aceasta este o descriere pur comportamental a arhitecturii detectorului de numere prime. Pentru a explica puterea unei instruciuni loop s-a mrit valoarea lui N la 16. Descrierea din tabelul T3.36 este pur didactic deoarece operatorul mod care presupune mprire nu este sintetizabil.

Tabelul T3.37 Sintaxa instruciunii while loop

Ultima instruciune de ciclare studiat este instruciunea while loop, a crei sintax este prezentat n tabelul T3.37. n acest tip de instruciune expresia boolean (booleanexpression) este testat naintea de fiecare iteraie, iar bucla se execut numai dac valoarea expresiei este adevrat.

3.10 Definirea ntrzierilor


Nici unul dintre exemplele VHDL prezentate pn n acest punct nu trateaz ntrzierile care apar n circuitele reale, dar limbajul permite modelarea acestor ntrzieri. Unul dintre cuvintele cheie care permit introducerea ntrzierilor este after care poate fi asociat cu orice tip de atribuire de semnal (secvenial, concurenial, condiional i selectat). Arhitectura pori logice interdicie (BUT-NOT), poate fi rescris dup cum urmeaz:
Z <= 1 after 4ns when X = 1 and Y =0 else 0 after 3 ns;

Aceast poart este astfel modelat nct semnalul de ieire fa de cel de intrare va avea o ntrziere de 4ns la tranziia din 0 n 1 i 3ns la tranziia din 1 n 0. O alt instruciune care invoc dimensiunea timp este instruciunea secvenial wait. Aceasta poate fi folosit pentru a suspenda executarea unui proces pentru o anumit perioad de timp. n tabelul T3.38 este prezentat un program aa numit test-bench, care folosete instruciunea wait pentru a genera formele de und simulate necesare la testarea funcionrii porii logice interdicie. Cele dou instruciuni care invoc dimensiunea timp prezentate anterior nu sunt sintetizabile ele sunt utile ns la modelarea test-bench-urilor.

51

Capitolul 3

Tabelul T3.38 Test-bench-ul corespunztor porii logice de interdicie

3.11 Sinteza circuitelor modelate cu limbajul VHDL


Dup cum s-a afirmat i la nceputul acestei seciuni limbajul VHDL a fost mai nti dezvoltat ca limbaj de descriere i simulare a circuitelor i abia mai trziu acest limbaj a fost adaptat pentru sintez. Astfel c limbajul are multe caracteristici i construcii care nu pot fi sintetizate. Subsetul de instruciuni i programe prezentate n aceast seciune sunt sintetizabile majoritatea. Trebuie de reinut c modul n care este descris un circuit n VHDL, se rsfrnge asupra caliti circuitului sintetizat, n continuare sunt prezentate cteva recomandri: - Structurile de control seriale de tipul if-elsif-elsif-else pot fi sintetizate sub forma unui lan serial de pori logice, ceea ce favorizeaz ntrzierile, astfel c n acest caz este mai bine s se foloseasc instruciunile de selecie case sau with dac condiiile se exclud reciproc. - n cazul n care se folosesc instruciuni condiionale n cadrul unui proces, dac pentru o anumit combinaie a intrrilor se omite specificarea valori pe care trebuie s o ia aib ieirea, compilatorul va crea un latch la ieire care s poat pstra vechea valoare a semnalului de ieire care altfel ar trebui s se schimbe. n general generarea unui astfel de latch nu este dorit. - Instruciunile de ciclare creeaz n general copii multiple ale logicii combinaionale descrise n cadrul instruciunii. Dac se dorete folosirea unei singure astfel copii a logici combinaionale ntr-o secven de pai atunci trebuie s se proiecteze un circuit secvenial. 52

Introducere n limbajul de descriere hardware VHDL

Este posibil ca sinteza unor construcii i structuri ale limbajului s nu fie posibil cu anumite programe de sintez, pentru aceasta trebuie consultat documentaia respectivelor programe pentru a vedea ce este i ce nu este sintetizabil.

53