Sunteți pe pagina 1din 31

Capitolul 5

Instrucț iunile
limbajului VHDL

2010 Proiectarea sistemelor digitale 1


Tematica
ØMetalimbaj pentru prezentarea pentru VHDL
ØInstrucț iuni concurente
ØInstrucț iuni secvenț iale

2010 Proiectarea sistemelor digitale 2


Metalimbajul
Este o variantă a metalimbajului Backus-Nnaur Form pentru descrierea sintaxei unui
limbaj.
În cadrul cursului vor fi utilizate următoarele elemente ale metalimbajului:
O sp e cifica ție B N F e ste u n se t d e re g u lid e d e riva re scrise su b fo rm a :
 

<simbol> ::= _expresie_


nume – un cuvânt cheie al limbajului;
identificator – desemneaza numele unui semnal, variabilă, constantă, expresie ;
< categorie> - desemnează o categorie a cărei sintaxă este descrisă cu ajutorul
metalimbajului;
::= - asignează unei categorii o anumită sintaxă;
{ } – desemnează o structură repetitivă;
[ ] – desemnează o structură opț ională.
| - separǎ mai multe simboluri ce reprezintǎ variante posibile;

2009-2010 PDSD 3
Execu ț ia
instruc ț iunilo
r VHDL

2010 Proiectarea sistemelor digitale 4


Categorii de instrucț iuni VHDL
Limbajul VHDL conține două mari categorii de instrucțiuni:
Instrucțiuni concurente:
Instrucțiuni de asignare necondiționată a semnalelor;
Instrucțiuni de asignare condiționată a semnalelor;
Instrucțiunea de asignare cu selecție;
Procese.
Instrucțiuni secvențiale
Instrucțiuni if;
Instrucțiuni case;
Instrucțiuni loop;
Instructiuni wait;
Instructiunea assert.

 Observaț ie!
 Instrucțiunile secvențiale nu pot exista decât țncapsulate țntr-un proces.
 Procesele sunt executate concurent țntre ele şi țn raport cu alte instrucțiuni
concurente.

2009-2010 PDSD 5
Execuț ia unui proces
Un proces se află fie țn starea execuție fie țn starea suspendat.
Procesul țncepe să fie executat ori de crte ori unul dintre semnalele din lista de
senzitivitate are un eveniment (o modificare a valorii).
Când ț ncepe execuț ia, instrucț
iunile secvențiale sunt executate ț
n succesiunea
naturală. În funcție de rezultatul evaluării unor condiții, ordinea execuției poate
fi modificată.
După ce şi ultima instrucțiune a fost executată, procesul trece țn starea
suspendat până la următorul eveniment.

Observaț ie! În cazul țn care lipseşte lista de senzitivitate, nu se va semnala eroare


la compilare ci doar o atenționare, dar vor apare anomalii la simularea
funcțională (behavioral).

2010 Proiectarea sistemelor digitale 6


Execuț ia unui proces
Corectitudinea execuției unui proces țn cazul simulării se bazează pe ideea că
valorile asignate pe durata execuției procesului nu sunt vizibile decât după ce
acesta s-a incheiat.
Aceasta se realizează prin asignarea valorii calculate țn momentul curent al
simularii, notat Tc, după o țntârziere ț infinitezimală, la momentul Tc+ț .
Asignarea intârziată este posibilă prin introducerea conceptului de driver a
semnalului. Principial, driverul semnalului oY are următoarea structură:

oY (valoare curenta, T c) (valoare noua, Tc+δ)

Exemplu:

process (iA, iB, iC)


begin
oY <= (iA xor iB) and iC;
end process;

2010 Proiectarea sistemelor digitale 7


Execuț ia unui proces

iA

iB

δ iC

oY

5 ns 10 ns

oY (0, 5 ns) (1, 5+δ ns) oY (1, 10 ns) (1, 10+δ ns)

2010 Proiectarea sistemelor digitale 8


Execuț ia instrucț iunilor concurente
O instrucț iune concurentă este executată numai dacă există condițiile ca să fie
produsă o modificare a valorii de la ieşire (apare o modificare a valorilor
semnalelor din membrul drept sau o modificare a valorilor din lista de
senzitivitate a unui proces).
O instrucțiune concurentă poate fi considerată ca un proces cu o listă de
senzitivitate implicită care include toate semnalele din membrul drept.
Ordinea de scriere a instrucțiunilor concurente este nesemnificativă!
Simularea funcțională este un proces periodic, realizat ț n momente de timp
bine prcizate.
Procesul de simulare țncepe cu faza de inițializare la momentul 0 ns. Dacă nu
se specifică o valoare de inițializare, semnalul va primi automat valoarea
logică 0 dacă este de tip bit sau valoarea U dacă este de tip std_logic.

