1 / 31

Instruc ț iunile limbajului VHDL

Capitolul 5. Instruc ț iunile limbajului VHDL. Tematica. Metalimbaj pentru prezentarea pentru VHDL Instrucțiuni concurente Instrucțiuni secvențiale. Metalimbajul. Este o variant ă a metalimbajului Backus-Nnaur Form pentru descrierea sintaxei unui limbaj.

hank
Télécharger la présentation

Instruc ț iunile limbajului VHDL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Tematica • Metalimbaj pentru prezentarea pentru VHDL • Instrucțiuni concurente • Instrucțiuni secvențiale 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 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. 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). Proiectarea sistemelor digitale

  7. 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; Proiectarea sistemelor digitale

  8. Execuția unui proces 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. Proiectarea sistemelor digitale

  10. 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. Fig. 5.2 Fig. 5.2 Proiectarea sistemelor digitale

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

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

  13. Erori posibile Proiectarea sistemelor digitale

  14. Instrucțiuni concurente PDSD

  15. Declararea entității <declarare_entitate> ::= ENTITYnume_entitateIS PORT ( [{nume_port: <mod_port> tip_port;}] nume_port: <mod_port> <tip_port> ); ENDnume_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>::= ARCHITECTUREnume_arhitectura OFnume_entitateIS [{<declarare tip> | <declarare subtip> | <declarare constanta> | <declarare semnal> | <declarare alias>};] BEGIN {<instrucțiune_concurentă>}; ENDnume_arhitectura; <declarare_tip> ::= type [{nume_tip,}] is <definitie baza> <declarare_subtip> ::= subtypenume_subtipisnume_tip restrictie <declarare_constanta> ::= constantnume_constanta: tip_constanta [:= <expresie>] <declarare_semnal> ::= signal [{nume_semnal,}] nume_semnal: tip_semnal [:= <expresie>] <declarare_alias> ::= aliasnume_alias: tip_semnal isnume_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|constantaunitate_masură _timp] ; • <atribuirea_valorii_semnalelor_condiționată> ::= • nume_semnal<= {expresie [after număr|constantaunitate_masură _timp] whencondiț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> ::= • withnume_semnal_selecțieselect • nume_semnal <= {expresie [after număr|constantaunitate_masură _timp] {whenvaloare_selecție {[ |valoare_selecție] },} whenothers; • 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

  21. 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|constantaunitate_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> ::= caseexpresieis {whenvaloare_selecție => {<instrucțiune_secvențială>;}} whenothers => {<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 <instrucțiunea_for_loop> ::= fornume_variabilăinstartto|downto stoploop [{<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. 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> ::= assertcondiție [reportexpresie] [severitynote | 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. Intrebări ? Proiectarea sistemelor digitale

More Related