+ All Categories
Home > Documents > Unitati fundamentale de proiectare in VHDL (Design...

Unitati fundamentale de proiectare in VHDL (Design...

Date post: 31-Aug-2019
Category:
Upload: others
View: 16 times
Download: 0 times
Share this document with a friend
28
Unitati fundamentale de proiectare in VHDL (Design units) Capitolul 2
Transcript

Unitati fundamentale de proiectare in VHDL (Design units)proiectare in VHDL (Design units)

Capitolul 2

Design units

• Un sistem digital poate fi modelat in VHDL ca o entitate (entity): – entitatea este unitatea fundamentala a unui proiect (design)

– O entitate poate fi o componenta a unui alt proiect – O entitate poate fi o componenta a unui alt proiect sau poate fi modulul de pe nivelul cel mai inalt al proiectului (top level module of the design)

• O entitate e descrisa ca un set de unitati de proiectare VHDL (design units).

• Aceste unitati de proiectare pot fi compilate separat

Design units

• In VHDL exista urmatoarele unitati de proiectare:1. Entity declaration (declaratia de entitate sau entitatea)2. Architecture body (arhitectura)3. Package declaration (declaratia de package)4. Package body (corpul unui package)5. Configuration declaration (declaratia de configuratie sau

configuratia)

• Unitati primare de proiectare: declaratia de entitate, declaratia de configuratie si declaratia de package

• Unitati secundare de proiectare: arhitectura si PACKAGE BODY

Declaratia de entitate

Declaratia de entitate specifica numele entitatii si interfata acesteia cu exteriorul (prin porturile entitatii)

Sintaxa:

ENTITY_delcaration ::=Descrierea BNF:

::= -se definesteENTITY nume IS

entity_header

[entity_declarative_part]

[BEGIN

entity_statement_part]

END [ENTITY][nume];

Entity_header ::= [GENERIC_clause][PORT_clause]

::= -se defineste

[] – secventa optionala

{} – secventa optionala repetabila

| - alternative logice

Conventie: vom nota cuvintele cheie cu majuscule, desi limbajul VHDL nu e case sensitive

Declaratia de entitate• Declaratia de entitate contine cuvintul cheie ENTITY urmata de numele

entitatii• Urmeaza un header, ce contine

– clauza GENERIC:• Parametrii generici apartin clasei constantelor si sunt vizibili in toate arhitecturile unei

entitati• De obicei sunt folositi pt a specifica intirzieri (dar nu numai)

– clauza PORT:– clauza PORT:• Se declara porturile entitatii, adica semnalele prin care entitatea comunica cu exteriorul

• Urmeaza – o parte optionala de declaratii si – o parte optionala de instructiuni, dar exista restrictii cu privire la instructiunile

care pot aparea intr-o entitate (se va discuta mai tirziu)• Declaratia de entitate se incheie cu END urmat optional de cuvintul cheie

ENTITY sau/si de numele entitatii;– Daca apare numele, trebuie sa fie acelasi ca si cel de la declarare

• Simbolul ; de la sfirsitul declaratiei de entitate e obligatoriu• A se vedea exemplele.

Declaratia de arhitecturaImplementarea unei entitati este descrisa in arhitectura

O entitate poate avea oricate arhitecturi.

Architecure_body::=

ARCHITECTURE nume_arhitectura OF nume_entitate IS

architecture_declarative_part

BEGIN

architecture_statement_part

END [ARCHITECTURE] [nume_arhitectura];

Arhitectura• Dupa cuvintul cheie ARCHITECTURE urmeaza numele

arhitecturii si apoi entitatea careia ii este asociata arhitectura

• Urmeaza partea de declaratii a arhitecturii (architecture declarative part) in care– Se pot declara: tipuri, constante, semnale, componente, – Se pot declara: tipuri, constante, semnale, componente,

subprograme– NU se pot declara: variabile

• Intre BEGIN si END: instructiunile din arhitectura– Acestea se executa concurent (in paralel) => nu conteaza

ordinea in care sint scrise• Dupa END: optional cuvintul cheie ARCHITECTURE

si/sau numele arhitecturii (acelasi ca la inceput) si in mod obligatoriu simbolul ;

Instructiuni in arhitecturi1. PROCESS :

– o instructiune compusa, in interiorul careia instructiunile se executa secvential

– Este instructiunea de baza pt descrieri comportamentale secventiale

2. BLOCK : o instructiune compusa, va fi discutata in 2. BLOCK : o instructiune compusa, va fi discutata in capitolul de modelare comportamentala concurenta

3. Apeluri concurente de proceduri 4. Instructiuni ASSERT concurente5. Asignari concurente de semnale6. Instantieri de componente: pt modelare structurala7. Instructiuni GENERATE (e de fapt o macroinstructiune)

Stiluri de descrierere (modelare)• In VHDL exista urmatoarele stiluri de modelare:

1. Modelare comportamentala secventiala – in interiorul proceselor

2. Modelare comportamentala concurenta:– Instructiunile 3-5 din lista anterioara

3. Modelare structurala: instructiunea de baza e cea de instantiere de componentainstantiere de componenta

• Instructiunile 2 si 7 sunt situatii speciale, care nu pot fi incadrate doar intr-o singura categorie

• Limbajul VHDL permite ca intr-o arhitectura sa apara orice combinatii ale stilurilor de modelare, dar

– Le vom discuta separat in scop didactic• Vom prezenta un exemplu cu un circuit modelat in cele

trei stiluri

Exemplu

• Vom descrie un circuit generator de paritate, avand patru intrari de tip BIT si o iesire care se activeaza (ia valoarea 1) cind combinatia de la intrare contine un nr par de ‘1’

• Aceasta este o specificare a circuitului, care ne poate servi pt descrierea comportamentala secventiala

• Nu avem nevoie de schema circuitului pentru descrierea comportamentala secventiala !

Descriere comportamentala secventiala a circuitului de paritateENTITY circ_paritate IS

PORT(v: IN BIT_VECTOR(3 DOWNTO 0);y: OUT BIT);

END circ_paritate;----------------ARCHITECTURE comport_secvential OF circ_paritate IS

circ_paritatev y

ARCHITECTURE comport_secvential OF circ_paritate ISBEGIN

PROCESS(v) -- semnalul v constituie LISTA DE SENZITIVITATE a

procesului--partea de declaratii a procesului:-- se pot declara constante si variabile, -- NU se pot declara semnale !

VARIABLE nr_de_1 : INTEGER:=0;BEGIN

nr_de_1:=0;

Descriere comportamentala secventiala a circ de paritate (2)

FOR i IN 0 TO 3 LOOP-- FOR i in 3 DOWNTO 0 LOOP

IF v(i)='1' THENnr_de_1 := nr_de_1 +1; -- nu exista operatori ++ += etc

END IF;END LOOP;

IF nr_de_1 MOD 2=0 THENy<= '1' AFTER 1 ns;

ELSEy<='0' AFTER 1 ns;

END IF;

END PROCESS;END;

Descrierea comportamentala secventiala comentarii

• Entitatea:– Se numeste circ_paritate– Are o intrare v care e un vector de 4 biti– Are o iesire y de tip BIT

• BIT e un tip predefinit in limbaj, avind valorile ‘0’ si ‘1’• Si BIT_VECTOR e predefinit in limbaj, ca ARRAY de BIT (tablou de biti)

• Arhitectura– Nu contine declaratii in partea de declaratii– Contine o singura instructiune (PROCESS)

Comentarii (continuare) • PROCESS

– Are o lista de senzitivitate, continind semnalul v, adica procesul se activeaza (se executa) de fiecare data cind se modifica v (are loc un eveniment pt semnalul v)

– In general lista de senzitivitate poate contine mai multe semnale; de fiecare data cind se modifica oricare din semnale, procesul isi reia executia

– Partea de declaratii a procesului contine declararea unei variabile, – Partea de declaratii a procesului contine declararea unei variabile, nr_de_1, de tip intreg (un contor). Variabila e initializata cu 0 la declarare.

– In procese se pot declara constante, variabile, subprograme, tipuri, dar– In procese NU se pot declara semnale si nici componente !– Instructiunile din interiorul procesului se executa secvential (in ordinea in care sint scrise)

– Se parcurge vectorul de intrare si se incrementeaza contorul atunci cind se gaseste o valoare ‘1’

– Daca s-a gasit un nr par de biti de ‘1’ atunci iesirea y va avea valoarea ‘1’ dupa o intirziere de 1ns (o nano secunda)

– Procesul e o bulca infinita: dupa END PROCESS se merge din nou la BEGIN

Descrierea structurala

Reprezentam schema circuitului, pe baza careia deducem ca avem nevoie de porti de tip sau_exclusiv si respectiv de o poarta de tip inversor

V(3)V(3)

V(2)

V(1)

V(0)

s1

s2

s3y

xor1

xor2

xor3

inv1

Descrierea portilor: xor

ENTITY poarta_xor ISGENERIC(del: TIME:=3ns);PORT(x1,x2: IN BIT;

y: OUT BIT);END poarta_xor;

poarta_xor

x1

x2

y

ARCHITECTURE behave OF poarta_xor IS-- declaratii de semnale, etc, -- NU se potdeclara variabile in arhitectura

BEGINy <= x1 XOR x2 AFTER del;

END behave;

Descrierea portilor: inversorENTITY inversor IS

GENERIC(del: TIME:=4ns);PORT(x: IN BIT;

y: OUT BIT);END inversor;

ARCHITECTURE behave OF inversor IS-- declaratii

inversorx y

-- declaratiiBEGIN

y <= NOT x AFTER del;END behave;

Descriere structurala a circuitului de paritate

ARCHITECTURE struct OF circ_paritate ISCOMPONENT xor_gate IS

GENERIC(del: TIME:=3ns);PORT(x1,x2: IN BIT; y: OUT BIT);

END COMPONENT;COMPONENT inv_gate IS

GENERIC(del: TIME:=4ns);GENERIC(del: TIME:=4ns);PORT(x: IN BIT; y: OUT BIT);

END COMPONENT;SIGNAL s1, s2, s3: BIT;

BEGINxor1: xor_gate PORT MAP(y => s1, x2=> v(2), x1=> v(3));

-- mapare dupa numexor2: xor_gate PORT MAP(v(1), v(0), s2); --mapare pozitionalaxor3: xor_gate GENERIC MAP(del => 4ns) PORT MAP(s1, s2, s3);inv1: inv_gate PORT MAP(x=>s3, y=>y);END ARCHITECTURE struct;

Descrierea structurala

• Contine componentele sistemului si modul de interconectare al acestora

• Comportamentul sistemului nu este descris explicit, dar el rezulta din structura sistemului

• In exemplu, arhitectura contine doua declaratii de componente si declaratii de semnale in partea de

• In exemplu, arhitectura contine doua declaratii de componente si declaratii de semnale in partea de declaratii

• Componentele din declaratii nu sunt elemente active, ci doar niste prototipuri (“templates”)

• Semnalele declarate sunt interne arhitecturii• In corpul arhitecturii avem doar instructiuni de instantieri

de componente (component instantiation statements)

Descrierea structurala• Fiecare instruct de instantiere de componente are o eticheta obligatorie, urmata

de numele componentei si de clauza PORT MAP, care face maparea porturilor• Maparea porturilor consta in realizarea unei asocieri intre porturile formale

(adica porturile din declaratia de componenta) si porturile actuale (acele semnale interne sau porturi ale entitatii pe care o modelam ce se conecteaza la porturile formale)

• Exista reguli precise in limbaj privind tipul si modul (directia) porturilor formale si actuale.– De exemplu, nu se poate conecta un port formal OUT la un port actual IN si nici

invers. invers. – Tipurile trebuie sa corespunda (intre portul formal si cel actual)

• Semnalele interne nu au mod, asa ca se pot conecta atit la porturi formale de intrare, cit si de iesire

• Maparea porturilor se poate face – Pozitional (nu se precizeaza numele portului formal, ci pe pozitia fiecarui port formal,

asa cum apare in declaratia de componenta, se precizeaza doar numele portului actual) -> nu se recomanda, poate genera erori greu de detectat !

– Dupa nume: se precizeaza atit numele portului formal, cit si al celui actual • ordinea porturilor formale nu conteaza in acest caz• Sintaxa e intotdeauna: port_formal => port_actual• Simbolul de mapare => are directia de la port formal spre port actual indiferent de directia porturilor

Descrierea structurala• Poate exista si clauza GENERIC MAP, atunci cind se

doreste modificarea valorii implicite a unuia sau mai multor parametri generici pentru o anumita instantiere de componenta

• Pentru a putea simula descrierea structurala e nevoie sa descriem si entitatile si arhitecturile corespunzatoare componentelor (xor_gate si inv_gate in exemplu). descriem si entitatile si arhitecturile corespunzatoare componentelor (xor_gate si inv_gate in exemplu).

• A se vedea descrierea portilor in exemplul studiat• Daca entitatile asociate lor au acelasi nume ca si

componentele si daca exista si o corespondenta intre porturile lor (ca nume, tip si mod) atunci se poate face asa-numita legare implicita (default binding)

• Daca, la fel ca in exemplul nostru, entitatile au alt nume decit componentele, atunci avem nevoie de o configuratie, care sa faca legarea lor

O configuratie a circuitului de paritate

CONFIGURATION cfg_circ_paritate OF circ_paritate ISFOR struct

FOR ALL: xor_gate USE ENTITY WORK.poarta_xor(behave);END FOR;FOR inv1: inv_gate USE ENTITY WORK.inversor(behave);END FOR;

END FOR;END CONFIGURATION;END CONFIGURATION;

Configuratia• In exemplu avem configuration declaration• Declaratia de configuratia specifica numele configuratiei

si entitatea careia configuratia ii este asociata• Apoi se precizeaza arhitectura pentru care se face

configuratia• Dupa care are loc legarea intre instantierile fiecareia din • Dupa care are loc legarea intre instantierile fiecareia din

componentele declarate in arhitectura si o pereche entitate(arhitectura), in acest caz din biblioteca de lucru curenta (avind numele logic WORK)

• Daca ar fi diferit numele porturilor componentelor si ale entitatilor asociate lor, ar fi avut loc si o asociere intre aceste nume

• Configuratiile se vor studia intr-un capitol ulterior• Limbajul VHDL prezinta o mare varietate de posibilitati in

ce priveste aceste asocieri cu ajutorul configuratiilor

Doua arhitecturi comportamentale concurente ale circ de paritate

ARCHITECTURE comport_concurent1 OF circ_paritate ISSIGNAL s1, s2, s3: BIT;

BEGINy<=NOT s3 AFTER 11ns; s3<=s2 XOR s1;s2<=v(0) XOR v(1);s2<=v(0) XOR v(1);s1<=v(3) XOR v(2);

END;

ARCHITECTURE comport_concurent2 OF circ_paritate IS

BEGINy<= NOT(v(0) XOR v(1) XOR v(2) XOR v(3)) AFTER 11ns;

END ARCHITECTURE;

Descrieri comportamentale concurente

• Ambele arhitecturi din exemplu contin doar instructiuni de asignare concurenta de semnal (concurrent signal assignment)

• Prima arhitectura e foarte apropiata de descrierea structuralastructurala

• Instructiunile din corpul arhitecturii sunt concurente, deci ordinea instructiunilor nu conteaza !

• A doua arhitectura e mai simpla (are o singura instructiune)

• Modelarea comportmentala concurenta va fi discutata intr-un capitol ulterior

PACKAGE Definitie: un package este o colectie de declaratii de subprograme, tipuri, subtipuri, constante, componente, etc, grupate intr-un mod care permite accesarea si utilizarea lor si de catre alte unitati de proiectare.

Declaratia de PACKAGE: este interfata package-ului, continind acele declaratii care sint vizibile din exterior.

Detaliile ascunse, care nu sunt vizibile din exterior, sunt grupate in PACKAGE BODY. PACKAGE BODY.

Un package declaration poate avea cel mult un package body.

Package body trebuie sa existe daca in package declaration apar declaratii de subprograme sau constante aminate (deferred constants).

Package_declaration::=

PACKAGE nume IS

package_declarative_part

END [PACKAGE] [nume];

Package_body::=

PACKAGE BODY nume IS

package_body_declarative_part

END [PACKAGE BODY] [nume];

PACKAGE• Daca exista si package body, atunci numele din PACKAGE BODY e

acelasi cu numele din package_declaration• Pentru a face vizibil intr-un design unit continutul unui package sau

o parte din el (un identificator), trebuie folosita clauza USE inainte de acel design unit. Exista doua forme:– USE nume_package.ALL;– USE nume_package.identifier;– USE nume_package.identifier;

• In primul caz tot continutul package-ul devine vizibil, pe cind in al doilea, doar identificatorul-ul specificat (de exemplu un tip, un subprogram, o componenta, o constanta, etc).

• Constante aminate: uneori dorim ca in PACKAGE declaration doar sa declaram o constanta, fara a-i preciza si valoarea => trebuie sa existe si package body.

• Valoarea constantei va fi precizata abia in package body• Utilitate: in caz ca dorim sa modificam valoarea constantei.

PACKAGE• Daca valoarea constantei e precizata in package declaration si o

modificam, atunci trebuie re-compilat package declaration SI TOATE unitatile de proiectare care il utilizeaza (folosind USE).

• Daca valoarea constantei se da doar in package body, atunci la modificarea acesteia NU mai trebuiesc re-compilate unitatile de proiectare care utilizeaza package declaration-ul folosind clauza USE

• Ce se pune in package body:– Constante aminate– Definitia subprogramelor declarate in package declaration: un

subprogram este doar declarat in package declaration, corpul sau fiind dar in package body. Acesta NU e vizibil in exterior

– Alte item-uri ajutatoare: de ex functii sau tipuri ajutatoare, pe care nu vrem sa le facem vizibile in exterior. Exemplu: declaram o functie care aduna doi vectori de biti si returneaza tot un vector de biti. Ca sa realizam functia avem nevoie de functii de conversie de la vectori de biti la intregi si de la intregi la vectori de biti, pe care le consideram auxiliare si le punem doar in package body.


Recommended