310 likes | 497 Views
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.
E N D
Capitolul 5 Instrucțiunile limbajului VHDL Proiectarea sistemelor digitale
Tematica • Metalimbaj pentru prezentarea pentru VHDL • Instrucțiuni concurente • Instrucțiuni secvențiale Proiectarea sistemelor digitale
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
Execuția instrucțiunilor VHDL Proiectarea sistemelor digitale
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
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
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
Execuția unui proces Proiectarea sistemelor digitale
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
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
Execuția instrucțiunilor concurente 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 Proiectarea sistemelor digitale
Erori posibile Proiectarea sistemelor digitale
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
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
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
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
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
Procese <proces> ::= [eticheta]: process (<lista_senzitivitate>) begin {<instrucțiune_secvențială>}; end process [eticheta] <lista_senzitivitate> ::= [{nume_semnal,}] nume_semnal PDSD
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
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
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
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
Instrucțiuni loop şi exit <instrucțiunea_loop> ::= loop {<instrucțiune_secvențială>;} exit when <condiție>; end loop; <condiție> ::= expresie_booleană PDSD
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
Instrucțiunea null <instrucțiunea_null> ::= null; Nu realizează nici o acțiune. PDSD
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
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
Intrebări ? Proiectarea sistemelor digitale