Sunteți pe pagina 1din 51

MICROPROCESOARE SI MICROCONTROLERE

- Note de curs -

Facultatea de Inginerie Mecanica, Mecatronica si Management

2. Bazele logicii digitate

2.1. Introducere

Hardware-ul responsabil cu execuţia instrucţiunilor în limbaj maşină poate fi construit utilizând un număr mare de câteva blocuri simple. Aceste blocuri simple sunt numite porţi logice. Aceste porţi logice implementează operaţiile logice de bază cum ar fi AND (Şl), OR (SAU), NOT (NU) şi aşa mai departe. De exemplu, şe ppt construe circuite hardware utilizând doar porţi AND şi NOT sau echivalentele lor. Porţile logice sunt construite cu ajutorul tranzistorilor. Un singur tranzistor este suficient pentru a implementa o poartă NOT (NU). Dar pentru implementarea unei porţi AND (Şl) sunt necesari 3 tranzistori. De exemplu, procesorul PENTIUM apărut in anul 1993 conţinea aproximativ 3 milioane de tranzistori. în anul 2000 apăruseră circuite care utilizau 100 de milioane de tranzistori. Cum se pot descurca creatorii cu circuite atât de complexe? în mod evident, au nevoie de un nivel mai înalt de abstractizare. De exemplu, porţi logice cum arfi AND şi OR reprezintă un nivel de abstractizare mai ridicat decât tranzistorii. în continuare vom vedea că nici acest nivel de abstractizare nu este suficient, existând încă milioane de porţi logice în cadrul procesorului. Din acest motiv vom vedea în continuare nivele! de abstractizare din ce în ce mai înalte.

I

Discuţia despre logica digitală este împărţită în 3 părţi. Prima parte se referă la porţile logice digitale şi la implementarea lor. După cum! spuneam, avem nevoie de nivele de abstractizare mai înalte pentru a putea reduce complexitatea proiectării circuitelor digitale. Aşa că vom urmări 2 nivele de abstractizare mai înalte, şi anume circuitele combinaţionale şi cele secvenţiale, în celelalte 2 părţi. în circuitele combinaţiona|le, ieşirea circuitului depinde doar de starea curentă a intrărilor. Un exemplu de circuit combinaţional îl reprezintă sumatorul. Ieşirea sumatorului depinde doar de valorile curente ale intrărilor lui. De partea cealaltă, ieşirea circuitelor secvenţiale depinde nu doar de valorile curente ale intrărilor, ci şi de valorile vechi ale acestora. De exemplu, în cazul unui numărător binar, ieşirea depinde de valoarea curentă. Valoarea următoare se obţine prin incrementarea valorii curente (putem '> spune că valoarea curentă reprezintă

o copie a valorii anterioare a intrărilor). Altfel spus, nu putem spune ce valoare va avea numărătorul la ieşire fără să-i cunoaştem starea curentă. De aceea putem spune că un numărător este un circuit secvenţial.

2.2. Porţi logice

Circuitele digitale care implementează funcţiile logice simple AND, OR, NOT şi altele se numesc porţi logice. în figura 2.1 sunt prezentate notaţiile simbolice pentru porţile AND, OR şi NOT. De asemenea se regăsesc şi tabelele de adevăr pentru cele 3 porţi. O tabelă de adevăr este o listă a tuturor combinaţiilor posibile pe intrări şi a valorilor corespunzătoare ale ieşirilor. De exemplu, dacă privim 0 logic ca fiind FALS şi 1 logic ca fiind ADEVĂRAT, se poate observa că tabela de adevăr pentru poarta logică AND reprezintă operaţia logică Şl.

AND gate OR gate NOT gate Logic symbol   A B F 0 0 0

AND gate

AND gate OR gate NOT gate Logic symbol   A B F 0 0 0 0

OR gate

AND gate OR gate NOT gate Logic symbol   A B F 0 0 0 0

NOT gate

Logic symbol

 

A

B

F

0

0

0

0

1

0

1

0

0

1

1

1

A

B

F

0

0

0

0

 

1

1

1

0

1

1

 

1

1

A

F

 
 

0

1

 
 

1

0

 

Truth table

Figura 2.1. Porţile logice de bază: simbolurile logice şi tabelele de adevăr.

În cadrul expresiilor logice se utilizează punctul (·), plusul (+) şi bara de negare (¯) pentru a reprezenta operaţiile AND, OR şi NOT. De exemplu, ieşirea porţii AND din figura 1 se poate scrie: F = A·B. Presupunând că literele sunt variabile logice, deseori se renunţă la punct şi putem scrie funcţia AND anterioară sub forma: F = AB. În mod asemănător funcţia OR este scrisă sub forma F = A + B. Ieşirea porţii NOT este exprimată sub forma F = Ā. Unii autori folosesc apostroful pentru a reprezenta operaţia NOT sub forma F = A' datorită reprezentării dificile a barei de negare. Precedenţa celor 3 operatori logici este următoarea: operatorul AND are o precedenţă mai mare decât operatorul OR, în timp ce operatorul unar NOT are cea mai mare precedenţă dintre cei trei operatori. De aceea, o expresie logică precum F = AB' + A'B poate fi scrisă sub forma F = (A (B')) + ((A') B). La fel ca în expresiile aritmetice, putem folosi parantezele pentru a modifica precedenţele implicite. Chiar dacă cele 3 porţi logice prezentate în figura 2.1 sunt suficiente pentru a implementa orice funcţie logică, este mai convenabil să implementăm şi alte porţi logice. Figura 2.2 prezintă alte trei porţi logice larg utilizate. Poarta NAND este echivalentă cu o poartă AND urmată de o poartă NOT. Asemănător, poarta NOR este o combinaţie între poarta OR şi poarta NOT. Vom vedea că, contrar aşteptărilor noastre, porţile NAND şi NOR necesită doar 2 tranzistori pentru implementare, pe când porţile AND şi OR necesită câte 3 tranzistori. Poarta SAU exclusiv (XOR) generează 1 logic la ieşire ori de câte ori cele două intrări sunt diferite între ele. Această proprietate determină utilizarea ei în anumite aplicaţii, cum ar fi generarea parităţii. O altă poartă interesantă şi utilă este poarta exclusiv-NOR. Aceasta este echivalentă cu o poartă XOR urmată de o poartă NOT.' Ieşirea acestei porţi este 1 logic ori de câte ori cele două intrări sunt identice. Poarta exclusiv-NOR mai este numită şi poarta echivalenţei sau a coincidenţei

este numită şi poarta echivalenţei sau a coincidenţei   A B F 0 0 1 0
 

A

B

F

0

0

1

0

1

1

1

0

1

1

1

0

A

B

F

2

Logic symbol Figura 2.2. Alte porţi logice utilizate 0 0   1 0 1 0
Logic symbol Figura 2.2. Alte porţi logice utilizate 0 0   1 0 1 0

Logic symbol

Figura 2.2. Alte porţi logice utilizate

0

0

 

1

0

1

0

1

0

0

1

1

0

A

B

F

0

0

0

0

1

1

1

0

1

1

1

0

Truth table

Să presupunem că lucrăm cu două variabile logice. Se ştie că putem defini o multitudine

de funcţii asupra celor două variabile, cum ar fi: AND, OR, NAND, NOR, XOR.

întrebarea căreia îi căutăm răspunsul este: câte funcţii logice diferite putem defini peste

N variabile logice? Odată cunoscut răspunsul la această întrebare,;putem utiliza

informaţia, de exemplu, pentru a studia universalitatea unei porţi logice. Poarta logică NAND este universală. Asta înseamnă că putem implementa orice funcţie logică

utilizând doar porţi NAND (putem folosi câte porţi NAND dorim). Pentru început, să ne concentrăm asupra celor două variabile. Din moment ce două

variabile pot avea patru combinaţii de intrare (adică patru rânduri în tabela de adevăr) şi

se poate seta ieşirea pe 1 sau pe 0 pentru fiecare rând, putem defini 16 funcţii diferite,

ca în Tabelul 2.1.

Tabelul

2.1.

Numărul

funcţiilor

ce

pot

fi'defnite

peste

două

variabile

logice

ce pot fi'defnite peste două variabile logice Privind tabelul 2.1, observăm că unele funcţii sunt

Privind tabelul 2.1, observăm că unele funcţii sunt nefolositoare (de ex. F0 şi F15) deoarece sunt independente de intrări. Alte funcţii pot fi identificate ca fiind corespunzătoare porţilor logice descrise anterior (de ex. F1 este funcţia AND, iar F6 este funcţia XOR). Putem generaliza cele discutate mai sus la N variabile logice notând faptul că există 2 N rânduri în tabela de adevăr a unei expresii logice cu N variabile. Deci numărul de funcţii ce poate fi definit pe N variabile este

de funcţii ce poate fi definit pe N variabile este Seturi complete Spunem că un set

Seturi complete

Spunem că un set de porţi este complet dacă putem implementa orice funcţie logică utilizând doar porţile din cadrul acestui set complet. Asta înseamnă că, teoretic, nu avem nevoie de alte porţi din afara setului pentru a implementa o funcţie logică. Exemple de seturi complete:

{AND, OR, NOT} {AND, NOT} {OR, NOT} {NAND} {NOR}

Un set complet este minimal dacă nu conţine elemente redundante, adică dacă se

şterge un element din cadrul setului, acesta nu rămâne complet. în seturile complete de mai sus observăm că primul set nu este minimal, deoarece putem elimina ori AND, ori OR (dar nu amândouă) şi obţinem un alt set complet. Cum putem demonstra că un set este complet? Trebuie să demonstrăm ca folosind doar porţile din cadrul setului, putem construi porţile AND, OR şi NOT. Figura 2.3 ilustrează modul în care putem obţine cele trei porţi utilizând doar porţi NAND. O demonstraţie asemănătoare este dată în figura 2.4, de data asta folosindu-se porţi NOR. Porţile NAND şi NOR mai sunt numite porţi universale deoarece putem implementa orice funcţie logică folosind doar porţi NAND sau NOR.

orice funcţie logică folosind doar porţi NAND sau NOR. Figura 2.3. Implementarea portilo AND, OR, NOT

Figura 2.3. Implementarea portilo AND, OR, NOT prin folosirea portilor NAND.

portilo AND, OR, NOT prin folosirea portilor NAND. Conceptele creerii circuitelor digitale pot fi descrise

Conceptele creerii circuitelor digitale pot fi descrise privind implementarea lor cu ajutorul terminale: baza, colectorul şi emitorul. Un tranzistor poate opera liniar sau în comutate. în funcţionarea liniară, tranzistorul amplifică semnalul de intrare aplicat pe bază. Aceta este modul de lucru al tranzistorului în circuitele de amplificare. în circuitele digitale se utilizează modul de:operare în comutaţie al tranzistorului. în acest mod, tranzistorul acţionează ca un comutatori între colector şi emitor. Tensiunea aplicată bazei tranzistorului determină dacă comutatorul este deschis (circuit deschis între colector şi emitor) sau închis (scurtcircuit între colector şi emitor). O tensiune de peste 2V va determina tranzistorul să se comporte ca un comutator închis, în timp ce o tensiune sub 0,8V va determina tranzistorul să se comporte ca un comutator deschis. Collector

în timp ce o tensiune sub 0,8V va determina tranzistorul să se comporte ca un comutator

Emitter

Figura 2.5. Tranzistorul

Figura 2.5. Tranzistorul (a) (b) (c) Figura 2.6. Implementarea porţilor logice simple: a ) poarta NOT;

(a)

Figura 2.5. Tranzistorul (a) (b) (c) Figura 2.6. Implementarea porţilor logice simple: a ) poarta NOT;

(b)

Figura 2.5. Tranzistorul (a) (b) (c) Figura 2.6. Implementarea porţilor logice simple: a ) poarta NOT;

(c)

Figura 2.6. Implementarea porţilor logice simple: a) poarta NOT; b) poarta NAND; c)poarta NOR

Ţinând cont de modul de funcţionare al tranzistorului, este uşor să implementăm o poartă NOT aşa cum este prezentat în figura 2.6.a. Colectorul tranzistorului este legat la Vcc prin intermediul unui rezistor. în mod uzual, Vcc are valoarea de 5V. Presupunând că 0V reprezintă 0 logic şi +5V reprezintă 1 logic, putem observa că implementarea cu un singur tranzistor din figura 2.6.a. corespunde unei porţi NOT. Atunci când Vin este joasă, apare un circuit deschis între colector şi emitor. De aici rezultă că nu trece curent prin tranzistor. Astfel, Vout va avea valoarea de 5V. Pe de altă parte, atunci când Vin are o valoare mare, apare un scurtcircuit întrse colector şi emitor,ceea ce determină un nivel scăzut de tensiune pentru Vout. 2.3. Funcţii logice

Funcţiile logice pot fi specificate într-o multitudine de moduri. O funcţie logică poate fi specificată verbal. De exemplu, funcţia majoritate poate fi enunţată în modul următor:

ieşirea trebuie să fie 1 logic atunci când majoritatea intrărilor sunt 1 logic. în mod asemănător, funcţia de paritate pară poate fi enunţată după cum urmează: ieşirea (bitul de paritate) este 1 logic atunci când avem un număr impar de 1 pe intrări. Principalele probleme ale enunţării verbale sunt imprecizia şi ambiguitatea. Se poate face ca enunţul să fie precis prin utilizarea tabelelor de adevăr. Metoda tabelei de adevăr presupune specificarea valorii ieşirii pentru fiecare combinaţie posibilă a intrărilor. Metoda tabelei de adevăr are sens pentru funcţiile logice deoarece alfabetul este alcătuit doar din 0 şi 1. în tabelul 2.2 sunt prezentate tabelele de adevăr pentru funcţia majoritate cu 3 intrări şi funcţia paritate pară.

A

B

C

F1

0

0

0

0

0

0

1

0

0

1

0

0

0

1

1

1

1

0

0

0

1

0

1

1

1

1

0

1

1

1

1

1

A

B

C

F2

0

0

0

0

0

0

1

1

0

1

0

1

0

1

1

0

1

0

0

1

1

0

1

0

1

1

0

0

1

1

1

1

Funcțuie majoritară

Funcție paritate pară

Tabelul 2.2. Tabelele de adevăr pentru funcţiile majoritate şi paritate pară

Avantajul metodei tabelei de adevăr îl reprezintă precizia. Principala problemă o

reprezintă creşterea exponenţială a numărului de linii în raport cu numărul de variabile logice. Pentru a specifica o funcţie logică se mai pot utiliza expresiile logice. Expresiile logice utilizează operatori logici. Expresiile logice pentru funcţiile majoritate cu 3 intrări şi paritate pară sunt prezentate în continuare:

- funcţia majoritate cu 3 intrări = AB + BC + AC

- funcţia paritate pară cu 3 intrări = A'B'C + A'BC' + AB'C' + ABC.

Această formă de specificare are avantajul; că este compactă şi păstrează precizia metodei tabelei de adevăr. Un alt avantaj major îl reprezintă faptul că expresiile logice pot fi modificate astfel încât să se obţină o proiectare eficientă. Ultima formă de specificare utilizează notaţia grafică. Figura 2.7 prezintă circuitul logic

ce implementează funcţia majoritate cu 3 intrări. Asemenea celorlalte două metode, şi aceasta este precisă, dar este mai mult utilizată de inginerii hardware pentru a implementa funcţiile logice.

Obţinerea expresiilor logice

Obţinerea unei expresii logice pe baza unui circuit logic presupune urmărirea circuitului de la intrare spre ieşire şi scrierea expresiilor logice intermediare. Acest proces este ilustrat în figura 2.9. Ieşirea porţii OR cea mai de sus este (A + B). Observând că intrările porţii OR din mijloc sunt A şi B', vom scrie expresia logică pentru ieşirea acestei porţi ca fiind (A + B). Continuând procesul, în final vom obţine următoarea expresie pentru funcţia logică F3:

F3 = (A+ B)(A + B')(A'+ B).

funcţia logică F3: F3 = (A+ B)(A + B')(A'+ B). Figura 2.9. Obţinerea expresiei logice din

Figura 2.9. Obţinerea expresiei logice din diagrama unui circuit

Pentru a arăta că acest circuit logic este echivalent cu o poartă AND cu 2 intrări, trebuie să arătăm că expresia logică pentru F3 se reduce la AB.

Stabilirea echivalenţei logice

Există două modalităţi de stabilire a echivalenţei logice a două funcţii. Prima metodă este cea a tabelei de adevăr. Cea de-a doua metodă implică manipularea expresiilor logice prin aplicarea regulilor algebrei booleene. în continuare vom discuta despre metoda tabelei de adevăr, urmând ca metoda algebrei booleene să fie descrisă îri secţiunea următoare. Metoda tabelei de adevăr este simplă din punct de vedere conceptual, dar extrem de greoaie pentru expresiile logice care implică multe variabile logice. Principiul este de a

urmări toate combinaţiile posibile pentru intrări şi de a vedea dacă cele două funcţii dau

aceeaşi ieşire. Dacă da, atunci cele două funcţii sunt echivalente. în tabelul 2.3 este prezentat acest proces. Se observă cele două coloane pentru ieşiri, câte una pentru fiecare funcţie. Din moment ce ieşirile celor două funcţii sunt identice, putem concluziona

că funcţiile F1 şi F3 sunt echivalente.

A

B

F-i = AB

F3 = (A + B)(A' + B)(A + B*)

0

0

0

0

0

1

0

0

1

0

0

0

1

1

1

1

Tabelul 2.3. Tabela de adevăr care demonstrează că funcţiile şi F3 sunt echivalente.

2.5. Proiectarea circuitelor logice

Pentru a oferi o perspectivă corectă asupra secţiunilor următoare, vom urmări în figura 2.10 o versiune simplificată a procesului de proiectare a circuitelor digitale. Specificaţiile de intrare pot fi date în limbaj normal. De exemplu, descrierea poate fi ceva gen:

„Proiectaţi un circuit care să implementeze funcţia majoritate cu trei intrări". Acest tip de descriere implică o multitudine de presupuneri, cum ar fi definiţia funcţiei majoritate. Chiar şi o funcţie simplă, cum este majoritatea, poate fi definită în mai multe moduri. în prezentările de până acum am folosit o funcţie majoritate simplă, fiecare intrare având aceeaşi importanţă. Dar putem defini şi alte funcţii majoritate. De exemplu, importanţa intrărilor poate fi diferită. De aceea următoarea etapă este să creăm o descriere precisă

a problemei din descrierea imprecisă (posibil incompletă) dată mai sus. Dacă vom

proiecta un circuit logic combinaţional, de exemplu, putem utiliza tabela de adevăr pentru a defini în mod exact specificaţiile problemei.

pentru a defini în mod exact specificaţiile problemei. Figura 2.10. Un proces simplu de proiectare a

Figura 2.10. Un proces simplu de proiectare a unui circuit logic

Cum vom obţine circuitul logic final din tabela de adevăr? După cum se poate observa în figura 2.10, mai sunt două etape intermediare. Din tabela de adevăr vom deriva o expresie logică. Expresia logică poate fi sub forma sumă-de produse sau produs-de- sume, după cum vom vedea în secţiunile următoare. Nu vom implementa, totuşi, această expresie logică direct, deoarece este posibil ca aceasta să nu fie în forma minimală şi să nu obţinem o proiectare eficientă. Va trebui să simplificăm această expresie logică, pentru a minimiza costurile de implementare. Circuitul logic final îl vom obţine din expresia logică sirnplificată. De notat că, de multe ori, prin rninimizarea implementării se înţelege minimizarea numărului de porţi logice utilizate. într-o anumită măsură acest lucru este adevărat. Urmărim acest obiectiv în metodologiile de simplificare. Dar se poate, face observaţia că atunci când implementăm un circuit digital, mai rnult ne interesează numărul de circuite fizice (chips) necesar decât numărul de porţi logice. Cei doi paşi intermediari nu mai sunt necesari dacă intenţionăm să implementăm

circuitul logic utilizând blocuri (de exemplu, în cazul multiplexoarelor). în acest caz, implementarea se face direct pe baza tabelei de adevăr.

2.6. Obţinerea expresiilor logice din tabelele de adevăr

Putem scrie o expresie logică dintr-o tabelă de adevăr în unul din două moduri: sumă- de-produse (SOP) şi produs-de-sume (POS). în forma sumă-de-produse, specificăm combinaţia de intrări pentru care ieşirea va fi 1. în forma produs-de-sume, se specifică combinaţia de intrări pentru care ieşirea este 0.

Forma sumă-de-produse

În această formă, fiecare combinaţie de intrări pentru care ieşirea ia valoarea 1 este exprimată sub forma unui termen AND. Acesta este termenul produs pe care îl utilizăm pentru a reprezenta operaţia AND. Între aceşti termeni produs se aplică operaţia OR. Deoarece utilizăm semnul + pentru operaţia . pentru operaţia OR și semnul pentru operația AND, această formă se numeşte sumă-de-produse. Pentru obţinerea termenilor produsului se scrie variabila dacă valoarea ei este 1 sau complementul acesteia dacă valoarea este 0. Exemplul 2.1. Să vedem funcţia majoritate cu 3 intrări. Tabela de adevăr este dată în tabelul 2.2. Se poate observa că ieşirea ia valoarea 1 de patru ori. Deci expresia logică va avea patru termeni de tip produs. Primul termen de tip produs va fi cel pentru linia 4 din tabelă. Deoarece A are valoarea 0, vom folosi complementul A'. B și C au valoarea 1, deci vor fi folosiţi ca atare. Termenul de tip produs pentru linia 4 din tabela de adevăr va fi: A'BC. Pentru linia 6 avem: AB'C, pentru linia 7 avem: ABC, iar pentru linia 8 ABC. Aplicând operatorul OR, obţinem:

Funcţia majoritate cu 3 intrări = A'BC + AB'C + ABC + ABC. Exemplul 2.2. Din tabela de adevăr a funcţiei paritate pară dată în tabelul 2.2, obţinem următoarea expresie:

Funcţia paritate pară cu 3 intrări = A'B'C + A'BC + AB'C + ABC. Notaţie: O notaţie ce permite reprezentarea compactă a expresiilor logice utilizează valorile zecimale ale combinaţiilor intrărilor pentru care ieşirea ia valoarea 1. De exemplu, primul termen din funcţia majoritate este scris ca 3 (011). Pentru a indica faptul că este vorba de o expresie de tipul sumă-de-produse, vom utiliza operatorul Σ(sigma) ca în exemplul următor:

Funcţia majoritate cu 3 intrări = Σ(3, 5, 6, 7). în mod asemănător putem scrie funcţia'paritate pară:

Funcţia paritate pară cu 3 intrări = Σ(1, 2, 4, 7).

Forma produs-de-sume

Este forma complementară a sumei-de-produse. în acest caz urmărim rândurile din tabela de adevăr pe care ieşirea are valoarea 0. Fiecare astfel de combinaţie de intrări este reprezentată sub forma unui termen OR, în care apare variabila dacă are valoarea 0 sau complementul acesteia daca are valoarea 1. Intre acesti termini obţinuţi se aplică operaţia AND şi se obţine expresia logica produs de sume:

Functia majoritate cu 3 intrari = (A + B + C)(A + B + C')(A + B' + C)(A' + B + C). Fuctia paritate para cu 3 intrari = (A + B + C)(A + B' + C')(A' +B + C')(A' + B' +C).

Notaţie: Putem utiliza o notaţie compactă asemănătoare celei folosite la notaţia sumă- de-produse prin scrierea doar a acelor termeni pentru care ieşirea ia valoarea 0. Vom folosi operatorul Π (pi) pentru a indica expresia produs-de-sume. Funcţia majoritate cu 3 intrări = Π(0, 1, 2, 4). Funcţia paritate pară cu 3 intrări = Π(0, 3, 5, 6).

Implementare folosind metoda forţei brute (brute force)

Expresiile logice sumă-de-produse şi produs-de-sume pot fi utilizate pentru a obţine o

implementare rudimentară ce foloseşte doar porţi AND, OR şi NOT. Pentru început vom exemplifica procesul pentru expresiile sumă-de-produse. Pentru fiecare intrare vom obţine complementul utilizând inversoare. Vom implementa fiecare termen de tip produs folosind o singură poartă AND cu n intrări, unde n este numărul de variabile booleene. Apoi vom conecta ieşirile porţilor AND la intrările unei singure porţi jOR. Numărul intrărilor porţii OR este egal cu numărul termenilor-produs din expresia logică. Ieşirea porţii logice OR reprezintă funcţia logică. Figura 2.11 prezintă implementarea expresiei sumă-de-produse pentru funcţia paritate pară folosind metoda forţei brute.

funcţia paritate pară folosind metoda forţei brute. Figura 2.11. Implementarea expresiei logice sumă -de-

Figura 2.11. Implementarea expresiei logice sumă-de-produse pentru funcţia paritate pară cu 3 intrări folosind metoda forţei brute

In mod asemănător se pot implementa şi expresiile produs-de-sume. în această implementare vom folosi porţi logice OR pentru fiecare termen-sumă şi o singură poartă AND pentru a obţine ieşirea finală. Figura 2.12 prezintă implementarea, expresiei produs-de-sume pentru funcţia paritate pară. Din moment ce ambele tipuri de expresii logice reprezintă aceeaşi tabelă de adevăr, rezultă că sunt echivalente; şi cum circuitele logice prezentate în figurile 2.11 şi 2.12 implementează cele două expresii logice, deducem că cele două circuite sunt de asemenea echivalente.

3. CIRCUITE LOGICE COMBINATIONALE

3.1 Introducere

Până acum s-a discutat doar despre implementare utilizând porţile logice simple. Una dintre caracteristicile cheie ale circuitelor proiectate în capitolul 2 este aceea că ieşirea acestora este o funcţie aplicată intrărilor. Astfel de dispozitive sunt numite circuite combinaţionale deoarece ieşirea poate fi exprimată ca o combinaţie a intrărilor. Deşi lucrul cu porţile logice este mai uşor decât lucrul cu tranzistorii, un nivel mai ridicat de abstractizare este necesar în proiectarea şi implementarea sistemelor digitale complexe. Vom vedea în continuare câteva circuite combinaţionale ce ne oferă un nivel de abstractizare mai ridicat. Nivelele mai înalte de abstractizare: ne ajută în procesul de proiectare şi implementare în mai multe moduri, dintre care cele mai importante ar fi:

1. Nivelele înalte de abstractizare Ine ajută în proiectare deoarece putem utiliza

blocuri funcţionale ce necesită mai multe porţi logice pentru implementare. în acest mod se reduce complexitatea.

2. Folosirea acestor dispozitive funcţionale de nivel înalt reduce numărul de circuite

integrate necesare implementării unei funcţii logice complexe.Cel de-al doilea punct este important din punct de vedere practic. Dacă privim o placă debază, putem observa că porţile logice ocupă un spaţiu important pe placa de circuit imprimat(PCB). Chiar dacă porţile de bază au apărut în anii 70, încă le mai putem vedea pe PCB-uri, alăturide procesoare complexe modeme. De fapt, ele ocupă chiar mai mult spaţiu. De aceea, reducereanumărului de circuite integrate este imbortantă pentru obţinerea unor sisteme compacte.Circuitele combinaţionale ne oferă un mecanism de a creşte gradul de integrare. De exemplu, săpresupunem că avem nevoie de o poartă NANDI cu 8 intrări.Putem utiliza un singur circuit integrat DIP cu 14 pini, şi anume 7430. Dacă am fi folosit pentru implementare porţi NAND cu 2 intrări, decâte circuite 7400 ar fi fost nevoie? Reducerea numărului circuitelor integrate folosite scade de asemenea şi costurile de

producţie (mai puţine circuite integrate de montat şi lipit) şi măreşte fiabilitatea. în continuare vom vedea câteva exemple de circuite logice combinaţionale.

3.2. Multiplexoare şi demultiplexoare

Un multiplexor (MUX) este caracterizat de intrări de date, n intrări de selecţie şi o singură ieşire. Multiplexorul conectează una dintre cele intrări de date, selectată cu ajutorul intrărilor de selecţie, la ieşire. Tratând intrările de selecţie ca numere binare, putem spune că intrarea de date li este conectată la ieşire atunci când intrările de selecţie au valoarea i. Schema bloc a unui multiplexor cu 4 intrări este prezentată în

figura3.1.

intrările de selecţie au valoarea i. Schema bloc a unui multiplexor cu 4 intrări este prezentată
intrările de selecţie au valoarea i. Schema bloc a unui multiplexor cu 4 intrări este prezentată
Si So 0 0 0 Io 0 1 Ii 1 0 h 1 1 h
Si So 0 0 0 Io 0 1 Ii 1 0 h 1 1 h
Si
So
0
0
0
Io
0
1
Ii
1
0
h
1
1
h

Figura 3.1. Schema bloc și tabela de adevăr pentru un multiplexor cu 4 intrari.

În figura 3.2 este prezentată o implementare a unui multiplexor cu 4 intrări. Dacă privim cu atenţie, putem observa că se aseamănă cu circuitul folosit pentru implementarea expresiei sumă-de-produse prin metoda forţei brute (figura 2.11). Această observaţie vizuală este importantă în descoperirea unei proprietăţi de bază a multiplexoarelor, şi anume că sunt universale, adică putem implementa orice funcţie logică utilizând doar multiplexoare. Deci mai putem adăuga o entitate listei de seturi complete prezentate în capitolul 2. Alt avantaj al implementării funcţiilor logice cu ajutorul multiplexoarelor îl reprezintă faptul că nu mai trebuie să simplificăm expresia logică, ci putem porni implementarea direct de la tabela de adevăr, folosind multiplexoarele ca elemente de bază.

de adevăr, folosind multiplexoarele ca elemente de bază. Figura 3.2. Implementarea cu porţi logice a unui

Figura 3.2. Implementarea cu porţi logice a unui multiplexor cu 4 intrări.

Cum se poate implementa o tabelă de adevăr folosind multiplexoare? Simplu. Se

conectează variabilele logice din expresia logică pe post de intrări de selecţie şi ieşirile funcţiei ca intrări de date. Pentru a urmări acest tip de implementare, avem nevoie de un multiplexor cu intrări de date şi b intrări de selecţie pentru a implementa o expresie logică cu b variabile, în figura 3.3 se prezintă implementarea funcţiilor majoritate cu 3 intrări şi paritate pară cu 3 intrări utilizând un multiplexor cu 8 intrări. Din acest exemplu se poate observa că datele de intrare sunt o copie a coloanei ieşirilor din tabela de adevăr corespunzătoare. Trebuie avută grijă doar la conectarea variabilelor logice: cea mai semnificativă variabilă din tabela de adevăr se conectează la intrarea de selecţie cea mai prioritară, după cum se poate observa în figura 3.3

mai prioritară, după cum se poate observa în figura 3.3 Functia majoritate Functia paritate para Figura
mai prioritară, după cum se poate observa în figura 3.3 Functia majoritate Functia paritate para Figura

Functia majoritate

după cum se poate observa în figura 3.3 Functia majoritate Functia paritate para Figura 3.3. Două

Functia paritate para

Figura 3.3. Două implementări utilizând multiplexoare cu 8 intrări.

Proiectare eficientă cu multiplexoare

Implementările descrise în secţiunea anterioară pot fi îmbunătăţite. Astfel, se poate implementa o expresie logică cu b variabile folosind ujn multiplexor cu intrări de date. Pentru anumite funcţii s-ar putea să fie necesar să utilizăm un inversor suplimentar. Ideea de bază este scoaterea din tabela de adevăr a unei variabile logice (X de exemplu). Variabila X sau complementul ei pot fi necesare ca intrări de date în multiplexor (deci avem nevoie de inversor pentru a obţine X'). Setul de date de intrare al multiplexorului va fi {0, 1, X, X'}. Chiar dacă poate fi eliminată orice variabilă din expresia logică, cel mai convenabil ieste să o scoatem pe cea rpardin dreapta (după poziţia din tabela de adevăr). Reducerea pentru funcţia majoritate este prezentată în figura 3.4. în partea stângă se observă tabela de adevăr originală, cu 3 variabile. Am eliminat variabila C din această tabelă de adevăr pentru a obţine noua tabelă de adevăr cu 2 variabile, A şi B. Pentru a obţine noua tabelă de adevăr, grupăm câte 2 rânduri în care valorile variabilelor A şi B

A şi B. Pentru a obţine noua tabelă de adevăr, grupăm câte 2 rânduri în care

sunt identice. Apoi ne uităm la valorile ieşirii şi dacă sunt identice (ambele 0 sau 1), valoarea ieşirii din noua tabelă de adevăr va fi egală cu valoarea ieşirii din vechea

tabelă. Dacă valorile ieşirii din tabela originală diferă între ele, trebuie găsită relaţia între acestea şi variabila C. Valoarea ieşirii din noua tabelă va putea fi în cazul acesta C sau

C De exemplu, atunci când A = 0 şi B = 0, ieşirea este 0 indiferent de valoarea lui C.

Deci valoarea ieşirii în noua tabelă de adevăr va fi 0. Pe de altă parte, atunci când A = 0

şi B = 1, ieşirea este egală cu C. Deci valoarea ieşlirii în noua tabelă de adevăr va fi C.

După ce obţinem noua tabelă de adevăr redusă, implementarea se face simplu, ca în figura 3.4.

redusă, imp lementarea se face simplu, ca în figura 3.4. Figura 3.4. Reducerea tabelei de adevăr
redusă, imp lementarea se face simplu, ca în figura 3.4. Figura 3.4. Reducerea tabelei de adevăr
redusă, imp lementarea se face simplu, ca în figura 3.4. Figura 3.4. Reducerea tabelei de adevăr

Figura 3.4. Reducerea tabelei de adevăr şi implementarea funcţiei majoritate.

Reducerea tabelei de adevăr pentru funcţia paritate pară este prezentată în figura 3.5. Implementarea funcţiei necesită un inversor pentru obţinerea lui C (inversorul nu apare

în figură).

pentru obţinerea lui C (inversorul nu apare în figură). Figura 3.5. Red ucerea tabelei de adevăr
pentru obţinerea lui C (inversorul nu apare în figură). Figura 3.5. Red ucerea tabelei de adevăr
pentru obţinerea lui C (inversorul nu apare în figură). Figura 3.5. Red ucerea tabelei de adevăr

Figura 3.5. Reducerea tabelei de adevăr şi implementarea funcţiei paritate pară .

Demultiplexoare

Demultiplexoarele (DEMUX) au o funcţionare opusă multiplexoarelor. La fel ca şi la multiplexoare, un demultiplexor are n intrări de selecţie. Deosebirea constă în inversarea rolului intrării şi ieşirilor de date. Un demultiplexor cu n intrări de selecţie are ieşiri de

în inversa rea rolului intrării şi ieşirilor de date. Un demultiplexor cu n intrări de selecţie

date şi o singură intrare de date. în funcţie de valoarea de pe intrările de selecţie, intrarea de date este conectată la ieşirea de date corespunzătoare. Schema bloc şi

implementarea cu porţi logice a unui demultiplexor cu 4 ieşiri sunt prezentate în figura

3.6.

demultiplexor cu 4 ieşiri sunt prezentate în figura 3.6. Figura 3.6. Schema bloc şi implementarea unui
demultiplexor cu 4 ieşiri sunt prezentate în figura 3.6. Figura 3.6. Schema bloc şi implementarea unui

Figura 3.6. Schema bloc şi implementarea unui demultiplexor cu 4 ieşiri.

3.3 Decodificatoare și codificatoare.

Decodificatorul este un alt bloc de bază util în selectarea unei linii din N. Intrarea decodificatorului este un număr (codificat) binar pe biţi, iar ieşirea este reprezentată pe linii decodificate. în figura 3.7 este prezentat un decodificator cu 2 intrări şi 4 ieşiri şi

implementarea logică. Dintre cele

la un moment dat, după cum se poate vedea din tabela de adevăr din figura 3.7.

cum se poate vedea din tabela de adevăr din figura 3.7. ieşiri ale unui decodificator, doar
cum se poate vedea din tabela de adevăr din figura 3.7. ieşiri ale unui decodificator, doar

ieşiri ale unui decodificator, doar una singură este 1

ieşiri ale unui decodificator, doar una singură este 1 Figura 3.7. Schema bloc şi implemen tarea

Figura 3.7. Schema bloc şi implementarea decodificatorului

Decodificatoarele pot fi folosite şi în implementarea funcţiilor logice. Folosind un singur decodificator şi un set de porţi OR putem implementa orice funcţie logică. Ideea de bază este că fiecare ieşire a decodificatorului trebuie privită ca un termen produs. Deci, dacă facem OR între acei termeni produs pentru care ieşirea funcţiei logice este 1,

implementăm expresia sumă-de-produse pentru funcţia logică respectivă. în figura 3.8 este prezentată implementarea a două funcţii logice cu ajutorul combinaţiei decodificator - porţi logice OR.

cu ajutorul combinaţiei decodificator - porţi logice OR. Figure 3.8 Implementarea func ț iilor logic utilizând

Figure 3.8 Implementarea funcțiilor logic utilizând decodificator și porți OR Codificatoare

Codificatoarele realizează operaţia inversă decodificatoarelor. Codificatoarele au 2B linii de intrare şi generează un număr binar pe 6 biţi pe cele B linii de ieşire. Tabela de adevăr a unui codificator este similară tabelei de adevăr a unui decodificator cu intrările şi ieşirile interschimbate. Ieşirea unui codificator este validă atât timp cât cel puțin una dintre intrări este logic 1. Codificatoarele trebuie să arate dacă ieşirea este validă sau nu. Acest lucru se realizează în general prin intermediul unei ieşiri de control suplimentare, după cum se poate observa din figura 3.9. Tot din această figură se - poate'observa cum se poate insera o intrare de activare. Ieşirea va fi validă doar când intrarea de activare este 1 logic. Se mai poate observa că ieşirea este 00 atunci cand intrările iau valorile 0000.sau 0001. Pentru a face distincţia între cele fi 1 logic ori de cate ori cel puţin o intrare di două cazuri, putem folosi semnalul de activare, care va cele patru este 1 logic.

semnalul de activare, care va cele patru este 1 logic. Figura 3.9. Codificator cu 4 intrări

Figura 3.9. Codificator cu 4 intrări şi 2 ieşiri

Circuitul logic din figura 3.9 funcţionează în cazul în care nu avem nici o intrare activă sau avem cel puţin o intrare pe 1 logic. în schimb nu sesizează dacă sunt setate două sau mai multe intrări simultan. De exemplu, dacă intrările au valoarea I 3 I 2 I 1 I 0 = 0110, ieşirea codificatorului va fi 11, ceea ce este eronat. O soluţie de rezolvare a acestei probleme ar fi asignarea de priorităţi intrărilor, iar dacă sunt active mai multe intrări simultan, va fi codificată cea cu prioritatea cea mai mare. în general, priorităţile sunt alocate astfel încâi l 0 are prioritatea cea mai mică, iar l 3 cea mai mare. în exemplul nostru, cu I 3 I 2 I 1 I 0 = 0110, ieşirea Codificatorului ar trebui să fie 10 din moment ce l 2 este intrarea pe 1 logic cu prioritatea cea mai rriare. Astfel de codificatoare se numesc

codificatoare cu priorităţi. în figura 3.10 este prezentat un astfel de codificator.

în figura 3 .10 este prezentat un astfel de codificator. Figura 3.10. Codificator cu priorităţi Comparatoare

Figura 3.10. Codificator cu priorităţi

Comparatoare

Comparatoarele sunt utilizate pentru implernentarea operaţiilor relaţionale de genul =, <, >, ş.a. De exemplu, putem utiliza porţi XOR pentru a determina dacă două numere sunt egale sau nu. în figura 3.11 este prezentat un comparator pe 4 biţi a cărui ieşire este 1 logic dacă cele 2 numere de intrare pe 4 biţi A = A 3 A 2 A 1 A 0 şi B = B 3 B 2 B 1 B 0 sunt identice.

0 şi B = B 3 B 2 B 1 B 0 sunt identice. 3.5 Sumatoare

3.5 Sumatoare

Vom vedea in continuare circuite sumatoare care ne permit sa efectuam operatii aritmetice simple. Cel mai simplu sumator aduna 2 biti si scoate la iesire suma si transportul, dupa cum se poate vedea in figura 3.12a. Din tabela de adevar se poate observa ca transportul poate fi generat cu ajutorul unei sungure porti AND, iar suma poate fi obtinuta cu o singura poarta XOR.

Figura 3.12. Tabela de adevăr şi implementarea pentru sumatorul simplu şi pentru sumatorul complet Problema

Figura 3.12. Tabela de adevăr şi implementarea pentru sumatorul simplu şi pentru sumatorul complet

Problema sumatoarelor simple este că nu pot fi utilizate pentru realizarea sumatoarelor care să realizeze adunări pe mai mult de 2 biţi. Dacă dorim să utilizăm sumatorul simplu de 1 bit pentru a construi sumatoare mai mari, care! săjpltfâ aduna numere pe N biţi, vom avea nevoie de sumatoare care să aibă ca intrări cei doi biţi, precum şi un posibil bit de transport generat de nivelul anterior. Astfel de sumator este cel complet pe un bit, care are trei intrări de 1 bit şi două ieşiri de 1 bit şi este prezentat în figura 3.12.b.

două ieşiri de 1 bit şi este prezentat în figura 3.12.b. Figura 3.13. Sumator cu transport

Figura 3.13. Sumator cu transport propagat realizat cu sumatoare complete pe 1 bit. Folosind sumatoare complete putem construi sumatoare care să adune două numere pe N biţi. Un exemplu de sumator pe 16 biţi este prezentat în figura 3.13. Astfel de sumatoare se mai numesc şi sumatoare cu transport propagat deoarece transportul se propagă de la poziţia 1 la poziţia 15. Să presupunem că sumatoru! cu transport propagat este construit cu sumatoare complete de 1 bit. Dacă presupunem că o poartă are o întârziere de 5 ns, fiecare sumator complet de 1 bit are nevoie de 3 x 5 = 15 ns pentru a obţine transportul C out . Deci sumatorul cu transport propagat pe 16 biţi prezentat în figura 3 13 are nevoie de 16 x 15 = 240 ns pentru a obţine rezultatul. Dacă dorim să folosim acest sumator într-un sistem, acesta nu poate funcţiona la viteze mai mari de 1/240 ns = 4 MHz, fiecare adunare necesitând un ciclu de ceas. Cum putem mări viteza sumatoarşlor multibit? Dacă analizăm motivul vitezei reduse a sumatoarelor cu transport propagat, observăm că propagarea transportului provoacă întârzierea în obţinerea rezultatului final. Dacă dorim;să îinbunătăţim performanţele,

trebuie să eliminăm această dependenţă şi să determinăm transportul de intrare independent pentru fiecare poziţie de bit. Astfel de sumatoare se numesc sumatoare cu transport anticipat. Principala problemă a acestor sumatoare este că sunt foarte complexe pentru cuvinte lungi. Pentru a vedea acest lucru şi pentru a observa cum fiecare sumator complet îşi poate genera propriul transport de intrare, să ne uităm la expresiile logice care trebuie implementate pentru generarea transportului de intrare. Transportul de ieşire pentru poziţia cea mai din dreapta C 0 se obţine astfel:

poziţia cea mai din dreapta C 0 se obţine astfel: Utilizând acest procedeu putem genera în

Utilizând acest procedeu putem genera în mod independent transporturile de intrare necesare.Expresia logică pentru C este o sumă-de-produse ce conţine doar A k şi B k , ik0. Deci apar doar întârzieri generate de porţi, din moment ce fiecare termenpoate fi implementat cu o singură indiferent de lungimea cuvintelor adunate. Complexitatea implementării unui astfel de circuit face impracticabil pentru cuvinte mai jmari de 8 biţi. în general, transportul anticipat este implerjientat la 4 sau 8 nivele. Putem aplica metoda transportului propagat pentru a obţine sumatoare cu lungimi de cuvânt mai mari folosind sumatoare cu transport anticipat pe 4 sau 8 biţi.

4. Circuite logice secvenţiale

4.1. Introducere

În ultimele două capitole am discutat despre circuitele combinaţionale. Caracteristica

definitorie a circuitelor combinaţionale este aceea că ieşirea depinde doar de valoarea

intrărilor. Ieşirea circuitelor secvenţiale, pe de altă parte, depinde atât de

valorile curent; cât şi de valorile anterioare ale intrărilor. Această dependenţă de valorile anterioare ale intrărilor defineşte proprietatea de memorie a circuitelor secvenţiale. În general, secvenţa valorilor anterioare ale intrărilor este codificată într-un set de variabile de stare. Există o cale de feedback care aduce variabilele de stare la intrările circuitului combinational, după cum se poate observa în figura 4.1. Uneori, feedbackul constă într-o simplă legătură între unele ieşiri şi intrările circuitului combinational. Cel mai des, însă, circuitul de feedback constă în elemente cum ar fi bistabilele. Aceste elemente sunt ele însele circuite secvenţiale care pot memora sau stoca informaţia de stare. Odată cu introducerea feedbackuiui se introduce şi o potenţială instabilitate în sistem. Drept exemplu să considerăm circuitul din figura 4.2.a. Acest circuit este stabil în sensul că ieşirea fiecărui inversor poate sta la un anumit nivel. În schimb circuitul este nedeterminant, deoarece nu putem spune care este nivelul exact ai ieşirilor inversoarelor, acesta putând fi 0 şi 1 sau 0 şi 1. În schimb se poate verifica faptul că circuitul din figura 4.2.b este instabil.

curentă a

Fig. 4.2 Circuite stabile şi instabile. Am văzut până acum câteva metode de proiectare a

Fig. 4.2

Circuite stabile şi instabile.

Am văzut până acum câteva metode de proiectare a circuitelor combinaţionale. Pasul cel mai important în proiectarea circuitelor'combinaţionale îl reprezintă simplificarea expresiilor logice. Pentru circuitele secvenţiale, procesul de proiectare nu e atât de simplu datorită dependenţei de intrările anterioare. Acest lucru necesită dezvoltarea unei baze teoretice pentru proiectarea circuitelor secvenţiale arbitrare. Spre sfârşitul capitolului vom vedea o metodă care ne prezintă procesul proiectării circuitelor secvenţiale. Totuşi, înainte de a vedea această metodă, să studiem câteva circuite secvenţiale simple, cumjarfj latchurile şi bistabilele.

4.2. Semnalul de ceas

Circuitele digitale pot opera asincron şau sincron. Circuitele ce operează asincron sunt independente unele de altele. Asta înseamnă că momentul producerii unei schimbări într-un circuit nu are nici o legătură cu momentul producerii unei schimbări în alt circuit. Modul de operare asincron poate crea probleme serioase într-un sistem digital tipic în care ieşirea unui circuit este legată1 la intrările altor circuite. în mod asemănător, un circuit poate avea ca intrări ieşirile mai multor circuite. Modul de operare asincron jimplică faptul că se poate ca nu toate intrările circuitului să fie valide simultan. Pentru a se evita astfel de problemş, circuitele sunt utilizate în modul sincron. în acest

mod, toate circuitele din sistem îşi schimbă starea la momente de timp bine definite. într- un sistem digital, semnalul de ceas defineşte momentele de timp când pot avea loc schimbările de stare. Implicit, acesta defineşte şi viteza la care circuitul poate opera. Un semnal de ceas este o secvenţă de 1 şi 0, aşa cum se poate observa din figura 4.3. Chiar dacă în general folosim semnale de ceas simetrice, ca în figura 4.3.a, se pot utiliza şi semnale de ceas asimetrice, ca în figurile 4.3b şi c. Marginea semnalului de ceas de la 1 la 0 se numeşte front crescător sau poyitiv. Analog putem defini frontal căzător sau negative, ca in figura 4.3. Un ciclu de ceas ester definit ca timpul dintre dour,fronturi crescătoare successive sau dintre dour fronturi căzătoare successive.

successive sau dintre dour fronturi căzătoare successive. Figura 4.3. Trei tipuri de semnale de ceas cu

Figura 4.3. Trei tipuri de semnale de ceas cu aceeaşi perioadă

Frecvenţa este măsurată în număr de cicli pe secundă (Hertz). Abrevierea MHz se referă la milioane de ciclii pe secundă. Perioada ceasului este definită ca timpul reprezentat de un ciclu de ceas. Toate cele trei semnale de ceas din figura 4.3 au aceeaşi perioadă de ceas. Perioada de ceas = 1 / frecvenţa ceasului. De exemplu, un ceas cu frecvenţa de 100MHz are o perioadă de ceas de 1 / (100 x 10s) = 10 ns. Semnalul de ceas are două funcţii distincte într-un circuit digital. Este semnalul global de sincronizare pentru întregul sistem. Fiecare ciclu de ceas are trei zone distincte:

începutul ciclului de ceas, sfârşitul ciclului de ceas şi un punct intermediar unde se schimbă nivelele. Acest punct intermediar se găseşte în mijlocul ciclului de ceas pentru semnalele de ceas simetrice. Cel de-al doilea scop al semnalului de ceas este de a oferi informaţii de temporizare sub forma perioadei de ceas (de exemplu, cât timp durează efectuarea unei operaţii ca AND logic). Întârzierea de propagare reprezintă timpul necesar ca semnalul să ajungă de la intrare la ieşire. O poartă logică gen poarta AND are o întârziere de propagare de aproximativ 10 ns. Pentru a vedea cum întârzierea afectează semnalul, să privim circuitul din figura 4.4.a. Presupunând că ΔT = 10 ns, semnalul de intrare este inversat şi întârziat la intrarea X a porţii AND. Atunci când facemoperaţia logică AND între cele două semnale, obţinem un semnal al cărui nivel „1" are durata ΔT. Presupunând că şi poarta AND are o

întârziere de propagare ΔT, semnalul apare la ieşirea porţii AND cu o întârziere ΔT, după cum se poate observa din figura 4.4.

ΔT, după cum se poate observa din figura 4.4. Figura 4.4. Efectul întârzierii de propagare asupra

Figura 4.4. Efectul întârzierii de propagare asupra ieşirii circuitului.

Această discuţie ar putea induce părerea că întârzierea de propagare determină frecvenţa maximă de lucru a circuitului. O privire atentă asupra definiţiei întârzierii de propagare ne convinge că acest lucru nu este adevărat. Caracteristica ce limitează frecvenţa de lucru este timpul staţionar de intrare. Acesta se referă la timpul minim cât semnalul trebuie să aibă aceeaşi valoare la intrare pentru ca circuitul să funcţioneze corect. Pentru porţile logice simple, acest timp este aproximativ egal cu întârzierea de propagare. Asta înseamnă că intrarea trebuie menţinută pe durata propagării. Din acest motiv întârzierea de propagare pare a determina frecvenţa maximă de lucru a porţii. | Pentru circuitele secvenţiale care necesită un semnal de ceas, se specifică şi durata minimă pentru! nivelele „1" şi „0". Aceste perioade se mai numesc şi perioade HIGH şi LOW.

4.3. Latchuri

Este momentul să vedem nişte circuite secvenţiale simple care pot memora valoarea unui bit. Latchurile sunt dispozitive sensibile la nivel, adică reacţionează la nivelul semnalului de intrare (high -1 sau low - 0). în contrast, bistabilele reacţionează la front, adică ieşirea se modifică doar pe frontul crescător sau căzător al semnalului.

Latchuri SR

Latchul SR este cel mai simplu circuit secvenţial despre care vom discuta. Pentru implementarea lui suijit suficiente doar două porţi NOR. Feedback-ul acestui latch este obţinut printr-o simplă legătură între ieşirea unei porţi NOR şi intrarea celeilalte, după

cum se poate vedea în figura 4.5.a. Simbolul logic pentru latchul SR este prezentat în figura 4.5.b. în figura 4.5.c este dată o tabelă de adevăr simplificată pentru latchul SR. Ieşirile celor două porţi NOR sunt numite Q şi Q' deoarece în modul normal de funcţionare cele două ieşiri ar trebui să fie complementare. Vom utiliza notaţia Qn pentru valoarea curentă (adică starea! curentă) şi notaţia Qn+i pentru valoarea următoare (adică starea1 următoare).

pentru valoarea următoare (adică starea1 următoar e). (a) Diagrama circuitului Simbol logic Tabel de adevar Figura

(a) Diagrama circuitului

Simbol logic

Tabel de adevar

Figura 4.5. Implementarea unui latch SR cu porţi NOR

Să analizăm tabela de adevăr. Atunci când S = 0 şi R = 1, putem observa că indiferent de starea curentă, ieşirea Q este forţată pe 0, iar de aici rezultă că ieşirea Q' va fi 1. Această stare este una stabilă, adică Q va rămâne 0 logic, iar Q' va rămâne 1 logic. Se poate verifica faptul că atunci când S = 1 şi R = 0, se obţine alta stare stabilă, cu Q = 1 şi Q' = 0. Atunci când ambele intrări S R sunt 0, valoarea următoare a ieşirii depinde de starea curentă. Să presupunem că ieşirea curentă este Q = 1 şi Q' = 0. Atunci când intrările se schimbă din S = 1 şi R = 0 în S = R = 0, starea următoare Qn+i rămâne aceeaşi cu starea curentă Qn. Să presupunem acum că starea curentă este Q = 0 şi Q' = 1. Se poate observa uşor că trecerea intrărilor din S = 0 şi R = 1 în S = R = 0 lasă ieşirea neschimbată. Acest fapt apare pe prima linie a tabelei de adevăr din figura 4.5.c. Ce se întâmplă atunci când ambele intrări sunt 1? Atât timp cat intrările sunt ţinute sus, ambele ieşiri sunt forţate pe 0 logic. Vom tăia această linie din tabela de adevăr pentru a arăta că această combinaţie a intrărilor nu este dorită. Pentru a vedea de ce am tăiat intrarea din tabelă, să vedem ce se întâmplă când valorile intrărilor se schimbă din S=R=1 în S = R = 0. Doar în teorie puterri presupune că valorile intrărilor se schimbă simultan. în practică există întotdeauna o diferenţă finită de timp între schimbările celor două intrări. Dacă S trece în 0 înaintea lui R, secvenţa schimbării intrărilor va fi SR=1101→00. Datorită stării intermediare SR = 01, ieşirea va fi Q = 0 şi Q' = 1. Pe de altă parte, dacă R trece în 0 înaintea lui S, secvenţa schimbării intrărilor va fi SR=11→10→00. Datorită stării intermediare SR = 10, ieşirea va fi Q = 1 şi Q' = 0. Astfel, la schimbarea intrărilor din 11 în 00, starea ieşirii este nedeterminată. Din acest motiv se doreşte eliminarea acestei stări. Denumirile S şi R provin de la Set şi Reset. Atunci când intrarea S este pe 1 logic (şi R este pe 0), ieşirea Q este setată (Q = 1). Dacă S este 0 şi R este 1, ieşirea Q este resetată (Q = 0). Din această prezentare rezultă că acest latch este dependent de nivel. Ieşirea răspunde schimbării nivelelor intrărilor. Acest luciii este valabil pentru toate latchurile. Putem observa că acest latch simplu are capacitatea de a memora un bit. Pentru a scrie 1 în acest latch, SR trebuie să fie 10; pentru a scrie 0 trebuie ca SR să fie 01. Pentru a reţine valoarba unui bit, ambele intrări trebuie să fie pe 0. În concluzie, avem posibilitatea

să scriem un 0 sau un 1 şi să-l reţinem atâta timp cât circuitul este alimentat. Aceasta este celula de bază pe careo utilizează memoria RAM ststică. O dată ce avem proiectul memoriei de 1 bit, putem multiplica acest circuit pentru a memora date mai largi sau cuvinte multiple.

Latchuri SR sincrone

O problemă a latchurilor SR este aceea că ieşirea urmăreşte schimbările intrărilor. Dacă dorim ca ieşirea să răspundă schimbărilor intrărilor la intervale de timp specificate pentru a putea sincroniza latchul cu restul sistemului, trebuie să modificăm circuitul ca în figura 4.6.a. Schimbarea majoră o reprezintă intrarea de ceas care activează intrările S şi R. Acestea sunt transmise circuitului văzut anterior doar dacă semnalul de ceas es'te pe 1 logic. Intrările nu au nici un efect asupra ieşirii atunci când semnalul de ceas este pe 0. Atunci când ceasul este 1 logic, circuitul implementează tabela de adevăr din figura 4.5.c

circuitul implementează tabela de adevăr din figura 4.5.c Figure 4.6. Latch SR sincronizat Ș i aceste

Figure 4.6. Latch SR sincronizat

Și aceste latchuri sunt active pe nivel. Atâta timp cât semnalul de ceas este 1, ieșirea depinde de intrările S și R.

Latchuri D

O problemă a ambelor tipuri de latchuri SR o reprezintă evitarea combinaţiei intrărilor SR = 11. Această problemă este rezolvată de latchul D prezentat în figura 4.7.a. Folosim un singur inversor pentru a avea valori complementare pe intrările S şi R ale latchului SR sincronizat. Pentru reţinerea valorii, intrarea de ceas trebuie menţinută pe 0 logic. Şi latchul D memorează un singur bit.

pe 0 logic. Şi latchul D memorează un singur bit. Figura 4.7. Latchul D folose ș

Figura 4.7. Latchul D folosește un inversor pentru a evita combinația SR= 11.

4.4 Bistabile

Bistabilele sunt active pe front, spre deosebire de latchuri, care sunt active pe nivel. În continuare vom vedea două tipuri de bistabile și anume bistabile D și JK.

Bistabile D

Vom vedea cum putem transforma un latch D activ pe nivel într-un bistabil D activ pe front. Putem folosi câteva indicii din figura 4.4, unde vedem că ieşirea circuitului este un mic impuls, egal cu timpul ¡de propagare al inversorului (10 ns), pe frontul crescător al semnalului de ceas. De aceea, dacă folosim acest semnal în locul ceasului de intrare, vom converti latchul D într-un bistabil D activ pe frontul crescător (sau pozitiv).

un bistabil D activ pe frontul crescător (sau pozitiv). Figu ra 4.8. Bistabil D activ pefrontulcrescător

Figura 4.8. Bistabil D activ pefrontulcrescător

pozitiv). Figu ra 4.8. Bistabil D activ pefrontulcrescător Figura 4.9. Simbolurile logice pentru latchuri şi

Figura 4.9. Simbolurile logice pentru latchuri şi bistabile: a) latch activ pe nivelul pozitiv; b) latch activ pe nivelul 0; c) bistabil activ pe front crescător; d) bistabil activ pe front căzător.

