LUCRAREA nr. 1


Decodificarea memoriei

1. Obiectivul lucrării

În cadrul acestei lucrări se vor prezenta modurile de decodificare a memoriei, cu particularizarea pentru microprocesorul Z80.

2. Considerații teoretice

Cel mai simplu sistem cu microprocesor este prezentat în figura 1.1. Acest sistem cuprinde pe lângă procesor, un bloc de memorie fixă (ROM), un bloc de RAM și decodificatorul de memorie pentru blocurile de memorie existente. Orice circuit de memorie sau bloc de memorie are nevoie de un semnal de selecție pentru a putea răspunde procesorului la operația cerută. Fiecare din aceste semnale de selecție este o ieșire din decodificatorul de memorie.

Prin generarea semnalelor de selecție pentru memorii se înțelege obținerea acelor semnale care activează sau validează circuitele de memorie partenere procesorului.

În continuare se vor prezenta pașii necesari în realizarea unui decodificator de memorie.

2.1 Harta memoriei

Prima problemă pe care trebuie să o rezolve proiectantul, legat de memorie, este stabilirea hărții memoriei, adică alocarea fiecărui circuit de memorie a cel puțin unei zone din spațiul direct adresabil al procesorului. Dimensiunea unei asemenea zone este legată de capacitatea circuitului de memorie. Această alocare se face în funcție de cerințele unității centrale, ale sistemului de operare și ale aplicației.

Exemplul 1.1:

  1. Unitatea centrală: După RESET procesorul execută programul de la o anumită adresă fixă și dependentă de procesor (la Z80 adresa 0000h). La această adresă ar trebui să se dispună o memorie ROM;
  2. Sistemul de operare: poate cere ca într-o anumită zonă să existe memorie sau să existe un anumit tip de memorie;
  3. Aplicație: o aplicație cu cerințe mari de memorie va impune utilizare mai multor circuite.

Când se construiește harta memoriei trebuie stabilite următoarele două date pentru fiecare circuit (bloc) de memorie:

  1. adresa de început;
  2. limitele de adresare.

Adresa de început a unui circuit de memorie se stabilește în funcție de:

  1. tipul circuitului - unitatea centrală presupune existența unui anuimt tip de circuit la o anumită adresă (Exemplul 1.1);
  2. capacitatea circuitului - adresa de început trebuie (ar fi bine) să fie un multiplu de capacitatea circuitului.

Exemplul 1.2:

Stabilirea adresei de început pentru un circuit DRAM (RAM dinamic) de 16Ko. Microprocesorul Z80 pornește după RESET de la adresa 0000h, deci la această adresă ar trebui să existe memorie ROM și nu putem plasa aici memoria noastră DRAM. Circuitul având capacitatea de 16Ko = 214 poate fi plasat (pentru o decodificare simplă) începând cu adresele 0000h, 4000h, 8000h sau C000h.

Limitele de adresare pentru un circuit se stabilesc în funcție de capacitatea circuitului:

1 Ko = 210 - 0000h – 03FFh (ultimii 10 biți se modifică);
2 Ko = 2*210 = 211 – 0000h - 07FFh (ultimii 11 biți).

2.2 Generarea semnalelor de selecție

Există mai multe tehnici pentru generarea semnalelor de selecție a circuitelor de memorie. De obicei blocul de circuite care generează aceste semnale se numește decodificator de adrese de memorie și are ca intrări linii din magistrala de adrese și eventual semnale de comandă generate de către procesor.

Adresarea liniară

Adresarea liniară constă în selectarea circuitelor sau blocurilor de memorie utilizând o singură linie din magistrala de adrese.

Exemplul 1.3:

Se cere să se asigure selecția a două blocuri de memorie (fig 1.2):

  1. Blocul 1 ocupă spațiul de adrese 0000h – 7FFFh
  2. Blocul 2 ocupă spațiul de adrese 8000h – FFFFh

Metoda se poate aplica în continuare (pentru mai multe blocuri) în felul următor: Blocul 1 se împarte la rândul lui în două alte subblocuri (fig 1.3):

