Resumen Final OC
Resumen Final OC
computadoras.
Simón Castillo
Resumen de Temas Repaso COC
Una computadora es una máquina digital, programable y sincrónica, diseñada para realizar
cálculos numéricos y lógicos, controlada por un programa almacenado y capaz de interactuar
con el mundo exterior a través de dispositivos periféricos.
Características principales
Este diseño asegura que la computadora pueda resolver problemas mediante la ejecución
secuencial de programas y permite el intercambio de datos entre sus diferentes componentes.
1
Memoria Principal
Buses de comunicación
Los buses son líneas de comunicación que permiten la transferencia de información entre
componentes:
2. Bus de datos: Transfiere datos según las señales de control establecidas. Su capacidad
determina la cantidad de datos transferidos por unidad de tiempo.
Registros clave
Estos elementos trabajan en conjunto para garantizar la ejecución ordenada y eficiente de las tareas
del sistema.
2
Componentes de la computadora
Las computadoras en realidad solo hacen cuatro cosas: recibir entradas (aceptan información
desde el mundo exterior), producir salidas (dan información al mundo exterior), procesar
información (llevan a cabo operaciones aritméticas o lógicas con la información) y almacenar
información (mueven y almacenan información en la memoria).
▪ Los contenidos de las celdas de la memoria son identificables por posición, sin importar
el tipo de los datos guardados en ese lugar.
3
LA UNIDAD CENTRAL DE PROCESAMIENTO
Función de la CPU
La CPU interpreta y ejecuta las instrucciones de los programas, realiza operaciones aritméticas
y lógicas, y coordina la comunicación con otras partes del sistema.
Factores importantes:
1. Compatibilidad: No todos los softwares son compatibles con todas las CPUs.
Componentes principales
2. Unidad de Control (UC): Coordina las operaciones de la ALU y gestiona el flujo de datos.
Tipos de registros
4
LA MEMORIA
Limitaciones de la CPU
● El resto del programa y los datos se almacenan en memoria hasta que la CPU esté lista
para usarlos.
La CPU se comunica con los demás componentes del sistema mediante tres tipos de buses:
𝑛
𝑛≤ 2
Este diseño asegura un flujo ordenado y eficiente de datos e instrucciones entre la CPU y la
memoria.
Ejemplo 1 ¿Cuántos bits deberán tener las direcciones para identificar 250 posiciones de
memoria diferentes?
Ejemplo 2 Escriba en binario la dirección más pequeña y la más grande para el bus de
direcciones del ej. anterior. ¿Puede determinar su valor en decimal?
5
Identificamos cada posición de memoria con un número binario llamado dirección. La
cantidad de bits almacenados en ella (llamado dato) se conoce como “unidad mínima
direccionable”. Si la posición de memoria puede contener 8 bits (1 byte) de información
decimos que la unidad mínima direccionable es el byte.
Por lo general, los buses tienen 8, 16 o 32 cables; dado que por cada cable puede fluir un bit a
la vez, un bus con 16 cables se denomina bus de 16 bits, ya que puede transmitir 16 bits de
información al mismo tiempo (por distintos caminos); transmite el doble de información que
un bus de 8 bits. Entonces, los buses más anchos pueden transmitir información con más
rapidez que los angostos. Además de la CPU y un conjunto de módulos de memoria, el tercer
elemento clave de un sistema de cómputo es un conjunto de módulos de entrada y/o salida
(E/S). Cada módulo realiza la interfase con el bus del sistema y controla uno o más dispositivos
periféricos
6
CICLO DE INSTRUCCIÓN
La función básica realizada por una computadora es la ejecución de programas. Hay que
entender el proceso de ejecución: el punto de vista más simple es considerar el procesamiento
de una instrucción como consistente de dos pasos: la CPU lee (búsqueda) las instrucciones
desde la memoria una a la vez, y las completa (ejecución).
El procesamiento requerido para una sola instrucción es llamado ciclo de instrucción. Usando
la descripción simplificada, los dos pasos son el ciclo de búsqueda y el ciclo de ejecución. El
ciclo se detiene sólo si la máquina es apagada, si ocurre algún error irrecuperable, o se
encuentra una instrucción de programa que detenga la computadora.
En el comienzo de cada ciclo de instrucción, la CPU busca una instrucción desde la memoria.
En una CPU típica, se usa un registro llamado contador de programa para conocer la ubicación
desde la cual la próxima instrucción debe ser buscada. A menos que se diga otra cosa, la CPU
siempre incrementa el contador de programa después de cada búsqueda de instrucción, de
modo de quedar listo para buscar la próxima en secuencia (es decir, la instrucción ubicada en
la siguiente posición de memoria). Esta secuencia podrá ser alterada y deberemos indicarla en
modo especial.
▪ CPU - Memoria: los datos pueden ser transferidos desde la UCP a la memoria o desde la
memoria a la CPU.
▪ CPU - E/S: los datos pueden ser transferidos hacia o desde el mundo exterior por una
transferencia entre la CPU y el módulo de E/S.
▪ Control: una instrucción puede especificar que la secuencia de ejecución sea alterada
(por ejemplo, con una operación de salto o jump).
7
REPRESENTACIÓN NUMÉRICA
Rango de representación
8
PRÁCTICA PERIFÉRICOS
Pantalla alfanumérica: sólo pueden mostrar caracteres alfanuméricos y para esto se dividen
en filas y columnas. En cada celda se almacena un carácter codificado en binario. Para esto se
utiliza la tabla ASCII que asigna 8 bits a cada carácter. Puede suceder que se especifique un
color para cada carácter, entonces necesito bits adicionales. Como sólo se puede elegir un
color por vez y por carácter serán log2(cantidad colores). Si se agregan atributos por cada
carácter (subrayado, negrita, etc.) se necesitará 1 bit adicional para cada atributo (puedo tener
más de uno a la vez).
Pantalla gráfica: este tipo de pantalla se divide en píxeles. La cantidad de pixeles estará dada
por la resolución (ancho x alto, por ejemplo, 1024x768). Cada punto puede ser de un color, e
indicando el color de cada pixel en toda la pantalla se formará la imagen. Existen diferentes
profundidades de color, por ejemplo: monocromo (blanco o negro, 1 bit); escala de grises (256
tonos de gris, 1 byte por pixel); True Color (24 bits por pixel).
Impresoras y escáneres: estos dispositivos sirven para transferir información desde (escáner)
y hacía (impresora) un medio impreso como el papel. Las características del medio y las
capacidades del dispositivo definirán el tamaño de la información. La cantidad de puntos o de
caracteres dependerá de la resolución del dispositivo. Además, existen impresoras que
trabajan en modo texto, y cada unidad, en lugar de ser un punto es un carácter lo que agrega 8
bits (ASCII) a cada unidad de datos.
Ejemplo 1: calcular el tamaño de memoria para un escáner monocromo con una resolución de 300ppp al
escanear una hoja de 10x15 pulgadas.
(300 x 10) x (300 x 15) x 1 bit (monocromo) = 13500000 bits
Ejemplo 2: calcular el tamaño de memoria para una impresora con una resolución de 150 puntos por
centímetro que trabaja en True Color para imprimir una hoja 10x15cm.
(150 x 10) x (150 x 15) pixels x 3 bytes / pixels (24 bits True Color) = 10125000 bytes
9
Ejemplo 3: calcular el tamaño de memoria para una impresora que imprime en alfanumérico con 150 filas y
100 caracteres por fila en True Color.
(150 x 10) x (150 x 15) caracteres x (1 + 3 bytes) / caracter (TC + ASCII) = 13500000 bytes
Disco duro: este es un dispositivo externo de almacenamiento secundario. Vamos a asumir que
las dos caras de cada plato son utilizables. Todas las caras tienen la misma cantidad de pistas,
todas las pistas tienen la misma cantidad de sectores y todos los sectores tienen la misma
cantidad de bits. Esto es importante ya que la pista más interna es más corta que la más
externa, lo cual implica que los sectores son más densos en el interior, pero siempre todos
almacenan la misma cantidad de bytes. Por lo general un sector tiene 512 bytes y esta es la
mínima unidad que se puede leer / escribir en el disco.
Ejemplo: calcular el tamaño de memoria para un disco duro de 2 platos con 300 pistas por cara y 1000
sectores por pista.
2 platos x 2 caras / plato x 300 pistas / cara x 1000 sectores / pista x 512 bytes / sector = 614,4MB
Cosas a tener en cuenta:
1. La velocidad de rotación es una característica importante del disco porque afecta al desempeño general.
2. Si debemos hacer cálculos que impliquen a la velocidad de rotación diremos que en cada vuelta se puede leer una pista
completa.
3. Si el valor que conocemos es el radio o diámetro de una pista y la densidad de sectores en ese extremo hay que usar la
fórmula de la circunferencia.
Ejemplo: calcular cantidad de sectores por pista, si tengo 10 sectores por centímetro y una pista de radio de
2 centímetros.
10 sectores / cm x (2𝜋 x radio) cm = 10 x 2𝜋 x 2 sectores = 40𝜋 sectores ≈ 125 sectores
10
SISTEMAS DE REPRESENTACIÓN EN PUNTO FIJO
Números negativos o fraccionarios no pueden ser representados en este sistema. Ejemplo BSS
restringido a 3 bits
Números positivos igual que el BSS, números negativos empiezan con 1. Ejemplo BCS
restringido a 3 bits
Números positivos igual que el BSS, números negativos calculo el número positivo y luego
cambio los 0 por 1 y viceversa.
11
Representó 23=8 números / Rango de representación: -3 ≤ x ≤ 3
puedo pasar de binario a negativo: el primer digito es ahora -(2n-1-1) y el resto de los dígitos
con pesos positivos. Por ejemplo, en 3 bits: 101 = -(23-1-1) + 20 = -3+1 = -2
Números positivos igual que el BSS, números negativos calculo el Ca1y sumo 1. Ejemplo Ca2
restringido a 3 bits
-4=100 (100 011+1 100) | -3=101 (011 100+1 101) | -2=110 (010 101+1 110) |
Dado un valor A, para obtener el número representado tengo que RESTAR el valor del exceso.
A = Exceso E de A - E
El número a representar viene dado por su valor más el valor del exceso (n bits, E=2n-1).
12
Rango de representación ASIMÉTRICO: -(2n-1) ≤ x ≤ 2n-1-1
Un cero: 10…0
Si empieza con 0 es negativo y si empieza con 1 es positivo (AL REVÉS). Ejemplo Ex2
restringido a 3 bits
-4=000 (-4+4=0 000) | -3=001 (-3+4=1 001) | -2= 010 (-2+4=2 010) |
-1=011 (-1+4=3 011) | 0=100 (0+4=4 100) | 1=101 (1+4=5 101) | 2=110 (2+4=6 110) |
Se considera que todos los números a representar tienen exactamente la misma cantidad de
dígitos y la coma fraccionaria está siempre ubicada en el mismo lugar.
Ejemplo 11,00 | 10,01 | 00,10 4 bits: 2 para la parte entera y dos para la fraccionaria. En la
computadora no se guarda la COMA, se supone que está en un lugar determinado.
La resolución es la diferencia entre dos números consecutivos. En los sistemas de punto fijo la
resolución es constante.
Ejemplo en un Sistema Punto Fijo con 3 bits parte entera en Ca2 y dos bits fraccionaria en BSS:
Rango [111,11 ; 011,11] [-4,75 ; 3,75] / Resolución 111,11-111,10=000,01=0.25
13
REPRESENTACIÓN Y ERROR
Con restricción de bits: la representación puede tener un error dado por e = |x - n|, donde x es
el número que quiero representar y n es el número más cercano a x que puedo representar.
Además, emax = resolución/2
Entonces para la representación de la parte fraccionaria se toman los valores enteros de los
resultados parciales, en el orden calculado: 0.2 = .0011 0011 … 0011 (periódico).
14
SISTEMA BCD Y BCD EMPAQUETADO (Sistema Decimal codificado en Binario)
En este sistema, los dígitos decimales se convierten uno a uno en binario. Para representar un dígito
decimal necesito 4 bits, y se asocia cada dígito con su valor en binario puro.
0=0000 | 1=0001 | 2=0010 | 3=0011 | 4=0100 | 5=0101 | 6=0110 | 7=0111 | 8=1000 | 9=1001
BCD Desempaquetado: se aplican en E/S y periféricos, los números se codifican usando un byte por
dígito. Pueden ser SIN SIGNO (4 bytes para el binario puro y los otros 4 se completan con 1111,
ejemplo: 5 = 1111 0101 = F5); o CON SIGNO (los 4 bits que acompañan al ÚLTIMO dígito son
reemplazados por C=1100 + | D=1101 –, por ejemplo: 4 = 1100 0100 = C4| -23 = 1111 0010 1101 0011
= F2D3)
BCD Empaquetado: se aplica en cálculo, se reservan 4 bits por dígito. NUNCA cortar los bits, siempre
escribir de a pares, si la cantidad de dígitos del número a representar es impar, completo con 0000.
Por ejemplo: 125 = 0000 0001 0010 0101 = 0125. El BCD Empaquetado también puede ser CON
SIGNO, en este caso agrego el signo al final. Por ejemplo: -25 = 0000 0010 0101 1101 = 025D| +8 =
1000 1100 = 8C
Para sumar en BCD tenemos dos casos: RES ≤ 9 No hay problema | RES > 9 SUMO 6 a ese dígito
(gener “acarreo” porque hay seis combinaciones no usadas)
15
CAMBIO DE BASES
FLAGS
Las FLAGS son bits de condición que el procesador establece de modo automático acorde al
resultado de cada operación realizada. Sus valores permitirán tomar decisiones como: realizar
o no una transferencia de control o determinar relaciones entre números.
Z (cero) N (negativo) C (carry) O (overflow)
1 todos los bits = 0 1 número negativo 1 acarreo / borrow 1 desborde en BCS
0 algún bit es 1 0 número positivo 0 otro caso 0 otro caso
Este sistema nos permite tener un rango mayor de números, es decir, podemos representar
números de “más pequeños” a “más grandes”, con la misma cantidad de bits, lo cual era una
limitación para el sistema en Punto Fijo.
La base [B] es implícita y no necesita almacenarse, puesto que es la misma para todos los
números. La ventaja que tiene este sistema es que necesito menos bits para almacenar la
mantisa y el exponente, que para almacenar el número completo. Tanto la M como el E, están
representados en algún sistema Punto Fijo ya conocido (BSS, BCS, Ca1, Ca2, Ex2).
16
DIFERENCIAS ENTRE SISTEMAS PUNTO FIJO Y PUNTO FLOTANTE
Al igual que en el Sistema Punto Fijo, el RANGO es la diferencia entre el mayor y el menor
número, se denota [mayor; menor]. Siempre será: mínimo menor número en mantisa y
mayor número en exponente | máximo mayor número en mantisa y mayor número en
exponente. Además, si la mantisa es normalizada con signo, voy a tener dos intervalos de
números, uno positivo y otro negativo, por lo tanto, voy a tener dos mínimos y dos máximos,
uno por cada intervalo.
17
Tener en cuenta que cuando la mantisa fraccionaria tiene muchos dígitos, para buscar
máximos número de mantisa [M] con n dígitos hacemos M = ± (1-2-n). Por ejemplo, para una
mantisa fraccionaria de 6 dígitos BCS y un bit de signo, el número máximo que puedo
representar con la mantisa es M = ± (1-2-6). (Después tengo que ver el exponente)
Para realizar operaciones en el Sistema Punto Flotante es necesario que, para sumar las
mantisas, los exponentes de cada número sean iguales, en el caso de que no se cumpla esto,
debo hacer un corrimiento de alguno de los dos exponentes (o ambos de ser necesario), para
poder realizar la operación correctamente. Por ejemplo, suma en Punto Flotante con mantisa
BSS 8 bits y exponente en BCS 8 bits. 00001111 00000011 + 00001000 00000010
00001111 00000011 E = 3
00001000 00000010 E = 2 Mx2E = 23x22 = 22x23 M = 00000100
El IEEE 754 es un estándar de aritmética en coma flotante. Este estándar especifica cómo
deben representarse los números en coma flotante con simple precisión (32 bits) o doble
precisión (64 bits), y también cómo deben realizarse las operaciones aritméticas con ellos.
Emplea mantisa fraccionaria, normalizada y en representación signo magnitud (M y S), sin
almacenar el primer dígito, que es igual a 1. El exponente se representa en exceso, que en este
caso no se toma como 2n-1, sino como 2n-1-1. Además, la base implícita de este sistema es 2.
18
Doble precisión: el estándar IEEE-754 para la representación en doble precisión de números
en coma flotante exige una cadena de 64 bits. El primer bit es el bit de signo (S), los siguientes
11 son los bits del exponente (E) y los restantes 52 son la mantisa (M).
Bits totales 32 64
Exponente en exceso 127 1023
Rango de exponente -126 | +127 -1022 | +1023
Rango de números
2-126 | ~2128 2-1022 | ~21024
[DEL STALLING] El Estándar IEEE 754 se desarrolló para facilitar la portabilidad de los
programas de un procesador a otro y así poder alentar el desarrollo de programas
numéricos sofisticados. Dichos formatos reducen la posibilidad de que el resultado final
se vea deteriorado por un error de redondeo.
LÓGICA DIGITAL
Un circuito digital es en el que están presentes dos valores lógicos. Y las compuertas son
dispositivos electrónicos que pueden realizar distintas funciones con estos dos valores lógicos.
Las compuertas constituyen la base de hardware sobre la que se construyen todas las
computadoras digitales. Para describir los circuitos que pueden construirse combinando
compuertas, se requiere un nuevo tipo de álgebra, en donde las variables solo pueden ser 0 o
1: esta es el álgebra booleana. Puesto que una función booleana de n variables tiene 2n
combinaciones de los valores de entrada, la función puede describirse totalmente con una
tabla de 2n renglones, donde cada uno indica un valor de la función para cada combinación
distinta de las entradas. Dicha tabla se la conoce como tabla de verdad.
19
Identidades del álgebra booleana
Funciones lógicas
Toda función lógica puede representarse mediante una tabla de verdad y un diagrama de
compuertas lógicas. Si quiero escribir la función lógica a partir de una tabla de verdad, debo
tener en cuenta que deben haber tantos términos como unos en los resultados de la tabla, y las
variables que valen 0 en la tabla aparecen negadas.
Suma de Productos: Es posible inferir la fórmula lógica asociada a una función desconocida de
la cual sólo se conoce la respuesta ante todas las combinaciones posibles de entradas. La
función tendrá tantos términos como unos tenga el resultado de la tabla.
Circuitos integrados
20
En general, un circuito combinacional consiste de n entradas binarias y m salidas binarias. Al
igual que una compuerta lógica, un circuito combinacional puede definirse de tres formas:
▪ Tabla de verdad: Para cada una de las posibles combinaciones de las n señales de entrada, se enumera el valor binario de
cada una de las m señales de salida.
▪ Símbolo gráfico: Describe la organización de las interconexiones entre puertas.
▪ Ecuaciones booleanas: Cada señal de salida se expresa como una función booleana de las señales de entrada (suma de
productos).
Los circuitos combinacionales cuentan con una o varias entradas y salidas. Los mismos
responden a los valores lógicos en las entradas, y la o las salidas están determinadas
exclusivamente por los valores de entrada en ese instante. Entonces, si cambia la entrada,
cambia la salida. Además, los valores pasados de las entradas, no influyen en los valores de la
salida. Por ejemplo, algunos circuitos combinacionales de uso frecuente son:
Multiplexores:
Decodificadores:
21
Comparadores:
Circuitos secuenciales
Las salidas dependen tanto de las entradas como del estado interno del circuito. Estos circuitos
tienen la característica de almacenar valores lógicos internamente, y los mismos se
almacenan, aunque las entradas lógicas no estén.
Los circuitos biestables son aquellos que poseen dos estados estables que se pueden mantener
por tiempo indefinido, salvo que las entradas provoquen un cambio, lo que nos permite tener
almacenado un dato en un dispositivo por el tiempo que se desee. Según la manera en que las
salidas respondan a las señales lógicas presentes en la entrada, los biestables se clasifican en
SR, J-K, D y T.
Respecto del instante en que pueden cambiar dichas salidas, pueden ser:
22
La señal del reloj indica a los elementos de memoria cuando deben cambiar su estado. Existen
dos tipos de biestables muy importantes: el latch y el flip-flop. Estos circuitos están
compuestos por compuertas lógicas y lazos de retroalimentación y son considerados los
circuitos básicos que constituyen los sistemas digitales. El latch es un circuito biestable
asíncrono, es decir que sus salidas cambian en la medida en que sus entradas cambien. El
flip-flop es un dispositivo secuencial sincrónico que toma muestras de sus entradas y
determina una salida sólo en los tiempos determinados por el reloj (CLK).
Latch SR: para crear una memoria de un bit necesitamos un circuito que de alguna manera
“recuerde” los valores de entrada anteriores. Podemos construir un circuito así a partir de dos
compuertas NOR. Este circuito tiene dos entradas S [set] para establecer el latch, es decir,
ponerlo en 1, y R [reset] para restablecerlo (ponerlo en 0). También hay dos salidas, Q y Q̅ que
son complementarias. A diferencia de los circuitos combinacionales, las salidas de un latch no
están determinadas de forma única por las entradas vigentes.
Flip-Flop
En muchos circuitos es necesario muestrear un valor que hay en una línea dada en un
instante dado y almacenarlo. En esta variable, llamada Flip-Flop, la transición de estado no
ocurre cuando el reloj es 1, sino durante la transición del reloj de 0 a 1 (flanco ascendente) o
de 1 a 0 (flanco descendente).
¿Qué diferencia hay entre un Flip-Flop y un Latch? Un Flip-Flop se dispara por flanco,
mientras que un Latch se dispara por nivel.
23
Flip-Flop SR:
Flip-Flop D
En el Flip-Flop SR hay que aplicar dos entradas diferentes para
cambiar el estado, el Flip-Flop D permite aplicar una sola entrada
para cambiar la salida. El Flip-Flop D está compuesto por dos
compuertas AND encargadas de enviar la señal de habilitación a
dos compuertas NOR. La salida de una compuerta NOR se
transforma en la entrada de la otra (retroalimentación). Hay una
gran similitud con el Flip-Flop SR, sólo difieren en que este tiene
una sola entrada de habilitación y en que la entrada de Reset es
igual a la de Set negada
Flip-Flop JK:
24
Flip-Flop T
El Flip-Flop T [Toggle] mantiene su estado o lo cambia dependiendo del valor de
T cada vez que se activa. La salida Q cambiará de 1 a 0 o de 0 a 1 en cada pulso
de la entrada T. Se puede implementar utilizando un biestable JK.
Relojes
En muchos circuitos secuenciales el orden en que ocurren los sucesos es crucial. A veces un
suceso debe suceder a otro, u ocurrir dos sucesos en simultáneo. Para que los diseñadores
puedan establecer las relaciones de temporización requeridas, muchos circuitos digitales
emplean relojes que hacen posible la sincronización. Un reloj es un circuito que emite una
serie de pulsaciones con una anchura de pulsación precisa y un intervalo preciso entre
pulsaciones consecutivas. Es una señal de tiempo precisa que determina cuando se producen
los eventos. El periodo entre los flancos correspondientes de dos pulsaciones consecutivas se
denomina tiempo de ciclo del reloj.
Registros
25
CICLO DE INSTRUCCIÓN
La computadora tiene como función ejecutar programas, los mismos están compuestos por
instrucciones almacenadas en memoria. La CPU procesa estas instrucciones, trayendolas
desde memoria una por vez y luego cumpliendo cada operación ordenada. Podemos
descomponer el procesamiento de instrucciones en dos etapas:
Etapa de búsqueda
Etapa de ejecución
El procesamiento requerido para una sola instrucción se llama CICLO DE INSTRUCCIÓN, que
consta de dos pasos: ciclo de búsqueda y ciclo de ejecución. La ejecución del programa se
interrumpe sólo si la máquina se apaga, hay un error o hay una instrucción que interrumpe a
la computadora. Al principio de cada ciclo, la CPU busca una instrucción en memoria. En la
CPU hay un registro llamado Contador de Programa [PC], que tiene la dirección de la próxima
instrucción a buscar. La CPU, después de buscar cada instrucción, incrementa el valor
contenido en PC, así podrá buscar la siguiente instrucción en secuencia (de esta manera, el PC
siempre va a estar apuntando a la próxima instrucción a ejecutar). La instrucción buscada se
carga dentro de un registro de la CPU, llamado Registro de Instrucción [IR]. Esta instrucción
está en la forma de un código binario que especifica las acciones que tomará la CPU. La CPU
interpreta cada instrucción y lleva a cabo las acciones requeridas. A esta interpretación se la
llama “decodificar”. En general, dichas acciones caen en cuatro tipos:
Dentro del CPU está la ALU, dos registros temporales a la entrada de la ALU y uno a la salida
26
[RT1, RT2, RT3], luego los registros en celeste que son el Registro de Instrucciones [IR] y el
Contador de Programa [PC]. Luego el otro bloque celeste son los secuenciadores que forman
parte de la Unidad de Control [UC] que nos va a indicar en que paso estamos dentro de la
ejecución de una instrucción. Luego la memoria dentro del esquema está separada en dos
partes: la Memoria de Instrucciones [MI] y la Memoria de Datos [MD]. A la derecha e izquierda
están los Buses: el Bus de Direcciones y el Bus de Datos (no está esquematizado el Bus de
Control). Recordar que la CPU se conecta al Bus de Datos por medio del registro MBR; y se
conecta al Bus de Direcciones por medio del registro MAR.
Supongamos que tenemos que hacer una operación aritmética con dos operandos que van a estar en
memoria y luego de realizar la operación se guarda el resultado en memoria también.
3. Búsqueda del primer operando: parte de la información de la instrucción que acaba de leerse
dice como calcular la dirección del primer operando. Entonces la CPU coloca la dirección del
operando en el Bus de Direcciones hace un ciclo de acceso para la lectura de la memoria, y la
memoria entrega el dato que viaja a través del Bus de Datos, ingresa a la CPU y llega al
Registro Temporario 1 [RT1].
4. Búsqueda del segundo operando: se repite lo mismo que el paso anterior, pero con el
segundo operando.
5. Operación aritmético-lógica realizada por la ALU, que luego coloca el resultado en el Registro
Temporario 3 [RT3] que es el registro de salida de la ALU. (Si estuviera el registro de Flags, se
actualizaría el mismo luego de hacer esta operación).
6. Almacenar el resultado: la instrucción nos dice dónde colocar el resultado, entonces la CPU
coloca la dirección en el Bus de Direcciones y hace un ciclo de acceso para escritura de la
memoria. Esta vez, es la CPU la que coloca el dato en el Bus de Datos que viaja por él y es
copiado en la dirección de memoria que le corresponde ser guardado. Entonces el flujo en
este caso es desde el RT3 hasta la Memoria de Datos [MD], haciendo la escritura del resultado.
27
7. Cálculo de la dirección de la próxima instrucción: se incrementa el Contador de Programa
[PC], así este apuntará a la dirección de memoria siguiente a donde estaba la instrucción que
acabamos de ejecutar. Y así se reinicia el ciclo para la próxima instrucción.
Diagrama de estados
28
ESTADO 5: búsqueda del operando. Se realiza el ciclo de acceso a Memoria o a E/S para
acceder a la información. Cómo involucra a la Memoria o E/S este estado está por encima de la
línea horizontal, es decir, está involucrando el manejo de los buses. [Los estados 4 y 5 se
pueden repetir, por ejemplo, si necesito buscar un segundo operando].
ESTADO 6: operación sobre los datos. El o los operandos necesarios ya están en la CPU y ahora
hay que realizar la operación sobre esos datos (suma, resta, multiplicación, etc.).
ESTADO 7: cálculo de la dirección del resultado. Ya hicimos el cálculo en la CPU y ahora hay
que calcular la dirección en la cual voy a guardar este resultado. La instrucción nos tiene que
haber dado la información, de donde debo guardar el resultado. Una vez que tengo dicha
dirección paso al último estado.
29
FORMATO DE INSTRUCCIONES Y MODOS DE DIRECCIONAMIENTO
¿Cómo es el formato de una instrucción? ¿Cómo está guardada una instrucción en memoria?
¿Qué campos la componen? ¿Cómo se distribuyen los bits?
Sabemos que todas las instrucciones son AUTOCONTENIDAS, esto significa que la instrucción
da toda la información necesaria para realizar todas las acciones que se necesiten para llevar
a cabo la instrucción, y para el encadenamiento con la próxima instrucción también.
El código de operación, que es un código binario que el fabricante asigna para cada
operación que se pueda llevar a cabo, y nos especifica la operación a realizar.
La referencia del operando fuente, es una determinada cantidad de bits que nos van
a permitir encontrar donde está el operando fuente.
Cada instrucción dentro de la CPU está representada por un cierto número de bits que nos van
a indicar todo lo necesario referente a la instrucción (¿Qué hacer? ¿Con qué? ¿Dónde va el
resultado? ¿Dónde está la próxima instrucción?). Este conjunto de bits que codifican la
instrucción lo podemos considerar dividido en campos, donde cada campo nos da la
información necesaria para cada una de esas cuestiones que tenemos que especificar. El
esquema que nos dice como están distribuidos esos campos es lo que se conoce como
FORMATO DE INSTRUCCIÓN. Vamos a tener formatos de instrucción distintos, con más o
menos campos y hay que analizar cuántos bits se asignarán para cada campo. La totalidad de
los bits de cada campo nos darán el largo de la instrucción.
30
En programación es muy incómodo estar trabajando en lenguaje de bits, entonces lo que se
hace es usar una representación simbólica, por ejemplo, ADD para la suma, MUL para la
multiplicación, etc. Estos se llaman Mnemónicos. Del mismo modo, los operandos también
conviene representarlos con una representación simbólica, por ejemplo, MOV Reg1, Mem1 es
una instrucción que copia lo contenido en la dirección de memoria Mem1 a un registro Reg1.
Obviamente tiene que estar previamente definido que se entiende por Mem1 y Reg1. En este
ejemplo tenemos bits asignados al código de operación, otros al operando fuente y otros para
el operando resultado. ¿Qué se va a codificar en la memoria? La secuencia de n bits que
forman dicha instrucción.
Ejemplo en lenguaje de alto nivel: X := X + Y Esta instrucción suma los valores almacenados
en las posiciones de memoria X e Y, para luego guarda el resultado en X. Esto puede implicar
cargar registros, sumarlos y luego almacenar el resultado en memoria. Hay que tener en
cuenta que una instrucción en alto nivel puede requerir varias instrucciones de máquina
31
Este sería el caso de una máquina de 4 direcciones, aquí no hay
Contador de Programa, la dirección de la próxima instrucción
está contenida en la instrucción actual. Tenemos direcciones
explícitas para operandos fuentes y operando resultados, y
para la próxima instrucción. Estas son muy raras puesto que
cada campo de dirección necesita tener bits para acomodar
una dirección completa.
Cód. Operación Dir. Resultado Dir. Op1 Dir. Op2 Dir. PróxInstr
32
Por último, está el caso de las máquinas de 1 dirección, tenemos
que suponer implícita otra información más para así sacar otro
campo dedicado a una dirección. Esta máquina dispone de un
registro especial en la CPU llamado acumulador que es uno de
los operandos de la operación y además el destino para el
resultado (cumple el rol del operando 1 en la máquina de dos
direcciones, sólo que en este caso es un registro de la CPU). Este
operando lo vamos a ir a buscar en memoria y lo vamos a
colocar en un registro interno acumulador, para no perder flexibilidad vamos a necesitar un
código de operación para cargar el acumulador [LOAD] y otro para descargarlo [STORE].
Qué tipos de operaciones se pueden manejar, cuáles [si por ejemplo quiero multiplicar y no
tengo una operación para eso, deberé implementar otro modo de hacerlo como por ejemplo
sumas sucesivas] y cuántas [si yo tengo muchas operaciones voy a necesitar más bits para
codificarlas]. Tenemos distintos tipos de operaciones posibles:
33
Instrucciones de transferencia de control: por ejemplo, las de bifurcación (condicionales) o los
saltos.
Qué tipos de datos vamos a trabajar, puesto que las instrucciones tienen que dar soporte a
distintos tipos de datos. Los tipos de datos más importantes son direcciones, números (entero,
punto fijo, etc), caracteres (ASCII, BCD) y datos lógicos.
Cuál va a ser el formato de las instrucciones en esta arquitectura [longitud (cantidad de bits),
número de direcciones, tamaños de cada campo].
Uso de registros, cantidad que se pueden referenciar mediante las instrucciones y uso
específico o general de los mismos.
Modos de direccionamiento
Como ya vimos, en una instrucción se necesitan bits para expresar el Código de Operación,
que indica la operación que vamos a hacer y otra cantidad de bits para especificar de donde
provienen los datos que vamos a utilizar en esta instrucción. ¿Cómo se puede reducir el
tamaño de estas especificaciones? Hay dos métodos generales:
Si un operando va a usarse varias veces, puede colocarse en un registro dentro de la CPU, esto
tiene como ventaja que el acceso será más rápido, puesto que todo lo que está colocado en
registro del CPU se accede más rápidamente; y además voy a necesitar menos bits pues por
ejemplo si tengo 32 registros dentro del CPU me alcanzan 5 bits para referenciar al operando
contenido en el registro del CPU, pues 25 = 32. De este modo reduzco el tamaño de las
instrucciones.
Por lo general los modos de direccionamiento tienen como objetivo: disminuir la cantidad
de bits dentro de la instrucción; lograr que existan direcciones que no precisan conocerse
hasta la ejecución del programa (por ejemplo, no necesito saber la dirección del operando
para escribir un programa, sólo con usar la representación simbólica del operando puedo
escribir mi programa y después la CPU se encargará de decodificar las instrucciones); poder
manejar los datos de manera más eficiente, por ejemplo, en las estructuras de datos de tipo
arreglos.
34
Modo de Direccionamiento Inmediato [MOV AL , 4]: en este modo
de direccionamiento el operando esta codificado en la instrucción,
es decir, se obtiene automáticamente de la memoria al mismo tiempo que la instrucción. En
este caso no hay que ir a hacer una referencia posterior a memoria, cuando llevamos la
instrucción a la CPU, llevamos codificado dentro de la instrucción el operando. Este modo de
direccionamiento se utiliza para definir constantes y también para inicializar variables, por
ejemplo. La desventaja es que el tamaño del operando va a estar limitado al tamaño de ese
campo de direccionamiento, entonces, si por ejemplo el campo de direccionamiento para ese
operando es de 16 bits, tengo que tener en cuenta que el operando no puede ocupar más de 16
bits.
35
Modo de Direccionamiento Indirecto por Memoria: en
este caso no vamos directamente a la dirección de memoria
que necesitamos, sino que tenemos que dar un paso
intermedio antes. Es decir, en el campo de la instrucción, ya
no nos dan la dirección efectiva del operando, sino que nos
dan una dirección que tiene guardada la dirección efectiva
del operando. Entonces se lee la dirección y se accede a Memoria, y ahí se hace un segundo
acceso a Memoria para acceder al operando.
¿De qué nos sirve que en la instrucción este la dirección de la dirección del operando?
Es para tratar de solucionar el problema del Modo de Direccionamiento Directo, y así, con una
dirección de menos bits en la instrucción, se apunta a una dirección de más bits. La ventaja es
que tendremos un espacio de direccionamiento mayor, pues el sitio en memoria al que está
apuntando el campo de mi instrucción puede tener más bits. Pero la desventaja es que voy a
tener más accesos a memoria, entonces, este modo de direccionamiento será más lento que el
modo de direccionamiento Directo. Otra ventaja es que no necesito conocer la dirección
efectiva del operando en el momento en el que escribo mi programa.
En este caso el registro sería un registro puntero pues apunta a la dirección efectiva del
operando.
36
Modo de Direccionamiento por Desplazamiento: este modo
implica especificar dos cosas, un registro involucrado y una
cantidad que hay que sumarla al contenido del registro para
encontrar la dirección efectiva del operando. Entonces la
dirección efectiva de aquello que queremos referenciar se
calcula con el contenido de un registro más una cantidad
binaria que se le suma. El registro puede estar implícito o no, dependiendo de qué instrucción
sea y del procesador. Si bien se están dimensionando dos conjuntos de bits, uno que nos
referencia la dirección de un registro y otro que nos indica una cantidad que sería el
desplazamiento, estamos especificando sólo una dirección. Este modo de direccionamiento
combina las capacidades de los modos de direccionamiento indirecto y directo.
Hay distintos Modos de Direccionamiento por Desplazamiento, los más comunes son:
MDD por Desplazamiento de Registro Base: el registro referenciado contiene una dirección
de memoria y el campo de dirección tiene un desplazamiento. Esto es muy útil para trabajar
por ejemplo con la estructura arreglo. Supongamos que yo quiero trabajar siempre con un
dato que está en la posición 4 de un arreglo, y yo quiero trabajar con distintos arreglos, pero
siempre con el dato de la posición 4, entonces puedo ir cambiando la dirección del registro,
pero el desplazamiento siempre será el mismo.
37
MDD por Desplazamiento Indexado: acá también se direcciona la memoria con un registro
más un desplazamiento. En esencia es igual desplazamiento por Registro Base, lo que cambia
es que se interpreta por desplazamiento y por dirección base. Acá el desplazamiento estaría
dado por el contenido del registro, y la dirección base está dada por el campo A. Entonces la
dirección base (desde donde comienzo) va a estar fija, y el desplazamiento que se lleve a cabo
va a depender del contenido del registro. Este registro lo puedo ir variando por ejemplo en un
lazo (iteración) y entonces así voy accediendo a distintos lugares de memoria en base a los
distintos desplazamientos que se van dando. En el caso de un arreglo, en el campo de la
instrucción especificamos la dirección del comienzo del arreglo y en el registro (que vamos a
llamar registro índice) vamos a tener la información que nos indique cómo nos vamos a
desplazar dentro de ese arreglo. Por esto mismo es que podemos decir que la Indexación
proporciona un mecanismo eficiente para realizar operaciones iterativas. Algunas máquinas
pueden realizar una auto-indexación, es decir, puede incrementar o decrementar este registro
como parte de la instrucción.
Modo de Direccionamiento del Stack: el Stack es un área de memoria que está administrada
como una estructura de tipo Pila, en donde el último en entrar es el primero en salir, es decir,
la información dentro de la estructura se va apilando. Entonces vamos a tener un registro
puntero de Pila que apunta a una dirección. Cada vez que meto algo en la pila, al puntero se le
cambia el valor para que apunte a la dirección en donde está guardada la última información
ingresada. Este registro llamado Puntero de Pila [Stack Pointer] está implícito y se
incrementa/decrementa automáticamente. Este puntero siempre va a apuntar al tope de la
pila.
38
REGISTROS
Dentro de la CPU tenemos disponibles registros que son visibles para el usuario, es decir, para
el programador, y otros que son registros de control y estado, que son utilizados por la UC
para controlar las operaciones de la CPU y no son visibles por el programador.
¿A qué le llamamos registros visibles? Estos son los que pueden ser afectados por el
programador directamente a través de las instrucciones. Por ejemplo, el Registro de
Instrucciones [IR] es un registro de control y estado porque no puedo controlar lo que está
dentro de ese registro, aunque sepa para qué sirve y sepa que existe.
Registros de propósito general: tienen múltiples funciones, en principio pueden ser usados
para cualquier operando y ese operando puede utilizarse para cualquier código de operación.
A veces pueden existir restricciones (por ejemplo, registros sólo usados para operandos en
Punto Flotante). También se pueden utilizar para direccionamiento (por ejemplo,
Direccionamiento Indirecto vía Registro).
Registros para alojar direcciones: estos pueden ser asignados para un Modo de
Direccionamiento con Desplazamiento, por ejemplo, el registro índice para el MDD
auto-indexado.
¿Conviene tener todos los registros para propósito general o conviene especializar su uso? La
primera respuesta que tenemos es que, si todos los registros son de propósito general, esto va
a afectar el tamaño de las instrucciones. Ahora si tengo registros especializados, puede
ahorrar bits para los casos especializados en el que necesite menos bits, pero se limita la
flexibilidad del programador.
Afecta el tamaño de la instrucción (pues necesito más bits para el campo de dirección para el
registro).
Si tengo una mayor cantidad de registros, voy a precisar un mayor número de bits para poder
codificarlos.
39
Si tenemos pocos registros, significa que no voy a poder tener muchos datos dentro de la CPU;
entonces voy a tener que ir permanentemente a Memoria a buscar mis datos.
Los registros de direcciones deben ser capaces de almacenar la dirección más grande que
podamos trabajar. Si, por ejemplo, las direcciones con las que va a trabajar nuestro
procesador son de 32 bits, nuestros registros tienen que tener espacio suficiente para guardar
estas direcciones de 32 bits.
Si los registros guardan datos, la idea es que puedan guardar la mayoría de tipos de datos que
trabaje ese procesador. En algunas máquinas se permite que un par de registros puedan estar
almacenando partes de un mismo dato, es decir que estos registros estén de manera contigua
y actúen como un solo registro, para poder trabajar un dato de doble longitud.
Pueden ser utilizados por las instrucciones de bifurcación condicional, por ejemplo, saltar si
hubo Overflow.
Generalmente no son alterados por el programador, sólo son utilizados para sus instrucciones
condicionales. Igualmente hay instrucciones para alterar estos bits pero no es una práctica tan
común.
Hay algunos de estos registros que son básicos para el funcionamiento de la CPU, como el
Registro Contador de Programa [PC], el Registro de Instrucción [IR], el Registro Buffer de
Memoria [MBR] que vincula la CPU con el Bus de Datos o el Registro de Dirección de Memoria
[MAR] que vincula la CPU con el Bus de Direcciones. Estos 4 registros son esenciales puesto
que se emplean para el movimiento de datos entre la CPU y la memoria.
40
SUBSISTEMA DE MEMORIA
Hay distintos niveles de memoria en un sistema de cómputo que establecen una jerarquía, en
donde los distintos niveles utilizan distintas tecnologías para ser construidos pues tienen
distintos tamaños, velocidad de trabajo, etc. Además, hay distintas características que
permiten definir la memoria.
Desde el comienzo de los microprocesadores se viene cumpliendo una especie de regla, que
dice que la velocidad del procesador se duplica cada 18 meses (sin variar el precio), esto
significa que, para un determinado momento tecnológico y un determinado precio, los
procesadores ejecutan una determinada cantidad de instrucciones por segundo, y lo esperable
es que para dentro de un año y medio, los procesadores ejecutan el doble de instrucciones por
un mismo precio. Y la otra regla es que por el mismo precio que pagamos una memoria de un
tamaño determinado, en cuatro años vamos a tener una memoria de un tamaño cuatro veces
mayor, mientras que la velocidad de memoria aumenta a razón de un 10% anual.
Como ya vimos anteriormente, cuando la CPU tiene que hacer un acceso a memoria, este es un
proceso más lento de lo que es trabajar dentro del CPU. A medida que aumenta la brecha entre
las velocidades del procesador y de la memoria, las distintas arquitecturas buscan tender un
puente sobre esta brecha. Una computadora típica suele tener distintos tipos de memoria,
desde una rápida y cara (en término de costo por bit) como el caso de los registros de la CPU,
hasta una barata y lenta como el caso de los discos. Esto no quiere decir que un disco sea
barato, sino que el costo por bit almacenado dentro de un disco es mucho más barato que el
costo por bit almacenado dentro de un registro.
La idea es que la interacción entre los distintos niveles de memoria sea tal que se logre un
funcionamiento equivalente a tener una computadora con una gran memoria y muy rápida,
pero sin tener que pagar el costo de esto, sino pagar un costo más reducido, distribuyendo
distintos niveles de memoria que funcionen con distintas velocidades y distinto costo por bit,
pero trabajando en forma coordinada.
Mientras más rápida es la memoria, más caro el costo por bit, y mientras más barato sea
el costo por bit, más lenta es a su vez la memoria.
41
Entre la Memoria Principal y la CPU hay otro tipo de memoria para salvar la brecha, esta es la
Memoria Caché, hay distintos tipos y niveles de Cache (nivel 1, nivel 2 e incluso nivel 3). A
medida que ascendemos tenemos mayor rendimiento y más costo por bit. Además, cuando
ascendemos, también aumenta la frecuencia de accesos a este tipo de memoria. Esto quiere
decir que en la cima de la pirámide los registros están siendo continuamente utilizados, la
Caché, es reiteradamente usada, con mucha más frecuencia que la Memoria Principal, pero no
tanto como los registros, y así siguiendo, es decir: los datos que están más cercanos a la CPU,
son los que van a ser accedidos más frecuentemente.
Duración de la información
1. Memorias volátiles: estas son memorias que precisan estar alimentadas, es decir
conectadas a la instalación eléctrica para mantener la información. Las mismas pueden
ser leídas o escritas, pero una vez que cortamos la alimentación del sistema la
información se pierde. Es el caso de la RAM.
2. Memorias NO volátiles: estas son aquellas que también pueden ser leídas o escritas,
pero no precisan de alimentación eléctrica para mantener la información, si precisan
alimentación eléctrica para poder modificarlas, verlas o escribirlas, pero una vez que
desconectamos la alimentación del sistema, la información queda ahí tal cual la
dejamos. Este es el caso de los discos.
3. Memorias permanentes: son aquellas que no pueden ser modificadas, al menos no en
forma normal.
42
Modo de acceso
Acceso por palabra: se puede acceder de a una palabra por vez, es decir acceder por
dirección y tomar una palabra. Por ejemplo, la Memoria Principal.
Acceso por bloque: tomar un bloque de información, por ejemplo, el caso de los discos o la
Caché, estos no transfieren de a un byte por vez, sino que transfieres sectores o grupos de
bytes
Velocidad: está relacionada con cuanto tiempo tarda la memoria en darnos una información o
en cuánto tiempo podemos escribirla.
Método de acceso
43
Acceso secuencial: es otro tipo de memoria en la cual hay que hacer una secuencia específica
para encontrar la información que estamos buscando, y nos obliga a dar una serie de pasos en
orden. Un ejemplo son las unidades de cinta magnética, en donde la información se va
almacenando por records, y para acceder a un record determinado tengo que pasar por todos
los anteriores. Entonces, el tiempo de acceso va a ser variable dependiendo del dato al que
quiero acceder.
Acceso directo: este acceso también es de tiempo variable. Los bloques o registros
individuales tienen una dirección única que se basa en la localización física. Este es el caso de
los discos, en los cuales nosotros sabemos en qué circunferencia (pista) sobre ese disco está la
información a la cual queremos acceder. Entonces es necesario movilizar el cabezal hasta la
pista correspondiente y luego esperar que llegue hasta el cabezal el sector que se está
buscando. Pero es directo porque directamente vamos a esa pista, no tenemos que pasar por
todas las pistas anteriores leyendo la información de cada una, simplemente nos posicionamos
en determinado lugar porque ahí está la información. Naturalmente, posicionarnos en
determinada pista, puede requerir más o menos tiempo, dependiendo a que distancia está el
cabezal de dicha pista.
Acceso asociativo: en este caso no se sabe en dónde está la información que estamos
buscando, pero conocemos parte de la información que buscamos. Esto es, conocemos el valor
de un campo de bits de la palabra que estamos buscando y lo que hacemos es recuperar toda
la palabra, entonces el hardware de este tipo de memoria se hace en comparación con todas
las palabras que componen esa memoria, comparando el campo de bits, que sería la clave de
búsqueda, hasta que se da con la palabra que se está buscando. Dicho de otro modo, se accede
conociendo parte del contenido de la palabra buscada, pero no por su dirección. La
comparación se hace en todas las palabras a la vez. Este es el caso de la memoria Caché, y el
tiempo de acceso sería invariable independientemente de la palabra que estuviéramos
leyendo (como en el caso de las memorias de acceso aleatorio, sólo que acá no accedemos por
dirección, sino por contenido).
44
RAM – Memoria de Acceso Aleatorio (Memoria Principal)
Como dijimos, que la memoria sea de acceso aleatorio significa que se puede acceder a
cualquier posición dentro de la memoria sin variar el tiempo de acceso a la misma,
independientemente de la posición de acceso que sea, y esto es por medio de una dirección.
Hay dos tecnologías básicas: una es que cada celda de memoria sea basada en Flip-Flop, esto es
lo que se usa en las memorias estáticas o SRAM; y el otro tipo la construcción de memoria está
basada en transistores, y son lo que se llamas memorias dinámicas o DRAM, en estas, en lugar
de tener un Flip-Flop, la información de si está almacenado un 1 o un 0 se da a partir de la
carga que tenga un dispositivo eléctrico que se llama capacitor, que tiene la capacidad de
almacenar o retener carga eléctrica.
El acceso a las ROM también es de tipo aleatorio (también es una RAM en el sentido de que es
una memoria de acceso aleatorio, pero le decimos RAM específicamente a la Memoria
Principal que es la memoria de lectura y escritura).
45
Pero la carga del capacitor no dura eternamente, la va perdiendo a medida que pasa el tiempo,
entonces para que este esquema funcione, es necesario que cada tanto el capacitor sea
refrescado, es decir volverlo a cargar a tope, si es que estaba cargado. Entonces
frecuentemente hay que hacer un proceso de lectura de ese capacitor, conectado a través de la
línea de selección del transistor y desde la línea de bit censando si ese capacitor tiene un nivel
de carga eléctrica mayor que un determinado nivel, si esto se cumple significa que el capacitor
guardaba un 1, entonces se le repone la carga completa.
Entonces en las memorias dinámicas, además de las celdas elementales, vamos a necesitar
circuitos que realicen esta operación de refresco de cada celda varias veces por segundo.
Haciendo una comparación entre las memorias dinámicas y estáticas, las memorias dinámicas
almacenan más información en la misma superficie de circuito integrado que las estáticas,
pues las celdas elementales de las memorias dinámicas (construidas a base de capacitores) son
más chicas que las celdas elementales de la memoria estática (construidas a base de Flip-Flop).
Pero la desventaja de las memorias dinámicas es que hay que refrescarlas porque los
capacitores se van descargando, mientras que a las estáticas no, entonces son memorias más
lentas que las estáticas justamente por las cuestiones constructivas, las memorias estáticas
están conmutando el estado biestable que es el Flip-Flop, mientras que las memorias
dinámicas hay que ir chequeando y reponiendo la carga de un capacitor, inclusive el proceso
de lectura es destructivo porque al acceder a un capacitor para ver si está cargado, al
chequear esto un poco lo descargo. En conclusión, la memoria dinámica, al mismo costo de
hacer un circuito integrado se pueden colocar más celdas dinámicas en un circuito integrado
que en uno estático, por eso el costo por bit en la memoria dinámica es más bajo que en la
memoria estática. Pero, por otro lado, las memorias estáticas son más rápidas. Entonces las
memorias dinámicas son usadas principalmente en la memoria principal, mientras que las
memorias estáticas, que son más rápidas, son usadas en la memoria Caché.
El elemento básico de una memoria semiconductora es la celda de memoria. Todas las celdas
de memoria de semiconductor comparten tres propiedades:
Todas tienen dos estados estables para representar al 0 y al 1. Haciendo una breve
referencia a la Memoria Dinámica, es estable entre comillas porque el capacitor se va
descargando, pero dado a que el circuito de refresco está permanentemente
trabajando, decimos que es estable.
46
Normalmente una celda tiene una línea de selección (que selecciona la celda de memoria), una
de control (que indica lo que voy a hacer con esa celda, si lectura o escritura) y una de
escritura/lectura de datos.
Luego a la izquierda tenemos la línea de selección, qué si vale 0, ambas compuertas AND están
entregando 0, la compuerta que va hasta el reloj del Flip-Flop nos va a indicar que ese
Flip-Flop está inactivo, porque no recibe señal, por lo tanto, lo que tenga en la entrada D no
importa. Por otro lado, mientras la otra compuerta AND este entregando un 0, el buffer de 3
estados que maneja la salida de la información va a estar en estado abierto, desconectado del
resto del sistema. Ahora si la línea de selección está en 1, en principio ambas compuertas están
habilitadas, pero hay que ver qué pasa con la otra línea. La otra línea es la de lectura/escritura,
qué si está en el estado de escritura, es decir la línea vale 1, la AND que está habilitada va a ser
la de arriba, que está conectada con la línea de reloj, entonces la señal del reloj va a estar en 1
y el Flip-Flop va a almacenar el dato que entra por la línea D. Cuando, por el contrario, la señal
de lectura/escritura está en 0, es decir en estado de lectura, la compuerta AND de arriba que
conecta al reloj está inhabilitada y la compuerta AND de abajo está habilitada. Esta habilita al
buffer para dejar pasar información de la línea Q hasta la línea de salida de la celda.
47
Organización del CHIP
Organización 2D: el arreglo está organizado en 2W palabras de B bits cada una. Cada línea
horizontal (una de 2W) se conecta a cada posición de memoria, seleccionando un renglón. Las
líneas verticales conectan cada bit a la salida. El decodificador que está en el chip tiene 2W
salidas para W entradas (bit del bus de direcciones).
48
Organización 2½D: el arreglo es cuadrado y
funciona parecido que el arreglo 2D. La principal
diferencia con el arreglo 2D es que los bits de una
misma palabra están dispersos en distintos chips, y
cada chip aporta un bit de cada palabra; además la
dirección se divide en dos partes: una parte es para
la selección de un re nglón y la otra parte para la
selección de una columna. Además, en este tipo de
organización vamos a tener dos decodificadores
En conclusión, en el 2D todos los bits de una palabra están en el mismo chip, y en el 2½D los
bits de una misma palabra estarán en distintos chips. Ahora el arreglo de 2D, si tengo un
número grande de palabras con pocos bits, va a ser muy largo y estrecho. Cada línea de
selección de palabra tiene que tener un manejador y conectarse a un decodificador, entonces
ocupan mucha superficie, y trae un montón de problemas de índole técnica y constructiva
(por ejemplo, no va a ser lo mismo censar si un capacitor que está cerca está cargado, a uno
que está un millón de líneas de distancia). Ahora en un arreglo cuadrado necesitamos menos
bits para decodificar líneas y columnas, entonces van a ser dos decodificadores mucho más
chicos, está todo mejor distribuido. Esto significa que el arreglo 2½D, al usar decodificación
separada de filas y columnas, reduce la complejidad de los decodificadores.
Además, respecto a la detección de errores, el arreglo 2D dificulta el uso eficaz de los circuitos
correctores de error. En 2½D, al estar los bits dispersos en distintos chips, hay menos
probabilidad de error, puesto que a lo sumo falla uno de los chips que aportan un bit a esta
palabra.
49
Construcción en paralelo y en serie
Supongamos que queremos construir una determinada memoria a partir de módulos de chips
que son más chicos que la cantidad de memoria que queremos construir: tengo módulos que
tienen menos palabras que la cantidad de palabras que quiero en la memoria o tengo módulos
cuyo ancho de palabra es más chico que el ancho de palabra que yo quisiera en la memoria.
¿Cómo se pueden conectar estos módulos más chicos para construir esa memoria resultante
más grande?
En este caso, el ancho de cada módulo es más chico que la palabra que buscamos, entonces la
solución es utilizar varios módulos en paralelo, entonces cada módulo aporta una cierta
cantidad de bits de cada palabra. En el ejemplo, cada módulo me aporta 4 palabras de 4 bits,
entonces si yo quiero 4 palabras de 8 bits, conecto dos módulos en paralelo y cada módulo me
aportará 4 bits por palabra. En este caso, las líneas de lectura/escritura, las líneas de selección
y las líneas de direcciones son comunes a ambos módulos, pues si quiero por ejemplo acceder
a la primera palabra de 8 bits, debo acceder a la primera palabra de 4 bits que me aporta cada
módulo cada módulo, ambas son direccionadas con la misma línea de direcciones,
seleccionadas con la misma línea de selección, y voy a realizar la misma operación en ambas
(sea lectura o escritura)
50
Segundo caso: ahora la longitud de la palabra es la
deseada, pero los módulos no tienen la capacidad
deseada (tengo menos palabras de las que quiero,
pero de la longitud correcta). En este caso, cubro un
cierto rango de direcciones con módulos de memoria
en SERIE. En este caso, a cada módulo se lo va a ver
en direcciones distintas.
En el ejemplo, ahora queremos 8 palabras de 4 bits, pero nuestro módulo de memoria aporta 4
palabras de 4 bits, entonces la longitud de la palabra es correcta, pero tengo 4 palabras en
lugar de 8. Acá vamos a necesitar una tercera línea de dirección, pues debemos direccionar 8
palabras (estas son 23 direcciones). Entonces las líneas
bajas de direcciones (A0 y A1) se comparten entre los dos módulos, y la línea alta (A2) nos
permite seleccionar entre un módulo y el otro. La línea de lectura/escritura es compartida,
porque si bien llega a ambos módulos, sólo uno de ellos va a poder recibir la señal de dicha
línea, según si está o no seleccionado por la línea de dirección A2.
Como vimos, la memoria dinámica de RAM básica, cuenta con celdas elementales de bits
organizadas en arreglos 2½D y se accede a las celdas de bits para leerlas o escribirlas. Para
mejorar la performance, empezaron a hacerse agregados a estas memorias dinámicas básicas.
Surgió la memoria DRAM Enhanced que contiene una pequeña memoria estática dentro del
chip de memoria que guarda la última línea leída (es decir, el último conjunto de bits leído).
¿Cuál es la finalidad de esto? Si en el futuro cercano, queremos acceder a un bit que está
contiguo con ese podemos hacerlo sin tener que acceder al arreglo cuadrado.
Luego surgió la Caché DRAM que incluye una memoria SRAM más grande en la cual se pueden
almacenar varias líneas, entonces permite anticipar el acceso de los futuros accesos, esto
funciona puesto a que la CPU es bastante probable que haga accesos secuenciales.
51
La última es la Synchronous DRAM (SDRAM) o memoria dinámica sincrónica, que es la que se
utiliza mayormente en las computadoras. Acá estaría sincronizada la entrega de datos con un
reloj externo y el funcionamiento es que se presenta una dirección a la RAM, la CPU se libera
(no se queda esperando el dato) y unos ciclos de reloj después va a buscar ese dato. Tiene un
modo de trabajo que se llama Burst que le permite a la SDRAM enviar datos en forma de
bloques.
Memoria caché
La memoria principal y la CPU tienen una gran brecha de velocidad debido a enfoques de
diseño diferentes: las CPUs optimizan velocidad y complejidad, mientras que las memorias
incrementan su capacidad. Aunque es tecnológicamente posible igualar las velocidades, sería
costoso. Por esto, se implementan jerarquías de memoria, combinando memorias pequeñas y
rápidas (Cache) con memorias grandes y lentas.
1. Localidad Espacial:
○ Es probable que las posiciones adyacentes a una palabra accedida sean leídas
pronto (e.g., secuencia de instrucciones, variables cercanas, estructuras de
datos).
2. Localidad Temporal:
○ Es probable que una palabra accedida recientemente sea utilizada de nuevo
pronto (e.g., bucles, subrutinas, uso de pilas).
Funcionamiento de la Caché
52
Tipos de Mapeo
1. Mapeo Asociativo:
○ Un bloque de memoria principal puede ubicarse en cualquier bloque de la
Caché.
○ Verificación mediante etiquetas asociadas a bloques.
2. Mapeo Directo:
○ Cada bloque de memoria principal tiene un único bloque asignado en la Caché
(modularidad).
○ Es más simple, pero puede generar conflictos frecuentes.
3. Mapeo Asociativo por Grupo:
○ Mezcla los dos anteriores; divide la Cache en grupos donde se mapean los
bloques.
● Es común tener más de un nivel de Caché (e.g., L1, L2) para mejorar la tasa de aciertos y
reducir el impacto de fallos.
53