Bistabile JK

Putem proiecta un bistabil activ pe front folosind structura master-slave prezentată în figura 4.10.a. Acest circuit conţine două latchuri SR. Latchul SR maşter este activat pe nivelul pozitiv al ceasului, iar ieşirea lui va fi activată pe nivelul negativ al ceasului. Circuitul din figura 4.10.a este un bistabil activ pe front negativ. în figura 4.10.b este prezentată notaţia simbolică a bistabilului. Legăturile de feedback de la ieşirea latchului SR slave la porţile AND de la intrările JK transformă latchul SR într-un latch JK pentru a evita nedeterminarea asociată cu combinaţia de intrare 11 pentru latchul SR. Pentru a ilustra modul de funcţionare al acestui bistabil, în figura 4.10.C sunt prezentate diagramele de timp ce acoperă toate cele şase posibilităţi: JK = 01, 10 şi JK = 11 cu Qn = 0 şi 1, şi JK = 00 cu Qn = 0 şi 1. Nu au mai fost incluse în diagramă şi

semnalele Q' şi Qm' deoarece sunt complementare cu semnalele Q şi Qm. Putem observa de pe diagramă că ieşirea se modifică doar pe frontul negativ al semnalului de ceas. Se poate verifica faptul că modificarea intrărilor J şi K în alte momente de timp nu afectează ieşirea.

