Tema 4 (v1.0B)
Tema 4 (v1.0B)
Tema 4 (v1.0B)
TEMA 4
EL SUBSISTEMA DE MEMORIA
Versión 1.0A
Imagen de portada
Vista de layout de una celda SRAM
http://www.eecs.tufts.edu/~ddemeo01/ee103/vlsi_sramCell.htm
Una señal con una barra encima, como 𝐴𝐴̅, por ejemplo, identifica una señal
que es activa a nivel bajo “0” e inactiva a nivel alto “1”. En lugar de usarse una
barra se pueden usar los símbolos * y #, por tanto, las siguientes indicaciones:
𝐴𝐴̅ 𝐴𝐴 ∗ 𝐴𝐴#
Las señales activas a nivel bajo también suelen identificarse en los diagramas
circuitales mediante un círculo tal y como se muestra en la siguiente figura:
D E F G
La señal D será activa alta mientras que las señales E y F serán activas bajas.
En la figura se muestra una señal G con barra y círculo. Usar dos señalizaciones de
negación refuerza la señalización, no la compensa, por tanto, la señal G es también
activa a nivel bajo.
Identifica una señal que señaliza lectura (Read) con el “1” y escritura (Write)
con el “0”. Acabada esta breve discusión sobre notación pasaremos a describir
brevemente la interacción entre la CPU y el subsistema de memoria.
La memoria es la parte del sistema que almacena el código y los datos del
programa que corre en la CPU.
DATOS
µP
CPU
ΜΕΜ E/S
DIRECCIONES
CONTROL
Obsérvese como en este caso, el hecho de que la CPU espere a que la memoria
responda, se relajan los requisitos temporales de respuesta de la memoria.
Direcciones MEM
La figura muestra las conexiones que
típicamente tienen las memorias.
Datos
Corresponden a un conjunto de líneas de
OE datos, un conjunto de líneas de direcciones
y tres líneas de control.
WE
Algunas memorias tienen señales
CS adicionales, pero estas señales son comunes
a casi todas.
STROBES
• 8 bits (1 Byte)
• 16 bits (2 Bytes)
• 4 bits (1/2 Byte = 1 Nibble)
• 1 bit (1/8 Byte)
A modo de ejemplo:
1𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵
216 𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃 = 216 𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵 = 26 210 𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵 = 64𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾
𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃
4𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵
210 𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃 = 212 𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵 = 22 210 𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵 = 4𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾
𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃
1
𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵
2 𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃 8
20
= 217 𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵 = 27 210 𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵 = 128𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾
𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃
Si OE* y WE* están activos (a "0") al mismo tiempo, una de las dos señales tiene
prioridad sobre la otra. Normalmente WE*, pero se ha de verificar en el datasheet
de la memoria.
Strobes de calle
Estas señales, de validación, normalmente activas bajas, sólo están presentes en
memorias con bus de datos con más de una calle (más de 8 bits). Permiten indicar
que calles se han de emplear en el acceso a memoria tanto para lectura como para
escritura.
Hay tantos strobes de calle como calles tenga el bus de datos de la memoria.
Suele pasar que las señales de la CPU y de la memoria no coincidan. En esos casos
se ha de incluir entre la CPU y la memoria un circuito que haga de interfaz.
SRAM DRAM
NVRAM FRAM
Debido a su gran simplicidad, las memorias DRAM tienen celdas que ocupan
mucho menos espacio que las memorias SRAM. Eso hace que puedan ser mucho
más densas. Por otro lado, lo complicado de su lectura hace que sean más lentas.
Adicionalmente, el hecho de que la información se almacene en un condensador
hace que la información se pierda si tardamos mucho en leerla.
Todas las celdas de las memorias DRAM se han de leer periódicamente para
refrescar su valor antes de que degenere. El tiempo entre refrescos típico que
garantiza no perder el valor almacenado se halla entre 30ms y 60ms.
SRAM con pila de salvaguarda que está activa cuando no hay alimentación
La lista anterior de memorias RAM no incluye todos los diferentes tipos y subtipos
de memoria RAM por lo que es posible encontrar otros tipos.
El motivo por el que no hacen falta los strobes en los ciclos de lectura es que
las interacciones entre la CPU y la Memoria tienen la CPU como Master.
Cuando la CPU pide un dato a la memoria, activa el bus de direcciones y los
strobes de las calles que desea que la memoria llene.
Si la memoria llena todas las calles del bus de datos, las que la CPU desea y las
que no, no se produce ningún error porque la CPU, igualmente, al ser Master, sabe
que sólo ha de leer las calles que ha solicitado y no hará caso del resto de las calles
tanto si la memoria las llena como si no.
Volviendo a las memorias ROM, una memoria ROM, como su nombre indica,
puede leerse pero no escribirse. Eso significa que han de fabricarse ya escritas.
El diseñador de la memoria envía al fabricante de la ROM el contenido que desea
para ésta y, el fabricante, fabrica una máscara específica para el proceso
tecnológico de fabricación de los chips de ROM pregrabados.
Dir 2n-1
n Dir 2n-2
Direcciones
Dir 2
Dir 1
Dir 0
Pull-Downs
D7 ……………….. D0
V++
e- e- e-
e-
e-
Para que puedan ser borradas, las memorias EPROM tienen una ventana
transparente a los rayos ultravioletas. Eso encarece mucho su encapsulado y, por
tanto, la memoria EPROM en conjunto.
Una memoria EPROM encapsulada sin ventana es más barata y no puede ser
borrada nunca. Puede ser, por tanto, vendida como OTP-ROM igual que si fuera
de fusibles.
EEPROM (o E2PROM)
(Electrically Erasable Programmable Read Only Memory)
Las memorias EPROM tienen un encapsulado caro y, borrarlas, es engorroso.
Memorias Flash
Las memorias FLASH emplean transistores similares a los de las memorias
EEPROM. A diferencia de las memorias EEPROM, no se pueden borrar las celdas
independientes. En general se pueden escribir a “0” bit a bit, pero el borrado a “1”
se ha de hacer en todo un bloque de múltiples bytes. Pese a ello son más populares
que las memorias EEPROM porque se pueden hacer más densas y baratas.
Las ventajas de actualización ISP hacen que prácticamente haya substituido a las
memorias Mask ROM.
NOR Flash
Las memorias NOR Flash tienen transistores accesibles de manera independiente.
La función lógica que se forma en la Bit Line en función del estado de las Word
Lines es NOR, de ahí su nombre.
Decodificación de direcciones
Adaptar las direcciones de la Memoria a las de la CPU. Ello es
especialmente importante cuando tenemos varias memorias y una única
CPU.
FFFFFh
MEM 1
64KB
MEM 2 16KB
MEM 3
32KB
00000h
A modo de ejemplo:
FFFFFh
MEM 1
64KB
F0000h
0BFFFh
MEM 2 16KB
08000h
MEM 3
32KB
00000h
Con independencia del ancho del bus de datos de la CPU, 8 bits, 16 bits, 32
bits… el mapa de memoria lo escribiremos siempre en bytes ya que la CPU
siempre ha de ser capaz de direccionar bytes independientes.
Sólo permitimos poner una memoria en una posición inicial que sea
múltiplo de su tamaño. Esta restricción es más importante.
El número de direcciones m de la CPU tendrá que ser mayor o igual que el número
de direcciones n de la memoria si deseamos que quepa en el mapa.
Parte alta
m-n sin asociar
Define un Parte media
marco M n coincidentes
Am-1... An An-1 ..... A0 CPU
Mm-n-1..M0 An-1 ..... A0 MEM
Ejemplo
Decodifique las direcciones de manera que la memoria tenga su última posición en
la mitad del mapa de la CPU.
CPU M1
A0..A15 A0..A12
D0..D7 D0..D7
CS
La memoria tiene bus de datos direcciones A0...A12 por lo que su capacidad será:
1𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵
213 𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑒𝑒𝑒𝑒 = 213 𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵 = 23 210 𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵 = 8𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾
𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃
Por lo que quedarán libres las líneas de la CPU A15, A14 y A13.
Estas tres líneas definen un número de marco desde 000 a 111 (8 valores).
64𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾
=8
8𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾𝐾
FFFFh
7
6
5
4
3
2
1
0
0000h
Como se puede observar, a las líneas A15, A14 y A13 se les ha asignado el marco
número 3 que corresponde a la combinación binaria 011.
Ello significa que la memoria se tendrá que activar para direcciones que se hallen
en el marco indicado, esto es, siempre que A15="0", A14="1" y A13="1". Como la
selección de la memoria se hace con la señal CS* que es activa baja, ello implica
que se ha de implementar la expresión:
FFFFh
M1 7
A0..A12 A0..A12 6
5
D0..D7 D0..D7 4
7FFFh
MEM
3
6000h
2
A13
1
A14 CS
0
A15 0000h
Si en lugar de generar CS* partir del marco deseado dejáramos esta señal
siempre activa, la memoria quedaría implementada en todos los marcos a la vez y
obtendríamos el mapa de memoria siguiente:
FFFFh
MEM
7
MEM
6
MEM
5
MEM
4
MEM
3
MEM
2
MEM
1
MEM
0
0000h
Ejemplo
Obtenga la decodificación más sencilla posible que haga que la memoria M1 tenga
su primera posición al principio del mapa y la memoria M2 tenga su última
posición al final del mapa. Obtenga el mapa de memoria resultante.
Considere que el sistema no tiene ni requerirá más memoria adicional a la
indicada.
CPU M1 M2
A0..A19 32KB 64KB
D0..D7 D0..D7
D0..D7
CS CS
A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 CPU
0 0 0 0 0 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 M1
1 1 1 1 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 M2
Las señales CS* de las dos memorias que permiten elegir los marcos adecuados
para cada una serán:
�𝐶𝐶𝐶𝐶
���𝑀𝑀1 = 𝐴𝐴19 + 𝐴𝐴18 + 𝐴𝐴17 + 𝐴𝐴16 + 𝐴𝐴15
�𝐶𝐶𝐶𝐶
���𝑀𝑀2 = �����
𝐴𝐴19 + �����
𝐴𝐴18 + �����
𝐴𝐴17 + �����
𝐴𝐴16
FFFFFh
M2 𝑀𝑀2 𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼 = 15 ∙ 216 = 𝐹𝐹0000ℎ
F0000h
𝑀𝑀1 𝐹𝐹𝐹𝐹𝐹𝐹 = (15 + 1) ∙ 216 − 1 = 𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹ℎ
A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 CPU
0 X X X X A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 M1
1 X X X A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 M2
����𝑀𝑀1 = 𝐴𝐴19
𝐶𝐶𝐶𝐶
����𝑀𝑀2 = �����
𝐶𝐶𝐶𝐶 𝐴𝐴19
FFFFFh
M2
F0000h Tenemos 8 imágenes de M2 en la parte alta de la
memoria entre 80000h y FFFFFh.
80000h M2
7FFFFh M1
Tenemos 16 imágenes de M1 en la parte baja de la
memoria entre 00000h y 7FFFFh
07FFFh
M1
00000h
Así, la CPU puede direccionar 220 Bytes, por tanto, cada mitad ocupa 219 Bytes.
219 219
𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝑀𝑀1 = 15 = 24 = 16 𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝑀𝑀2 = 16 = 23 = 8
2 2
Esta no es, sin embargo, la única manera posible de repartir las direcciones, ni
siquiera usando decodificación sencilla.
�𝐶𝐶𝐶𝐶
��� = 𝐴𝐴𝑚𝑚−1 + ⋯ . +𝐴𝐴𝑛𝑛+1 + 𝐴𝐴0
Eso significa que la memoria sólo se seleccionará para las direcciones pares del
primer marco ya que en las direcciones impares A0=1.
2n+1-1
Marco 0
Marco 0
0
La memoria, señalada con regiones azules, ocupa las posiciones pares del
primer marco. Las posiciones impares no están conectadas a ninguna memoria.
Es por ello que hemos llamado número de módulo al número definido por las
direcciones bajas. En este caso, con un bit de direcciones bajas, las direcciones
válidas para el módulo 0 son las que cumplen:
𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷ó𝑛𝑛 𝑚𝑚ó𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑 2 = 0
Que corresponde a las direcciones pares, mientras que las direcciones válidas para
el módulo 1 son las que cumplen:
𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷ó𝑛𝑛 𝑚𝑚ó𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑 2 = 1
𝑚𝑚 = 𝑛𝑛𝑛𝑛 + 𝑛𝑛 + 𝑛𝑛𝑛𝑛
Marco 2na-1
El número de marco nos dice en que marco se halla la
memoria dentro del mapa de la CPU.
Marco 0
El número de módulo nos dice en que posiciones, dentro del marco, se halla la
memoria.
módulos 0, 1, 2 y 3.
Si escogemos el módulo 1, la
memoria se hallará en las
posiciones del marco que
mMarco 2m-na cumplan:
𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚 4 = 1
Ejemplo
Explore las distintas opciones de decodificación de líneas bajas usando 4 chips de
memoria como el indicado. Obtenga los mapas de memoria resultantes en cada
caso.
CPU M
A0..A15 16KB
D0..D7
D0..D7 4 Chips
CS Iguales
Por tanto, los 4 chips de memoria llenan el mapa de la CPU. No obstante, hay
múltiples maneras de llenar el mapa de la CPU con las 4 memorias dependiendo de
cómo repartamos las direcciones altas y bajas.
En esta opción no empleamos las líneas bajas para decodificar la memoria, por
tanto tenemos na=2 (4 marcos) y nb=0 (un módulo sin elección).
Tenemos 4 marcos y 4 memorias y, por tanto, habrá que poner una memoria en
cada marco. La siguiente tabla muestra como quedaría la decodificación:
Por tanto la generación de las señales CS* de las memorias y el mapa de memoria
sería:
FFFFh
Marco
M4 3
����𝑀𝑀1 = 𝐴𝐴15 + 𝐴𝐴14
𝐶𝐶𝐶𝐶
Marco
M3 2 �𝐶𝐶𝐶𝐶
���𝑀𝑀2 = 𝐴𝐴15 + �����
𝐴𝐴14
���𝑀𝑀3 = �����
�𝐶𝐶𝐶𝐶 𝐴𝐴15 + 𝐴𝐴14
Marco
M2 1
���𝑀𝑀4 = �����
�𝐶𝐶𝐶𝐶 𝐴𝐴15 + �����
𝐴𝐴14
M1 0
Marco
0000h
Pero también podríamos no haber empleado las líneas altas y haber empleado sólo
las líneas bajas.
En ese caso tendríamos na=0 (1 marco sin elección) y nb=2 (4 módulos).
Tenemos 4 módulos y 4 memorias y, por tanto, habrá que poner una memoria en
cada módulo. La siguiente tabla muestra como quedaría la decodificación:
Por tanto la generación de las señales CS* de las memorias y el mapa de memoria
sería:
FFFFh
M4
M3
M2 �𝐶𝐶𝐶𝐶
���𝑀𝑀1 = 𝐴𝐴1 + 𝐴𝐴0
M1
�𝐶𝐶𝐶𝐶
���𝑀𝑀2 = 𝐴𝐴1 + ����
𝐴𝐴0
�𝐶𝐶𝐶𝐶
���𝑀𝑀3 = ����
𝐴𝐴1 + 𝐴𝐴0
M4 �𝐶𝐶𝐶𝐶
���𝑀𝑀4 = ����
𝐴𝐴1 + ����
𝐴𝐴0
M3
M2
M1
0000h
Pero estas no son las únicas opciones que tenemos. También podríamos haber
repartido por igual las líneas altas y bajas.
En ese caso tendríamos na=1 (2 marcos) y nb=1 (2 módulos).
Por tanto la generación de las señales CS* de las memorias y el mapa de memoria
sería:
FFFFh
�𝐶𝐶𝐶𝐶
���𝑀𝑀1 = 𝐴𝐴15 + 𝐴𝐴0
M4
M3
M4 �𝐶𝐶𝐶𝐶
���𝑀𝑀2 = 𝐴𝐴15 + ����
𝐴𝐴0
M3
���𝑀𝑀3 = �����
�𝐶𝐶𝐶𝐶 𝐴𝐴15 + 𝐴𝐴0
M2 ����𝑀𝑀4 = �����
𝐶𝐶𝐶𝐶 ����
𝐴𝐴15 + 𝐴𝐴0
M1
M2
M1
0000h
Podría parecer que ya hemos agotado todas las opciones. Nos sobraban 2 líneas y
hemos probado a repartir 2+0, 0+2 y 1+1. Sería cierto que hemos agotado las
opciones si hacemos el mismo reparto de líneas para todas las memorias. Pero no
es necesario que así sea.
FFFFh
M4
����𝑀𝑀1 = 𝐴𝐴15 + 𝐴𝐴0
𝐶𝐶𝐶𝐶
���𝑀𝑀3 = �����
�𝐶𝐶𝐶𝐶 𝐴𝐴15 + 𝐴𝐴14
M2 ���𝑀𝑀4 = �����
�𝐶𝐶𝐶𝐶 𝐴𝐴15 + �����
𝐴𝐴14
M1
M2
M1
0000h
FFFFh
���𝑀𝑀1 = �����
�𝐶𝐶𝐶𝐶 𝐴𝐴15 + 𝐴𝐴0
M2
M1
M2 ���𝑀𝑀2 = �����
�𝐶𝐶𝐶𝐶 𝐴𝐴15 + ����
𝐴𝐴0
M1
�𝐶𝐶𝐶𝐶
���𝑀𝑀3 = 𝐴𝐴15 + 𝐴𝐴14
M4
�𝐶𝐶𝐶𝐶
���𝑀𝑀4 = 𝐴𝐴15 + �����
𝐴𝐴14
M3
0000h
Vicente Jiménez - Apuntes de DSBM - Tema 4 - Pag. 34
4.3.5 Decodificación sencilla e incompleta
Am-1........................A0 CPU
Mna-1 ..M0 An-1 .... A0 Bnb-1 ..B0 MEM
Parte alta Parte media Parte baja
na líneas n líneas nb líneas
D0..D7 D0..D3
CS CS
M2
A0..A15
D0..D3
CS
Dado que ambas memorias se hallan en paralelo, ambas tendrán que tener
exactamente la misma decodificación alta (Marcos) y baja (módulos a partir de
A0).
A modo de ejemplo, una CPU de 16 bits tendrá dos calles de 8 bits. Una calle
0 de D0 a D7 y una calle 1 de D8 a D15. Cada calle tendrá un strobe de calle
asociado que indicará cuando está en uso.
M1
A0..An-1 A0..An-1
CPU
D0..D7 D0..D7
A1..Am-1
D0..D15
Str C0 CS
Str C0
M2
A0..An-1
Str C1
D8..D15 D0..D7
Str C1 CS
Como puede verse, seguimos teniendo direcciones alta, bajas y medias. Una
parte de las direcciones A0 en CPUs de 16 bits y A0, A1 en CPUs de 32 bits sólo
serán visibles fuera de la CPU a través de los strobes de calle.
CPU
A1..A19 M1 64KB M2 64KB M3 64KB M4 64KB
A0..An-1 A0..An-1 A0..An-1 A0..An-1
D0..D15
D0..D7 D0..D7 D0..D7 D0..D7
UDS
LDS CS CS CS CS
1𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃
216 𝐵𝐵 = 216 𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵 → 𝐴𝐴0 … . . 𝐴𝐴15
1𝐵𝐵𝐵𝐵𝐵𝐵𝐵𝐵
La CPU tiene dos calles y 2 strobes de calle. La señal de strobe LDS* se activa (a
"0") cuando se usa la calle 0 y la señal de strobe UDS* se activa (a "0") cuando se
usa la calle 1.
FFFFFh
�𝐶𝐶𝐶𝐶
���𝑀𝑀1 = �����
𝐿𝐿𝐿𝐿𝐿𝐿 + 𝐴𝐴17 + 𝐴𝐴19
�𝐶𝐶𝐶𝐶
���𝑀𝑀2 = ������
𝑈𝑈𝑈𝑈𝑈𝑈 + 𝐴𝐴17 + 𝐴𝐴19
�𝐶𝐶𝐶𝐶
���𝑀𝑀3 = �����
𝐿𝐿𝐿𝐿𝐿𝐿 + �����
𝐴𝐴17 + 𝐴𝐴19
�𝐶𝐶𝐶𝐶
���𝑀𝑀4 = ������
𝑈𝑈𝑈𝑈𝑈𝑈 + �����
𝐴𝐴17 + 𝐴𝐴19
M3/M4
M1/M2
M3/M4
M1/M2
00000h
En cada marco ocupado por M1 y M2, M1 ocupa las direcciones pares y M2 las
impares. Igualmente, en cada marco ocupado por M3 y M4, M3 ocupa las
direcciones pares y M4 las impares.
El hecho de que tenemos una indeterminación (A18) hace que tengamos dos
imágenes de cada memoria.
Si CPU y memoria tienen el mismo ancho de bus, basta unir cada strobe de
calle de la CPU y la memoria entre si y unir ambos buses de datos. CS* se
generará por la decodificación del resto de direcciones no asociadas a los strobes.
CPU MEM
A1..Am-1
m-1 n A0..An-1
D0..D15 D0..D15
Str0 Str0
Str1 Str1
CS
m-n-1
CPU ROM
A1..Am-1 m-1 n A0..An-1
D0..D15 D0..D15
Str0 CS
Str1
m-n-1
Ejemplo
Sitúe las memorias indicadas de manera que se cumplan las restricciones
indicadas.
Muestre el mapa de memoria resultante.
CPU
M1..M4 RAM de 64K Bytes con bus de 8 bits
A2..A23
M5..M8 RAM de 64K Bytes con bus de 16 bits
D0..D31 y strobes LBS*, UBS*
M9..M10 ROM de 256K Bytes con bus de 16 bits
BE0 RAM al principio del mapa / ROM al final
BE1
BE2
BE3
Como las memorias M1 a M4 tienen bus de 8 bits, hemos de asignar una a cada
una de las 4 calles de la CPU. Con ello completamos los primeros 256KB de
memoria.
Como las memorias M5 a M8 tienen bus de 16 bits, hemos de asignar cada una dos
calles de la CPU. Asignaremos M5 y M7 a las calles 0 y 1 y las memorias M6 y
M8 a las calles 2 y 3.
Cada grupo de dos memorias llenará las 4 calles de la CPU. La distinción entre los
grupos M5-M6 y M7-M8 la haremos por decodificación de direcciones altas que es
la opción más sencilla. M5-M6 ocuparán un bloque de 128KB consecutivo al
bloque ocupado por M1-M4 y M7-M8 ocupará un bloque de 128KB consecutivo al
de M5-M6.
Con ello tendríamos decodificación completa, pero como nos basta con no
colisionar con la ROM, dejaremos indeterminadas las líneas A19 a A22.
En el caso de la memoria ROM, tenemos dos chips con dos calles para distribuirlos
entre las 4 calles de la CPU. Su estructura será similar a la de los pares M5-M6 o
M7-M8. En total, la ROM ocuparía los 512 KB finales del mapa, pero,
nuevamente, como nos basta con no colisionar con la RAM, indeterminaremos las
líneas A19 a A22.
�𝐶𝐶𝐶𝐶
���𝑀𝑀1 = ������
𝐵𝐵𝐵𝐵0 + 𝐴𝐴18 + 𝐴𝐴23
����𝑀𝑀2
𝐶𝐶𝐶𝐶 = ������
𝐵𝐵𝐵𝐵1 + 𝐴𝐴18 + 𝐴𝐴23
����𝑀𝑀3
𝐶𝐶𝐶𝐶 ������ + 𝐴𝐴18 + 𝐴𝐴23
= 𝐵𝐵𝐵𝐵2
����𝑀𝑀4
𝐶𝐶𝐶𝐶 = ������
𝐵𝐵𝐵𝐵3 + 𝐴𝐴18 + 𝐴𝐴23
�𝐶𝐶𝐶𝐶
���𝑀𝑀5 = 𝐴𝐴17 + �����
𝐴𝐴18 + 𝐴𝐴23 ����� = ������
𝐿𝐿𝐿𝐿𝐿𝐿 𝐵𝐵𝐵𝐵0 ������
𝑈𝑈𝑈𝑈𝑈𝑈 = ������
𝐵𝐵𝐵𝐵1
�𝐶𝐶𝐶𝐶
���𝑀𝑀6 = 𝐴𝐴17 + �����
𝐴𝐴18 + 𝐴𝐴23 𝐿𝐿𝐿𝐿𝐿𝐿 = 𝐵𝐵𝐵𝐵2 𝑈𝑈𝑈𝑈𝑈𝑈 = ������
����� ������ ������ 𝐵𝐵𝐵𝐵3
�𝐶𝐶𝐶𝐶
���𝑀𝑀7 = �����
𝐴𝐴17 + �����
𝐴𝐴18 + 𝐴𝐴23 ����� = ������
𝐿𝐿𝐿𝐿𝐿𝐿 𝐵𝐵𝐵𝐵0 ������
𝑈𝑈𝑈𝑈𝑈𝑈 = ������
𝐵𝐵𝐵𝐵1
����𝑀𝑀8 = �����
𝐶𝐶𝐶𝐶 𝐴𝐴17 + �����
𝐴𝐴18 + 𝐴𝐴23 ����� = ������
𝐿𝐿𝐿𝐿𝐿𝐿 𝐵𝐵𝐵𝐵2 ������
𝑈𝑈𝑈𝑈𝑈𝑈 = ������
𝐵𝐵𝐵𝐵3
����𝑀𝑀9 = �����
𝐶𝐶𝐶𝐶 𝐴𝐴23
�𝐶𝐶𝐶𝐶
���𝑀𝑀10 = �����
𝐴𝐴23
Las conexiones de los buses de datos tendrán que ser coherentes con las
definiciones anteriores:
7FFFFFh FFFFFFh
24-1 = 15 M9-M10
Imágenes Entrelazadas
más
F80000h
07FFFFh M7-M8
Entrelazadas
060000h M5-M6 24-1 = 15
Entrelazadas Imágenes
040000h
más
M1-M4
Entrelazadas
000000h 800000h
Todas las memorias tienen indeterminadas 4 líneas (de A19 a A22). Por tanto
tendremos 16 imágenes de cada memoria.
El espacio direccionable por la CPU es de 16 MBytes. Tanto la memoria RAM
como la ROM totalizan 512 KBytes (8 chips de RAM de 64KB y dos chips de
ROM de 256 KB). Tanto la RAM como la ROM ocupan cada una la mitad del
mapa de memoria de 8 MBytes.
El número de imágenes coincide con 8MB/512KB = 16.
Am-1........................A0 CPU
Mna-1 ..M0 An-1 .... A0 Bnb-1 ..B0 MEM
Parte alta Parte media Parte baja
na líneas n líneas nb líneas
Am-1........................A0 CPU
X....X An-1 .... A0 X.....X MEM ADDR
Am-1........................A0 CPU
Mna-1 ..M0 X.......X Bnb-1 ..B0 MEM CS*
Am-1......Ai+n-1.....Ai.......A0 CPU
X....X An-1 .... A0 X.....X MEM ADDR
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 CPU
13 12 11 10 9 X 8 7 6 5 4 3 2 1 X 0 MEM
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 CPU
3 10 1 X 7 2 8 4 0 11 X 12 5 13 6 9 MEM
En decodificación sencilla habíamos usado para generar la señal CS* las líneas de
la CPU no empleadas en la asignación de direcciones:
Am-1........................A0 CPU
Mna-1 ..M0 X.......X Bnb-1 ..B0 MEM CS*
Ejemplo
Sitúe la memoria indicada, con decodificación completa, a partir de la dirección
4000h.
CPU M1
A0..A15 32KB
D0..D7 D0..D7
CS
Obsérvese que se nos pide que situemos la memoria a partir de la posición 4000h.
FFFFh
M1
El mapa resultante de la distribución tiene una
indeterminación en las direcciones altas, por tanto, hay
dos imágenes que ocupan, cada una, la mitad del mapa de
la CPU.
M1
Cada dirección de la memoria será accesible en dos
direcciones dentro del mapa de la CPU, una en cada
mitad.
0000h
3
M1
En la figura podemos ver a asignación de marcos
C000h sobreimpresa sobre la distribución resultante de
la asignación de direcciones.
2
8000h
Como se puede ver, cada imagen de la memoria
ocupa 2 marcos al ser la memoria de 215 Bytes y
1
4000h
M1 cada marco de 214 Bytes.
0000h
0
�𝐶𝐶𝐶𝐶
��� = (𝐴𝐴15 + ����� ����� + 𝐴𝐴14�
𝐴𝐴14)�𝐴𝐴15
Obsérvese que empleamos una función AND de dos grupos OR. La función
AND no la habíamos usado nunca antes porque nunca habíamos hecho una
selección de dos marcos a la vez que no fuera debida a las indeterminaciones.
Recordad que estamos trabajando en lógica negada ya que CS* se activa por nivel
bajo. Por tanto, CS* ha de valer 0 en (y sólo en) los marcos 1 y 2.
FFFFh
La generación de CS* hace que sólo los marcos
3
M1
1 y 2 sean visibles. Ello se muestra en la figura
C000h de la izquierda.
2 Tendremos, por tanto, la memoria M1 visible
8000h
entre las posiciones 4000h y BFFFh.
1
4000h
M1
0000h
0
CPU M1
A0..A15 32KB
D0..D7 D0..D7
CS
FFFFh
A15 A14 .......A0 CPU
M1 X A14....... A0 MEM ADDR
M1
la memoria que ocupan las dos mitades del mapa de la
CPU.
0000h
Los marcos 0, 5, 6 y 7 corresponden a los número binarios 000, 101, 110 y 111,
por tanto, la generación de CS* será:
FFFFh
7 La memoria ahora se ve ahora en el marco 0 (1/4 inferior
6
M1
de la memoria) y en los marcos 5, 6 y 7 (3/4 superiores
5 de la memoria).
4 Obsérvese que ninguna parte de la memoria se accede en
3 dos lugares distintos del mapa de memoria. La
2
M1
decodificación es, por tanto, completa.
1
0
0000h
Los dos ejemplos anteriores ilustran la utilidad que puede tener emplear
decodificación no sencilla para algunos casos especiales.
En la mayor parte de los casos, sin embargo, la decodificación sencilla suele ser
suficiente.
La manera más sencilla de usar OE* y WE* es hacer que se activen siempre
que la CPU indique lectura o escritura respectivamente.
La siguiente figura muestra los circuitos de generación de estas señales para 4 tipos
de CPU que representan la mayor parte de las opciones que podemos encontrar.
CPU WE CPU
R/W W WE
OE R OE
CPU CPU
OE
R/W W WE
WE R OE
Las señales strobe de validación tiene siempre dos estados: activo o inactivo.
Se trata de señales de validación. Eso las diferencia de cualquier otra señal de los
buses.
• Strobes de calle
Indican el uso de un byte del bus de datos
En esos casos no hace falta añadir más strobes que los ya requeridos.
A0..A7
D0..D7 A0…A7 D0…D7
R/W
ALE
Este tipo de buses suele llevar asociada alguna señal de control, como ALE
en el ejemplo, que simplifica la captura de los datos de direcciones del bus antes de
que se retiren.
RAM RAM
RAM Zona RAM
Inaccesible RAM
PROM PROM
Memoria Memoria Mapa
Interna externa Resultante
Para verlo más fácilmente vamos a aplicar datos concretos al ejemplo anterior.
FFFFFh
PROM
128KB A la izquierda se muestra un mapa de memoria de
E0000h un microcontrolador hipotético que tiene 2 áreas
de memoria externa de 128 KB cada una.
MCU
PROM
CPU A0..A16 A0..A16
A0..A19 A18
D0..D7 D0..D7
CS1
D0..D7 R OE A17,A19
R A17..A19
CS
A17,A18
W CS2
RAM A19
A0..A16 A0..A14
D0..D7 D0..D7 A0..A16
R OE R
W WE W
A15..A19 CS
MCU
Una señal CS* para cada región de memoria externa
A0..A16 disponible.
D0..D7 Suficientes líneas del bus de direcciones para llenar el área
externa más grande.
R
W El bus de datos.
No hará falta añadir strobes en el circuito externo dado que CS1*, CS2* ya los
incorporan.
El hecho de tener una señal CS* pregenerada no significa que sólo se pueda
poner un chip de memoria, se puede añadir otro nivel de decodificación para
decodificar varios chips de memoria empleando como punto de partida la señal
CS* que genera el MCU.
FFFFFh
PROM
128KB
E0000h
Hemos puesto una nueva columna con los CS* que genera el MCU. El MCU
nunca activará a la vez dos señales CS*, por tanto, basta introducir en la
decodificación de cada memoria el CS* del área en que se desee incluir.
7FFFFh
M3 32KB
M3 32KB ����𝑀𝑀1 = 𝐶𝐶𝐶𝐶1
𝐶𝐶𝐶𝐶 ����� + 𝐴𝐴16
EXT2
M3 32KB 128KB
����𝑀𝑀2 = 𝐶𝐶𝐶𝐶1
𝐶𝐶𝐶𝐶 ����� + �����
𝐴𝐴16
60000h M3 32KB
�𝐶𝐶𝐶𝐶
���𝑀𝑀3 = �����
𝐶𝐶𝐶𝐶2
5FFFFh M2
64 KB EXT1
128KB
M1
64 KB
40000h
Para completar la solución del problema hemos de poner todas las conexiones de
los tres chips de memoria RAM.
M1 M2 M3
A0..A15 A0..A15 A0..A15 A0..A15 A0..A14 A0..A14
R OE R OE R OE
W WE W WE W WE
A16 A16
CS CS CS
CS2
CS1 CS1
n 2n2m=2n+m
Fila
Celdas
2m Bit Lines
2m Sense
m
Columna
D0
n
ADDR
RAS
m
CAS D0
En lugar de usar un bus de direcciones de ancho total n+m, se usa un bus que
tiene como anchura el máximo de estos dos números.
Como al principio del ciclo únicamente es necesaria la información de que fila
hemos de usar, esta se proporciona al principio del bus señalizándolo con una
bajada de la señal RAS* (Row Address Strobe). Un tiempo más tarde, se usan las
mismas líneas para proporcionar la información de la columnas señalizándolo con
la bajada de la señal CAS* (Column Address Strobe).
D0…D3
Con el tiempo, las memorias DRAM se han ido mejorando para permitir
lecturas más rápidas. La primera mejora fue las DRAM Fast Page Mode (FPM). La
idea que hay detrás de estas memorias es que si se ha de acceder a varias
posiciones dentro de la misma fila, no debería ser necesario volver a indicar ésta.
El las memorias FPM, por tanto, es posible dar varias transiciones a la señal CAS*
dentro de un único valor de fila señalizado con RAS*. La siguiente figura muestra
un cronograma para este tipo de memoria.
Las memorias Flash tienen actualmente una importancia tan grande que no
tendría sentido no hacer ningún comentario sobre el procedimiento de acceso a
éstas. Como se comentó anteriormente corresponden a una evolución de la
memoria EEPROM y se pueden dar en dos tipos: NOR y NAND.
Las memorias NOR Flash se diseñan substituir las memorias ROM, EPROM
y EEPROM. Su temporización en lectura es similar a las otras PROM, por lo que
no hace falta dar una explicación específica sobre ellas.
Las memorias NAND Flash pretenden substituir los discos duros y diskettes.
El acceso no se hace a bytes específicos sino a bloques de memoria. Su estructura
interna, por tanto, está optimizada para acceder en lectura y programación a
muchos datos en un tiempo muy corto.
Su interfaz es especial y basada en comandos a diferencia del interfaz clásico
basado en buses de datos y direcciones de las memorias NOR Flash.
Las líneas típicas de una memoria flash con bus de 8 bits son:
Como se ha indicado, I/O0 a I/O7 son el bus de entrada/salida. El resto son señales
de control.
La señal CE# tiene el comportamiento de un Chip Enable habitual. La memoria no
responderá a ninguna otra señal si esta señal no está activada.
Las señales WE# y RE# indican si el bus I/O se emplea para entrada o salida. Y se
usan para validar cada dato que se mueve por el bus.
Las señales CLE y ALE determinan el tipo de dato que se mueve por el bus:
El ciclo comienza con CLE alto y ALE bajo, indicando que se va a enviar
una orden de control. En el flanco de subida de WE# se valida el dato 80h que
indica que se va a introducir información.
A ello le sigue una combinación con CLE bajo y ALE alto, lo cual indica que se
envían direcciones. Los 5 bytes correspondientes a la posición a escribir (2 de
columnas y 3 de filas) se señalizan con sendos flancos de subida de WE#.
A continuación le sigue una serie de ciclos de la señal WE# con CLE y ALE bajos
que indican que lo que sigue son datos que serán los que se escribirán a partir de la
posición indicada.
Después de los datos se envía otro comando, señalizado con CLE alto y ALE bajo,
con valor 10h, que da inicio a la programación de los datos enviados.
La memoria señaliza con la bajada de la señal R/B# que la escritura está en
proceso. Cuando esta acaba lo señaliza con el alzado de R/B# con lo que la
memoria puede recibir más órdenes.
El último comando enviado en el ciclo se el comando 70h que pregunta si la
escritura fue correcta. La respuesta se recibe en el flanco de subida de la señal de
lectura RE#.
La jerarquía de memoria sin embargo se aprovecha para algo más que eso. Se
emplea también para:
• Seguridad
• Virtualización de direcciones
• Segmentación de direcciones
Datos Datos
Control Control
En rigor, la MMU puede tanto insertarse después de la CPU como ser una
parte de la misma CPU. Es más fácil entenderla, sin embargo, como un añadido
que es transparente desde el punto de vista de la CPU.
Los sistemas tienen una cantidad de memoria RAM limitada pero pueden
tener bastante más espacio en el disco duro. Si un programa es más grande que el
espacio que tiene asignado en memoria, siempre puede cargar del disco sólo una
parte. Cuando lo necesite siempre puede cargar otra parte.
Esto es lo que se conoce como overlays y no requieren de participación del
sistema operativo. Un programa basado en overlays está compuesto de diferentes
partes (overlays) que se van cargando en memoria dinámicamente según son
necesitadas.
Los overlays tienen el inconveniente que el programa que está en marcha ha de
saber en todo momento que partes necesita e ir cargándolas explícitamente cuando
no están presentes en memoria descartando otras partes en el proceso.
32 24
CPU Direcciones MMU Direcciones MEM DISCO
1 2
Datos Datos
3 4
.........
Control Control n-1 n
Lógicamente, en memoria sólo nos cabe una parte de las páginas de memoria
virtual. La MMU hará la traducción de las direcciones que solicita la CPU a las
correspondientes a las páginas que se hallan en memoria.
INICIO OFFSET
3BFFFh 0FFFFh
Data 2
64K
2C000h 2C000h 00000h
2BFFFh 0BFFFh
Code 2
48K
20000h 20000h 00000h
Las líneas de la CPU desde m en adelante se usarán para generar CS* de manera
que sólo una combinación de estas líneas genere un señal CS* baja.
0000H
CPU MEM
CPU MEMORIA A0 - A 13 A0 - A 13
n=16 16kB (m=14)
A 14- A 15 DEC. CS
Espacio
DIR.
de 64kB
D0 - D 7 D0 - D 7
FFFFH
0000H
CPU MEM
CPU A1 - A 14 A0 - A 13
n=16 MEMORIA
16kB (m=14)
Sólo en pos. pares A 0 , A 15 DEC. CS
Espacio
DIR.
de 64kB
D0 - D 7 D0 - D 7
FFFFH
Queda por resolver como se genera el CS* a partir de las líneas restantes del bus de
direcciones. La solución más sencilla y habitual es colocar el inicio de la memoria
en una posición del mapa de direcciones que sea múltiplo de su tamaño.
0000H
MEMORIA
16kB M0
CPU CPU MEM
n=16
A0 - A 13 A0 - A 13
M1
Espacio
de 64kB A
14
CS
A 15
4 Marcos M2
de 16kB
D0 - D 7 D0 - D 7
M3
FFFFH
La tabla de direcciones reflejará esta asigación dado que A15 y A14 han de valer 0
(marco 0) para que se active CS* en la memoria.
Negando o no cada una de las líneas A14 y A15 antes de la puerta OR (AND en
lógica negada), podemos poner la memoria en cualquiera de los 4 marcos posibles.
A
14
A 15
CS
MREQ
0000H
MEMORIA 1
16kB M0
CPU CPU MEM MEM
n=16
MEMORIA 2 A0 - A 13 A0 - A 13 A0 - A 13
M1
Espacio 16kB
de 64kB A14 A14
A15 CS A15 CS
4 Marcos M2
de 16kB
D0 - D 7 D0 - D 7 D0 - D 7
M3
FFFFH
CS CS
D0 - D 7 D0 - D 7 D0 - D 7
0
A15 X1 1
A14 X0 2
3
MREQ
Ejemplo de uso de decodificadores.
0000H
MEM 1 (pares)
CPU MEM MEM
CPU
n=16 A0 - A 13 A1 - A 14 A1 - A 14
D0 - D 7 D0 - D 7 D0 - D 7
FFFFH 0
A15 X1 1
A0 X0 2
3
MREQ
MEMORIA 4 MEMORIA 4
P3 MEMORIA 4 P3 P3 P3
16kB MEM4 16kB
FFFFH 16kB
+ Mapa 1 Mapa 2 Mapa 3 Mapa 4
Mapas de memoria correspondientes a las tablas anteriores
Consideremos, por ejemplo, el caso en que deseamos poner una memoria de 16kB
y otra de 32kB conectadas a una CPU con un espacio de direcciones de 64kB.
MEMORIA A14
M2 A15
16kB CS A15 CS
M1
M3 D0 - D 7 D0 - D 7 D0 - D 7
FFFFH
Ejemplo de decodificación para dos memorias de distinto tamaño
Uno podría pensar en la posibilidad de poner la memoria de 16k en el primermarco de 16k, M016k y
la memoria de 32k ocupando los dos marcos M116k y M216k.
Aunque esta opción garantiza la continuidad de la memoria, no es fácil de implementar dado que
los dos marcos consecutivos M116k y M216k no equivalen a ningún marco de 32k.
Ello no implica que no se pueda hacer, pero es más laborioso. Queda como ejercicio para el lector
determinar la circuitería que sería necesaria en este caso.
A 0 - A14 A0 - A 13
CS CS
D0 - D 7 D0 - D 7 D0 - D 7
0
A15 X1 1
A14 X0 2
3
MREQ
Implementación con un decodificador
0000H
MEMORIA
16kB M0
CPU MEM
MEMORIA A0 - A 13 A0 - A 13
M1
16kB
MEMORIA MREQ CS
16kB M2
D0 - D 7 D0 - D 7
MEMORIA
M3
16kB
FFFFH
Dado que la información de A14 y A15 que permite elegir los marcos de 16kB
dentro del mapa de memoria no se usa en la decodificación, resulta que la memoria
se halla activa para todos los marcos.
Son equivalentes.
Se puede decir que la memoria de cada una de los marcos es una imagen exacta de
la de las otras. Es por ello que a todas ellas se les denomina Zonas Imagen.
MREQ
1 0 2·214 a 3·214-1
Decodificación con 3 zonas imagen
Para ello juntaremos las líneas de direcciones de todas las memorias junto con CS*
y otras señales de control.
Luego juntaremos agruparemos las líneas de datos de las memorias hasta llegar a
las 8 líneas necesarias para completar un byte.
CPU
D
0
D -D
0 3
D
7
A0 - A m-1
CS
D -D
0 3
A0 - A m-1 A0 - A m-1
P0
MEM. 2 MEM. 1
P1
16k (4bits) 16k (4bits)
P2
P3
FFFFH
El número de bytes (NB) del bus de datos suele ser una potencia de 2.
La anchura w, en bits, del bus de datos suele ser por tanto del tipo w=8·2x=8·NB.
Los valores habituales son 8 (byte), 16 (word) y 32 (dword).
A23 A22 A21 A20 A19 A18 A17..A1 Strobes (A0) CPU Rango
63·218
LDS* MEM a
1 1 1 1 1 1 A16..A0
(A0=0) 1 64·218-1
(Pares)
A16..A0 63·218
UDS* MEM a
1 1 1 1 1 1
(A0=1) 2 64·218-1
(Impares)
Ejemplo de tabla de decodificación en el µP 68000
000000H
FC0000H
MEM 1 / MEM 2 P63
FFFFFFH
A 1 ... A 17
UDS
D 0 ... D 7
D 8 ... D 15
Strobes
A23 A22 A21 A20 A19 A18..A2 (A1A0) CPU Rango
0 0 0 0 0 A16..A0 BE0* (00) Mem 1 0 a 219-1
Dir. mod 4 = 0
19
0 0 0 0 0 A16..A0 BE1* (01) Mem 2 0 a 2 -1
Dir. mod 4 = 1
19
0 0 0 0 0 A16..A0 BE2* (10) Mem 3 0 a 2 -1
Dir. mod 4 = 2
19
0 0 0 0 0 A16..A0 BE3* (11) Mem 4 0 a 2 -1
Dir. mod 4 = 3
Para µP/µC con bus de datos de más de 8 bits, también existe la posibilidad de
emplear memorias con el mismo ancho de bus de datos que el microprocesador.
Si la CPU puede hacer accesos con ancho menor que el bus de datos, es necesario
que la memoria, para operaciones de escritura, cuente con strobes de byte igual que
la CPU. En operaciones de lectura no es necesario dado que la CPU sencillamente
ignorará los bytes no solicitados con los strobes.
000000H
FC0000H
MEM 128k x 16 bits P63
FFFFFFH
CPU MEM
A 1 ... A 17 A 0 ... A 16
A 18... A 23 CS
LDS LB
UDS UB
D 0 ... D 15
D 0 ... D 15
A14 A15
CS CS
MREQ MREQ
D0 - D 7 D0 - D 7 D0 - D 7
0000H
MEMORIAS
1y 2 P0
SOLAPADAS
4000H
MEMORIA 2 P1
16kB
8000H
MEMORIA 1
16kB P2
C000H
P3
FFFFH
Comentarios adicionales
En general, este tipo de decodificación no suele ser muy útil porque desaprovecha mucho el
espacio de memoria disponible debido a los rangos en los que se dan solapamientos.
Si el espacio de direccionamiento de la CPU es de 2n y las memorias son de 2m bytes, podrán
conectarse un máximo de n-m memorias de este modo (Un CS* a cada línea del bus de direcciones
de la CPU que no va al bus de direcciones de las memorias).
El número de páginas disponibles de 2m bytes es, sin embargo 2n-m.
De ello, la eficiencia de uso del espacio de direcciones es (n-m)/2n-m.
Para el ejemplo n=16 y m=14, la eficiencia máxima es 2/22 = 50%.
Pero para n=24 y m=14, se podrían poner como máximo 10 chips de 16kB y la eficiencia bajaría
hasta 10/210 ≈ 1%
La numeración hexadecimal emplea 16 posibles valores para cada dígito. Dado que
en notación decimal empleamos sólo 10 valores (0...9), los valores restantes en
hexadecimal se extraen del abecedario. De ello: