Instrucțiunile limbajului VHDL Capitolul 5 Instrucțiunile limbajului VHDL 2010 Proiectarea sistemelor digitale
Proiectarea sistemelor digitale Tematica Metalimbaj pentru prezentarea pentru VHDL Instrucțiuni concurente Instrucțiuni secvențiale 2010 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; 2009-2010 PDSD
Execuția instrucțiunilor VHDL 2010 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. 2009-2010 PDSD
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
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
Proiectarea sistemelor digitale Execuția unui proces 2010 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. 2010 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 2010 Proiectarea sistemelor digitale
Execuția instrucțiunilor concurente 2010 Proiectarea sistemelor digitale
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
Proiectarea sistemelor digitale Erori posibile 2010 Proiectarea sistemelor digitale
Instrucțiuni concurente Instrucțiuni concurente 2009-2010 PDSD
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
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
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
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
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
Procese 2009-2010 <proces> ::= [eticheta]: process (<lista_senzitivitate>) begin {<instrucțiune_secvențială>}; end process [eticheta] <lista_senzitivitate> ::= [{nume_semnal,}] nume_semnal 2009-2010 PDSD Ionescu Augustin-Iulian
Instrucțiuni secvențiale Instrucțiuni secvențiale 2009-2010 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> 2009-2010 PDSD
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. 2009-2010 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ă 2009-2010 PDSD
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
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
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. 2009-2010 PDSD
Instrucțiunea null <instrucțiunea_null> ::= null; Nu realizează nici o acțiune. 2009-2010 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; 2009-2010 PDSD
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
Proiectarea sistemelor digitale Intrebări ? 2010 Proiectarea sistemelor digitale