Blocul B1

- B11 ocupă spațiul de adrese 0000h – 3FFFh
- B12 ocupă spațiul de adrese 4000h – 7FFFh

Această metodă este foarte simplă și presupune puține circuite, însă se folosește doar în cazul unui număr mic de blocuri de memorie, ale căror adrese diferă printr-un număr mic de biți (1, 2).

Decodificarea completă

Se construiește un tabel (Tabelul 1.1) care are ca și coloane rangurile magistralei de adrese iar ca linii prima și ultima configurație de adresă din fiecare zonă acoperită de un circuit. Apoi pentru fiecare zonă se inspectează coloanele pornind de la rangul cel mai semnificativ spre cel mai puțin semnificativ și se rețin acele ranguri (coloane) care rămân nemodificate pentru orice configurație de adresă din zona respectivă. O funcție logică combinațională de aceste ranguri va individualiza zona respectivă și va genera semnalul de selecșie pentru circuitul care acoperă zona respectivă.

Exemplul 1.4:

Să se realizeze selecția pentru următoarele blocuri de memorie:

  1. Blocul B1 ocupă spațiul de adrese 0000h - 03FFh (1Ko)
  2. Blocul B2 ocupă spațiul de adrese 1800h - 1FFFh (2Ko)
  3. Blocul B3 ocupă spațiul de adrese 4000h - 5FFFh (8Ko)
  4. Blocul B4 ocupă spațiul de adrese 6000h - 6FFFh (4Ko)

A15

A14

A13

A12

A11

A10

A9

A8

A7

A6

A5

A4

A3

A2

A1

A0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

1

1

1

1

1

1

1

1

1

0

0

0

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

0

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

1

1

1

1

1

1

1

1

1

1

1

1

1

0

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

1

0

1

1

1

1

1

1

1

1

1

1

1

1

Tabelul 1.1





Decodificare incompletă

În cadrul decodificării incomplete se construiește același tabel ca la decodificare completă, se face aceeași inspecșie, dar nu se iau în considerare toate rangurile care individualizează zona respectivă. Aceasta duce la simplificarea decodificatorului, însă un același circuit va acoperi (va fi văzut în) mai multe zone din spațiul de adresare al procesorului. Dacă se ignoră un rang din zona ocupată, un circuit va ocupa două zone egale cu capacitatea sa, dacă se ignoră două ranguri, circuitul va ocupa patru zone, etc.

Exemplul 1.5:

În Exemplul 1.4 linia A15 nu este decisivă în selecția blocurilor de memorie. Dacă se renunță, în decodificare, la linia A15 din magistrala de adrese toate cele patru circuite de memorie se vor “vedea” în două zone distincte de adrese. Astfel vom avea:

  1. Blocul B1 ocupă spațiile de adrese 0000h - 03FFh și 8000h - 83FFh (1Ko)
  2. Blocul B2 ocupă spațiile de adrese 1800h - 1FFFh și 9800h - 9FFFh (2Ko)
  3. Blocul B3 ocupă spațiile de adrese 4000h - 5FFFh și C000h - DFFFh (8Ko)
  4. Blocul B4 ocupă spațiile de adrese 6000h - 6FFFh și E000h - EFFFh (4Ko)




Chiar dacă linia A10 nu rămâne neschimbată pentru toate liniile tabelului, ea nu este indispensabilă selecției blocului B1, deci dacă se renunță și la linia A10 blocul de memorie B1 se va vedea în patru zone din spațiul de adresare al procesorului:

  1. Blocul B1 ocupă spațiile de adrese 0000h - 03FFh, 0400 - 07FFh, 8000h - 83FFh și 8400h - 87FFh (1Ko)
  2. Blocul B2 ocupă spațiile de adrese 1800h - 1FFFh și 9800h - 9FFFh (2Ko)
  3. Blocul B3 ocupă spațiile de adrese 4000h - 5FFFh și C000h - DFFFh (8Ko)
  4. Blocul B4 ocupă spațiile de adrese 6000h - 6FFFh și E000h - EFFFh (4Ko)




