joi, 10 februarie 2011

Capitolul V


 Specificaţii cu transformări de semnale.
5.1  Noţiuni generale. 
Specificarea sistemelor în formă structurală ne aminteşte de schemotehnica în mod textual. Puterea Verilog, însă  este în aceia că permite o specificare mai flexibilă decât cea schemotehnică. De exemplu, în locul componentelor interconectate, putem specifica un sistem ca un set de relaţii între intrările şi ieşirile lui. Acest tip de specificaţii se numesc specificaţii prin flux de date.
Mai întâi de toate, dacă vorbim despre relaţii, avem nevoie de expresiile care le formează. În secţiunea 2 vom introduce concepţiile de bază a expresiilor şi vom descrie operanzii utilizaţi în expresii. Un important tip de operanzi sunt numerele constante, pe care le vom reprezenta tot aici.
În afară de operanzi în expresii se utilizează şi operatorii Verilog oferă o set de operatori pentru diferite tipuri de operanzi şi diferite aplicaţii. Îi vom descrie în secţiunea 3.
În fina, fiecare expresie va fi atribuită unui semnal. În specificaţiile prin flux de date se utilizează aşa numitele atribuiri continue, care sunt destul de intuitive, aşa cum vom vedea în secţiunea 4. Pentru ca o specificare să semene complet cu operaţiile dintr-un circuit real, vom avea nevoie să specificăm reţinerile pentru fiecare atribuire. Le vom precăuta în secţiunea 4.


                                                      5.2  Expresii 
5.2.1        Introducere în expresii.
În afară de câteva sisteme triviale, semnalele de intrare necesită o transformare într-un oarecare mod pentru a obţine semnalele dorite la ieşire. Procesul poate fi privit ca:
       Outputs ← transformation (inputs)
Transformările sunt realizate de expresii, care sunt definite în Manualul de Referinţă (Reference Manual) a limbajului ca ,,construcţii care combină operatori şi operanzi pentru a primi un rezultat care este o funcţie de valori operanţilor şi proprietăţile operatorilor’’. Operatorii în Verilog pot avea semne, doi sau trei operanţi, depinde de specificarţia lui.
În plus, este un set anumit de operanţi cu care poate lucra un operator.

5.2.2        Operanzi.
Expresii fără operanţi nu există, adică operanţii sunt obiectele asupra cărora operanţii îşi realizează funcţiile. Operanţii pot fi de diferite tipuri, însă ei trebuie să fie compatibili cu operatorii cu care lucrează.

Cea mai simplă şi mai evidentă categorie de operanţi este referinţa la un net (fir) sau registru prin numele lui. Asemenea operanţi sunt destul de evidenţi şi nu au nevoie de o precizare suplimentară.
Valorile constante este un alt grup de operanţi. Verilog permite utilizarea valorilor constante de diferite tipuri care pot fi specificate în diferite formate.
Pentru specificaţii cu vectori (net sau registru), se utilizează selectarea bitului ( un singur bit) sau selectarea paralelă (câţiva biţi). O parte a memoriei poate de asemenea utiliza, însă în acest caz se permite utilizarea a unor construcţii de cuvânt întregi.
Şi în sfârşit, o chemare de funcţie (de sistem sau definită de utilizator) se poate utiliza ca o operant, prevăzută ca să returneze o valoare compatibilă cu operatorul.

 5.2.3    Constante întregi.

Constantele întregi, adică numere întregi specificate implicit, predefinit sunt zecimale şi pot scri în mod normal cum ne obişnuisem să le vedem. Numărul poate avea în faţă semnul minus dacă are o valoare negativă. Acesta este  un mod simplu, dar nu unicul mod de a specifica un număr întreg în Verilog.
Limbajul permite specificarea numerelor nu numai în format zecimal, dar şi în hexazecimal, octal şi binar. Uneori apare necesitatea scrierii numărului într-o formă nonzecimală. În acest caz el trebuie să fie precedat de caracterul ghilimică (’) şi o literă care indică baza reprezentării: h sau H pentru hexazecimal, o sau O pentru octal, şi b sau B pentru binar. Orice valoare specificată în acest mod este tratată ca un întreg fără semn.
Mărimea constantei întregi este determinată de compilator, însă predefinit de celemai multe ori este de cel puţin de 32 biţi. Limbajul permite de a utiliza constante de mărime specificată, acest lucru se face prin adăugarea în faţă a unui număr pozitiv ce reprezintă numărul de biţi în care e reprezentată constanta.
Într-o specificare a constantei zecimale se utilizează litera d sau D.
4’d4
8’b10011001
8’b1
8’h1

 

