Decodificarea memoriei
În cadrul acestei lucrări se vor prezenta modurile de decodificare a memoriei, cu particularizarea pentru microprocesorul Z80.
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.
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:
Când se construiește harta memoriei trebuie stabilite următoarele două date pentru fiecare circuit (bloc) de memorie:
Adresa de început a unui circuit de memorie se stabilește în funcție de:
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:
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):
![]() |
![]() |
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
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:
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:
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:
Î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.
Î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:
RAM static
Fig 1.5
Pentru circuitul 2114 (1K x 4biți) avem:
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
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
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)
Să se proiecteze decodificatorul de memorie al unui sistem cu microprocesorul Z80 ce conține următoarele resurse:
Pentru realizarea lucrării se vor urma pașii: