tehnici de proiectare asistat‚a de calculator capitole de...
Post on 25-Jan-2020
9 Views
Preview:
TRANSCRIPT
Tehnici de proiectare asistata de calculatorCapitole de curs
Dr. Doru Todinca
Departamentul CalculatoareUniversitatea “Politehnica” Timisoara
Cuprins
1 Introducere 1
2 Constructori de baza ai limbajului VHDL 4
2.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Entitati (Entity declarations) . . . . . . . . . . . . . . . . . . . . . . 4
2.3 Arhitecturi (Architecture body) . . . . . . . . . . . . . . . . . . . . . 5
2.4 Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3 Elemente de baza ale limbajului VHDL 13
3.1 Identificatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 Obiecte de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3 Tipuri de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3.1 Tipuri scalare . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3.2 Tipuri compuse . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3.3 Subtipuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4 Expresii si operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4 Descrieri structurale. Configuratii 23
4.1 Instructiunea GENERATE . . . . . . . . . . . . . . . . . . . . . . . . 23
Lista figurilor 28
i
Capitolul 1
Introducere
Obiectul cursului de TPAC (Tehnici de Proiectare Asistata de Calculator) va fi lim-
bajul VHDL.
Initialele VHDL provin de la VHSIC Hardware Description Language, iar VHSIC
ınseamna Very High Speed Integrated Cicruits, si a fost un program dezvoltat ın anii
1980 de catre Departamentul Apararii al Statelor Unite, cu scopul de a se realiza
progrese semnificative ın priectarea si dezvoltarea de circuite integrate pe scara larga
si foarte larga.
La programul VHSIC au luat parte un numar mare de companii, care utilizau
diverse formalisme (de obicei limbaje sau unelte proprii) pentru descrierea, simularea
sau sinteza circuitelor integrate. Au aparut astfel probleme legate de schimbul de
informatii ıntre firmele participante la proiect. Solutia propusa a fost dezvoltarea
unui limbaj de descriere hardware (HDL – Hardware Description Language) care sa
permita:
• descrierea unor proiecte sau parti ale unor proiecte ıntr-o forma standardizata
• simularea circuitelor la diverse niveluri de descriere
• sinteza automata a circuitelor descrise ın limbajul respectiv.
Astfel s-a dezvoltat limbajul VHDL, care a fost adoptat ca standard IEEE ın
anul 1987, devenind standardul IEEE Std. 1076-1987. Standardul (limbajul) a fost
re-actualizat ın anul 1993: IEEE Std. 1076-1993.
Descrierea (reprezentarea) unui sistem digital poate fi facuta la diferite niveluri de
abstractizare si ın domenii (planuri) distincte (domeniul comportamental, domeniul
structural si domeniul fizic). Nivelurile de descriere ale unui sistem sau circuit sunt,
ın ordine crescatoare a gradului de abstractizare:
1
CAPITOLUL 1. INTRODUCERE 2
1. circuit: ın domeniul comportamental structural, elementele componente sunt
tranzistoare, rezistoare si capacitoare, iar in domeniul comportamental se uti-
lizeaza ecuatii diferentiale pentru a descrie functionarea acestora.
2. logic: componentele structurale sunt reprezentate de porti logice si bistabile,
iar ın planul comportamental, functionarea sistemului este descrisa de ecuatii
logice booleene.
3. nivelul transferului ıntre registri (Register Transfer sau RT-level, ın limba en-
gleza): ın plan comportamental functionarea e descrisa de operatiile de transfer
ıntre registri, iar ın plan structural, elementele sunt: registre, ALU (unitati
aritmetice si logice), multiplexoare, etc.
4. nivelul sistem: este cel mai abstract nivel de reprezentare. Functionarea e
descrisa prin algoritmi sau procese (de exemplu procese VHDL), iar elementele
structurale sunt unitati centrale (CPU), memorii, magistrale.
In domeniul fizic, nivelul sistem e reprezentat de placi cu circuite, nivelul RT de
macro-celule sau de chip-uri, nivelul logic de celulele standard ale unui producator de
circuite integrate, iar nivelul circuit, de layout-ul tranzistoarelor.
Limbajul VHDL acopera nivelurile 2–4 (de la nivelul logic pana la nivelul sistem),
dar nu si nivelul circuit.
De altfel limbajul VHDL a fost definit ın termeni de simulare si mecanismul de
simulare pentru VHDL este extrem de riguros. Ca o consecinta a definirii seman-
ticii limbajului VHDL ın termeni de simulare, exista instructiuni si constructii ale
limbajului care sunt mai dificil de sintetizat.
In cadrul acestui curs se va studia limbajul VHDL ın primul rand din punct de
vedere al modelarii si simularii sistemelor digitale, fara a se insista pe aspectele legate
de sinteza automaa a circuitelor.
Limbajele de descriere hardware ın general si limbajul VHDL ın particular, au
elemente comune limbajelor de programare de nivel ınalt, cum ar fi structurile de
date si instructiunile, dar au si elemente specifice, care ın mod normal nu se regasesc
ın limbajele de programare de nivel ınalt (Pascal, C, etc). Cele mai importante
elemente specifice limbajelor de descriere hardware sunt:
• mecanismul de simulare, care permite ordonarea evenimentelor, avansul timpu-
lui, etc, astfel ıncat rezultatele simularii sa fie deterministe, adica sa nu depinda
de sistemul de operare, de tipul calculatorului pe care se efectueaza simularea,
etc
CAPITOLUL 1. INTRODUCERE 3
• timpul: ın limbajele de descriere hardware exista si tipul timp (time), reprezen-
tat prin numere ıntregi sau flotante, ın VHDL folosindu-se numere ıntregi, a
caror reprezentare depinde mai putin de implementare decat reprezentarea nu-
merelor flotante
• elementele de descriere structurala: limbajele de descriere hardware permit de-
scrierea felului ın care se leaga ıntre ele componentele unui proiect
• paralelismul (concurenta: deoarece hardware-ul functioneaza concurent, si lim-
bajele de descriere hardware trebuie sa permita modelarea concurena a executiei
proceselor. Limbajul VHDL este un limbaj concurent, dar are si structuri ın
cadrul carora instructiunile se executa secvential (procesele si subprogramele).
Capitolul 2
Constructori de baza ai limbajuluiVHDL
2.1 Introducere
Un circuit sau sistem poate fi modelat ın VHDL sub forma unui set de elemente de
proiectare (design units). Elementele de proiectare existente ın VHDL sunt urma-
toarele:
1. entity declaration – declaratia entitatii sau mai pe scurt, entitatea
2. architecture body – corpul arhitecturii sau arhitectura
3. package declaration
4. package body – corpul package-ului
5. configuration declaration – configuratia
Vom anzliza pe rand constructorii de baza ai limbajului VHDL.
2.2 Entitati (Entity declarations)
O declaratie de entitate specifica numele entitatii si interfata acesteia cu exteriorul,
reprezentata prin porturile sale.
Sintaxa unei declaratii de entitate este:
entity_declaration::=
ENTITY entity_name IS
entity_header
[entity_declarative_part]
4
CAPITOLUL 2. CONSTRUCTORI DE BAZA 5
[BEGIN
entity_statement_part]
END [ENTITY][entity_name];
entity_header::=
[PORT_clause][GENERIC_clause]
Pentru descrierea sintaxei limbajului vom apela la notatia BNF, ın care semnificatia
simbolurilor este:
::= – se defineste
[] – secventa optionala
{} – secventa optionala repetabila
| – alternative logice
Limbajul VHDL nu este “case-sensitive’, adica nu face deosebirea ıntre litere mari
si mici, dar ın acest curs vom scrie cu majuscule cuvintele cheie ale limbajului.
Deci, o declaratie de entitate contine cuvantul cheie ENTITY si numele entitatii,
urmata de un header si, ın mod optional, de o parte de declaratii si de una de
instructiuni, tot optionala. Asupra acestora vom reveni mai tarziu, pe parcursul
cursului.
Headerul entitatii contine clauza PORT, prin care se declara porturile entitatii
(semnalele prin care aceasta comunica cu mediul exterior) si clauza GENERIC. Parametrii
generici apartin clasei constantelor si sunt vizibili ın toate arhitecturile care apartin
unei entitati. Un exemplu tipic de utilizare a lor este pentru a specifica ıntarzierile
care apar pe circuit, ıntre intrarile si iesirile sale.
Declaratia de entitate se ıncheie cu cuvantul cheie END urmat eventual de cuvantul
cheie ENTITY sau/si de numele entitatii. Simbolul ; de la sfarsitul declaratiei este
obligatoriu.
Exemplu:
2.3 Arhitecturi (Architecture body)
Declaratia de entitate nu precizeaza nimic despre implementarea entitatii. Acest lucru
se face utilizand arhitecturile. O entitate poate avea oricate arhitecturi, de exemplu
o arhitectura care o descrie din punct de vedere comportamental si o alta arhitectura
care o descrie din punct de vedere structural.
CAPITOLUL 2. CONSTRUCTORI DE BAZA 6
Sintaxa:
architecture_body::=
ARCHITECTURE architecture_name OF entity_name IS
architecture declarative part
BEGIN
architecture statement part
END [ARCHITECTURE][architecture_name];
Dupa cuvantul cheie ARCHITECTURE urmeaza numele arhitecturii si entitatea
careia ıi este asociata, iar apoi o parte de declaratii.
Corpul arhitecturii se afla ıntre BEGIN si END si contine instructiuni con-
curente, si anume:
• instructiuni PROCESS
• instructiuni BLOCK
• apeluri concurente de proceduri
• instructiuni ASSERT concurente
• asignari concurente de semnale
• instantieri de componente
• instructiuni GENERATE
Observatie: ın VHDL o arhitectura poate contine orice combinatie de descrieri
structurale si comportamentale, dar pentru claritate ın exemplele urmatoare vom
face distinctie ıntre stilul comportamental (concurent sau secvential) si cel structural.
Exemplu: vom descrie un circuit generator de paritate ın trei moduri: structural,
comportamental concurent si comportamental secvential. Circuitul are 4 intrari de
tip BIT (un tip enumerare predefinit ın limbajul VHDL, avand valorile ’0’ si ’1’,
corespunzator celor doua valori din logica booleana) si o iesire, care va avea valoarea
’1’ daca un numar par de intrari au valoarea ’1’, respectiv va avea valoarea ’0’ daca
un numar impar de intrari au valoarea ’1’.
-- fisierul PORTI.vhd
ENTITY poarta_xor IS
GENERIC(del: TIME:=3ns);
CAPITOLUL 2. CONSTRUCTORI DE BAZA 7
PORT(x1,x2: IN BIT;
y: OUT BIT);
END poarta_xor;
ARCHITECTURE behave OF poarta_xor IS
-- simbolul pentru comentariu !
-- declaratii de semnale, etc,
-- NU se pot declara variabile in arhitectura
BEGIN
y <= x1 XOR x2 AFTER del;
END behave;
ENTITY inversor IS
GENERIC(del: TIME:=4ns);
PORT(x: IN BIT;
y: OUT BIT);
END inversor;
ARCHITECTURE behave OF inversor IS
-- declaratii
BEGIN
y <= NOT x AFTER del;
END behave;
Primul fisier contine descrierile celor doua (tipuri de) porti (sau-exclusiv si in-
versor), care vor fi utilizate ın descrierea structurala a generatorului de paritate.
Cele doua entitati contin cate o clauza generic (folosita pentru a declara parametrul
generic del, de tip TIME, ce reprezinta timpul de propagare al fiecarei porti, precum
si o clauza PORT, care specifica porturile fiecarei entitati.
Fiecare din arhitecturi contine o singura instructiune, si anume o asignare con-
curenta de semnal (concurent signal assignement).
Urmatorul fisier contine descrierea entitatii generatorului de aritate si trei arhi-
tecturi ale acestuia.
------------------
--
-- fisier ENTITATE circuit_paritate
CAPITOLUL 2. CONSTRUCTORI DE BAZA 8
--
-------------------
ENTITY circ_paritate IS
PORT(v: IN BIT_VECTOR(3 DOWNTO 0);
y: OUT BIT);
END circ_paritate;
ARCHITECTURE struct OF circ_paritate IS
COMPONENT 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);
PORT(x: IN BIT; y: OUT BIT);
END COMPONENT;
SIGNAL s1, s2, s3: BIT;
BEGIN
xor1: xor_gate PORT MAP(y => s1, x2=> v(1), x1=> v(0));
-- mapare dupa nume
xor2: xor_gate PORT MAP(v(2), v(3), s2); --mapare pozitionala
xor3: xor_gate GENERIC MAP(del => 4ns) PORT MAP(s1, s2, s3);
inv1: inv_gate PORT MAP(x=>s3, y=>y);
END ARCHITECTURE struct;
CONFIGURATION cfg_circ_paritate OF circ_paritate IS
FOR 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;
CAPITOLUL 2. CONSTRUCTORI DE BAZA 9
END CONFIGURATION;
ARCHITECTURE comport_concurent1 OF circ_paritate IS
SIGNAL t1, t2, t3: BIT;
BEGIN
y<=NOT t3 AFTER 11ns;
t3<=t2 XOR t1;
t2<=v(2) XOR v(3);
t1<=v(0) XOR v(1);
END;
ARCHITECTURE comport_concurent2 OF circ_paritate IS
BEGIN
y<= NOT(v(0) XOR v(1) XOR v(2) XOR v(3) ) AFTER 11ns;
END ARCHITECTURE;
Entitatea circ paritate are o iesire y, pe un bit si o intrare v, care este un vector
de 4 biti (BIT V ECTOR este un tip predefinit ın VHDl si este un tablou de biti de
dimensiune nespecificata – unconstrainned array).
Arhitectura struct prezinta o descriere structurala a circuitului. In partea de
declaratii a arhitecturii se declara componentele care vor fi utilizate, adica o poarta
de tip sau-exclusiv, (componenta xor gate) si o componenta inversor inv gate. Se
observa ca numele componentelor difera de numele entitatilor (poarta xor si inversor).
Numele porturilor sunt la fel ca la entitati, dar ın general pot sa difere. De asemenea
se mai declara 3 semnale interne, s1, s2 si s3, care sunt folosite ın corpul arhitecturii,
pentru interconectarea componentelor.
Corpul arhitecturii struct contine doar instructiuni de instantiere de componente,
si anume 3 instantieri ale portii sau-exclusiv si o instantiere a inversorului. Fiecare
instructiune de instantiere de componente are o eticheta (label), care este obligato-
rie, urmata de precizarea tipului componentei care este instantiata si de maparea
genericelor si a porturilor.
Daca se face si maparea genericelor, atunci pentru instanta respectiva a componen-
tei, valoarea parametrului generic va fi cea precizata prin GENERIC MAP, iar daca
GENERIC MAP lipseste, atunci se pastreaza valoarea de la declarare a parametrului
CAPITOLUL 2. CONSTRUCTORI DE BAZA 10
generic.
Maparea porturilor consta ın a stabili corespondenta ıntre portul formal din declaratia
de componenta si portul actual, care este semnalul care se leaga la portul respectiv.
Portul actual poate fi sau un semnal intern sau un port al entitatii care este descrisa
(circ paritate ın cazul nostru). Daca portul formal este un port al entitatii, atunci
exista reguli care precizeaza ce fel de port actual ıi corespunde unui port formal (tre-
buie sa corespunda tipul lor si directia : IN, OUT, INOUT, etc). Nu se poate lega
un port formal OUT la un port actual IN (sau un IN la un OUT). Mai multe detalii
se vor prezenta ın capitolul de modelare structurala.
Maparea porturilor se poate face dupa nume, ca ın cazul instructiunilor cu etichetele
xor1 si inv1 sau pozitional, cum se ıntampla la instructiunile cu etichetele xor2 si
xor3. La maparea dupa nume se precizeaza numele portului formal, simboluk =>,
urmat de numele portului actual, iar ordinea ın care se mapeaza porturile nu con-
teaza. La maparea pozitionala nu mai apar numele portutilor formale, ci pe pozitia
corespunzatoare portului formal din declaratia componentei se trece numele portului
actual care se mapeaza la acel port actual..
Observatii:
1. Este important sa nu se confunde simbolukl =>, folosit la maparea dupa nume,
cu simbolul <=, utilizat la instructiunile de asignare de semnal.
2. “Directia’ simbolului => este ıntotdeauna de la portul formal spre portul
actual, indiferent de directia porturilor (IN¡ OUT sau INOUT).
3. Maparea pozitionala poate fi o sursa de erori foarte greu de detectat !! Com-
pilatorul nu semnaleaza eroare daca unui port formal i se asociaza un alt port
actual avqnd decat cel dorit, dar avand modul (directia) si tipul compatibile cu
portul actual (de exemplu, daca la intrarea de reset a unui circuit se mapeaza
semnalul extern de clock).
La descrierea structurala se foloseste si o configuratie (configuration declara-
tion), care face legatura (binding) ıntre componentele declarate ın arhitectura struct
si perechole entitate - arhitectura asociate componentelor respective. In exemplul
nostru, componentei xor gate i se asociaza entitatea poarta xor cu arhitectura be-
have, iar componentei inv gate i se asociaza entitatea inversor cu arhitectura behave.
Asupra configuratiilor vom reveni mai pe larg ıntr-un capitol ulterior.
Se observa ca nu conteaza ordinea ın care apar instructiunile de instantiere de
componente.
CAPITOLUL 2. CONSTRUCTORI DE BAZA 11
Arhitectura comport concurent1 foloseste 4 instructiuni de asignare concurenta
de semnale si se observa ca se poate stabili o corespondenta ıntre ecuatiile logice din
aceasta arhitectura si portile logice din arhitectura struct. Deoarece cele 4 instructiuni
de asignare de semnal sunt concurente, nu conteaza ordinea ın care sunt scrise.
Arhitectura comport concurent2 foloseste o singura asignare concurenta de sem-
nal, scriind ıntr-o forma mai condensata ecuatiile logice din arhitectura comport concurent1.
Intr-un alt fisier a fost descrisa o arhitectura comportamentala secventiala a en-
titatii circ paritate, dupa cum urmeaza:
----------------
--
--fisier arhitectura
--contine arhitectura "comport_secvential" a entiatatii "circ_paritate"
--
----------------
ARCHITECTURE comport_secvential OF circ_paritate IS
BEGIN
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;
FOR i IN 0 TO 3 LOOP
IF v(i)=’1’ THEN
nr_de_1 := nr_de_1 +1;
-- nu exista operatori ++, +=, etc :)
END IF;
END LOOP;
IF nr_de_1 MOD 2=0 THEN
CAPITOLUL 2. CONSTRUCTORI DE BAZA 12
y<= ’1’ AFTER 1 ns;
ELSE
y<=’0’ AFTER 1 ns;
END IF;
END PROCESS;
END;
Arhitectura contine o singura instructiune, instructiunea compusa PROCESS,
care are o parte de declaratii si corpul procesului, ıntre BEGIN si END PROCESS.
‘In partea de declaratii se declara variabila nr de 1, de tip INTEGER, care este si
initializata cu zero.
Instructiunile din cadrul unui proces se executa ın mod secvential (ın ordinea
ın care sunt scrise). In acest exeplu apar instructiuni de asignare de variabil, de
ciclare si instructiuni IF. Se observa ca nu exista nici o legatura ıntre arhitectura
comport secvential si posibilele scheme hardare care descriu functionarea genera-
torului de paritate, descrierile comportamentale secventiale avand de obicei un nivel
de abstractizare mai ınalt decat descrierile comportamentale concurente sau decat
cele structurale.
2.4 Package
Observatie: nu am gasit o traducere potrivita pentru “package”.
Un PACKAGE declaration (declaratie de package) este o colectie de declaratii de
subprograme, tipuri, constante, componente etc, grupate astfel ıncat diverse unitati
de proiectare sa le poata utiliza.
Corpul unui package (PACKAGE BODY) contine detaliile “ascunse” ale imple-
mentarii unui package, care nu sunt vizibile din exterior (ın mod tipic corpul sub-
programelor, eventual subprograme auxiliare, care ajuta doar la implementarea celor
declarate ın partea de declaratii a package-ului).
Pentru a face vizibil continutul unui package se folosesc clauze USE, ın una din
formele:
USE package_name.identifier;
USE package_name.ALL;
Prima forma face vizibil doar identificatorul respectiv, iar a doua forma face viz-
ibile toate declaratiile din package declaration.
Si asupra package-lor se va reveni ıntr-un capitol viitor.
Capitolul 3
Elemente de baza ale limbajuluiVHDL
Elementele de baza ale limbajului VHDL sunt obiectele de date (data objects) care
pot avea diferite tipuri de date, literalii (constante) si operatorii.
Limbajul VHDL este puternic tipizat si nu permite operatii ıntre ıntregi si reali
sau ıntre elemente de tip BIT si de tip BOOLEAN.
3.1 Identificatori
In VHDL exista doua tipuri de identificatori: de baza si extinsi. Un identificator de
baza este compus dintr-o secventa de unul sau mai multe caractere (litere mari si mici,
cifre si caracterul underscore “ ”). Primul caracter trebuie sa fie o litera, iar ultimul nu
poate fi underscore, de asemenea nu pot aparea doua caractere underscore succesive.
NU se face deosebire ıntre litere mari si mici. Nu este permis ca un identificator de
baza sa aiba acelasi nume ca si un cuvant rezervat al limbajului.
Un identificator extins consta ıntr-o secventa de caractere cuprinsa ıntre doua
caractere backslash, de exemplu \test\ sau \2c\.Comentarii Comentariile ın VHDL ıncep de la secventa −− si se continua pana
la sfsitul randului curent.
3.2 Obiecte de date
Obiectele de date contin valori de un anumit tip si sunt create printr-o declarare de
obiect (object declaration). In VHDL exista urmatoarele patru clase de obiecte de
date:
13
CAPITOLUL 3. ELEMENTE DE BAZA ALE LIMBAJULUI VHDL 14
1. Constante. O constanta este initializata la declararea sa si nu ısi schimba val-
oarea ın timpul executiei programului. Exemplu:
CONSTANT pi: REAl:=3.14159;
O constanta primeste o valoare ınaintea simularii. Constantele declarate ın
subprograme sunt initializate la fiecare apelare a subprogramului.
In VHDL exista si constante amanate (deferred constants). Acestea pot apare
doar ın package-uri, si anume sunt declarate ın PACKAGE declaration, dar nu
sunt initializate decat ın PACKAGE BODY.
Se pot declara constante ın package-uri, ın entitati, arhitecturi, procese si sub-
programe. Parametrii generici apartin implicit clasei constantelor.
2. Variabile. Spre deosebire de constante, valoqrea unei variabile poate fi modifi-
cata si dupa declarare. Ca si constantele, o variabila are la un moment dat o
singura valoare. La declararea unei variabile aceasta poate fi initializata ın mod
explicit, sau daca nu, variabila va fi initializata implicit (cu valoarea cea mai
din stanga a tipului variabilei). Spre deosebire de semnale, atunci cand se exe-
cuta o instructiune de asignare de variabila, valoarea variabilei se actualizeaza
instantaneu.
Se pot declara variabile DOAR ın procese si subprograme. In VHDL 93 a fost
introduse variabile globale, dar nu se recomanda utilizarea lor deoarece sunt o
sursa de nedeterminism.
3. Semnale. Semnalele se folosesc pentru a lega partile unui proiect: semnalele
sunt obiecte prin intermediul carora se face comunicarea ıntre procese si ıntre
subcomponentele unei entitati.
Spre deosebire de constante si variabile, un semnal nu are doar o singura valoare
la un moment dat, ci are o forma de unda proiectata constand din perechi
(valoare, moment de timp). Spre deosebire de variabile, valoarea unui semnal
NU se actualizeaza instantaneu ın urma executiei unei instructiuni de asignare
de semnal, ci doar se planifica un set de valori pentru semalul respectiv.
NU se pot declara semnale ın procese si subprograme, ci doar ın package, entitati
si arhitecturi. Porturile unei entitati apartin implicit clasei semnalelor. Un
semnal poate fi initializat explicit la declararea sa, altfel va fi initializat implicit,
conform acelorlasi reguli ca si ın cazul variabilelor. Exemplu de initializare
explicita:
CAPITOLUL 3. ELEMENTE DE BAZA ALE LIMBAJULUI VHDL 15
SIGNAL x: INTEGER:=-5;
4. Fisiere. Fisierele vor fi discutate ıntr-un capitol ulterior.
Parametrii formali ai unei functii pot sa fie constante sau semnale, iar parametrii
formali ai unei proceduri pot apartine oricarei clase.
3.3 Tipuri de date
Un tip de date este un nume asociat cu un set de valori si un set de operatii. In VHDL
exista tipuri predefinite care sunt descrise ın package-ul STANDARD, de asemenea
se pot defini noi tipuri.
Pot exista urmatoarele categorii de tipuri:
1. tipuri scalare
2. tipuri compuse, care pot fi tipuri tablou (ARRAY): toate elementele sunt de
acelasi tip, sau RECORD: elementele au tipuri diferite
3. tipuri ACCESS (pointeri)
4. tipuri fisier (FILE types).
In acest capitol ne vom referi doar la tipuri scalare si la tipuri compuse.
3.3.1 Tipuri scalare
Exista urmatoarele tipuri scalare:
• tipuri enumerare
• tipuri ıntregi
• tipuri flotante
• tipuri fizice
Tipuri enumerare
Contin un set de valori definite de catre utilizator. Exemplu:
TYPE state IS (ready, waiting, run);
Tipuri enumerare predefinite:
CAPITOLUL 3. ELEMENTE DE BAZA ALE LIMBAJULUI VHDL 16
• CHARACTER
• BIT, cu valorile ′0′ si ′1′
• BOOLEAN cu valorile FALSE si TRUE
• SEVERITY LEVEL cu valorile (NOTE, WARNING, ERROR, FAILURE)
In package-ul std logic 1164 exista
TYPE std_ulogic IS (’U’, ’X’, ’0’, ’1’, ’Z’, ’W’, ’L’, ’H’, ’-’);
Fiecarui element al unui tip enumerare ıi corespunde pozitia sa ın cadrul tipului:
cel mai din stanga element are pozitia 0, iar apoi valoarea pozitiei se incrementeaza
de la stanga spre dreapta.
Tipuri ıntregi
Contin un set de valori ıntregi ıntr-un anumit domeniu. Exemplu:
TYPE index IS RANGE 0 TO 7;
TYPE small IS RANGE -10 TO 10;
Tipul INTEGER e predefinit ın limbaj, continand valori cel putin ıntre −(231−1)
si (231 − 1)). Doimeniul numerelor ıntregi e dependent de implementare, dar trebuie
sa acopere intervalul specificat.
Tipurile ENUMERARE si INTREGI se numesc TIPURI DISCRETE.
Tipuri flotante
Tipurile flotante (floating point type) aproximeaza numerele reale, precizia reprezentarii
fiind dependenta de implementare. Definirea unui astfel de tip ınseamna definirea
domeniului valorilor, ca ın exemplul urmator:
TYPE level IS -1.00 TO 1.00;
Tipul REAL e predefinit, avand domeniul de valori dependent de implementare,
dar cel putin ıntre −1.0E38 si 1.0E38.
CAPITOLUL 3. ELEMENTE DE BAZA ALE LIMBAJULUI VHDL 17
Tipuri fizice
Sunt tipuri numerice folosite pentru a reprezenta marimi fizice cum ar fi: timpi,
lungimi, curenti, tensiuni etc.
Declaratia unui tip fizic include specificarea unei unitati de baza si eventual a unor
unitati secundare care sa fie multipli ıntregi ai unitatii de baza.
In VHDL tipul TIME este un tip fizic predefinit, ca ın exemplul de mai jos. De
asemenea se mai prezinta un alt exemplu de tip fizic, curent:
TYPE TIME IS RANGE -2,147_483_647 TO 2_147_483_647
-- implementation dependent
UNITS
fs; -- femtosecond (unitate de baz’a)
ps = 1000 fs; -- picosecond
ns = 1000 ps; -- nano
us = 1000 ns; -- micro
ms = 1000 us; -- milliseconds
sec = 1000 ms;-- second
min = 60 sec;
hr = 60 min;
END UNITS;
TYPE current IS RANGE 0 TO 1E9
UNITS
nA; --nano ampere
ua = 1000 nA;
mA = 1000 ua;
Amp = 1000 mA;
END UNITS;
3.3.2 Tipuri compuse
Tipuri tablou
Un tip tablou este un tip compus din elemente de acelasi tip. Numele unui element
de tip tablou poate contine unul sau mai multi indici pentru a putea fi accesat. Un
tablou poate avea oricate dimensiuni. Limbajul permite ca unui obiect de tip tablou
sa ıi fie asignata ca valoare un alt obiect de tip tablou ıntr-o singura instructiune de
asignare.
CAPITOLUL 3. ELEMENTE DE BAZA ALE LIMBAJULUI VHDL 18
Exemple:
TYPE address_word IS ARRAY (0 TO 23) OF BIT;
TYPE data_word IS ARRAY (0 TO 7) OF BIT:
TYPE ROM_mem IS ARRAY(0 TO 125) OF data_word;
TYPE RAM_meme IS ARRAY(125 DOWNTO 0, 125 DOWNTO 0) OF BIT;
-- Daca avem urmatoarele declaratii:
VARIABLE rom1: ROM_mem;
VARIABLE ram1: RAM_mem;
--Pentru doi indecsi intregi i si j, un element al celor doua
--tablouri va fi accesat astfel:
rom1(i)(j):= ’0’;
ram1(i,j):=’1’;
-- rom1(i) este un vector de 8
--biti, iar ram1(i) este un vector de 125 de biti.
ram1(3):=(OTHERS=>’1’);
-- toti cei 125 de biti primesc valoarea ’1’
-- (OTHERS=>’1’) se numeste aggregate value (valoare agregata)
Exista si tablouri de dimensiuni nelimitate (unconstrained arrays). Ele sunt
folosite ın mod obligatoriu pentru functii de rezolutie (o functie de rezolutie are ca
unic parametru de intrare un unconstrained array al tipului de baza si returneaza tipul
de baza). De asemenea sunt utile pentru proceduri si functii de conversie. Exemplu:
TYPE stacktype IS ARRAY(INTEGER RANGE <>) OF data_word;
In VHDL exista predefinite:
TYPE BIT_VECTOR IS ARRAY(NATURAL RANGE <>) OF BIT;
TYPE STRING IS ARRAY(POSITIVE RANGE <>) OF CHARACTER;
CAPITOLUL 3. ELEMENTE DE BAZA ALE LIMBAJULUI VHDL 19
Tipuri ınregistrare (RECORD)
Descriu obiecte ce contin elemente de tipuri diferite.
Exemplu:
TYPE features IS RECORD
size: RANGE 100 TO 200;
price: RANGE 20.0 TO 200.0;
delay: TIME;
VARIABLE x1, x2: features;
--Se pot face urmatoarele asignari:
x1:=(70, 37.5, 40ns); --aggregate
x2:=x1;
x2.delay:=15ns;
3.3.3 Subtipuri
Un subtip se obtine dintr-un tip de baza prin specificarea valorii unei constrangeri.
Operatiile care se pot face cu elementele unui subtip sunt aceleasi ca si pentru tipul
de baza.
Exemple:
SUBTYPE small_int IS INTEGER RANGE -9 TO 9;
--INTEGER e tipul de baza, iar
--RANGE -9 TO 9 este constrangerea
SUBTYPE bit8 IS BIT_VECTOR(7 DOWNTO 0);
SUBTYPE bit32 IS BIT_VECTOR(31 DOWNTO 0);
-- Subtipuri predefinite in limbaj:
SUBTYPE NATURAL IS INTEGER RANGE 0 TO INTEGER’HIGH;
SUBTYPE POSITIVE IS INTEGER RANGE 1 TO INTEGER’HIGH;
--unde INTEGER’HIGH este valoarea maxima a tipului INTEGER
Se pot defini si subtipuri fara constrangeri, care sunt ca si un alt nume dat tipului
de baza:
SUBTYPE intregi IS INTEGER;
CAPITOLUL 3. ELEMENTE DE BAZA ALE LIMBAJULUI VHDL 20
3.4 Expresii si operatori
Expresiile sunt formule care descriu calculul unei valori. Expresiile combina elemente
primare cu operatori. Elementele primare pot fi obiecte de date. apeluri de functii,
expresii cu paranteze.
In expresii se pot ıntalni urmatoarele categorii de operatori:
1. logici
2. relationali
3. de deplasare si rotire (shift operators)
4. de adunare
5. de multiplicare
6. combinati
Precedenta operatorilor creste de la 1 la 6.
Operatori logici
Acestia sunt: AND, OR, NAND, NOR, XOR, XNOR, NOT. Ei sunt definiti pentru
operanzi de tip BIT sau BOOLEAN sau pentru tablouri unidimensionale cu elemente
de tip BIT sau BOOLEAN. Operatorii de tip AND si OR sunt de tip scurtcircuit,
adica, pentru operatorul AND, daca unul din operanzi este sau FALSE) restul ex-
presiei nu se mai evalueaza. La fel pentru operatorul OR, daca un operand este sau
TRUE), rezultatul expresiei este imediat evaluat la sau TRUE).
Atentie, operatorii NAND si NOR nu sunt asociativi si din aceasta cauza o expresie
de forma:
a NAND b NAND c
este ilegala !
Operatorul unar NOT are aceeasi precedenta ca si operatorii combinati.
Operatori relationali
Sunt:
• =
CAPITOLUL 3. ELEMENTE DE BAZA ALE LIMBAJULUI VHDL 21
• / =
• <
• <=
• >
• >=
Operatorii de egalitate (=) si inegalitate (/ =) sunt definiti pentru orice tip cu
exceptia fisierelor, iar ceilalti operatori relationali sunt definiti pentru orice tip scalar
sau pentru tablouri unidimensionale cu elemente de tip discret (enumerare sau intregi)
(tablouri discrete). Pentru tablouri discrete comparatia se face element cu element
de la stanga spre dreapta.
Operatori de deplasare si rotire
Operandul din stanga este un tablou cu elmente de tip BIT sau BOOLEAN, iar
operandul din dreapta este un numar ıntreg. Daca operandul din dreapta este un
numar negativ, atunci se executa operatia opusa (deplasarea sau rotirea la stanga cu
un numar de pozitii devine deplasare, respectiv rotire la dreapta cu acelasi numar de
pozitii).
Operanzıi sunt: SLL, SRL (deplasare logica la dreapta, respectiv la stanga), SLA,
SRA (deplasare aritmetica la stanga, respectiv dreapta), ROL - rotire la stanga si
ROR rotire la dreapta.
Operatori de adunare
Operatorii de adunare sunt + − &. Pentru primii doi operatori operanzii trebuie sa fie
ambii de acelasi tip numeric, iar rezultatul are acelasi tip ca si operanzii. Operatorii
+ si − mai pot fi folisiti ca operatori unari, de semn, ın acest caz avand o precedenta
mai mare decat a operatorilor binari. Operatorul & este utilizat pentru concatenarea
sirurilor.
Operatori de multiplicare
Opratorii de multiplicare sunt: ınmultire ∗, ımpartire /, modulo MOD si rest REM
(reminder). Operatorii de ınmultire si ımpartire sunt definiti pentru operanzi de
acelasi tip, fie ıntreg fie flotant, iar rezultatul are tipul operanzilor. Operatorul de
ınmultire poate avea un operand de tip ıntreg sau flotant si unul de tip fizic, iar
CAPITOLUL 3. ELEMENTE DE BAZA ALE LIMBAJULUI VHDL 22
rezultatul va fi de tip fizic. Se permite ımpartirea a doi operanzi avand acelasi tip
fizic, iar rezultatul este de tip ıntreg.
Operatorii MOD si REM sunt pentru operanzi de tip ıntreg si determina restul
ımpartirii, tot de tip ıntreg. Rezultatul unei operatii REM are semnul primului
operand: a REM b = a − (a/b) ∗ b, iar rezultatul operatiei MOD are semnul celui
de-al doilea operand. Operatia a MOD b se defineste astfel: exista un numar ıntreg
n astfel ıncat a MOD b = a− b ∗ n.
Exemple: (−7)REM4 = (−7)REM(−4) = −3, 7MOD(−4) = −1.
Operatori combinati
Cei doi operatori combinati sunt ABS, care determina valoarea absoluta a operandu-
lui si este definit pentru orice tip numeric si ∗∗: operatorul de putere (exponential),
la care operandul din stanga poate fi ıntreg sau flotant, iar operandul din dreapta
(exponentul) este de tip ıntreg. Asa cum s-a mentionat mai ınainte, operatorul logic
NOT are aceeasi precedenta ca si ABS si operatorul putere.
Capitolul 4
Descrieri structurale. Configuratii
4.1 Instructiunea GENERATE
Consideram un bistabil de tip D reprezentat prin entitatea dff_1, arhitectura behave
si avand configuratia implicita dff_cfg:
ENTITY dff_1 IS
GENERIC(tp: time:=1ns);
PORT(d, clk, reset: IN BIT;
q, qb: OUT BIT);
END dff_1;
ARCHITECTURE behave OF dff_1 IS
BEGIN
PROCESS(reset, clk, d)
BEGIN
IF(reset=’0’) AND reset’EVENT THEN
q<=’0’ AFTER tp;
qb<=’1’ AFTER tp;
ELSIF(clk=’1’) AND clk’EVENT AND clk’LAST_VALUE=’0’ THEN
q<= d AFTER tp;
qb<=NOT d AFTER tp;
END IF;
END PROCESS;
END ARCHITECTURE;
CONFIGURATION dff_cfg OF dff_1 IS
FOR behave END FOR;
23
CAPITOLUL 4. DESCRIERI STRUCTURALE. CONFIGURATII 24
END CONFIGURATION;
Instructiunea GENERATE este utilizata in special pentru descrierea structurilor
regulate si reprezinta un mecanism de compliare conditionata ın VHDL.
Sintaxa instructiunii este:
label_id: generation_scheme GENERATE
concurrent_statements
END GENERATE [label_id];
Schema de generare (generation scheme) poate fi de tip FOR sau IF. Daca este de
tip FOR, indexul utilizat nu trebuie declarat, iar daca schema este de tip IF, acesta
nu are ramuri ELSIF sau ELSE. De asemenea, IF si FOR nu au nici o semantica de
executie (nici o legatura cu instructiunile secventiale IF si LOOP).
Instructiunile concurente din corpul lui GENERATE sunt ın mod tipic (dar nu
neaparat) instantieri de componente. Compilatorul expandeaza codul din interiorul
lui GENERATE. De exemplu daca se utilizeaza o schema de generare de tip FOR cu
5 iteratii si ın corpul lui GENERATE se utilizeaza o instructiune de instantiere de
componenta, atunci vor aparea 5 instantieri de componenta ın codul expandat.
Se va prezenta un exemplu de utilizare a instructiunii GENERATE.
Cu ajutorul bistabil descris mai ınainte dorim sa descriem un registru de deplasare
pe 4 biti, utilizand instructiunea GENERATE.
O posibila descriere a registrului de deplasare ar fi:
-- Instructiunea GENERATE cu
-- schema de generare de tip FOR
ENTITY shift_reg IS
GENERIC(len: NATURAL:=4);
PORT(reset, clock, a: IN BIT; b:OUT BIT);
END shift_reg;
ARCHITECTURE shift_gen_1 OF shift_reg IS
COMPONENT dff IS
GENERIC(tp:TIME:=1ns);
PORT(d, clk, reset: IN BIT;
q, qb: OUT BIT);
END COMPONENT;
CAPITOLUL 4. DESCRIERI STRUCTURALE. CONFIGURATII 25
SIGNAL z: BIT_VECTOR(0 TO 4);
BEGIN
z(0)<=a;
g: FOR i IN 0 TO 3 GENERATE
dffx: dff PORT MAP(z(i), clock, reset, z(i+1), OPEN);
END GENERATE;
b<=z(4);
END shift_gen_1;
Dezavantajul acestei descrieri este ca nu sunt tratate unitar, ın cadrul instructiunii
GENERATE, bistabilele de la capetele registrului de deplasare. Acest lucru se poate
face combinand schema de generare de tip FOR cu scheme de tip IF:
-- Instructiunea GENERATE cu scheme de generare de tip
-- FOR si IF
ARCHITECTURE shift_gen_2 OF shift_reg IS
COMPONENT dff IS
GENERIC(tp:TIME:=1ns);
PORT(d, clk, reset: IN BIT;
q, qb: OUT BIT);
END COMPONENT;
SIGNAL z:BIT_VECTOR(1 TO len-1);
BEGIN
g1: FOR i IN 0 TO (len-1) GENERATE
g2: IF i=0 GENERATE
dffx: dff PORT MAP(d=>a, clk=> clock,
reset=>reset, q=>z(1), qb=>OPEN);
END GENERATE g2;
g3: IF i=(len-1) GENERATE
dffx: dff PORT MAP(d=>z(len-1), clk=>clock,
reset=>reset, q=>b, qb=>OPEN);
END GENERATE; --g3
g4: IF (i>0) AND (i<len-1) GENERATE
dffx: dff PORT MAP(z(i), clock,
CAPITOLUL 4. DESCRIERI STRUCTURALE. CONFIGURATII 26
reset, z(i+1), OPEN);
END GENERATE g4;
END GENERATE; -- g1
END ARCHITECTURE shift_gen_2;
Configuratia pentru registrul de deplasare se poate face ın felul urmator:
-- Configuratia pentru arhitectura shift_gen_2 va fi:
CONFIGURATION cfg_gen OF shift_reg IS FOR shift_gen_2
FOR g1
FOR g2
FOR ALL: dff USE CONFIGURATION WORK.dff_cfg;
END FOR;
END FOR;--g2
FOR g3
FOR ALL: dff USE ENTITY WORK.dff_1(behave);
END FOR;
END FOR;--g3
FOR g4
FOR ALL: dff USE ENTITY WORK.dff_1(behave);
END FOR;
END FOR;--g4
END FOR; -- g1
END FOR; -- shift_gen_2 END cfg_gen;
Un exemplu de entitate de test a registrului de deplasare:
entity test_shift_reg is
end;
architecture a_test of test_shift_reg is
COMPONENT shift_reg IS
GENERIC(len: NATURAL:=4);
PORT(reset, clock, a: IN BIT; b:OUT BIT);
END COMPONENT;
SIGNAL insig, r, cl, outsig: BIT;
BEGIN
l: shift_reg PORT MAP(r, cl, insig, outsig);
CAPITOLUL 4. DESCRIERI STRUCTURALE. CONFIGURATII 27
cl<=NOT cl AFTER 50ns;
r<=’1’, ’0’ after 3ns, ’1’ after 40ns;
insig<=’1’ after 145ns, ’0’ after 380ns, ’1’ after 1680ns;
end;
configuration cfg_test of test_shift_reg is
for a_test
for l: shift_reg use configuration work.cfg_gen;
end for;
end for;
end cfg_test;
Lista figurilor
28
top related