5.2.4    Operanzii ,,bit select’’ şi ,,part select’’
Atunci când avem nevoie de o parte a unui vector net sau registru vom utiliza operatorul select, iar în cazul unui bit – bit select, în cazul când avem nevoie de o oarecare cantitate de biţi vom folosi operatorul part-select.
Sinteza operandului bit-select este foarte simplă: numele vectorului urmaţi de indexul bitului dorit inclus în paranteze pătrate, adică de ex: Mybus[5].
La fel în relaţii cu vectorii se utilizează şi specificaţii cu rang al biţilor rangul este specificat în acelaşi mod şi declaraţia vectorilor, [MSB : LSB].
Dacă unul din indecşii specificaţi este în afară de rangul vectorului, sau sunt egali cu ,,x’’ sau ,,z’’ atunci operandul automat trece în valoarea ,,x’’.
Nu se permite selectarea biţilor sau părţi a unui registru real sau realtime.

 5.3    Operatori.
5.3.1    Operatori aritmetici.
Verilog oferă un număr mare de operatori (32) din care fac parte operatori unari (cu un operand), binari şi …(cu trei operanzi). Aceşti operatori pot fi grupaţi în dependenţă de funcţia pe care o îndeplinesc.
Operatorii aritmetici sunt evidenţi chiar şi pentru începători: ,,+’’ – adunare, ,,-‘’ – scădere, ,,*’’ – multiplicare şi ,,/’’ – divizare. Cu ajutorul lor se fac operaţii între doi operanzi. Primii doi operatori (,+’ şi ,-‘) se pot utiliza cu un singur operant pentru a determina semnul lui.
În afară de cei 4 operanzi mai există încă unul care se notează diferit operanzii de tip registru şi întreg. Unul este tratat ca fără semn celălalt cu semn. Ca consecinţă a acestei reguli, se pot obţine rezultate diferite în rezultatul aceiaşi operaţii asupra aceloraşi valori dar de tip diferit pentru operanzi. 
5.3.2    Operatori Relaţionali.
După cum se poate observa din denumirea acestui grup de operatori, operatorii relaţionali compară doi operanţi la inegalitate. Din acest grup fac parte 4 operatori ,,>’’ – mai mare; ,,<’’ – mai mic; ,,>=’’ – mai mare sau egal; ,,<=’’ mai mic sau egal.
Verificarea egalităţii face parte din alt grup de operatori în toate 4 cazuri rezultatul expresiei este 0 în caz de expresia este falsă şi 1 – adevărată (true). Dacă un bit a oricărui operand este ,,x’’ sau ,,z’’ este imposibil de determinat rezultatul şi deci la rezultat puţini biţi decât altul, el va fi completat cu zerouri din partea stângă.
Operatorii relaţionali au o mai mică prioritate decât operatorii aritmetici.
Ex:
5.3.3    Operatori de Egalitate.
În majoritatea limbajelor de programare şi HDL-uri operatorii de egalitate nu formează un grup aparte, dar aparţin grupului de operatori operaţionali.
Din unele considerente, în Verilog ei se reprezintă în grupuri separate.
Unul din aceste considerente îl reprezintă logica bazată pe patru valori logice. În dependenţă de caz poate apărea nevoia de a compara două valori cu o precizie mai avansată luând în consideraţie şi valorile ,,x’’ şi ,,z’’ pentru operatorii relaţionali. După cum ştim rezultatul va fi necunoscut adică ,,x’’ dacă un oarecare operand conţine vre-o valoare ,,x’’.
Primii operatori de egalitate (,,precizie’’) sunt numiţi case egalitate inegalitatea se notează prin ,,= = =’’ şi ,,!= =’’ respectiv. Operatorii asemănători cu cei relaţionali sunt numiţi de egalitate (inegalitate logică şi se notează prin ,,= =’’ şi ,,!=’’… între notaţii se reţine uşor, într-un fel reprezintă nivelul de precizie: egalitate şi extraegalitate.

5.3.4    Diferite tipuri de operatori logici.
Operatorii logici pot fi surse de confuzie pentru începători deoarece servesc pentru diferite ţeluri dar folosesc aceleaşi simboluri. Verilog HDL standard împarte aceşti operatori în trei clase: operatori logici, operatori pe biţi (bit wire) şi operatori de concentrare  (reductan).
Operatorii logici iau operanzi de o lungime arbitrată, efectuează compararea logică, şi dă un rezultat de un bit. Independent de lungimea operanzilor.
Operatorii pe biţi (bit-wire) iau doi operanţi de o lungime arbitrară şi efectuează operaţia logică bit cu bit respesctiv din cei doi operanzi (bitul i a operantului din stânga cu bitul i a operantului din dreapta), rezultatul va fi de lungimea acelui mai lung operant din cei doi iar cel mai scurt se completează cu zeroruir din stânga).
Operatorii de concetrare (reducction) iau numai un operant vector produce un rezultat de un bit prin aplicarea operaţiei logice tutror biţilor operandului.

