2.Tipuri de date si obiecte

In VHDL exista doua feluri de tipuri: tipuri SCALARE si tipuri COMPUSE.

Tipurile scalare includ numere, cantitati fizice si enumerari, si tipuri predefinite. Tipurile compuse sint vectori si inregistrari. In VHDL sint definite si tipurile 'access' (pointeri) si 'file' (fisiere).

declaratie_de_tip :.= type identificator is tip

tip ::= tip_scalar

tip_compus

tip_access

tip_file

tip_scalar ::= tip_enumerare I tip-intreg I tip_real tip_fizic

tip-compus ::= tip_tablou I tip_inregistrare

a)Tip intreg:

Tipul intreg reprezinta o multime de numere intregi dintr-un interval specificat. Sintaxa este:

tip_intreg ::= multime_in_interval

multime_in_interval ::= range

interval interval ::= expresie_simpla directie expresie_simpla

directie :.= to I downto

Expresiile care specifica intervalul trebuie sa aiba valori intregi. Limitele intervalului sint cuprinse intre -2147483647 si +2147483647.

Exemple:

type byte_int is range 0 to 255;

type signed is range -32768 to 32767;

type bit_index is range 31 downto 0;

Exista tipul predefinit 'integer', care reprezinta numere intregi cuprinse intre -2147483647 si +2147483647.

 

b)Tip fizic:

Tipul fizic este un tip numeric de reprezentare a unor cantitati fizice (lungime, timp, volti). Declaratia de tip include specificarea unei unitati de masura de baza si eventual un numar de unitati de masura secundare, care reprezinta multiplii ai unitatii de baza. Sintaxa este:

tip_fizic ::= constructor_interval

units

unitate_de_baza

{unitati secundare}

end units

unitate_de baza ::= identificator;

unitati_secundare ::= identificator = literal_fizic;

literal_fizic :.= [literal_abstract]nume_unit;

Exemple:

type length is range 0 to 1E9

units

um;

mm = 1000 um;

cm = 10 mm;

m = 1000 mm;

end units;

type resistance is range 0 to 1E8

units

ohms;

kohms = 1000 ohms;

Mohms = 1E6 ohms;

end units;

Exista tipul predefinit 'time', folosit in simulari VHDL pentru specificarea intirzierilor.

type time is range interval_maxim_din_implementare

units

fs;

ps = 1000 fs;

ns = 1000 ps;

us = 1000 ns;

ms = 1000 us;

sec = 1000 ms;

min = 60 sec;

hr = 60 min;

end units;

Un numar de tip fizic se scrie: valoare unitate.

Exemple:

10 mm 1200 ohm 23 ns

c)Tip real:

Tipul real reprezinta o aproximare discreta a setului de numere reale ditrun interval specificat. Precizia de aproximare nu a definita de limbajul VHDL standard, dar numarul trebuie sa aiba maxim 6 cifre. Intervalul a cuprins intre -1E38 to + 1E38. Sintaxa: tip real :.= constructor interval

Exemple:

type signal level is range -10.00 to +10.00;

type probability is range 0.0 to 1.0;

Exista un tip predefinit 'real'. Intervalul de valori este predefinit si include valorile cuprinse intre -1E38 si +1E38.

 

 

d)Tip enumerare:

Tipul enumerare este o multime ordonata de identificatori sau caractere. Identificatorii si caracterele din cadrul unei enumerari trebuie sa fie distincti, dar pot fi 'refolositi' in enumerari diferite. Sintaxa este:

tip_enumerare ::= (enumeraref{,enumerare})

enumerare ::= identificator I caracter

Exemple:

type logic level is (unknown,low,undriven,high);

type alu_function is (disable,pass,add,substract,multiply,divide);

type octal_digit is (‘0',’1’,’2’,’3’,’4','5',’6’,’7’);

Exista o serie de tipuri de enumerari predefinite:

type severity-level is (note,warning,error,failure);

type boolean is (false,true);

type bit is ('0','1');

type character is (

NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL,

BS, HT, LF, VT, FF, CR, SO, SI,

DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB,

CAN, EM, SUB, ESC, FSP, GSP, RSP, USP,

‘ ‘, ‘!’, … ‘z’, ‘{‘, ‘|’, ‘}’ , ‘~’, DEL);

I

e)Tablouri :

In VHDL, un tablou e o colectie indexata de elemente de acelasi tip. Tablourile pot fi unidimensionale sau multidimensionale. Un tablou poate avea dimensiunea definita la declarare sau nedefinita, urmind ca indicele sa is valori definte ulterior. Sintaxa este:

tip_tablou ::= tablou dim-nedefinita I tablou_dim_definita

tablou dim_nedefinita ::=array (subtip-index{,subtip-index})

of subtip element

tablou dim _definita ::= array multime_index of subtip_element

subtip-index ::= tip range <>

multime_index ::=(interval _discret{,interval_discret})

interval discret ::= subtip discret I interval

Exemple:

type word is array (31 downto 0) of bit;

type memory is array (address) of word;

type transform is array (1 to 4,1 to 4) of real;

type register _bank is array (byte range 0 to 132) of integer;

type vector is array (integer range <>) of real;

Simbolul ' < >' poate fi vazut ca o 'locatie' pentru index, care va fi 'umpluta' atunci cind a folosit vectorul. De exemplu, un obiect a declarat vector de 20 de elemente astfel:

vector(1 to 20).

Exista doua tipuri predefinite de tablouri (vectori):

type string is array (positive range <>) of character;

type bit vector is array (natural range <>) of bit;

Tipul 'bit vector' a folosit la simularea sistemelor digitale.

Un element al tabloului poate referit prin indexarea numelui tabloului. De exemplu, fie a si b doua tablouri de dimensiuni 1 si, respectiv, 2. Atunci a(1) si b(l,1) se refera la elementele tablourilor. Se pot referi si parti continue din tablouri, de exemplu a(8 to 15) este un vector de 8 elemente care a inclus in vectorul a.

Fie un tip de tablou declarat astfel:

type a is array (1 to 4) of character;

si vrem sa scriem un vector de acest tip, care sa contina elementele 'f, 'o', 'o', 'd' in aceasta ordine. Putem scrie astfel: ('f' 'o' 'o' 'd') in care elementele sunt in ordinea crescatoare a indicelui.

O alta varianta ar fi aceasta: (1=>'f',3=>'o',4=>'d',2=>'o')

In acest caz, este dat explicit indicele pentru fiecare element, care pot fi deci in orice ordine. Ambele variante pot fi folosite in cadrul scrierii aceluiasi tablou. Se poate folosi si cuvintul 'others', in locul indexului, care indica spre o valoare folosita pentru toate elementele care nu au fost mentionate explicit.

De exemplu: ('f',4=>'d',others=>'o')

f)Inregistrari:

Inregistrarile in VHDL sint colectii de elemente, care pot avea tipuri diferite. Sintaxa este:

 

 

tip_inregistrare ::=

record

element

{element}

end record

element ::= lista_identificatori : subtip_element;

lista identificatori ::= identificatorf{,identificator}

subtip element ::= subtip

Exemple:

type instruction is

record

op_code : processor_op;

address mode : mode;

operand1,operand2 : integer range 0 to 15;

end record;

Fie o inregistrare r si un cimp f in aceasta inregistrare. Acel cimp poate fi referit cu numele 'r.f’

g)Subtipuri:

Subtipurile reprezinta tipuri de baza restrictionate. Sintaxa este:

declaratie subtip ::= subtype identificator is subtip;

subtip ::= [functie de rezolutie] marcaj_tip [constringere]

marcaj_tip ::= nume_tip I nume-subtip

constringere ::= mult:wq :ime_inintervalimultime-index

Exista doua feluri de subtipuri:

1. Subtipul reprezinta valorile unui tip scalar, restrinse la un interval.

subtype pin_count is integer range 0 to 400;

subtype digits is character range '0' to '9';

2 . Subtipul reprezinta valorile unui tablou cu indici nedefiniti, restrins prin definirea indicilor. subtype id is string(1 to 20);

subtype word is bit_vector(31 downto 0);

Exista doua subtipuri numerice predefinite:

subtype natural is integer range 0 to MAXINT

subtype positive is integer range 1 to MAXINT

h)Declaratii de obiecte:

In VHDL exista trei clase de obiecte: CONSTANTE, VARIABILE si SEMNALE. Vom discuta despre constante si variabile. O constanta este un obiect care este initializat cu o valoare cind e creat, care nu mai este ulterior modificata. Sintaxa este:

constanta::=constant lista_identificatori:subtip[:=expresie];

Declaratiile de constante care nu au expresie de initializare se numesc 'constante aminate', si nu apar decit in declaratiile de package. Valoarea de initializare trebuie data bin package body corespunzator.

Exemple:

constant e : real := 2.13455;

