Documente Academic
Documente Profesional
Documente Cultură
Describe why bus demultiplexing is needed for some processors, for example for 8086
processors.
Procesoarele acestea au magistrala de adrese si date multiplexata, aceste linii sunt
folosite si pentru trimiterea adreseleor si datelor. Exterior procesorului e nevoie de o solutie de
demultiplexare prin care sa se extraga inapoi adresele si datele.
Ca in curs.
- Concepte mai practice: setul de instrictiuni, tipuri de date, pointeri etc. Si de aici o sa
avem subiecte. Cumva sa citim si partea asta.
Requirements:
- establish the memory map, including the number of memory circuits required by the
design, the number of 16 bits memory blocks and their sizes
- design the LED connection logic both hardware and software in order to make the LED
blinking when the system is initializing its state and the LED is powered on when the
system is running and it goes off when the system is powered off
- write a routine which will copy 2 KB of memory from physical address 00100H to the
beginning of SRAM. During this initialization we have to make the LED blinking, after the
copy routine is ended, well let the LED switched ON
- considering the following variables definitions in C language, determine the memory size
and memory content used by a 16 bits compiler (that means integer and pointers are
stored on 16 bits), the variables are located at the beginning of DRAM. Here are the
variables:
int a = (int) 0xF0FF
int b;
int *p = &a;
int s[10] = { 1, 2, 3 };
The memory variables are declared as lower variables?
1. La harta memoriei trebuie sa luam fiecare circuitele si sa ne uitam la numele lui. Trebuie
sa avem grija ca se poate specifica la ce adrese ca inceapa. 8086 procesor pe 16 bits
asta inseamna ca toate bocurile de memorie din sistem trebuie sa poata fi accesate pe
16 bits.
64K x 16 bits = 64K * 2B = 128KB
Avem nevoie de un singur circuit de memorie pentru a avea 128KB de EPROM
In cate blocuri se impart circuitele acestea? Fiind un singur circuit pe 16 bits o sa avem nevoie
de un singur bloc de memorie. Selectie circuitelor se face la nivel de blocuri in cazul lui 8086. La
examen o sa avem tot pe 16 bits exemple, n-o sa ne dea pe 32bits.
Primul caz:
B1 128KB 00000H
Ar trebui sa calculam care e spatiul de memorie ocupat de acest bloc?
128 = 2^7
1K = 2^10
=> 2^10 * 2^7 = 2^17
Ultima adresa ar fi 2^17 - 1 scris in hexa:
1 1111 1111 1111 1111
1 F F F F
Al doilea caz:
16K * 8bits = 16K * 1B = 16KB
64KB / 16KB = 4 circuite de memorie
Grupam cate 2 circuite pe bloc, pentru ca trebuie sa avem 16 bits intr-un bloc (avem 16K
* 8bits si ne trebuie 16 bits per bloc)
In cazul al treilea:
B4 128KB (spatiul de adrese ar fi 00000H - 1FFFFH)
B5 128KB (aici la fel)
DRAM-ul de obicei poate fi si pe mai putini bits. Ca paranteza sa luam cazul in care
avem 64K * 1bit. Daca am avea circuite asa, atunci ar trebui sa le grupam intr-un block 16 astfel
de circuite, 16 * 64K * 1bit, deci o sa avem 2 * 8 * 64K * 1bit => 2 * 64KB, deci avem 2 blocuri a
cate 16 circuite fiecare.
Regula impartirii pe blocuri, intr-un bloc de memorie se pun atatea circuite cate sunt
necesare pentru a acoperi numarul de bits din magistrala de date.
In cazul lui B4, adresa de inceput trebuie sa fie multiplu de 20000H. B4 il punem la
80000H si B5 la C0000H. Putem alege orice adrese vrem noi unde se poate.
Asta a fost pasul 2. Acum pasul 3.
Aici s-ar incheia prima cerinta.
Dar noi continuam si facem tabelul de decodificare sa vedem cum arata.
Aici ne putem verifica, pentru primul bloc avem 128 K => ne trebuie 17 linii de
decodificare, adica e numarul de ranguri care se modifica.
De la stanga la dreapta grupam coloanele care nu se modifica. Valoarea rangurilor ce
raman trebuie sa fie egala cu dimensiunea in biti a blocului. Ex pentru Blocul 1 ne raman de la
A16 la A0 => 17 bits.
Adresa o alegem pe 8 biti sau pe 16 biti. (Acolo dupa rezistenta vine si o dioda, my
drawing skills are awesome)
Punctul 3.
Rutina de copiere a blocului de memorie. La intrebarile astea treubie sa vem grija la
urmatorul lucru, ce tip de adrese avem, s-ar putea sa primi adrese fizice sau logice. Adresa
fizica este cea care apare in harta de memorie si este adresa de pe liniile de adrese ce merg la
memorie.
Adresa logica este adresa cu care lucrez in program care in mod general la 8086 este
formata din segment pe 16 bits si offset tot pe 16 bits.
In modul real:
adresa fizica = segment * 16 + offset
Daca avem adresa logica si trebuie sa calculam adresa fizica atunci calculam invers.
0 : 0100H
0100H : 0H
cx <- nr iteratii
LOOP eticheta
MOV cx, 1024 ; asta in cazul in care copiem cate 16bits deodata
next: MOV AX, DS:[SI] ; am luat 2 octeti de la adresa asta
MOV ES:[DI], AX ; i-am scris la adresa cealalta
ADD SI, 2
ADD DI, 2
CALL led_on ; astea le putem pune oriunde in interiorul buclei
CALL led_off
LOOP next
Punctul 4.
Aici ar trebui sa vedem cat spatiu ocupa un compilator cand aloca spatiu pentru
variabilele alea statice in zona de memorie pentru variabilele globale. Trebuie sa avem grija la:
sa vedem daca variabilele sunt globale sau locale, variabilele globale se aloca pe segmentul de
date, iar cele local pe stiva. In cazul nostru sunt variabile globale astfel incat ele sunt puse in
segmentul de date. Pentru variabilele locale avem in curs cum se aloca pe stiva.
Se cere daca aceste variabile sunt alocate la inceputul DRAM-ului sa vedem cati octeti
sunt alocati si sa vedem care ar fi continul acelor octeti.
Cel mai simplu e sa facem in format grafic.
Ca observatie daca ne da adresa vrea sa vada daca stim si endieness-ul procesorului.
La b specificam daca e initializat de compilator sau putem spune ca nu stim ce e acolo.
Trebuie sa specificam asta, depinde de compilator.
Sunt 26 de octeti de memorie alocati pentru ca avem cate 2 octeti pentru fiecare
variabila, variabila a are 2 octeti, b la fel, p la fel, s e un array ce contine 10 elemente si
fiecare are cate 2 octeti, deci in total 26.
Poate sa ne ceara care din variabile sunt aliniate cu adresele de memorie sau nu. Ce
inseamna asta? Inseamna ca adresa de inceput pentru o variabila este multiplu pentru
dimnesiunea in octeti a unui element in adresa respectiva. In exemplul nostru toate sunt aliniate
pentru ca sunt multipli.
Daca am fi avut un char ch intre a si b, atunci nu ar mai fi fost aliniate. Daca ni se cerea
sa aliniam variabilele atunci trebuia sa mutam b-ul mai jos incat sa fie aliniat sau sa mutam
char-ul la sfarsit.