2010 Proiectarea sistemelor digitale 9


Execuț ia instrucț iunilor concurente
Exemplu : Se consideră comparatorul de egalitate pe doi biți din Fig. 1.1. Modelul VHDL ales
pentru descrierea schemei este cel din Fig. 1.2. Ordinea de execuție a instrucțiunilor este
prezentată țn Fig. 1.3.

a(0) p0
a(1)
aeqb

b(0)
b(1) p1

Fig. 5.1

iA iB

p0 p1

oAeqB
Fig. 5.3

Fig. 5.2
Fig. 5.2
2010 Proiectarea sistemelor digitale 10
Execuț ia instrucț iunilor concurente

iA 00 01

iB 01 11

p0

p1

oAeqB

δ δ δ δ

2010 Proiectarea sistemelor digitale 11


Erori posibile
Nețnțelegerea modului de execuție a instrucțiunilor poate conduce la
scrierea unor programe VHDL pentru sinteză care generează erori grave țn
simularea funcțională.
Exemplu: crearea unui AND cu 8 intrări.

eroare

2010 Proiectarea sistemelor digitale 12


Erori posibile

2010 Proiectarea sistemelor digitale 13


  

Instrucț iuni

concurente

2009-2010 PDSD 14
Declararea entităț ii
<declarare_entitate> ::=
ENTITY nume_entitate IS

PORT ( [{nume_port: <mod_port> tip_port;}]


nume_port: <mod_port> <tip_port>
);
END nume_entitate;

<mod_port> ::= in | out | buffer | inout


<tip_datǎ> ::= std_logic |
std_logic_vector( indicemax downto indicemin |
indicemin to indicemax)
unde

nume_entitate – numele entității descrise;


nume_port – numele portului descris;
tip_port – tipul de dată; țn cadrul cursului vom utiliza ca tipuri de bază std_logic respectiv
std_logic_vector.
indicemin – valoarea minimă a indicelui vectorului;
indicemax – valoarea maximă a indicelui vectorului;

2009-2010 PDSD 15
Declararea arhitecturii
<declarare_arhitectura>::=
ARCHITECTURE nume_arhitectura OF nume_entitate IS
[{<declarare tip> | <declarare subtip> | <declarare constanta> | <declarare semnal> |
<declarare alias>};]
BEGIN
{<instrucțiune_concurentă>};
END nume_arhitectura;
<declarare_tip> ::= type [{nume_tip,}] is <definitie baza>
<declarare_subtip> ::= subtype nume_subtip is nume_tip restrictie
<declarare_constanta> ::= constant nume_constanta: tip_constanta [:= <expresie>]
<declarare_semnal> ::= signal [{nume_semnal,}] nume_semnal: tip_semnal [:= <expresie>]
<declarare_alias> ::= alias nume_alias: tip_semnal is nume_semnal [restrictie]

2009-2010 PDSD 16
Instrucț iuni concurente

<instrucțiune_concurentă> ::=
<atribuirea_valorii_semnalelor_necondiționată>
| <atribuirea_valorii_semnalelor_condiționată>
| <atribuirea_valorii_semnalelor_cu_semnal_de_selecție>
| <proces>

2009-2010 PDSD 17
Instrucț iuni de asignare a semnalelor
Asignare necondiționată şi asignare condiționată.
<atribuirea_valorii_semnalelor_necondiționată> ::=
nume_semnal <= expresie [after număr|constanta unitate_masură _timp] ;

<atribuirea_valorii_semnalelor_condiționată> ::=
nume_semnal <= {expresie [after număr|constanta unitate_masură _timp]
when condiție [else]}
expresie1;
unde
<= operatorul de asignare a semnalelor;
nume_semnal – numele unui semnal sau port;
expresie – o expresie a cărei evaluare are acelaşi tip cu a semnalului din membrul
stâng;
after – clauză care permite simularea funcțională a intârzierilor; este neglijata la sinteza;
valoarea intârzierii se poate introduce printr-o valoare numerică sau ca o constantă numerică;
condiție – o expresie cu valoare logică (adevarat sau fals);
expresie1 – expresia asignatǎ pentru toate valorile expresiei de condiție nespecificate țn
clar.
.