2.3 Linii de comandă folosite în decodificare

Întrucât pe magistrala de adrese circulă mai multe tipuri de informații (adrese de porturi, adrese de memorie, registre), există riscul ca atunci când procesorul dorește să selecteze un port a cărui configurașie de adresă coincide cu a unei locații de memorie, să se selecteze pe lângă port și circuitul respectiv de memorie. Pentru a evita această situașie se utilizează ca intrări în decodificatorul de adrese semnale de comandă generate de procesor care să individualizeze fie comunicația cu memoria fie cu porturile de intrare/ieșire.

2.4 Restricții de timp

În proiectarea unui decodificator pentru memorie trebuie consultate și diagramele de timp atât ale microprocesorului cât și ale memoriilor folosite. Aceasta, în primul rând, pentru a nu exista neconcordanțe de timp între generarea semnalelor de selecție și timpii de răspuns a memoriilor. Astfel, dacă o memorie este prea lentă pentru un anumit procesor, ea nu va reuși să plaseze pe magistrala de date informația stocată și procesorul va citi niște date invalide. În acest caz trebuie prevăzut un bloc cu logică suplimentară pentru generarea unui semnal de “așteptare” (la Z80 este WAIT), pentru ca procesorul să aștepte până când memoria poate plasa datele pe magistrală (la fel și pentru scriere). Acest semnal de așteptare se poate genera doar pentru blocurile de memorie lente, iar pentru cele mai rapide nu se va activa.

Un al doilea motiv pentru care trebuie luate în calcul și diagramele de timp este necesitatea respectării ordinii de generare a semnalelor pentru o anumită operație cu memoria. De exemplu în cazul unei scrieri în SRAM (2114) este nevoie ca semnalul /WE să se activeze înaintea semnalului /CS.

Pentru aceasta vom prezenta în continuare diagramele de timp ale memoriilor folosite în cadrul laboratorului.

EPROM


Fig 1.4

Pentru circuitul EPROM 2716 (2Ko) avem următorii timpi:

tacc = max 350 - 390 - 450 ns
tCE = max 350 - 390 - 450 ns
tOE = max 120 ns

RAM static


Fig 1.5

Pentru circuitul 2114 (1K x 4biți) avem:

tacc = max 200 - 300 - 450 ns
tCS = max 100 ns
tWE = 100 - 200 ns
tWS = 70 - 100 ns
tWH < 50 ns

RAM dinamic

Deoarece memoriile dinamice au capacități de stocare mari, și pentru a nu mări numărul de intrări de adrese s-a recurs la multiplexarea liniilor de adrese, reducându-se la jumătate numărul acestora. O jumătate din liniile de adrese sunt trimise la început și sunt considerate a fi adresa de linie pentru locația dorită. Acestea sunt urmate de cealaltă jumătate de linii, care adresează coloana locației de memorie.

La activarea liniei RAS, memoria preia informația de pe liniile A6-0 și o consideră ca fiind adresa de linie a celulei de memorie; apoi o logică externă trebuie să modifice configurația de la intrările A6-0 și să activeze linia CAS, memoria preluând adresa la activarea lui CAS, o consideră a fi adresa de coloană a celulei de memorie. Celula de memorie astfel selectată va fi încăracată cu o nouă valoare în cazul unei scrieri sau își va depune informația pe magistrala de date pentru a fi preluată de către procesor, în cazul unei citiri (Fig 1.6).

Pentru comutarea adreselor de linie cu cele de coloană se folosește un circuit multiplexor (74LS157) extern memoriei ce va fi prezentat în continuare.

Specificul memoriilor RAM dinamice este că ele trebuie reîmprospătate. Circuitul cere ca la maximum 2ms să fie reîmprospătate toate locațiile. Există facilitatea de reîmprospătare pe linie, adică reîmprospătarea se poate face nu numai la nivel de celulă ci și la nivel de linie. Pentru aceasta circuitul cere activarea liniei RAS și plasarea pe A6-0 a adresei de linie.