5.3.5    Operatori de deplasare. (shift)
Operatorii de deplasare posedă doi operanzi. Primul este un vector de biţi care trebuie deplasat şi al doilea este numărul de poziţii cu câte trebuie de deplasat vectorul. Direcţia deplasării este specificată de operand.
,,<<’’ pentru deplasarea la stânga
,,>>’’ pentru deplasarea la dreapta
În timpul deplasării bitul din stânga (în cazul deplasării spre dreapta) sau cel din dreapta (în cazul deplasării spre stânga) este completat cu zerouri. Operatori de rotaţie în Verilog nu există.
Dacă un operand are vre-o necunoscută sau nivel de impedanţă înaltă, rezultatul va fi necunoscut, deoarece deplasarea cu o poziţie a vectorului spre stânga este echivalentă cu înmulţirea la 2 (sau împărţirea la 2 pentru deplasarea spre dreapta) operaţia de deplasare  este utilă pentru implimentarea efectivă a unor operaţii aritmetice la nivel fizic.
reg [8 : 0] regA
reg A = 8’b01101100
    reg A << 2            (reg A=10110000)
    reg A >> 3            (reg A=00010110)
 
5.3.6    Operatori de concatenare şi replicare.
Concatinarea ({,}) este un operator special care nu se plasează între paranteze ci îl includem în sine. Se utilizează acest operator pentru a organiza mai mulţi operanzi într-un vector. Elementele vectorului sunt separate prin virgulă. Operanţii pot fi de tip net sau registru, un bit selectat, o parte a vectorului sau o constantă.
Operatorul de replicare (copiere) se utilizează pentru a concatina de mai multe ori acelaşi operand. El extinde versiunea operatorului de concatinare prin includerea copiei unui operand prin indicarea numărului de copii a operandului, adică când avem nevoie de exemplu să concatinăm patru copii a vectorului

Data[1:0]
putem scrie:
utilizând operatorul de concatenare:
 {Data[1:0],Data[1:0],Data[1:0],Data[1:0]} 

sau utilizând operatorul de replicare:

  {4{Data[1:0]}}

Operatorul de replicare poate fi utilizat în interiorul concatinării cu operand:
 Ex.  
reg [7:0] Data1             //01001101
reg [7:0] Data2             //01010100
reg unbit;                     //1
reg [7:0]  Vector_nou;
vector_nou = {2{Data1[6:5]}, 2{unbit}, 2 Data2 [1:0]}
vector_nou                    //(10101100)


5.4    Atribuirea continuă.

5.4.1    Atribuire continuă.
Atunci când o expresie sau o operaţie este executată are loc o atribuire către un semnal de ieşire pentru ca rezultatul să fie accesibil. Există două tipuri principale de atribuiri: atribuire continuă şi atribuire procedurală.
Primul tip de atribuire (atribuire continuă) este modelul de bază a relaţiilor în modelarea fluxurilor de date.
Atribuirea continuă constă în următoarele elemente:
-    Cuvântul rezervat assign.
-    Declaraţia reţinerii (opţional).
-    Partea stângă a atribuirii numită destinaţia atribuirii, poate fi de tip net (scalar sau vector) sau o concatinare de net-uri. Registrele nu pot fi de partea stângă a atribuirii continue.
-    Simbolul de atribuire ,,=’’.
Partea dreaptă a atribuirii reprezintă o expresie operanzii căreia pot fi de orice tip permis (constante, net, registre, chemări de funcţii etc.).
Ex.
assign    OutC={InA,InB}
assign    OutC=InA&InB
assign    OutC=InA|InB
assign    OutC=InA+InB

5.4.2    Atribuirea continuă implicită.
Declaraţiile de Net şi atribuirile în Verilog sunt specificate la acelaşi nivel (într-un modul), şi nu sânt separate prin cuvântul cheie begin. De fapt declaraţiile şi atribuirile pot fi mixate şi uneori chiar combinate. O declaraţie combinată cu o atribuire se numeşte atribuire continuă implicită sau declaraţii de atribuiri de tip net.
Când se recurge la o atribuire continuă implicită cuvântul cheie assign este omis În schimb declaraţia de net include numele firului/semnalului urmată de semnul atribuirii şi expresia.
Uneori poate părea mai simplu de utilizat atribuirea continue implicite decât cele normale (explicite). Însă e necesar să ţinem cont că fiecare net poate fi declarat numai o dată şi ca consecinţă i se poate atribui numai o expresie, prin declaraţia de atribuire net. Pe de altă parte utilizând atribuirea explicită, aceluiaşi net i se poate atribui numai o expresie, prin declaraţia de atribuire net. Pe de altă parte utilizând atribuirea explicită, aceluiaşi net i se pot atribui diferite expresii.