2009-2010 PDSD 18
Instrucț iuni de asignare a semnalelor
Asignare cu semnal de selecție:
<atribuirea_valorii_semnalelor_cu_semnal_de_selecție> ::=
with nume_semnal_selecție select
nume_semnal <= {expresie [after număr|constanta unitate_masură _timp]
{when valoare_selecție {[ | valoare_selecție] },}
when others;

unde
<= operatorul de asignare a semnalelor;
nume_semnal_selecție – numele unui semnal sau port ale cărui valori se utilizează
pentru selecția expresiei asignate;
expresie – o expresie a cărei evaluare are acelaşi tip cu a semnalului din membrul
stâng;
valoare_selecție – o valoare particulară a semnalului de selecție; fiecare valoare
poate fi utilizată o singură dată țn cadrul unei instrucțiuni;
others – desemnează orice valoare posibilă neutilizată a semnalului de selecție;
folosirea țn ultima linie este necesară pentru a elimina orice ambiguitate privind
valorile de selecție neutilizate.
2009-2010 PDSD 19
Procese
<proces> ::=
[eticheta]: process (<lista_senzitivitate>)

begin

{<instrucțiune_secvențială>};

end process [eticheta]

 <lista_senzitivitate> ::= [{nume_semnal,}] nume_semnal


2009-2010 PDSD 20

  

Instrucțiuni

secvenț iale

2009-2010 PDSD 21
Instrucț iuni secvenț iale
 <instrucțune_secvențială> ::=
 <instrucțiunea_de_atribuire_semnale>
 | <instrucțiunea_de_atribuire_variabile>
 | <apel_la_procedură>
 | <instrucțiunea_if>
 | <instrucțiunea_case>
 | <instrucțiunea_loop>
 | <instrucțiunea_for_loop>
 | <instrucțiunea_exit>
 | <instrucțiunea_return>
 | <instrucțiunea_null>
 | <instrucțiunea_wait>
 | <instrucțiunea_assert>


2009-2010 PDSD 22
Instrucț iuni de atribuire
Asignarea semnalelor

<instrucțiunea_de_atribuire_semnale> ::=
nume_semnal <= expresie [after număr|constanta unitate_masură
_timp] ;

Asignare variabile

<instrucțiunea_de_atribuire_variabile> ::= nume_variabilă := expresie;

Observaț ie! În timp ce atribuirea valorii unui semnal se realizează cu țntârzierea


δ , atribuirea valorii unei variabile este imediată, ca țn cazul limbajelor de
programare uzuale.

2009-2010 PDSD 23
Instrucț iunea if
 <instructiunea_if> ::=
 if <condiție> then
 {<instrucțiune_secvențială>;}
 [{elsif <condiție> then
 {<instrucțiune_secvențială>;}}]
 [else
 {<instrucțiune_secventială>;}]
 end if;

 <condiție> ::= expresie_booleană

2009-2010 PDSD 24
Instrucț iunea case
 <instrcțiunea_case> ::=
 case expresie is
 {when valoare_selecție=> {<instrucțiune_secvențială>;}}
 when others=> {<instrucțiune_secvențială>;}
 end case;

 unde
 valoare_selecție – o valoare oarecare a expresiei; aceeaşi valoare nu poate să
apară de două ori țntr-o instrucțiune case;

2009-2010 PDSD 25
Instrucț iuni loop şi exit
 <instrucțiunea_loop> ::=
 loop
 {<instrucțiune_secvențială>;}
 exit when <condiție>;
 end loop;

 <condiție> ::= expresie_booleană


2009-2010 PDSD 26
Instrucț iunea for … loop
 <instrucțiunea_for_loop> ::=
 for nume_variabilă in start to|downto stop loop
 [{<instrucțiune_secvențială>;}]
 [next [when <condiție>];]
 [{<instrucțiune_secvențială>;}]
 end loop;

 <condiție> ::= expresie_booleană


 Observaț ie!
Variabila de control a ciclului nu trebuie declarată explicit, ea având semnificație
doar local, la nivelul instrucțiunii.
În corpul ciclului trebuie să existe cel puțin o instrucțiune secvențială țn
afară de instrucțiunea next.

2009-2010 PDSD 27
Instrucț iunea null
 <instrucțiunea_null> ::= null;

 Nu realizează nici o acțiune.

2009-2010 PDSD 28
Instrucț iunea wait
 <instrucțiunea_wait> ::=
 wait for constantă_temporală unitate_timp | expresie_temporală;

Suspendă execuția procesului pe durata precizată. După scurgerea timpului


precizat execuția este reluată cu instrucțiunea imediat următoare.


 Exemplu: wait for 40 ns;

2009-2010 PDSD 29
Instrucț iunea assert
 <instrucțiunea_assert> ::=
 assert condiție
 [report expresie]
 [severity note | warning | error | failure]

 Exemplu:

 -- time 250ns
 wait for 150 ns;
 taSel<="01";
 -- time 300ns
 wait for 50 ns;
 assert (taY="101") report "eroare caz 1" severity error;

 2009-2010 PDSD 30
Intrebări ?
2010 Proiectarea sistemelor digitale 31

S-ar putea să vă placă și