constant max-size : natural;

B Variabila e un obiect a carui valoare se poate modifica.

Sintaxa este:

variabila::=variable lista_identificatori:subtip[:=expresie];

Daca expresia de initializare lipseste, i se asociaza variabilei o valoare implicita. Pentru tipurile scalare implicita este cea mai din stinga valoare pentru acel tip: prima dintr-o enumerare, cea mai mica dintr-un interval dat in ordine ascendenta, cea mai mare dintr-un interval dat in ordine descendenta. Daca variabila este un tip compus, valoarea implicita este formata din toate valorile implicite alr tipurilor componente.

Exemple:

variable count : natural := 0;

variable trace : trace_array;

Daca 'trace array' este un vector de booleeni, atunciu valoarea initiala a lui 'trace' este un vector de elemente cu valorile 'false'.

Mind dat un obiect, a posibil sa se defineasca nume alternative pentru obiect sau pentru o parte din el. Sintaxa este:

nume_alternativ::=alias identificator:subtip is nume;

Exemple:

variable instr : bit_vector(31 downto 0);

alias op code : bit vector(7 downto 0) is instr(31 downto 24) ;

In acest exemplu, numele 'op code' este un nume alternativ pentru primii 8 biti din 'instr'.

i) Atribute:

Tipurile si obiectele declarate in VHDL pot avea asociate informatii suplimentare, numite atribute. Un atribut este referit cu '''.

Atribute pentru orice tip sau subtip scalar T:

ATRIBUT REZULTAT

T'left valoarea stinga a lui T

T’right valoarea dreapta a lui T

T'low valoarea cea mai mica a lui T

T'high valoarea cea mai mare a lui T

Atribute pentru orice tip T, X fiind membru al lui T si N un

intreg:

ATRIBUT REZULTAT

T’pos(X) pozitia lui X in T

T’val(N) valoarea de la pozitia N din T

T’leftof(X) valoarea de la stinga lui X in T

T'rightof(X) valoarea de la dreapta lui X in T

T’pred(X) valoarea imediat mai mica decit X in T

T’succ(X) valoarea imediat mai mare decit X in T

Atribute pentru orice tablou sau obiect A, N fiind un intreg cuprins intre 1 si numarul de dimensiuni ale lui A:

ATRIBUT REZULTAT

A'left(N) v al.stinga a interv.index pt.dim.N in A

A’right(N) val.dreapta a interv.index pt.dim.N in A

A'low(N) val.cea mai mica int.index pt.dim.N in A

A'high(N) val.cea mai mare int.index pt.dim.N in A

A’range(N) int.de valori pt.index pt.dim.N in A

A’reverse_range(N) int.valori pt.index, in ordine inversa

A’length(N) lungimea intervalului index pt.dim.N in A

 

 

3.Epresii si operatori

Iata lista operatorilor din VHDL in ordinea descrescatoare a precedentei

** abs not

* / mod rem

+(unar) -(unar)

+ - &

= /= < <= > >=

and or nand nor xor

Operatorii logici AND, OR, NAND, NOR, XOR si NOT opereaza pe valori de tip bit sau boolean si pe vectori (tablouri unidimensionale) de aceste tipuri. Operatiile pe vectori se aplica intre elementele corespondente ale fiecarui vector, rezultatul fiind tot un vector.

Operatorii relationali =, /=, < , < =, > si > = se aplica pe operanzi de acelasi tip si au ca rezultat o valoare booleana. Operatorii de egalitate (= si /=) permit operanzi de orice fel de tip. Ceilalti operatori permit numai operanzi de tip scalar sau vectori uni-dimensionali de tip discret. Operatorii + si - (unari sau binari) au semnificatia uzuala pentru operanzi numerici. Operatorul de concatenare (&) se aplica pe vectori, rezultatul fiind un nou vector format din alipirea celor doi vectori operanzi. Se pot concatena un element si un vector, sau doua elemente care prin concatenare formeaza un nou vector de dimensiune 2. '

Operatorii de inmultire si impartire (* si /) lucreaza pe numere intregi, reale si operanzi de tip fizic. Operatorii cit si rest (MOD si REM) lucreaza numai pe tipuri intregi. Operatorul valoare absoluta (ABS) lucreaza cu operanzi de orice tip. Operatorul ridicare la putere (**) poate avea un intreg sau un real in partea stinga, dar trebuie sa aiba neaparat un intreg in partea dreapta. Un exponent negativ a permis numai daca operandul din partea stinga a tip real.