J şi K în alte momente de timp nu afectează ieşirea. Figura 4.10. Bistabil JK master-slave

Figura 4.10. Bistabil JK master-slave

Tabela de adevăr pentru bistabilul JK este prezentată în tabelul 4.1. Spre deosebire de latchu SR, bistabilul JK acceptă toate cele patru combinaţii de intrare. Atunci când JK = 11, ieşirea se complementează. Această caracteristică este folosită la construirea numărătoarelor, după cum vom vedea în secţiunea următoare.

Această caracteristică este folosită la construirea numărătoarelor, după cum vom vedea în secţiunea următoare. 25

Pentru o operare corespunzătoare, semnalele de intrare JK trebuie aplicate cu cel puţin ts unităţi de timp înaintea frontului căzător al semnalului de ceas. Timpul ts este numit timp de start. O valoare tipică de timp pentru ts este de 20 ns.

4.5. Exemple de circuite secvenţiale

Registre de deplasare Registrele de deplasare, după cum le s|punj3 şi numele, deplasează datele la dreapta sau la stânga cu o poziţie pe fiecare ciclu de ceas. IProiectarea unui registru de deplasare este relativ simplă, după cum se poate vedea din figura 4.11.

relativ simplă, după cum se poate ved ea din figura 4.11. Figura 4.11. Registru de deplasare

Figura 4.11. Registru de deplasare pe 4 biţi realizat cu bistabile JK

Acest registru de deplasare, realizat cu bistabile JK active pe front pozitiv, deplasează datele către dreapta. Pentru primul bistabil JK avem nevoie de un inversor astfel încât pe intrarea K să se regăsească complementul datelor ce intră (intrare serială). Datele de la ieşirea Q a celui mai din dreapta bistabil JK sunt o copie a datelor de intrare seriale întârziate cu 4 cicli de ceas. Aceasta este una din utilizările registrelor de deplasare. Mai putem utiliza registrele de deplasare pentru conversie serial-paralel. De exemplu, un semnal serial, folosit ca intrare pentru registrul de deplasare din figura 4.11., va produce o ieşire paralelă pe 4 biţi (luată de la cele 4 ieşiri Q a celor 4 bistabile JK). Chiar dacă nu am prezentat aici, putem proiecta registre de deplasare care acceptă ca intrare semnale paralele şi seriale. Registrele de deplasare mai sunt utilizate în implementarea operaţiilor logice de deplasare pe bit în unităţile aritmetico-logice.

Numărătoare

Numărătoarele sunt un alt exemplu de circuite secvenţiale larg utilizate. Pentru a vedea cum este construit un numărător, să considerăm cel mai simplu numărător:

numărătorul binar. Un numărător binar cu B biţi poate număra de la 0 la 2B - 1. De exemplu, un numărător binar cu B = 3 poate număra de la 0 la 7. După ce a ajuns la valoarea 7, numărătorul va trece la pasul următor la 0. Un astfel de numărător este numărător modulo 8. Ştim că un numărător modulo 8 necesită 3 biţi pentru a reprezenta valoarea numărată. în general un numărător modulo 2B necesită B biţi: Numărătorul modulo 8 este reprezentat în figura 4.12. Putem utiliza bistabilele JK în modul complementare cu JK = 11. Ieşirea Q a unui

bistabil este legată la intrarea de ceas a următorului bistabil. Semnalul de ceas de intrare, care guvernează funcţionarea întregului numărător, este aplicat bistabilului 0. Când scriem ieşirea numărătorului Q2Q1Q0, valoarea reprezintă numărul de fronturi negative ale semnalului de ceas. De exemplu, linia punctată din figura 4.12.b reprezintă Q2Q1Q0 = 011. Acest număr este numărul de fronturi negative de ceas de la stânga liniei punctate.

de fronturi negative de ceas de la stânga liniei punctate. Figura 4.12. Numărător binar:implementat cu bistabile

Figura 4.12. Numărător binar:implementat cu bistabile JK active pe front negativ

6. Microprocesorul

6.1. Structura de bază a unui microprocesor

Microprocesoarele nu sunt altceva, decât unitati centrale de calcul ( CPU Central Processing Unit), incorporate într-o capsulă de circuit integrat. Ele vor citi instrucțiunile unui program dintr-un bloc de memorie, le vor decodifica și vor executa comenzile formulate în însuși codul instrucțiunii.

comenzile formulate în însu ș i codul instruc ț iunii. Vom încerca să umplem treptat blocul

Vom încerca să umplem treptat blocul funcţional gol din figura 6.1 cu elemente strict necesare pentru funcţionarea unei uniljăţi centrale, constituind pe parcursul prezentului paragraf o posibilă structură de microprocesor. Pentru a citi din blocul de memoriei externă codul instrucţiunii ce urmează a fi executată, microprocesorul va trebui să genereze o adresă pe care o va pune la dispoziţia memoriei, până când în celula selectată pe baza acesftei adrese va apare data cerută. Pentru a putea "menţine" starea1 liniilor de adresă pe durata întregii operaţii de citire, microprocesorul va trebui să posede un element memorator intermediar, pe care-l vom numi registru tampon de adrese AB (Address Buffer). Informaţia codificată, citită dini memorie o vom depune temporar, de asemenea într-un registru intermediar. Fie numele acestuia registru tampon de date DB (Data Buffer). Liniile electrice pe care se va genera cuvântul binar de adresă le vom numi magistrală de adrese ABUS (Address BUS), iar pe cele dedicate datelor citite/scrise din/în memorie, magistrală de date DBUS (Data BUS). Completând modelul initial vid cu aceste elemente, obținem structura din figura 6.2 .

Să presupunem că instrucţiunea recent citită şi depusă temporar în registrul de date are următoarea

Să presupunem că instrucţiunea recent citită şi depusă temporar în registrul de date are următoarea semnificaţie: "Citeşte conţinutul celulei de memorie a cărei adresă este cu 3 mai mare adresa curentă (cea din AB), adaugă la această valoare 5 şi rescrie rezultatul în aceeaşi celulă de memorie." Pentru a efectua această instrucţiune microprocesorul are nevoie de o unitate aritmetică;

cu ajutorul acesteia se va putea calcula o noua adresă dememorie și se va putea efectua adunarea cerută. : După cum am amintit deja, în aritmetica binară operaţiile aritmetice pot descrise cu ajutorul unor funcţii logice. Este normal ca aceste circuite să fie utilizate şi pentru efectuarea unor operaţii logice ;propiu-zise. De aici rezultă şi numele utilizat:

unitatea aritmetico-logică ALU (Arithmetic Logic Unit). Pentru a putea executa cele formulate în enunţul comenzii, microprocesorul va trebui să fie dotat şi cu o unitatea de comandă. Eâ este aceea care va diseca problema, "spărgând-o" în paşi elementari şi va programa execuţia secvenţială în timp a tuturor manevrelor necesare pentru a duce la bun sfârşit misiunea ce i-a fost încredinţată: generează semnalele de comandă pentru întregul sistem, dirijează fluxul de date, corelează viteza de lucru a unităţii centrale cu timpul de acces |al memoriei etc. Unitatea de comandă poartă diverse nume: CCU - Computer Control Unit, TCU -jTimming and Control Unit, Sq - SeQuencer sau CC - Command Circuit. Noi vom alege ultimul nume. Activitatea unităţii de comandă este pilotată de un semnal de ceas, avand frecventa de ordinal MHz (1MHz =

10 6 Hz)

Semnalele electrice prin care micro procesorul va da comenzi de execuţie către memorie şi celelalte componente din sistem, le vom numi semnale de comandă. Semnalele prin care el culege informaţii privind starea diverseor componente din sistem, le vom numi semnale de stare. Introducând elementele nou definite în mocelul considerat, obţinem structura din figura 6.3.

Să continuăm construcţia. Dacă următoarea instrucţiune va folosi rezultatul instrucţiunii precedente pentru a

