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:

          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;





        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