Documente Academic
Documente Profesional
Documente Cultură
Instrucț iunile
limbajului VHDL
2009-2010 PDSD 3
Execu ț ia
instruc ț iunilo
r VHDL
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.
Exemplu:
iA
iB
δ iC
oY
5 ns 10 ns
oY (0, 5 ns) (1, 5+δ ns) oY (1, 10 ns) (1, 10+δ ns)
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
δ δ δ δ
eroare
Instrucț iuni
concurente
2009-2010 PDSD 14
Declararea entităț ii
<declarare_entitate> ::=
ENTITY nume_entitate IS
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ă>};
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
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;
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;
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;
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;
2009-2010 PDSD 28
Instrucț iunea wait
<instrucțiunea_wait> ::=
wait for constantă_temporală unitate_timp | expresie_temporală;
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