Fig 1.7

Pentru circuitul 4116 (16K x 1bit) avem:

tRC = min 320 ns
tRAS = 150 - 10000 ns
tRCD = 20 - 86 ns
t RASS = 0
tRASH = min 20 ns
tCASS = min 10 ns
tCASH = min 45 ns
to = 70 - 100 ns
tWE = min 75 ns
tWS = min 75 ns
tWH < 50 ns

Ciclurile masină (fetch, read, write)

Operațiile în care procesorul accesează memoria sunt cele de aducere cod instrucțiune (fetch) și citirea/scrierea din memorie. În figurile 1.8 și 1.9 sunt prezentate ciclurile de fetch și citire/scriere din memorie pentru microprocesorul Z80. Frecvența de tact la care lucrează microprocesorul Z80 este între 2.5 MHz și 6 MHz.


Fig. 1.8

2.5 Implementare

Implementarea decodificatorului de memorie se poate realiza folosind porți logice (AND, OR, XOR, NOT) circuite decodificatoare (LS 138). Întârzierile pe porțile logice se consideră de aproximativ 10 ns iar pe un circuit decodificator de 30 ns.

Decodificatorul LS138

Circuitul LS138 este un decodificator cu trei intrări de selecție (A2-A0) și trei intrări de validare (E3-E1). Acest circuit poate fi folosit în decodificarea memoriei pentru reducerea numărului de circuite logice folosite.

E1

E2

E3

A2

A1

A0

O0

O1

O2

O3

O4

O5

O6

O7

1

x

x

x

x

x

z

z

z

z

z

z

z

z

x

1

x

x

x

x

z

z

z

z

z

z

z

z

x

x

0

x

x

x

z

z

z

z

z

z

z

z

0

0

1

0

0

0

0

1

1

1

1

1

1

1

0

0

1

0

0

1

1

0

1

1

1

1

1

1

0

0

1

0

1

0

1

1

0

1

1

1

1

1

0

0

1

0

1

1

1

1

1

0

1

1

1

1

0

0

1

1

0

0

1

1

1

1

0

1

1

1

0

0

1

1

0

1

1

1

1

1

1

0

1

1

0

0

1

1

1

0

1

1

1

1

1

1

0

1

0

0

1

1

1

1

1

1

1

1

1

1

1

0

Tabelul 1.2

Multiplexorul LS157

Circuitul LS157 este un multiplexor având opt intrări și patru ieșiri. Intrările i0i și i1i sunt multiplexate în funcție de semnalul S pe ieșirea yi. Circuitul se folosește la multiplexarea intrărilor de adrese pentru memoria RAM dinamică.


yi = /E ( I1i S + Ioi /S)

3. Mersul lucrării

Să se proiecteze decodificatorul de memorie al unui sistem cu microprocesorul Z80 ce conține următoarele resurse:

  1. 4 Ko EPROM 2716 (plasați începând cu adresa 0000H);
  2. 2 Ko SRAM 2114;
  3. 32 Ko DRAM 4116.

Pentru realizarea lucrării se vor urma pașii:

  1. Aflarea limitelor de adresare pentru fiecare circuit de memorie;
  2. Stabilirea hărții memoriei;
  3. Deducerea și implementarea semnalelor de selecție folosind o decodificare completă (implementarea se va realiza cu porți logice și cu circuite decodificatoare);
  4. Deducerea și implementarea semnalelor de selecție folosind o decodificare incompletă;
  5. Pentru decodificarea incompletă se vor arăta toate zonele de memorie în care este văzut un circuit sau bloc de circuite;
  6. Deducerea și implementarea semnalelor de comandă pentru memorii ținând cont de restricțiile de timp prezentate în lucrare;
  7. Realizarea împrospătării pentru memoria DRAM;
  8. Să se calculeze și apoi să se măsoare întârzierea pe decodificatorul realizat.