Să continuăm construcţia. Dacă următoarea instrucţiune va folosi rezultatul instrucţiunii precedente pentru a efectua o nouă operaţie aritmetică, atunci valoarea calculată în prealabil trebuie citită din nou din memorie. Acest acces suplimentar la memorie poate fi economisit, dacă în interiorul microprocesorului vom prevedes câteva elemente de memorare în care să se poată înmagazina temporar date sau adrese de memorie. Aceste elemente de memorie ale microprocesorului le vom numi regiştri. Unii dintre aceşti regiştri vor fi folosiţi în scopuri dedicate, cum ar fi urmărirea execuţiei secvenţiale a instrucţiunilor din memorie. Registru tampon de adrese (AB) n|u poate fi folosit în acest scop, fijndcă aşa cum s-a văzut în exemplele prezentate, conţinutul lui va trebui să se modifice, eventual de meii multe ori pe parcursul execuţiei unei instrucţiuni (cazul în care instrucţiunea în curs trebuie să efectueze accese la memorie, pentru a citi sau a scrie date în ea). Este deci nevoie de un registru în care să se poată genera şi păstra nealterată adresa de memorie a următoarei instrucţiuni de executat. Folosind acest registru, microprocesorul va putea continua după terminarea instrucţiunii în purs - execuţia secvenţei de instrucţiuni prevăzute, care astfel se constituie într-un program. Numele acestui registru special este contor de program PC (Program Counter). Intr-un alt registru special vom outea păstra informaţii referitoare la natura rezultatului unei operaţi aritmetice: număr negativ sau pozitiv (eventual egal cu zero), număr par sau impar etc. în acest registru, fiecărui atribut considerat i se rezervă un bit. Vom numi aceşti biţi, biţi de condiţie, iar registrul îl vom numi registru! indicatorilor de condiţie F (Flag - steguleţ, fanion). Avem nevoie de acest Registru pentru a putea defini instrucţiuni de salt condiţionat. Să ne imaginăm următoarea instrucţiune: "Dacă rezultatul operaţiei precjedente este un număr negativ, atunci continuă execuţia programului cu instrucţiunea locată la adresa următoare (valoarea actuală a contorului de program, PC); dacă numărul este pozitiv, continuă execuţia la adresa egală cu valoarea conţinută în primul registru de uz general". Această instrucţiune va verifica valoarea "indicatorului de semn" şi va ramifica execuţia programului în funcţie de valoarea acestui bit. Să introducem şi regiştri în scherria bloc din figura 6.3. Cu aceasta putem considera încheiată definirea principalelor structuri funcţionale ale microprocesorului. Pentru efectuarea transferurilor interne de date, microprocesorul va fi prevăzut şi cu o magistrală internă de date, magistrală a parei "lăţime" (număr de linii distincte) depinde de tipul microprocesorului în cauză. Privind din exterior, la terminalele microprocesorului regăsim semnalele sale de

comunicaţie cu sistemul constituit în jurul lui: magistrala de adrese, magistrala de date şi magistrala de comenzi. La magistralele de date şi cofnenzi pot fi cuplate circuite de intrare/ieşire (l/O) care stabilesc legătura cu lumea externă: interfaţa om-maşină şi accesul la memorii de masă, nevolatile. Dacă veţi completa figura 6.4. cu câteva dispozitive de intrare/ieşire, veţi obţine schema bloc a hardware-ului minimal al unui microcalculator. Ideea de magistrală unică, "plimbată" la toate elementele din sistem - inclusiv la cele de intrare/ieşire - este o caracteristică constructivă de bază a microcalculatoarelor. Amintim aici, că unităţile de calcul mai performante efebtuează operaţiile de intrare/ieşire prin aşa numitele canale de l/b a căror complexitate poate depăşii uneori complexitatea unui microcalculator. Ele sunt capabile să efectueze transferul de date între calculator şi mediul extern în mod independent, fără ca prin aceasta să perturbe câtuşi de puţin (derularea unui program de către unitatea centrală.

puţin (derularea unui program de către unitatea centrală. "Lungimea" (numărul de biţi ai regiştrilor

"Lungimea" (numărul de biţi ai regiştrilor interni ai microprocesorului) se corelează de obicei cu "lăţimea" (numărul de linii ale) magistralei de date. Aceasta este măsura "numărul de biţi" ai unui microprocesor. Microprocesoarele cu structură fixă sunt de obicei de 8, 16 sau 32 biţi. Lungimea de cuvânt a microcalculatoarelor realizate cu microprocesoarele "bit slice" (felii de bit), a căror structură este flexibilă, va fi totdeaunsj un multiplu întreg al numărului de biţi al unei felii. Registrul de adresă, respectiv "lăţimea" magistralei de adrese defineşte spaţiul de memorie adresabil direct de către microprocessor. O magistrală de adrese de 16 bit permite adresarea a 216 =65.536 celule de memorie distincte, iar 20 de linii de adresă ne conduc în lumea megaocteţilor: 2= 1.048.576 celule adresabile. Z80 este un microprocesor pe 8 biţi, cu 16 linii de adresă.

6.2. Structura internă a microprocesorului Z80

Vom prezenta mai jos structura internă a microprocesorului Z80, structură organizată pe blocuri funcționale:

Z80, structură organizată pe blocuri func ț ionale: În figura 6.5 găsim toate structurilfe funcţionale pe

În figura 6.5 găsim toate structurilfe funcţionale pe care le-am inserat treptat în modelul microprocesorului teoretic constituit anterior. în extremitatea laterală dreaptă a figurii 6.5 apare o căsuţă notată MEMORIE, care simbolizează un bloc de memorie de lucru fără de care nu se poate aborda prezentarea funcționarii nici unei unitați centrale. Această căsuța nu este o parte componentă a microprocesorului luat în studio. Microprocesorul “se termină” de fapt la cei doi regiștri tampon: registrul tampon de date (DB data buffer) și registrul tampon pentru adrese (AB – adress buffer). În alcătuirea microprocesorului rămân deci, regiștrii speciali și cei de uz general (AB, PC, SP, IY, IX, R, I, W, Z, H\ Li", D[, E', B', C, H, L, D, E, B, C, A, A', F, F',T, T, şi IR), ), circuitul de comandă (Command Circulit), ), unitatea aritmetică logică (ALU), magistralele interne şi semnalele externe (/INT, /NMI, |/M1, /MREQ, /IORQ, /RD, M/R, /BUSRQ, /BUSACK, /RESET, /HALT, /RFSH, şi /WAIT).

6.2.1. Regiştri

Pentru a putea funcţiona, executând programe stocate într-un modul de memorie, precum şi pentru a avea un număr oarecare de date disponibile imediat, în interiorul fiecărui microprocesor se înglobează câteva celule de memorare, celule a căror conţinut poate fi citit, modificat şi rescris în caz de nevoie. Aceste celule de memorie de tip citeşte/scrie, încorporate în interiorul microprocesorului se numesc regiştri. Aşa cum ne sugerează amplasarea şi forma de reprezentare a acestor regiştri în figura 6.5, ei nu sunt toţi identici. Unii sunt mai scurţi (8 biţi), alţii au lungime dublă (16biţi), la unii ant reprezentat fiecare bit în parte (F şi F') fiindcă ei au o semnificaţie aparte, la alţii această discriminare nu este necesară. în figura 6.5 se observă că fiecărui registru îi este ataşată o căsuţă în care se înscrie şi valoarea hexazecimală a unui număr oarecare pe care îl conţine. Dacă dorim să clasificăm regiştrii, trei este numărul criteriilor mai des folosite:

lungimea (numărul de biţi): distingem reg ştri de 8 biţi (A, B, C etc.) şi de 16 biţi (PC, SP, etc.) SP, etc.)

accesibilitatea: pe lângă regiştrii accesibili utilizatorului prin instrucţiuni specifice, există câţiva regiştrii de manevră care se folosesc pentru stocarea temporară a datelor, regiştrii care sunt transparenţi utilizatorului (nu se pot acdesa) (ex. T, DB, AB etc.) (ex. T, DB, AB etc.)

destinaţia: există regiştrii de uz general care se folosesc ca simple celule de memorie internă şi alţii cu! destinaţie specială care, pe lângă trăsătura de memorare, fie că sunt dedicaţi stocării doar a unui anumit tip de date (PC, IR, F),fie c ă sunt îizestra ț i ș i cu anumite facilita ț i , F),fie că sunt îizestrați și cu anumite facilitați suplimentare ( SP, A, etc.).

6.2.1.1. Registri speciali

Contorul program - PC (Program Counter) Indicatorul de stivă - SP (Stack Pointer) Registrul de instrucţiune - IR (Inştruction Register) Registrul A - (Acumulator) Registrul indicatorilor de condiţie – F-(Flag) Registrul de reâmprospătare a memoriilor dinamice - R (Refresh) Registrul vectorului de întreruperi -1 (Interrupt register)

Contorul program - PC (Program Counter) este un registru dublu, având lungimea de 16 biţi. El este destinat să memoreze adresa instrucţiunii curente ce se extrage din memorie. După ce se citeşte codul instrucţiunii curente din memorie (această operaţie se numeşte fetch), conţinutul acestui registru este automat incrementat cu 1. Astfel se asigură secvenţialitatea în execuţia unui şir de instrucţiuni (program). Instrucţiunile se vor executa începând de la adresa 0 (după /RESET), în ordinea crescătoare a adreselor. Atunci când în program apare un salt, se invalidează acţiunea circuitului intern de incrementare, în FjC încărcându-se noua valoare a adresei de salt. Memoria adresabilă direct este de 2 16 =65536 lodaţii Aistincte (în HEXA de la 0000H la FFFFH).

Indicatorul de stivă - SP (Stack Pointer) este un registru registru dublu, având lungimea de 16 biţi. Având aceeaşi lungime ca şi PC, el poate adresa întreg spaţiul de adrese de memorie: 0000H la FFFFH. Acest registru păstrează adresa de 16 biți a varfului stivei plasată oriunde in memoria RAM externă. Zona din memoria RAM utilizată ca stivă ester organizată pe principiul “ultimul- intrat, primul- ieșit ” (LIFO- Last In First Out), registrul SP organizând o stivă descrescătoare: la fiecare salvare se înscriu în memorie 2 octeți și conținutul indicatorului de stivă este decrementat cu 2.

SP=SP-2

La fiecare restaurare se citesc din memorie doi octeți și conținutul indicatorului de stivă este incrementat cu 2.

SP=SP+2.

Pentru salvarea şi restaurarea; datjelor din regiştri, stiva se dovedeşte a fi foarte utilă şi

convenabilă, dar nu şi de neînlocuit. Există în schimb un caz în care existenţa unei memorii organizată ca stivă este imperios necesară, şi anume: la apelarea subrutinelor şi mai ales în cazul unor apeluri multiple. Ori de câte ori programatorul scrie anumite module care pot fi folosite în mai multe-puncte ale programului său, el1 le va scrie sub formă de subrutine. O subrutină poate fi oricând apelată dintr-un program principal, folosind o instrucţiune de tipul CALL adresă, unde adresă este adresa de început a subrutihei. La întâlnirea unei instrucţiuni CALL, secvenţa de execuţie a programului principal este! abandonată, se execută subrutina, iar la întâlnirea unei instrucţiuni de tipul RET, care marchdazăj sfârşitul subrutinei, se revine în programul apelant, la instrucţiunea imediat următoare instrucţiunii CALL. Cum se revine? Odată cu executarea instrucţiunii CALL, adresa instrucţiunii următoare din programul apelant este salvată în vârful stivei, iar la execuţia instrucţiunii RET această valoare este citită automat din vârful stivei şi încărcată în contorul program PC, reluându-se astfel "firul pierdut". Aceasiă metodă de folosire a stivei dă rezultate bune şi în cazul apelării unei subrutine din altă subrutină şi aşa mai departe. Atragem atenţia că folosirea acestui registru este delicată. Pe stivă se înmagazinează atât valori salvate din regiştri de date, cât şi adrese de revenire din subrutine. Vă daţi seama ce se întâmplă dacă dintr-o droare de programare, la revenirea dintr-o subrutină în contorul program PC se încarcă o datăjoarecare şi nu adresa de revenire!

Registrul de instrucțiune IR (Instruction Register) este un registru cu lungimea de 8 biți. Acesta este celula în care se depoziteazăcodul unei instrucțiuni, citit din memorie la operația fetch. Circuitul de comandă al microprocesorului preia codul instrucțiunii de executat ăn vederea ducerii la bun sfârșit a execuției instrucțiunii. Programatorul nu are acces la acest registru și nu poate fi nici înscris și nici citit.

Registrul A - (Acumulator) este un registru având lungimea de 8 biţi. El se distinge prin faptul că pe lângă a şti să memoreze un octet, este! implicat în toate operaţiile aritmetice şi logice: unul din cei doi parametri asupra cărora urmează să fie efectuată o operaţie aritmetică şi logică (adunare, scădere, etc.) se va afla obligatoriu în acumulator. Rezultatul operaţiei se generează de asemenea în registrul A, el suprascriindu-se peste valoarea iniţială. Observăm că operaţiile aritmetice şi cele logice | acţionează astfel încât acumulează rezultatele în registrul A. De aici provine numele de acumulator. Ne putem imagina un microprocesor virtual care să aibă mai mulţi regiştri prevăzuţi cu această facilitate specială. Acel microprocesor ar avea mai mulţi acumulatori. S-au realizat şi astfel de microprocesoare. Un exemplu în acest sens îl poate constitui microprocesorul M6800 al firmei Motorola. Conchidem prin a afirma ică a poseda mai mulţi acumulatori poate fi un avantaj, reducându-se astfel numărul de | manevre necesare pentru efectuarea unor operaţii aritmetice/logice, dar este cert: un singur acumulator este suficient pentru a efectua operaţii oricât de complexe. Totul depinde de califidarea profesională şi iscusinţa programatorului în a aranja operaţiile elementare ale microprocesorul ji într-o ordine dorită, astfel ca programul realizat să efectueze ceea ce dorim. În figura 6.5 remarcăm prezenţa un si căsuţe marcate cu simbolul A'. Acest registru este un registru secundar, care împreună cu registru F’, B', C',D', E', H’ şi L’ formează grupul regiştrilor secundari. Existenţa acestor regiştri secundari este o particularitate a microprocesorului

Z80. Ei sporesc considerabil performanţele lui Z80 în comparaţie cu predecesorul său I8080. Conţinutul registrului A' poate fi interschimbat cu cel al registrului A, folosind instrucţiunea EX AF, AF". A" nu este un al doilea acumulator ai microprocesorului Z80 deoarece doar unul dintre ei poate fi activ la un moment dat. Pentru interschimbarea conţinutului celorlalţi regiştri se foloseşte instrucţiunea EXX. Registrul indicatorilor de condiţie - F (Rlag). Aşa cum o spune şi numele simbolic ales pentru acest registru special (flag-fanion, steguleţ)!el este menit să semnaleze ceva. în acest registru, care în cazul microprocesorului Z80 are Idngirliea de 8 biţi, fiecare bit în parte are semnificaţia lui. Starea lor (0 sau 1) indică satisfacerea iau nesatisfacerea unor condiţii date. De aceea ei se numesc indicatori de condiţie. Flagurile furnizează atât programatorului cât şi însăşi unităţii de comandă a microprocesorului, informaţii privind natura rezultatului unei operaţii aritmetice sau logic efectuate. Din starea biţilor dedicaţi ai registrului F putem afla dacă rezultatul operaţiei efectuate este 0 sau nu, dacă el este uh număr pozitiv sau negativ, dacă numărul biţilor din rezultat ce au valoarea 1 este un număr par sau impar etc. Să-i analizăm pe rând:

Flagul S (sign=semn) care apare pe poziţia cea mai semnificativă a registrului F (bit 7), memorează bitul cel mai semnificativ al uiui număr rezultat în acumulator pe baza unei operaţii aritmetice sau logice. în reprezentarea Ibineiră bitul cel mai semnificativ se foloseşte adesea pentru indicarea semnului unui număr. Prin convenţie, şi rezultând din particularităţile reprezentării sub forma complementului faţă de 2 a numere or binare, valoarea 0 a bitului S indică număr pozitiv, iar valoarea 1 un număr negativ. înzestrând bitul cel mai semnificativ al unui număr binar avnd lungirrjea de n biţi, cu funcţia de semn, tatălui numerelor reprezentabile prin acel număr nu se schimbă. Se modifică plaja de reprezentare a lor. Dacă se foloseşte convenţia numerelor întregi fără semn, atunci un număr binar de 8| biţi poate avea 2 8 =256 de valori distincte, cuprinse în plaja [0,255]. Dacă convenţia de reprezentare este: numere întregi cu semn, atunci aceeaşi 8 biţi pot reprezenta de asemenea 256 de valoiji, cijiprinse de data asta în plaja [-128+127]. în tehnica de programare, rămâne pe seama programatorului să decidă asupra semnificaţiei bitului celui mai semnificativ şi implicit al flagului de semn S. Starea flagului S se testează de obicei soft prin două instrucţiuni de salt condiţionat: JP P,nn şi JP M,nn care permit ramificarea programului în funcţie de starea indicatorului de semn. JP P,nn (jump if plus) - salt dacă rezultatul e pozitiv, efectuează saltul la adresa nn, dacă S=0 ; JP M,nn (jump if minus) - salt dacă rezultatul e negativ, efectuează saltul la adresa nn, dacă S=1 ; Vom vedea mai încolo că există şi alte instrucţiuni prin care se poate testa flagul S, ca şi flagurile Z, P/O, şi Cy de alfel, dar ne limităm deocamdată la cele două de mai sus fiindcă ilustrează destul de sugestiv utilitatea indicatorilor de condiţie.

Flagul Z (zero) - apare pe poziţia oit 6 a registrului F. El este înscris cu valoarea 1

dacă rezultatul unei operaţii aritmetice/lobicei este 0. Dacă rezultatul operaţiei diferă de 0, atunci conţinutul indicatorului Z va fi 0. Adesea pentru testarea flagului Z se folosesc instrucţiunile de salt condiţionat: JP NZ,nn şi JP Z,nn unde:

JP NZ?nn (jump if not zero) semnifică salt, dacă diferit de zero: saltul se efectuează dacă Z=0 ; JP NZ,nn (jump if zero) înseamnă salt.idacă zero: saltul se efectuează dacă Z=1. Acest i indicator este folosit şi de circuitujl de comandă al microprocesorului, la execuţia unor instrucţiuni repetitive. Amintim aici instrucţiunile de comparaţie CPIR şi CPDR (ComPare Increment Repeat respectiv ComPare Decrement Repeat) caz în care instrucţiunea care compară conţinutul acumulatorului cu celule de memorie aflate la adrese crescătoare (sau descrescătoare) se termină dacă Z=1, adică în cazul egalităţii celor (două

numere comparate. Instrucţiunile de transfer de blocuri de date la periferice, INDR şi INIR precum şi OTDR şi OTIR se termină deasemenea în cazul în care Z=1 (în cazul de faţă registrul B devine 0). Flagul H (Half carry) ocupă pdziţis bit 4 în registrul indicatorilor de condiţie F şi reprezintă transportul care apare în urma unei opera Ti aritmetice de la bitul 3 spre bitul 4 al acumulatorului. Acest flag NU poate fi testat prin instrucţiuni de salt condiţionat. Ei este folosit de către unitatea aritmetică/logică a microprocesorului (ĂLU), la execuţia instrucţiunii de corecţie zecimală (DAA -Decimal Adjust Acumulator), pentru corecţia numerelor zecimale codificate binar: BCD. Dacă considerăm cei 4 biţi inferiori (bitO - bit3) a unui număr ca o cifră hexazecimală (digit), care poate avea Valori în domeniul [0 - F], transportul intermediar H va avea valoarea 1 ori de câte ori, ca rezultat a unei operaţii de adunare sau'scădere, valoarea digitului mai puţin semnificativ (bit 0 - bit 3) depăşeşte domeniul: fie că ar trebui să fie mai mare de 9, fie că ar trebui să fie negativ (mai mic ca zero). ALU execută toate operaţiile înj sistemul binar. De aceea, pentru a putea lucra şi cu numerje zecimale codificate în binar (J3CD), instrucţiunea de ajustare a rezultatului unei operaţii aritmetice DAA, va folosi acest bit de transport intermediar. Flagul PA/ (Parity/Overflow) - este) un indicator de condiţie multifuncţional. El ocupă poziţia bit 2 în registrul F. Aşa cum rezultă din numele acestui indicator, el poate indica paritatea numărului din acumulator (în urma exdcutâirii unei instrucţiuni logice) sau depăşire de domeniu (în urma executării unei intrucţiuni aritmetice când apare un transport dinspre bitul 6 spre bitul 7 al acumulatorului). O a treia funcţie a acestui flag care este citată destul de rar în literatura de specialitate (ea dezvăluindu-se doar acelora care studiază atent setul de instrucţiuni al microprocesorului): instrucţiunile de transfer multiple (LLD, LDI, LDDR, LDIR) şi cele logice multiple (CPD, CPI, CPDR, CPIR) utilizeazjă flagul PA/ ca detector de zero al registrului dublu BC. în acejst din urmă caz PA/=0, dacă conţinutul registrului dublu BC=0, ceea ce este o condiţie de terminjare a instrucţiunilor cu repetiţie. Pentru aceste instrucţiuni PA/=1 dacă BC ≠ 0. Atragem un pic atenţia asupra folosirii bitul Ji PA/ cu rol de depăşire de domeniu: după cum se ştie rezultatul unei operaţii aritmetice este corect dacă:

1) apare concomitent transport dinspre bitul 6 către bitul 7 (bitul de semn) şi dinspre bitul 7 mai încolo (bitul carry). 2) nu se efectuează nici un fel de trcinsport. Această condiţie se poate implementa uşor prin hardware sau software realizând o funcţie SAU-EXCLUSIV (XOR) între cei doi biţi de transport:

V=T 6 XOR T 7

În cazul apariției unui transport rezultatul trebuie corectat. Flagul P/V poate fi tetstat prin instrucțiuni de salt condiționat: JP PO,nn și JP PE,nn:

JP PO,nn (jump if parity odd) se executa salt la adresa nn dacăparitatea este impară

(P/V=0).

JP PE,nn (jump if parity even) se execută salt la adresa nn dacă paritatea este pară (PA/=1); Remarcăm, că indiferent de faptul că P/V indică paritate sau depăşire, mnemonica face referire mereu, la paritate. Aceasta este o posibilă capcană pentru programatori, ei trebuind să ştie ce anume indică flagul PA/ în momentul îi care se foloseşte una din instrucţiunile de salt condiţionat ce testează starea acestui bit

(instrucţiune logică sau aritmetică).

I • Flagul N - este un indicator care memorează tipul ultimei operaţii aritmetice efectuate:

adunare sau scădere. în registrul F el ocupă poziţia b'rt 1. De ce se numeşte tocmai N, nu

ştim nici noi, referinţele bibliografice avute la disDoziţie neindicând nimic sugestiv în acest sens. i N=1 dacă ultima operaţie aritmetică a fost adunare ;

| N=0 dacă ultima operaţie efectuată a fost scădere ; Flaguli N este folosit împreună cu

indicatorul de transport intermediar H şi cu indicatorul de transpprt Cy, pentru ajustarea

numerelor zecimale codificate binar (BCD), de către instrucţiunea DAA.

Utilizatorul nu dispune de instrucţiuni dedicate pentru testarea valorii acestui indicator.

• Flagul Cy (Carry - transport)1 este indicatorul cel mai popular, afectat atât de operaţiile

aritmetice/logice cât şi de clasa operaţiilor de rotire/deplasare octet. El ocupă poziţia bit 0 în registrul indicatorilor de condiţie F. Flagul; Cy este înscris cu valoarea 1 orii de câte ori de câte ori apare un transport de la cifra cea mai semnificativă în afară. Acesta este cazul, dacă pe urma unei adunări în aritmetica fără semn (gama de valori posibile 0-255) rezultă un număr mai mare de 255. La scădere Cy=1, dacă scăzătorul ester main mare decât descăzutul. Spre deosebire de toți indicatorii de condiție, în cazul flagului Cy exista instrucțiuni dedicate pentru modificarea conținutului acestui bit:

SCF (Set Carry Flag) cauzează : Cy=1, iar CCF (Complement Carry Flag) complementează conţinutul lui Cy. Existenţa acestor instrucţiuni ne sugerează ideea să folosim indicatorul Cy ca indicator universal de condiţie. Un programator îşi poate fixa de exemplu regula ca acest Cy să fie folosit ca indicator de eroare: dacă la întoarcerea dintr-o subrutină Cy=1, eşirsa din subrutină să fie anormală, programul urmând să ia alt curs de parcurgere. Acest exemplu este doar o idee, oricine putând ataşa alte semnificaţii posibilb bitului Cy. Indicatorul Cy poate fi teistat prin instrucţiuni de salt condiţionat: JP NC,nn şi JP C,nn. Folosind aceste instrucţiuni, ramificaţia programului se va face după cum urmează: JP IMC.nn (jump if non carry) - salt Ia adresa nn, dacă Cy=0; JP C,nn (jump if carry) - salt la nn, dacă Cy=1; Ca şi ijn cazul celorlalte flaguri testabile1 prin instrucţiuni de salt condiţionat şi Cy poate dirija apeluri şi reveniri condiţionate din subrutine:

CALL NC, nnCALL C,nn ; RET NC ; RET C. Cei doi biţi ai registrului F care au mai fâmas sunt lipsiţi de semnificaţie, conţinutul lor variind imprevizibil pe toată durata de funcţionare a microprocesorului Z80. Registrul de reîmprospătare a memoriilor dinamice - R (Refresh) - este un registru cu lungimea de 7 jbiţi, menit să asigure printr-o; numărare ciclică de la 0 la 127 (0000000 - 1111111) reîmprospătarea memoriilor RAM dinamice, din componenţa unui microcalculator, atunci când ele există. Pentru a-i înţelege mai bine'menirea şi modul în care se achită de sarcina încredinţată, vom face din nou o paranteză. în memoriile RAM dinamice pastr.area informaţiei se face în celule a căror element de memorare este un condensator realizat în structura semiconductorului. Ştiind că un circuit de memorie dinamică având 65.536 celule de memorie distincte este un circuit integrat cu 16 pini, a cărui structură (chip) nu depăşeşte dimensiunea de 3mm x 3 mm, ne putem da seama că şi dimensiunile geometrice ale condensatoarelor de memorare într-un circuit RAM dinamic nu depăşesc 10"15F. Datorită curenţilor de scurgere prin dielectricul acestor condensatoare, ele au tendinţa de a se descărca, pierzând ajstfe în timp treptat informaţia (1 sau 0) înregistrată în ele. Timpul limită în care această descărcare nu periclitează încă

integritatea informaţiei stocate, este de aproximativ 2msec. De aceea diri 2 în 2 msec. condensatoarele vor trebui repolarizate la valoarea lor iniţială. Această procedură se numeşte reîmprospătarea memoriilor dinamice (refresh). Pentru a afla care este thnica folosită pentru a da un răspuns la această întrebare vom considera structura circuitelor DRAM. În timpul răspândirii pe scară largă a microprocesoarelor de 8 biți, cele mai răspândite circuite DRAM au fost cele de 16Kbit. Ele au o organizare matriceală având 128 linii și tot atâtea coloane. Astfelse acoperă întregul spațiu de adrese de 16Kbit:

128 x 128 = 16384 = 16Kbit.Memorii dinamice sunt astfel realizate, încât selectarea unei celule pentru scriere sau citire reîmprospătează îijitregul rând pe care se află elementul accesat. Ba chiar mai mult, nici nu trebuie făcut accesul până la celula dată: este suficient să se selecteze rândul respectiv. Reîmprospătarea memoriei dinamice se poate face în acest caz asigurând ca toate cele 128 de rânduri să fíe selectate cel puţin o (dată la 2 msec. Cele 128 de rânduri se pot codifica pe 7 linii (27=128) de adresă. De aici rezultă ca un registru numărător circular având lungimea de 7 biţi arputea sta la baza sistemului de reîmprospătare. (Acelaşi număr de biţi -7- este suficient şi în cazul utilizării unui circuit RAM dinamic având capacitatea de 64Kbit, căci aceste circuite conţin de fapt 4 grupe de 16Kbit). lată de ce registrul R are lungimea de 7biţi. Rămâne de văzut cum funcţionează. Proiectanţii microprocesorului' Z80 au plecat de la ideea că în timpul decodificării unei instrucţiuni citite din memorie, microprocesorul nu efectuează nici o activitate externă. Magistrala de adrese a microprocesorului îşi poate schimba deci conţinutul, pe biţii ei inferiori A0-A6 apărând conținutul registrului R, care acompaniat de semnale de comandă (/MREQ și /RFSH) va pute asigura reîmprospătarea memoriei dinamice. După cum ați realizat probabil, registrul R ester înzestrat și cu un mecanism care îi incrementează automat conținutul dupa fiecare ciclu refresh.

Conţinutul registrului R poate fi înscris şi citit "via" acumulator:

LD R,A - înscrie R LD A,R - citeşte R Aceste sunt singurele instrucţiuni prin cate programatorul poate accesa registrul R. În rest e trăieşte viaţa monotonă şi autonomă de numărător circular de 7 biţi. La iniţializarea microprocesorului (aplicarea semnalului de comandă /RESET), conţinutul registrului de refresh R este încărcat cu 0. Prezenţa registrului R este un câştig semnificativ în favoarea microprocesorului Z80, ea microcalculatorului de un efort considerabil, cel de a realiza o memorie cu 2 căi de acces (din partea procesorului şi din partea unui circuit de reîmprospătare extern) şi de rezolva cdnflidtele ce apar între cele două subansamble. Registrul vectorului de întreruperi - I (Interrupt register) - este un registru cu lungimea de 8 biţi şi serveşte în modul de întreruperi 2 (instrucţiunea IM 2) la dirijarea (identificarea) sursei de cerere a întreruperilor. Prin întrerupere înţelegem fenomenul la apariţia căruia microprocesorul abandonează - la cererea unui eveniment extern - programul în curs de rulare, deserveşte - executând un program dedicat - evenimentul extern, după care se reîntoarce la programul abandonat, reluându-i execuţia din punctul în care ea fusese suspendată. Sunt multe aspecte de lămurit în legătură cu acest fenomen. Ne oprim acum doar asupra unui aspect: cum identifică microprocesoiul perifericul (sau evenimentul extern) care a solicitat întreruperea ? Cererea de întrerupere /INT soseşte fizic la microprocesor pe linia

de stare având acelaşi nume. Pentru identificarea apelantului, şi implicit pentru localizarea rutinei de tratare aferente s-au elaborat numeroase soluţii, şî se pot imagina cel puţin atâtea noi variante. Soluţia cea mai rapidă şi cea mai flexibilă pare a fi'identificarea vectorizată: din diverse surse se constituie o adresă de memorie, care este însăşi a'dresa de început a rutinei de tratare a cererii de întrerupere recepţionate. Această adresă se încarbă în contorul program PC şi microprocesorul a şi ajuns la rutina dorită. Care sunt aceste surse ? a)În cazul microprocesorului Z80, perifericul care solicită întreruperea va plasa, o dată cu acceptarea ei, pe liniile de date un octet de adresă, pentru identificare. Fiecare periferic are adresa lui proprie, inconfundabilă cu altele. Asta ar fi prima sursă. b) Cea de a doua sursă este însăşi registrul I. Conținutul lui se plasează pe liniile superioare de adresă A8 – A15 ( liniile inferioare A0 A7 sunt date de periferic). Din cei 2 octeți atașați se formează o adresă de memorie A0 – A15 ) vector de întrerupere) de la care se citesc 2 octeți succesivi din memorie, și se încarcă în PC efectuându-se saltul la rutina căutată. S-a identificat astfel implicit,fără căutări sau testări, sursa cererii de întrerupere. Iniţializarea registrului precum şi asigurarea faptului ca în memorie, la adresa vectorului de întrerupere să se afle adresa de început a rutinei de tratare a întreruperii respective, cade bineînţeles în sarcina programatorului. Procedura de adresare folosită este dublu indirectă. A doua treaptş de adresare - cea de citire a adresei efective de început a subrutinei de tratare a întreruperii acceptate, - este indirectă, prin memorie. Programatorul poate avea acces la registrul I numai cu următoarele două instrucţiuni:

