Presentation is loading. Please wait.

Presentation is loading. Please wait.

Instrucțiunile limbajului VHDL

Similar presentations


Presentation on theme: "Instrucțiunile limbajului VHDL"— Presentation transcript:

1 Instrucțiunile limbajului VHDL
Capitolul 5 Instrucțiunile limbajului VHDL 2010 Proiectarea sistemelor digitale

2 Proiectarea sistemelor digitale
Tematica Metalimbaj pentru prezentarea pentru VHDL Instrucțiuni concurente Instrucțiuni secvențiale 2010 Proiectarea sistemelor digitale

3 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 specificație BNF este un set de reguli de derivare scrise sub forma: <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; PDSD

4 Execuția instrucțiunilor VHDL
2010 Proiectarea sistemelor digitale

5 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. PDSD

6 Proiectarea sistemelor digitale
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

7 Proiectarea sistemelor digitale
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ă: Exemplu: process (iA, iB, iC) begin oY <= (iA xor iB) and iC; end process; 2010 Proiectarea sistemelor digitale

8 Proiectarea sistemelor digitale
Execuția unui proces 2010 Proiectarea sistemelor digitale

9 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

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

11 Execuția instrucțiunilor concurente
2010 Proiectarea sistemelor digitale

12 Proiectarea sistemelor digitale
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

13 Proiectarea sistemelor digitale
Erori posibile 2010 Proiectarea sistemelor digitale

14 Instrucțiuni concurente
Instrucțiuni concurente PDSD

15 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; PDSD

16 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] PDSD

17 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> PDSD

18 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. . PDSD

19 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. PDSD

20 Procese <proces> ::= [eticheta]: process (<lista_senzitivitate>) begin {<instrucțiune_secvențială>}; end process [eticheta] <lista_senzitivitate> ::= [{nume_semnal,}] nume_semnal PDSD Ionescu Augustin-Iulian

21 Instrucțiuni secvențiale
Instrucțiuni secvențiale PDSD

22 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> PDSD

23 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 d, atribuirea valorii unei variabile este imediată, ca ȋn cazul limbajelor de programare uzuale. PDSD

24 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ă PDSD

25 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; PDSD

26 Instrucțiuni loop şi exit
<instrucțiunea_loop> ::= loop {<instrucțiune_secvențială>;} exit when <condiție>; end loop; <condiție> ::= expresie_booleană PDSD

27 Instrucțiunea for … loop
for nume_variabilă in start to|downto stop loop [{<instrucțiune_secvențială>;}] [next [when <condiție>];] 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. PDSD

28 Instrucțiunea null <instrucțiunea_null> ::= null;
Nu realizează nici o acțiune. PDSD

29 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; PDSD

30 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; PDSD

31 Proiectarea sistemelor digitale
Intrebări ? 2010 Proiectarea sistemelor digitale


Download ppt "Instrucțiunile limbajului VHDL"

Similar presentations


Ads by Google