5.4.3    Atribuire condiţională.
Operatorii condiţionali se utilizează larg nu numai în limbajul de programare, dar şi în HDL. Deoarece într-o expresie de atribuire continuă e imposibil de utilizat construcţii de tip if-else, în locul lor în acest caz se utilizează operatorul condiţional, pentru o forma expresiile dorite.
Operatorul condiţional diferă de alţi operatori deoarece are trei operanzi. Primul operator este condiţia pentru execuţia uneia din două expresii:
-    dacă este adevărat (evaluarea prin 1) atunci al doilea operand este atribuit părţii stângi;
-    dacă este falsă (evaluarea prin 0) se atribuie al treilea operand;
-    dacă condiţia este ,,x’’, ambele expresii sunt evaluate prin compararea bit cu bit;
-    dacă sunt egali valoarea lui este atribuită părţii stângi;
-    dacă sunt diferiţi, se atribuie valoarea ,,x’’.
Fiecare operand poate fi o expresie şi poate conţine şi operatori condiţionali:

5.4.4    Parcurgerea semnalelor.
De acum am clarificat cum se face o atribuire. A rămas doar întrebarea ,,Cum se execută?’’. Din fericire nu e nici un mister în asta deoarece atribuirea continuă urmează regulele ce urmeză.
Atribuirea continuă este mereu activă. Când un operand din partea dreaptă îşi schimbă valoarea, se face o reevaluare a expresiei şi rezultatul este atribuit părţii stângi.
Anume din aceste considerente această atribuire se numeşte continuă.
În cazul când sunt mai multe atribuiri, nu este vre-o Ordine predefinită de executare a lor. De fapt fiecare atribuire se execută concomitent. Ordinea în care sunt specificate are careva oglindire în implicaţiile tehnice. Însă nu se poate spune care este cea mai bună cale de specificare a instanţelor concurente.
5.4.5    Reţinerile (Delays).
Toate atribuirile pe care le-am precăutat au fost mai mult ideale, şi nu iau timp pentru execuţie. Însă circuitele reale se manifestă şi prin careva reţineri, Verilog oferă mecanisme pentru a reprezenta reţineri în circuite. Sunt mai multe obţiuni pentru specificarea reţinerilor în multe opţiuni pentru specificarea reţinerilor în Verilog, (aşa ca minimum, maximum, etc.).
Aici vom discuta despre cele mai simple şi mai universale reţineri.
Reţinereile sunt specificate în unităţi temporale. Interpretarea fizică a unităţilor temporale depinde de utilizator şi nu e neapărat să fie în nano-secunde şi micro-secunde. Definirea unităţilor temporale sunt specificate cu directiva compilatorului timescale.
Reţinerea într-o atribuire continuă reprezintă timpul între schimbarea unui operand din partea dreaptă a atribuirii şi atribuirea valorii sau expresiei rezultate părţii drepte.
Reţinerea e specificată prin #  t, unde t – numărul de unităţi temporale. Această reţinere apare între cuvântul cheie assign şi atribuirea ca atare.

5.5    Test - Transportarea  fluxului de date.

          Să se selcteze afirmaţiile corecte:

1.    Numerele negative sunt stocate ca complement faţă de doi.
2.    Întregii de mărime specificată se pot specifica numai în formă binară.
3.    Întregii mărimea cărora nu este specificată, sunt stocaţi utilizând un număr de biţi minim poziţie.
4.    Selectarea biţilor se poate face  şi pentru vectorii şi pentru memorii.
5.    Rezultatul unei expresii relaţionale este adevărat sau fals.
6.    Dacă un oarecare bit a operandului în compararea cu operatorul ,,= =’’ este ,,x’’ atunci rezultatul la fel este ,,x’’.
7.    Operatorii logici dau un rezultat de un bit.
8.    În operaţia de …(deplasare) completare se face cu ,,0’’ sau ,,1’’ în dependenţă de bitul care se elimină la deplasare.
9.    Concatinarea e posibilă numai pentru biţi separaţi.
10.    Cuvântul cheie ,,assign’’ este optimal în atribuirea continuă.
11.    Atribuirea continuă poate avea ca destinaţie un semnal de tip not.
12.    Declaraţiile tipurilor net şi atribuirile pot şi combinate.
13.    Ordinea specificaţiilor atribuirilor continuă influenţează ordinea execuţiei.
14.    Reţinerile în Verilog sunt specificate în monosecunde.
15.    Atribuirea continuă este unica expresie de 3 operanzi.