LD I,A - înscrie o valoare în I; LD A,I - citeşte valoare lui I; La iniţializarea microprocesorului (aplicarea semnalului de comandă /RESET), în registrul I se înscrie valoarea 0.

6.2.1.2. Regștri de uz general.

B, C, D, E, H, L, - regiștri primari IX, IY regiștri de index B', C\ D\ E', H\ U reșistri secundari Au menirea să păstreze în apropierea unitații centrale date, care so poată if accesate rapid, evitându-se pe cât se poate accesele la memorie, operatii care sunt molt main lente și reduc artful viteza de lucru a microprocesorului. Într-o grupare semnificativă a figurii din IM.0 distingem alături de regiștrii déjà prezentați (PC,SP,R,I) alte căsuțe simbolizate cu B,C,D,E,H,L, regiștri de uz general primary și B`,C`,D`,E`,H`,L`,regiștri de uz general secundari. Precum și IX respectiv IY care sunt regiștri de index. Regiştrii B şi C: sunt regiştri generali de 8 biţi. Există o multitudine de instrucţiuni (de transfer, aritmetice, logice, de rotire, e[tc.) care tratează conţinutul acestor regiştri. Ei nu au fost figuraţi întâmplător pe aceeaşi linie: în anumite condiţii ei se pot ataşa, formând un registru pereche BC, având lungimea de 16 biţi. în această [situaţie B este octetul cel mai semnificativ, iar C octetul cel mai puţin semnificativ. Există bineînţeles instrucţiuni care tratează perechea BC ca un registru de 16 biţi (instrucţiuni de transfer, instrucţiuni aritmetice).

Regiştrii D şi E: se caracterizează;prin aceleaşi trăsături ca şi regiştri B şi C. Atunci când perechea DE formează un registru dublu de 16 biţi, D ocupă octetul superior iar E octetul inferior. Regiştrii H şi L: diferă de cei anteriori B, C, D, E doar prin faptul că sunt implicaţi într-un număr mai mare de instrucţiuni, având astfel un grad de funcţionalitate sporit faţă de BC şi respectiv DE. Atunci când ei formeazăj o pereche HL, registrul H ocupă octetul superior, iar L cel inferior. Plusul de funcţionalitate al acestui registru dublu se referă la efectuarea de operaţii aritmetice sau logice între registrul A şi conţinutul unei locaţii de memorie oarecare, când adresa acestei locaţii se va înscrie în registrul jdublu HL. Perechea HL devine astfel principalul instrument de adresare indirectă a unor operanzi localizaţi in memorie la adrese cunoscute. Se mai pot folosi în schimb şi regiştrii IX şi IY.

Regiştrii index IX şi IY: sunt prin definiţia dată de producători, regiştri de 16 biţi. Ei sunt dedicaţi pentru stocarea unor adrese de memorie. Faptul că aceste instrucţiuni care tratează aceşti regiştri ca şi regiştri de 8 biţi, este ascUns sub voalul tăcerii de către fabricanţi. Noi îi vom trata ca regiştri de 16 biţi. Regiştri IX şi IY au foşti gândiţi să fie utilizaţi atunci când trebuiesc efectuate operaţii aritmetico/logice asupra unor câmpuri de date, date ce sunt aşezate la adrese successive de memorie, formând astfel un tabel. Registri index nu vor conţine adresa celulei care se doreşte a fi tratată,ci conțin adresa de început a tablei de date. Data dorită se va localiza adăugând la adresa de la începutul tabelei ( adresa de bază), indicele ( numărul de ordine) datei respective. Indicele datei dorite se specifică explicit în enunțul instrucțiunii, valoarea lu fiind adunată în cursul execuției instrucțiunii la adresa de bază, conținută în registrul în registrul index IX sau IY, formându-se artful adresa efectivă a celulei de memorie dorite. Spere exemplificare considerăm instrucțiunea :

ADD A,(IX+7) Conţinutul registrului IX nu se modifică pe parcursul execuţiei acestei instrucţiuni. Datele din tabeleje adresate cu registrul index vor fi date cu lungimea de 1 octet. Numărul maxim de elemente ce pot fi reperate cu o adresă de bază este de 256, datorită faptului că indicele care apare în câmptjl instrucţiunii are lungimea de 11 octet. Programatorul dispune bineînţeles de instrucţiuni de iniţializare, salvare şi restaurare a regfştribr index /X şi IY. Ba chiar mai mult, ei pot fi folosiţi şi pentru! efectuarea unor operaţii aritmetice de 16 biţi, înlesnindu-se astfel calculul unor adrese de bază, prin program. Această facilitate suplimentară îi îndeamnă pe mulţi programatori, să folosească regiștri dubli IX și IY în alt scop decît cel pentru care au fostgândiți, ceea ce desigur nu ester de condamnat. Artful regiștriiIX și IY sunt des utilizați ca elemente de memorare a unor valori numerice de 16 biți. Amintim că tehnica de adresare a unor operanzi localizați în memorie, folosind regiștri IX și IY se numește adresare indexată. Regiştri Secundari B', C’, D’, E', H', L. Ca şi în cazul regiştrilor speciali A și F, unde am întâlnit deja regiştri secundari A' respective F', şi regiştri de uz general au câte o dublură: regiştri secundari B', C, D', E', H', L'. Conţinutul regiştrlor primari şi a celor secundari poate fi interschimbat concomitent, printr-o singură instrucţiune: EXX după care se poate lucra cu regiştri secundari la fel ca şi cu cei primari (folosind acelaşi set de instrucţiuni). Toate instrucţiunile care implică regiştri de uz general B, C, D, E, H, L acţionează asupra

conţinutului regiştrilor primari. Pentru a putea opera cu conţinutul regiştrilor secundari, el trebuie transferat în regiştri primari, folosind instrucţiunea EXX.

6.2.1.3 Regiştri de manevră, transparenţi utilizatorului

În interiorul oricărui microprocesor) există şi anumiţi regiştri care nu sunt folosiţi în mod explicit de către instrucţiunile acelui microprocesor. în figura 6.5 am notat aceşti regiştri cu T, T, W şi Z. Eji sunt regiştri de manevră, transparenţi utilizatorului, deci nu se pot accesa cu ajutorul setului de instrucţiuni. Regiştri W şi Z: sunt regiştri de câte 8 biţi care pot fi trataţi şi ca regiştri dubli de 16 biţi. Regiştri temporari T: sunt regiştri de intrare în unitatea aritmetică/logică (ALU) şi au câte 8 biţi fiecare. Registrtrul tampon de date DB (Data Buffer) este un registru bidirecţional de 8 biţi, care delimitează interiorul microprocesorului dejlumea externă. El este necesar în primul rând pentru a menţine datele ce sunt trimise din celulele regiştrilor interni spre memorie, sau spre periferice. Regiștri tampon de adrese AB (Address Buffer) izolează pe de o parte magistrala externă de adrese de cea internă. În afară de aceasta el are un rol de memorare temporară a unor adrese, rol pe care l-am explicitat la relevarea modelului funcţional al unui microprocesor ipotetic.

6.2.2. Circuitul de Comandă Acest bloc funcțional, notat în figura 6.5 cu Commnd Circuit ester inima și creierul oricărei unitați centrale de calculator și implicit al microprocesoarelor. Sarcina lui este să guverneze toate activităţile microprocesorului, începând din momentul în care acestuia i se aplică tensiune şi semnal de tact. Circuitul de comandă generează tokte semnalele de comandă pentru activarea secvenţială a tuturor elementelor interne şi externe din microcalculator. în linii mari, în activitatea lui se disting următoarele faze majore: citeşte din memorie codul instrucţiunii de executat, îl decodifică şi înţelegând semnificaţia codului citit programează toate activităţile interne şi externe pentru a duce la bun sfârşit comanda primită. Amintim doar că cea mai scurtă instrucţiune se execută în 4 tacţi procesor (ex. transferul între regiştri: LD A,p ; LD D,E etc.) pe când cea mai lungă necesită 23 de stări de tact distincte, fiecare cu semnificaţia ei (ex.:

ştergerea unui bit dintr-o locaţie de memorie adresată printr-un registru index: RES

3,(IX*IND)).

În blocul funcţional al circuitului da comandă am inclus şi bistabilii de validare/inhibare a sistemului de întreruperi IFF1 şi IFF2, precum şi registrul MOD de 2 biţi al modului de întrerupere folosit. Dacă IFF1 ş/'IFF2 au valoarea 1, atunci sistemul de întreruperi este validat, microprocesorul acceptând cererile de întrerupere sositet din exterior. Dacă ele au valoarea 0, sistemul de întrerulperi este inhibat, cererile de întreruplere fiind neglijate. în registrul MOD se stochează modul de întrerupere selectat prin una din instrucţiunile de comandă IMO, I/M1, IM2. Asupra rolului acestor elemente funcţionale şi a funţionării lor vom reveni în altă lucrare de laborator.

6.2.3. Unitatea aritmetico-logică

Aşa

cum

rezultă

din

relatările

anterioare,

ALU

este

un

bloc

funcţional

al

microprocesoarelor, destinat să efectueze operaţiile aritmetice şi logice. Unitatea

aritmetico/logică a microprocesorului Z80 este de tip paralel, având lăţimea d 3 8 biţi. Această unitate centrală poate executa două operaiii aritmetice: adunarea şi scăderea acţionează de asemenea pe cuvinte de

a două numere binare de câte 8 biţi. Operaţiile logice câte 8 biţi. Ele sunt Şi, SAU,' SAU

EXCLUSIV, COMPARAŢIE şi COMPLEMENTARE (corjnplement faţă de 1 sau 2). Unul din operanzii implicaţi în operaţijle ALU, va proveni totdeauna din registrul acumulator A. Odată; cu generarea rezultatului operaţiilor aritmetice/logice, se poziţionează şi indicatorii de condiţie ai registrului F. Setul de instrucţiuni aritmetice şi logice pare a fi sărac pentru cel care doreşte să execute calcule ştiinţifice folosind instrucţiunile enunjateJ Pentru începători pare puţin probabil să calculezi logaritmul unui număr real cu o precizie de 16 cifre semnificative, atunci când dispui de o unitate aritmetică care ştie doar să adune şi să scadă două numere întregi

având valori cuprinse în limitele [0,255]. Ţinem să-i liniştim afirmând i Ieste posibil, trebuie să cunoşti însă bazele analizei numerice pentru a reduce calculul unui logaritm la adunări şi scăderi şi să ai iscusinţa de a transpune aceşti algoritmi în prdgrarrie scrise cu ajutorul instrucţiunilor limitate ale microprocesoarelor. ALU efectuează scăderile transformând scăderile în adunări. Numerele de scăzut (negative) sunt transformate în complementul lor faţă de 2. Circuitele electronice care realizează funcţiile ALU sunt de tip combinaţional, fiind mult mai simple decât cele din circuitul de comandă al microprocesorului.

6.2.4 Magistralele interne

Magistrala de 8 biţi.

Ştiind că lăţimea majorităţii regîştrilpr din interiorul microprocesorului Z80 este de un octet, deducem că în interiorul lui trebuie să existe o magistrală având lăţimea de 8 biţi pentru a se putea efectua transferurile interne. La aceasta magistrală de date care începe la bufferul de date DB se leagă registrul instrucţiune IR, acumulatorii A, regiştri tampon T de

la intrarea ALU, ieşirea ALU, precum şi toţi ceilalţi regiştri interni de 8 biţii.

Magistrala de 16 biţi. Adresele de memorie pe care microprocesorul le generează au lăţimea de 16 biţi. În interiorul microprocesorului ele se veh culează pe o magistrală locală care se termină la registrul tampon pentru adrese AB (Address Buffer). Din studiul detaliat al funţionăriijmic-oprocesorului rezultă că toţi regiştri B, C, D, E, H, L, IX, IY, SP, PC, şi WZ au câte 2 ieşiri:

- una din ieşiri este racordată lalmagistrala de 8 biţi, folosindu-se pentru transferul de date. -cealaltă ieşire a lor este legată la octetul superior sau inferior al magistralei de 16 biţi, permiţând astfel generarea unor adrese de 16 biţi pentru adresarea memoriei externe.

Semnale de comandă interne.

Pentru a putea activa în ordinea dorită, fiecare element funcţional intern, circuitul de comandă al microprocesorului dispune dej o multitudine de semnale de comandă, semnale care ajung |a toate părţile lui componente. Ele nu au fost reprezentate în modelul din figura IM.O numărul lor mare nepermiţând acest lucru. Oricfjm este suficient să ştim de existenţa

lor. Nefiind nominalizate, aceste semnale vor fi grupate sub numele generic de semnale de comandă interne.

6.3. SEMNALELE

EXTERNE

După ce am cunoscut structura internă a microprocesorului, este momentul să prezentăm semnalele prin care el comunică cu lumea externă. în figura 6.6. redăm semnalele externe ale microprocesorului Z80, grupate funcţional. Distingem 3 clase mari de semrjale: magistrala de date, magistrala de adrese şi magistrala de comenzi.

6.3.1. Magistrala de date DO - D7

Cele 8 linii care pornesc din registrul tampon de date DB al microprocesorului sunt folosite pentru a asigura transferul de date între microprocesor, memorie şi dispozitive de intrare/ieşire, împreună ele formează magistrala de dalte a microprocesorului, notată DO - D7. Magistrala de date a; microprocesorului este bidirecţionala. Pe ea intră date atunci când se efectuează o citire din memorie sau dispozitive de intrare/ieşire, şi ies date la efectuarea unei scrieri. Magistrala este de tip tri-state: pe lângă cele două nivele logice active (0 şi 1), fiecare linie de da^e poate avea o stare inhibată, de înaltă impedanţă. Această stare este utilă dacă în anumite momente de funcţionare, magistrala de date trebuie cedată de către microprocesor unei alte componente din microcalculator. Un exemplu în acest sens îl poate constitui efectuarea unui transfer de date, direct de la un dipozitiv de intrare/ieşire în memorie (sau invers) procedeu numit DMA (Direct Memory Acces - acces direct la memorie). Magistrala de date este neinversată: biţii de valoare 1 vor apare cu nivele de tensiune ridicată (3 - 4 V), pe când cei valoare 0 vor fi materializaţi prin nivele de tensiune scăzute (0.1 - 0.8 V). DO este bitul cel mai puţin semnificativ al octeţilor ce circulă pe magistrala de date.

6.3.2 Magistrala de adrese: AO - A15 Cele 16 linii ce- şi au originea în

6.3.2 Magistrala de adrese: AO - A15

Cele 16 linii ce-şi au originea în registrul tampon de adrese AB a microprocesorului, formează împreună magistrala de adrese.

Ea este unidirecţională: adresele ies din microprocesor pentru a fi transmise la circuitele de memorie şi cele de intrare/ieşire ale microcalculatorului. Cele 16 linii de adresă permit adresarea directă a 64 k de memorie RAM. Pentru adresarea dispozitivelor de intrare/ieşire, se decodifică de obicei octetul inferior al registrului de

adrese AO -A7, putându-se astfel lega 256 x 2 dispozitive de intrare/ieşire în sistem

transferul de date între procesor şi dispozitivele de intrare/ieşire se realizează cu ajutorul instrucţiunilor ce folosesc adresarea indirectă: IN A,(C) respectiv OUŢ (C),A atunci, în ciclurile de intrare/ieşire, pe magistrala de adrese va apare conţinutul regiştrilor BJ(A15 - A8) şi C (A7 - AO). Decodificând ambii octeţi ai magistralei de adrese, numărul dispozitivelor de intrare/ieşire adresabile direct de către microprocesor creşte la 65.536 x 2. În ciclul de reîmprospătare a memoriei, liniile de adresă AO - A6 conţin adresa rândului reîmpipspătat (conţinutul registrului R). Aidoma magistralei de date şi magistrala de adrese poate avea 3 stări electrice (logice) distincte: 2 stări active (1 sau 0) şi o stare inhibată de înaltă impedanţă. Menirea celei de a treia stări este identică cu cea enunţată la magisitrala de date. Linia AO conţine bitul cel mai puţin semnificativ al adreselor (pe scurt LSB).

6.3.3. Magistrala de comenzi

Dacă

Acest nume este un nume generic, căci spre deosebire de celelalte două magistrale, în care liniile fiecăreia aveau semnificaţii similare magistrala de comenzi este reuniunea unor semnale individuale de intrare sau ieşire din microprocesor, având fiecare un rol aparte Le

clasificăm totuşi în trei grupei -semnalul de tact

- semnale de comandă

- semnale de stare

6.3.3.1 Semnalul de tact (O)

Este un semnal TTL, constituind elementul motor al microprocesorului. Toate evenimentele interne ale micoprocesorului apar sincronizate cu acest semnal. Frecvența semnalului poate varia în limite destul de largi, interesul nostrum fiind însă acelea de a lucra cu frecvențe cât main mari ale semnalului de ceas, datorită faptului că viteza de execuție este direct proporțională cu freccvența tactului O.

6.3.3.2 Semnale de comandă

În această categorie includem semnalele care sunt generate de către microprocesor. Cu ajutorul lor, circuitul de comandă !al microprocesorului dirijează activităţile din interiorul microcalculatorului. /M1 - (Machine cyde 1 - ciclu maşină 1) este un semnal activ în starea 0. El apare ori de câte ori microprocesorul citeşte din memorie codul unei instrucţiuni, operaţie numită fetch. în acesta situaţie el este însoţit de alte două semnale /MREQ (Memory REQuest) şi /RD (ReaD) care concură la citirea codului din memorie. /M ¡I se activează şi în ciclul de acceptare a unei cereri de întrerupere. în acest caz el se activează îjnpreună cu /IORQ (Input/Output ReQuest). Apariţia lor concomitentă determină perifericul apelant să depună pe magistrala de date octetul inferior al vectorului de întrerupere. Există instrucţiuni care sunt descise prin două sau trei coduri de operaţie. în cursul execuţiei acestora, /M1 se activează ta citirea fiecărui octet cod de operaţie. /M1 poate trece în starea! de înaltă impedanţă (tri-state). /MREQ - (Memory REQuest - cerere de acces la memorie), este un semnal activ în starea 0. El se activează ori de câte ori microprocesorul doreşte să efectueze un acces la memorie, fie pentru! citirea, fie pentru înscrierea ei. /MREQ se activează şi pe parcursul ciclului de reâmprospătare a memoriilor dinamice, acompaniat de semnalul /RFSH. în momemtul apariţiei acestui semnal magistrala conţine pe liniile A0 - A15 adresa de memorie la care se va efectua accesul. /MREQ poate trece în starea de înaltă impedanţă (tri-state). /RD (ReaD - citeşte) este uri semnal activ în starea 0. El este activat atunci când microprocesorul execută citirea unui octet, din memorie sau de la un dispozitiv de intrare. Elementul apelat (celula de memorie sau dispozitivul de intrare) va transfera la apariţia acestui semnal conţinutul lui pe magistrala de datei. Sursa datei de citit se stabileşte din starea semnalelor /MREQ şi /IORQ. /RD poate trece în starea de înaltă impedanţă (tri-state). /WR - (/WRite - scrie) este un semnal activ în starea 0. El se activează atunci când microprocesorul urmează să scrie un ocjtet în memorie sau la un dispozitiv de intrare/ieşire. Destinaţia octetului transferat se stabileşte din starea semnalelor /MREQ şi /IORQ. înainte de activarea semnalului /WR microprocesorul!va depune pe magistrala de date octetul de transferat. Datele fiind stabile în momentul apariţiei semnalului de scriere /WR, el poate fi folosit (frontul său căzător) pentru înscrierea lor în celule de memorie sau

dispozitivul de ieşire dorit. A/VR poate trece în starea de înaltă impedanţă (tri-state); /IORQ - (Input/Output ReQuest - cerere de acces la dispozitivul de intrare /ieşire ) este un semnşl activ în starea 0. El este acompaniat de unul din semnalele /RD_ sau /WR, împreună cu care determină tipul de acces efectuat la dispozitivele de intrare/ieşire. în ciclul de acceptare a cererii; de întrerupere /IORQ se activează împreună cu /M1. Prezenţa celor două semnale semnifică acceptarea unei cereri de întrerupere. /IORQ poate trece în starea de înaltă impedanţă (tri-state). /RFSH - (ReFreSH - reâmprospătare) este un semnal activ în starea 0. El se generează în ciclul de reâmprospătare a memoriilor dinamice. Prezenţa acestui semnal, activat înseamnă că pe liniile A0 - A6 s-a depus conţinutul registrului R. La apariţia semnalului /RFSH aceste linii nefiind încă stabilizate, se recomandă să se folosească semnalul /MREQ care apare în acest ciclu puţin mai târziu, pentru declanşarea accesului de reâmprospătare a memoriei. /HALT - (Halt - opreşte) eşte un semnal de ieşire activ în starea 0, prin care microprocesorul aduce la cunoştinţa sîsteifnului, faptul că a executat o instrucţiune HALT şi este oprit, prin această stare microprocesorul nul poate fi scos decât printr-o întrerupere /INT (dacă IFF = 1) o întrerupre nemascabilă /NMI, sau o reinițializare /RESET. În realitate microprocesorul nu stă pe loc, ci executa în continuare instrucțiuni NOP (No Operation) pentru a asigura reâmprospătarea unei eventuale memorii dinamice din system. Dacă ieșirea din starea HALT s-a făcut printr-o întreruper, (mascabilă sau nemascabilă), dupa tratarea ei, execuția programului va continua de la instrucțiunea locală la adresa următoare instrucțiunii HALT.

/BUSAK - (BUS AcKnowledge I- acceptarea cererii de magistrală) este un semnal activ în starea 0, prin care microprocesorul i confirmă acceptarea unei cerei /BUSRQ de cedare a magistralelor. Semnalul /BUSAK apatje totdeauna după terminarea unui ciclu maşină, după ce microprocesorul şi-a pus în stare de înaltă impedanţă magistralele (date, adrese, comenzi). /BUSAK nu trece niciodată în starea dej îna tă impedanţă.

6.3.3.3. Semnale de stare

O fi microprocesorul "creierul şi conducătorul" vieţii interne a unui microcalculator, dar

oricât de atotputernic ar fi, nu-şi poate pemhite să dea comenzi orbeşte, fără să-i pese de

răspunsul celorlalte componente din sistem. Uneori \|a trebui să-şi încetinească ritmul, alteori va fi întrerupt, părăsind temporar programul în care se afla, pentru a se putea îngriji

la cerere de subalternii săi, ba chiar mai mult, în anumite circumstanţe va trebui să stea

deoparte, lăsându-i şi pe alţii "să vorbească" - să preia comanda - dacă ex stă activităţi pe care ei le pot efectua mai rapid şi mai eficient.

În ultimă instanţă, dacă în munca sa microprocesorul s-a pierdut pe drum, pe cărările

accidejntate ale unui program insuficient de bine pus la punct, trebuie să existe posibilitatea de a-l readuce cu "picioarele pe pământ", forţandu-l să ia totul de la început. Microprocesorul culege informaţiile necesare pentru luarea unor astfel de decizii, prin

intermediu! unor semnale de intrare numite de către noi, semnale de stare. Să le cunoaştem:

/WAIT - (Aşteaptă) este o "atenţionare" emisă de elementul apelat (celulă de memorie sau dispozitiv de intrare/ieşire) prin care acesta semnalizează microprocesorului faptul că

merge prea repede şi el colaboratorul nu poate ţine! pasul. în fiecare ciclu de memorie sau de intrare/ieşire după lansarfe comenzii (activarea semnalelor/MREQ sau /IORQ şi /RD sau /WR) circuitul de comandă al microprocesorului analizează starea liniei A/VAIT . Dacă ea este activă (valoare 0) atunci se inserează cicluri de tact suplimentare de aşteptare, până când elementul apelat îşi termină treaba. La dispariţia semnalului A/VAIT, microprocesorul continuă execuţia instrucţiunii ca şi cum nu s-ar fi întâmplat nimic. Acest semnal permite un(ui microprocesor oricât de rapid, să poată coexista şi colabora cu circuite de memorie sau j de jintrare/ieşire lente. Dacă în sistem coexistă elemente rapide (ex. circuite RAM cu timp de acpes Ide 100 - 200 ns) şi lente (ex. memorie de ferită cu timp de acces de ordinul microsecund^lor) semnalul A/VAIT adaptează viteza de rulare a microprocesorului la posibilităţile concrete ale fiecăruia. Specificăm totuşi, că dacă în sistem există memorii RAM dinamice care aşteaptă să fie reîmprospătate de către microprocesor, athnci aşteptarea cauzată de semnalul A/VAIT nu poate fi oricât de lungă, fiindcă altfel s-ar risca pierderea informaţiei stocate în DRAM. /INIT (INTerrupt - întrerupere) este petiţia depusă de un element din sistem (de obicei un dispozitiv intrare/ieşire) prin care solicită participarea microprocesorului la rezolvarea unei situaţii noi, create de apariţia unui evenimenl exem. Dacă sistemul de întreruperi al microprocesorului este validat, atunci activarea semnalului /INT (valoare 0) va declanşa abandonarea programului în curs de execuţie şi microprocesorul efectuează un salt la o rutină în care tratează cererea de întrerupere. După terminarea rutinei Jde întrerupere microprocesorul se întoarce în programul abandonat, reluându-i execuţia din punctul în care a fost abandonat. Cererea de întrerupere este acceptată numai după terminarea ultimului ciclu maşină a instrucţiunii în curs de execuţie. Cererea de întrerupere este ignorată dacă microprocesorul este în stare de aşteptare (WAIT) dacă este suspendat (BUSAK) sau dacă sistemul de întreruperi este inhibat (bistabilul IFF1 = 0). Dacă cererea de întrerupere se acceptă (în acest caz microprocesorul Z80 generează concomitent semnalele /M1 şi /IORQ), saltul la începutul rutinei de tratare a întreruperii se va efectua în diverse modurji în funcţie de regimul programat prirj intermediul instrucţiunilor IM 0, IM 1 sau IM 2 (Interrupt Mode). Ieşirea dintr-o subrutină de trateire £ întreruperii /INT se face cu instrucţiunea RETI. /NMI va întrerupe chiar şi un program de tratare a unei întreruperi sosite pe linia /INT. La acceptarea cererii de între|rupere nemascabilă, microprocesorul salvează conţinutul un salt necondiţionat la adresa 0066H unde trebuie să înceapă rutina de tratare a întreruperilor nemascabile. După terminarea acestui program sie poate restaura vechea valoare a PC-ului de pe stivă, pentru a relua programul abandonat cu ajutorul instrucţiunii RETN. /NMI-ul este singurul semnal al microprocesorului Z80 care datorita importanţei sale (trebuie evitată posibilitatea trecerii neobservate a unei cereri /NMI) nu se activează pe nivel ca /INT, ci pe front! Cererea /NMI se înregistrează lă apariţia unui front căzător pe acest semnal, cerere care va persista până la acceptare (sfârşitul instrucţiunii în curs) chiar dacă între timp cererea în sine a dispărut. Evenimente importante care merită să fie semnalate prin /NMI sunt:

-avertisment la căderea tensiunii sau -intervenţie operator.

/BUSRQ (BUS - ReQuest – cerere de magistrală) este piciorul pus în prag de către un element din sistem, manevră prin care se suspendă microprocesorul. Aceasta din urmă va

termina ciclu maşină în curs de execuţie, după care emite semnalul de acceptare a cererii /BUSAK şi va sta deoparte cu toate magistralele puse în starea de înaltă impedanţă (cedate). în această situaţie dispozitivul care a suspendat microprocesorul va prelua comanda magistralelor din microcalculator. Aceastăfacilitate poate if folosită pentru a realiza un system cu dour procesoare diferite, din care doar unul so fie active sau pentru a realize un dispozitiv cu aces direct la memorie. Un dispozitiv DMA poate efectua un transfer main rapid între un echipament periferic și memoria microcalculatorului, decât ar putea-o face microprocesorul prin program. /BUSRQ ester active în starea 0. /RESET (Reiniţializare) este mâna de ajutor acordată de către operator microprocesorului (sau de către proiectanţii microprocesoruui - operatorului) Acest semnal permite reiniţializarea microprocesorului. La activarea lui (valoarea 0) se întâmplă următoarele evenimente în interiorul microprocesorului:

-se şterge contorul program PC = 0000H -se inhibă sistemul de întrerupdri IFF1 = IFF2 = 0 -se stabileşte regimul de întreruperi IM 0 -se iniţializează regiştri I şi R I = R = 00H Semnalul /RESET se va aplica microprocesorului la trezire (după pornirea de la butonul reţea al unui dispozitiv cu microprocesbr) şi oricând execuţia unui program s-a rătăcit sau a intrat într-o buclă infinită. Pentru a fi luat în considerare,!semnalul /RESET trebuie să fie activ minimum 3 tacţi de procesor. Pe durata aplicării semnalului /RESET = 0 magistralele de date şi adrese ale microprocesorului Z80 trec în stare de înaltă impedanţă (tri-state) iar semnalele de comandă înstare inactiva (1 logic). În acest răstimp nimeni nu lucrează, deci nu vor exista ciclurile de reîmprospătare a memoriei, nu se va active /RFSH. Orice încercare de a realiza un sistem în care aceste legături inverse feed-back lipsesc ar fi sortită1 eşecului. Dacă aceste semnale nu există sau dacă ele nu sunt luate în considerare, nu poate rezulta altceva decât un sistem ricid ce nu se adaptează la condiţiile schimbătoare ale mediului său înconjurător, un sistem în cjare ideea de siguranţă primează asupra criteriilor de performanţă.

6.4. Sistemul de întreruperi a! microprocesoruSui Z30.

Microprocesorul Z80 acceptă couă semnale de întrerupere: /NMI, întreruperea nemascabilă, şi /INT, întrerupere mpscsibilă validată selectiv prin program. La întreruperea nemascabilă Z80 răspunde într-un mod simplu, în timp ce pentru întreruperea mascabilă există trei moduri de tratare. întreruperea /NMI este piioritară faţă de /INT. La iniţializare, bistabilii interni IFF1 şi IFF2 sunt forţaţi pe zero, ceea ce este echivalent cu invalidarea întreruperilor, iar în această si are microprocesorul nu acceptă întreruperi mascabile. întreruperile se validează prin poziţionarea bistabililor IFF1 şi IFF2 pe "1"cu ajutorul instrucţiunii El. Orice întrerupere în aşteptare va putea fi servită numai după execuţia instrucţiunii care urmează după El. întârzierea cu o instrucţiune este utilă atunci când după Ei se execută o instrucţiune de revenire. în cazul în care UC-Z80 (UC=Un|tate Centrală) acceptă o întrerupere, IFF1 şi IFF2 sunt aduşi pe "0", inhibându-se astfel acceptarea unor alte întreruperi până la o nouă instrucţiune El. Dezactivarea sistemului de întreruperi mascabile se face cu instrucţiunea Di. Aşa cum am menţionat, destinaţia lui IFF2 este de a memora temporar starea lui IFF1 la apariţia unei întreruperi mascabile canid, pentru prevenirea celorlalte întreruperi, IFF1 se

forţează pe "0" Mai mult, la execuţia unei instirucţuni de forma LD A, I sau LD A, R starea lui IFF2 este transcrisă în indicatorul de paritate, ceea ce permite testarea şi memorarea ei, şi deci, implicit, refacerea prin program a valorii iniţiale a lui IFF1. O altă cale, cea obişnuită, de a reface starea precedentă întreruperii nemascabile este pn'n execuţia unei instrucţiuni de revenire din întreruperea nemascabilă, RETN. Întreruperea nemascabilă nu; poate fi invalidată prin program, fiind acceptată în orice situaţie de UC-Z80. /NMI-ul se rezervă de obicei pentru evenimente prioritare, cum ar fi de exemplu căderea tensiunii de alimentare. La apariţiai semnalului /NMI, dacă semnalul /BUSRQ nu este activ, microprocesorul ignoră în ciclul de extragere următor codul instrucţiunii, iniţiind un restart la adresa 0066H! La această adresă se găseşte în general secvenţa de serviciu a întreruperii nemascabile. Z80 ppate fi programat pentru a răspunde a întreruperile mascabile într-unui din modurile 0, 1 sau 2, mejnorate cu ajutorul bistabililor IMFa şi IMFb. Cele trei moduri de lucru sunt descrise în continuare:

Modul 0. Este compatibil cu procedurile de întrerupere ale microprocesorului 8080. în acest mod de întrerupere dispozitivul perifenc poate plasa pe magistrala de date, în ciclul de tratare a întrerdperii, orice instrucţiune. Deci, ideea procedurală este că instrucţiunea următoare nu se mai extrage din memorie, ci va fi furnizata de dispozitivul care întrerupe. în general, aceasta este o instrucţiune Restart (mnemonica este RST xx), deoarece perifericul trebuie să asigure plasarea pe magistrala de date a unui singur oct^t. Instrucţiunile de restart realizează apeluri de subrutine plasabjile la opt locaţii fixe în pagina zero din memorie. Desigur, dispozitivul care întrerupe poate genera orice cod de instrucţiune, de exemplu o instrucţiune CALL, formată din trei octeţi pentru apel la orice locaţie de memorie, dar în acest caz este mai dificil de realizat interfaţarea cu perifericul deoarece va trebui să mai livreze încă doi octeţi. Precizăm, de asemenea, că la iniţializare, UC-Z80 intră automat în modul kero. Modul 1. Este foarte asemănător cu modul de răspuns la întreruperea nemascabilă. Diferenţa principală constă în faptul că se execută un restart la locaţia 0038H, în loc de

0066H.

Modul 2. Este cel mai puternic mod; de răspuns al microprocesorului Z80: cu un singur octet furnizat de dispozitivul care întrerupe se pohte executa un apel indirect la orice locaţie de memorie. Pentru a folosi acest mod de tratare1 a întreruperilor, programatorul trebuie să scrie o tabelă cu adresele de început ale fiecărei rutine de serviciu. Tabela poate fi localizată în orice zonă a memoriei. La acceptarea unei întreruperi, UC-Z80 formează un pointerde 16 biţi cu ajutorul căruia ia din | tabelă adresa rutinei de serviciu torespunzătoare dispozitivului care întrerupe. Cei mai semnificativi 8 biţi ai pointer-u\u\ surit diaţi de conţinutul registrului I încărcat în prealabil (la iniţializare l=0). Cei mai puţini semnificativi 8 biţi vor fi generaţi de periferic, cu observaţia că la circuitele periferice din familia ZILOG ultimul bit trebuie să fie zero (sunt necesari de fapt numai 7biţi generaţi de periferic şi deci adresele retinelor de întrerupere vor trebui plasate la adrese pare). în figura de mai jos se înfăţişează procedura de tratare a întreruperii în modul 2: după cue dispozitivul periferic generează porțiunea cea main puțin semnificatvă a pointer-ului, UC-Z80 salvează automat în stivă numărătorul de program,obține din tabelăadresadeînceput a subrutinei de serviciu și efectuează un salt la această adresă. Dispozitivele periferice din seria Z80 permit implementarea unui sistem de întreruperi care so lucreze în modul 2 asigurând în acest scop generarea automată a vectorului de întrerupere pe timpul unui ciclu de achitare. De asemenea,menționăm că dispozitivele din

familia ZILOG care întrerup pot fi conectate în lanț, prioritatea fiind determinată de de poziția fizică din lanț. Fiecare circuit are o intrare de validare a întreruperilor, pinul IEI, și o ieșire de validare a întreruperilor, pinul IEO, către următorul dispozitiv. Primul dispozitiv din lanț ester cel prioritar și trebuie so aibă intrarea IEI cablată la ”1”. Comanda semnalului IEO în funcție de IEI și de întreruperea locală ester asigurată de toate circuitele periferice din familia Z80.

asigurată de toate circuitele periferice din familia Z80. Pentru a înţelege mai bine relaţiaintre cele trei

Pentru a înţelege mai bine relaţiaintre cele trei semnale, /BUSRQ, /NMI, şi /INT, ce pot întrerupe fluxul normal al execuţiei instrucţiunilor, prezentăm în continuare organigrama de mai jos. Aşa cum se vede, /INT şi /NMI sunt luate în considerare la sfârşitul instrucţiunii, în timp ce /BUSRQ la sfârşitul unui ciclu maşină. Ordineai de prioritate a acestor semnale, începând cu cel prioritar, este: /BUSRQ, /NMI şi/INT. în timp ce UC-Z80 este în modul DMA, cu magistralele comandate de un periferic, nu se răspunde la /NMI sau /INT.