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.
Exemple
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);
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:
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;
Variabila e un obiect a carui valoare
se poate modifica.
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