0% encontró este documento útil (0 votos)
34 vistas54 páginas

Resumen Final OC

El documento describe la organización y funcionamiento de las computadoras, destacando su naturaleza digital, sincrónica y programable. Se detalla la arquitectura de Von Neumann, que incluye componentes como la CPU, memoria y buses de comunicación, así como el ciclo de instrucción y la representación numérica de datos. Además, se abordan aspectos de entrada/salida y periféricos, enfatizando la importancia de la interacción entre los diferentes elementos del sistema informático.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
34 vistas54 páginas

Resumen Final OC

El documento describe la organización y funcionamiento de las computadoras, destacando su naturaleza digital, sincrónica y programable. Se detalla la arquitectura de Von Neumann, que incluye componentes como la CPU, memoria y buses de comunicación, así como el ciclo de instrucción y la representación numérica de datos. Además, se abordan aspectos de entrada/salida y periféricos, enfatizando la importancia de la interacción entre los diferentes elementos del sistema informático.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Resumen final Organización de

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

1. Digital: Procesa información de forma discreta, representada en valores binarios (0 y


1).

2. Sincrónica: Coordina sus operaciones mediante un reloj central.

3. Capacidad de cálculo: Dispone de una Unidad Aritmético-Lógica (ALU) para realizar


operaciones numéricas y lógicas.

4. Controlada por programa: Ejecuta instrucciones almacenadas, que puede obtener,


interpretar y ejecutar.

5. Comunicación: Interactúa con el entorno para recibir y emitir datos.

Componentes y funcionamiento básico

La arquitectura de la mayoría de las computadoras sigue el modelo de John Von Neumann, el


cual incluye:

● Unidad de cálculo (ALU): Procesa datos.

● Memoria: Almacena datos e


instrucciones.

● Unidades de entrada y salida (E/S):


Permiten la interacción con el mundo
exterior.

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

1. Memoria de instrucciones: Contiene las órdenes que la computadora debe interpretar y


ejecutar.

2. Memoria de datos: Almacena la información necesaria para cálculos, decisiones y


actualizaciones.

Buses de comunicación

Los buses son líneas de comunicación que permiten la transferencia de información entre
componentes:

1. Bus de control: Coordina operaciones, sincroniza dispositivos y autoriza el uso de otros


buses.

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.

3. Bus de direcciones: Identifica la dirección de memoria con la que se desea comunicar.

Unidad Central de Procesamiento (CPU)

● Unidad de control (UC): Decodifica instrucciones y organiza su ejecución.

● Unidad Aritmético-Lógica (ALU): Realiza cálculos y operaciones lógicas.

● Registros: Memoria interna rápida para datos e instrucciones en uso.

Registros clave

1. Contador de programa: Guarda la dirección de la próxima instrucción y se incrementa


automáticamente tras cada lectura.

2. Registro de instrucción: Almacena la instrucción leída para que la UC decida la acción a


realizar.

3. Registro de direccionamiento: Contiene la dirección de memoria para buscar datos,


evitando interferir con el contador del programa.

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).

Virtualmente todos los diseños de computadoras contemporáneas están basados en los


conceptos desarrollados por John Von Neumann. Tal diseño es conocido como la Arquitectura
Von Neumann, y se basa en tres conceptos claves:

▪ Los datos e instrucciones están almacenados en una única memoria de lectura-escritura


constituida por celdas de igual tamaño.

▪ Los contenidos de las celdas de la memoria son identificables por posición, sin importar
el tipo de los datos guardados en ese lugar.

▪ La ejecución ocurre de manera secuencial (a menos que se modifique explícitamente)


de una instrucción a la siguiente.

El modelo de Von Newmann consta de 5 elementos principales:

● Unidad de Entrada: provee las instrucciones y


los datos.

● Unidad de Memoria: en donde se almacenan los


datos e instrucciones.

● Unidad Aritmético-Lógica: es la que procesa los


datos.

● Unidad de Control: es la que dirige la operación.

● Unidad de Salida: donde se envían los


resultados.

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.

2. Velocidad: Depende del reloj interno, medido en Hertz, y de la arquitectura del


procesador, que organiza los componentes en el chip.

Componentes principales

1. Unidad Aritmética y Lógica (ALU): Procesa cálculos y operaciones lógicas.

2. Unidad de Control (UC): Coordina las operaciones de la ALU y gestiona el flujo de datos.

3. Memoria interna (Registros): Pequeña memoria de alta velocidad que almacena


temporalmente datos e instrucciones.

○ Bus interno: Facilita la transferencia de datos entre registros y la ALU.

Tipos de registros

1. Registros visibles al usuario: Permiten optimizar la programación en lenguaje de


máquina, minimizando el acceso a la memoria principal.

2. Registros de control y estado:

○ Contador de Programa: Guarda la dirección de la próxima instrucción a ejecutar.

○ Registro de Instrucción: Contiene la instrucción más reciente leída desde la


memoria principal.

4
LA MEMORIA
Limitaciones de la CPU

● Solo puede manejar una instrucción y unos pocos datos a la vez.

● El resto del programa y los datos se almacenan en memoria hasta que la CPU esté lista
para usarlos.

Conexión con otros componentes

La CPU se comunica con los demás componentes del sistema mediante tres tipos de buses:

1. Bus de direcciones: Identifica las celdas de memoria mediante direcciones únicas.

2. Bus de datos: Transporta los datos que se están procesando.

3. Bus de control: Coordina y controla el intercambio de información, indicando


operaciones de lectura o escritura.

Tiempo de acceso y tamaño del bus de direcciones

● Tiempo de acceso: El tiempo que tarda un elemento de memoria en completar una


operación de lectura o escritura.

● Tamaño del bus de direcciones: Determina la cantidad de posiciones de memoria que se


pueden identificar. Se calcula según la fórmula:

𝑛
𝑛≤ 2

Donde n es el número de posiciones de memoria y nnn es el número de bits del bus de


direcciones.

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?

N = 250 ≤ 2n si n = 8, 28 = 256 y se cumple la desigualdad. Respuesta: 8 bits.

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?

Dirección más pequeña = 00000000 | Dirección más grande = 11111111

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.

BUSES Y ENTRADA / SALIDA

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).

La corrida de un programa consiste en la repetición de los pasos de búsqueda y ejecución. La


‘búsqueda’ de instrucción es una operación común para cada instrucción, y consiste en leer
información de, al menos, una posición de memoria. La ‘ejecución’ puede involucrar varias
operaciones y depende de la naturaleza de la instrucció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.

La instrucción buscada es cargada en un registro de la CPU conocido como Registro de


Instrucción. La instrucción está en la forma de un código binario que especifica qué acción
debe tomar la CPU; ésta interpreta la instrucción y realiza la acción requerida. En general,
estas acciones caen en 4 categorías:

▪ 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.

▪ Procesamiento de datos: la CPU puede realizar alguna operación aritmética o lógica


sobre los datos.

▪ 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

Los datos e informaciones que se manejan internamente en un sistema informático se pueden


representar, según sus características, en:

CÓDIGOS ALFANUMÉRICOS (ASCII): en general cada carácter se maneja internamente en una


computadora por medio de un conjunto de 8 bits (1 byte) mediante un sistema de codificación
binario que denominaremos código de caracteres.

REPRESENTACIONES NUMÉRICAS: un sistema de numeración se caracteriza


fundamentalmente por su base, que es el número de símbolos distintos que utiliza, y un
coeficiente que determina cuál es el valor de cada símbolo dependiendo de la posición que
ocupe.

Teorema Fundamental de la Numeración

Se trata de un teorema que relaciona una cantidad expresada en cualquier sistema de


numeración posicional con la misma cantidad expresada en el sistema decimal. El Teorema
Fundamental de la Numeración dice que el valor decimal de una cantidad expresada en otro
sistema de numeración, está dado por la fórmula:

SISTEMA DECIMAL: sistema posicional que utiliza 10 símbolos (del 0 al 9).

SISTEMA BINARIO: es el sistema de numeración que utiliza internamente el hardware de las


computadoras actuales. La base o número de símbolos que utiliza el sistema binario es 2
(siendo los símbolos 0 y 1).

SISTEMA HEXADECIMAL: es un sistema posicional pero que utiliza dieciséis símbolos (0 al 9 y


de A al F)

Rango de representación

Se denomina rango de representación en un sistema determinado, al conjunto de números


representables con el mismo. Un sistema de base b y números de n dígitos tiene un rango igual
a bn.

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

BSS – Binario sin signo

Con n bits represento 2n números.

Rango de representación: 0 ≤ x ≤ 2n-1

Números negativos o fraccionarios no pueden ser representados en este sistema. Ejemplo BSS
restringido a 3 bits

Represento 23=8 números / Rango de representación: 0 ≤ x ≤ 7 0=000 | 1=001 | 2=010 | 3=011 |


4=100 | 5=101 | 6=110 | 7=111

BCS – Binario con signo

Con n bits represento 2n números.

Rango de representación: -(2n-1-1) ≤ x ≤ 2n-1-1

Tengo dos ceros: 00...0 / 11...1

Números positivos igual que el BSS, números negativos empiezan con 1. Ejemplo BCS
restringido a 3 bits

Representó 23=8 números / Rango de representación: -3 ≤ x ≤ 3

-3=111 | -2=110 | -1=101 | 0=000 y 111 | 1=001 | 2=010 | 3=011

TÉCNICA DE COMPLEMENTOS: el complemento a un número N de un número A (A<N) es igual


a la cantidad que le falta a A para ser N. Complemento a N de A = N – A

El complemento a un número N de (N – A) es A. Complemento a N de (N – A) = N – (N – A) = A

Ca1 – Complemento a 1 (Complemento a la base reducida)

Complemento a la base denominada N=bn-1

Con n bits represento 2n números.

Rango de representación: -(2n-1-1) ≤ x ≤ 2n-1-1

Tengo dos ceros: 00...0 / 11…1

Números positivos igual que el BSS, números negativos calculo el número positivo y luego
cambio los 0 por 1 y viceversa.

Ejemplo Ca1 restringido a 3 bits

11
Representó 23=8 números / Rango de representación: -3 ≤ x ≤ 3

-3=100 | -2=101 | -1=110 | 0=000 y 111 | 1=001 | 2=010 | 3=011

OTRA FORMA: pasar negativo de decimal a binario: -(2n-1-1)+|num| el resultado lo paso a


binario. Por ejemplo, en 8 bits: -56 = -(28-1-1) + 56 = -27 + 56 = -71 = 11000111.

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

Ca2 – Complemento a 2 (Complemento a la base)

Complemento a la base denominada N=bn

Con n bits represento 2n números.

Rango de representación ASIMÉTRICO: -(2n-1) ≤ x ≤ 2n-1-1

Tengo un cero: 00…0

Números positivos igual que el BSS, números negativos calculo el Ca1y sumo 1. Ejemplo Ca2
restringido a 3 bits

Represento 23=8 números / Rango de representación: -4 ≤ x ≤ 3

-4=100 (100 011+1 100) | -3=101 (011 100+1 101) | -2=110 (010 101+1 110) |

-1=111 (001 110+1 111) | 0=000 | 1=001 | 2=010 | 3=011

OTRA FORMA: pasar negativo de decimal a binario: -(2n-1)+|num| el resultado lo paso a


binario. Por ejemplo, en 8 bits: -56 = -(28-1) + 56 = -28 + 56 = -72 = 11000110. puedo pasar de
binario a negativo: el primer digito es ahora -(2n-1) y el resto de los dígitos con pesos positivos.
Por ejemplo, en 3 bits: 101 = -(23-1) + 20 = -4+1 = -3

TÉCNICA DE EXCESO: la representación de un número A es la que corresponde a la SUMA del


mismo y un valor constante E. Exceso E de A = A + E

Dado un valor A, para obtener el número representado tengo que RESTAR el valor del exceso.
A = Exceso E de A - E

Ex2 – Exceso en base 2

El número a representar viene dado por su valor más el valor del exceso (n bits, E=2n-1).

Con n bits represento 2n números.

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

Represento 23=8 números / Rango de representación: -4 ≤ x ≤ 3 / Exceso 23-1 = 4

-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) |

3=111 (3+4=7 111)

NÚMEROS EN PUNTO FIJO

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.

RANGO Y RESOLUCIÓN EN PUNTO FIJO

El RANGO es la diferencia entre el número mayor y el menor [n° menor; n° mayor]

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

Al convertir un número decimal a binario tenemos dos casos:

Sin restricción: en la cantidad de bits a usar, la representación no tendrá errores.

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

PASAR DECIMAL FRACCIONARIO A BINARIO

Cuando se trata de pasar a binario un número fraccionario SE MULTIPLICA POR 2. Serán


sucesivas multiplicaciones que se acotarán según la cantidad de bits con los que contemos
para la representación. Las partes enteras de esas multiplicaciones parciales formarán al
finalizar el número binario resultante. Las partes fraccionarias parciales son las que se irán
multiplicando por 2 sucesivamente. Por ejemplo, para 0,2:

0,2 * 2 = 0,4 me quedo con el entero 0 del resultado

0,4 * 2 = 0,8 me quedo con el entero 0 del resultado

0,8 * 2 = 1,6 me quedo con el entero 1 del resultado

0,6 * 2 = 1,2 me quedo con el entero 1 del resultado

0,2 * 2 = 0,4 …. Comienzan a repetirse los 4 cálculos anteriores

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)

SISTEMA BCH (Sistema Hexadecimal codificado en Binario)


Los dígitos decimales se convierten uno a uno en binario. Para representar un dígito hexadecimal
se usarán siempre 4 bits, asociando 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 | A=1010 | B=1011 | C=1100 | D=1101 | E=1110 | F=1111

15
CAMBIO DE BASES

BASE2 BASE10 BASE16


BASE2 Teorema Fundamental de la formo grupos de 4 bits desde la
Numeración derecha y asigno hexa.
𝑵𝟏𝟎 = ∑𝒎 𝒅𝒊𝟐𝒊 11 11102 = 3E16
𝒊=𝒏

BASE10 Divido x10 por 2 Divido x10 por 16


5 | 2 510 = 1012 20 | 16 2010 = 1416
1 2|2 4 1
0 1
BASE16 TABLA: reemplazo cada dígito Teorema Fundamental de la
hexadecimal Numeración
por su binario. 𝑵𝟏𝟎 = ∑𝒎 𝒅𝒊𝟏𝟔𝒊
𝒊=𝒏
4A16 = 0100 10102

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

​Si hay OVERFLOW [O] Ca2 es incorrecto


​Si hay CARRY o BORROW [C] BSS es incorrecto

SISTEMA EN PUNTO FLOTANTE

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

​ El rango en Punto Flotante es mayor.

​ La cantidad de combinaciones binarias es la misma en ambos sistemas.

​ En Punto Flotante, la resolución no es constante a lo largo del intervalo.

MANTISA SIN NORMALIZAR, NORMALIZADA, O NORMALIZADA BIT IMPLÍCITO

​ Número SIN NORMALIZAR: podemos tener distintas representaciones para un


mismo número, por ejemplo: 2-1x 20 = 20x 2-1 = 22x 2-3 … etc.

​ NORMALIZACIÓN: nos sirve para tener un único par de valores de mantisa y


exponente para un número [SIN 0]. EN EL SISTEMA FRACCIONARIO NORMALIZADO
TODAS LAS MANTISAS EMPIEZAN CON 0,1.

​ NORMALIZACIÓN BIT IMPLÍCITO: en este caso, no almaceno el uno más significativo


de la mantisa, este es el bit implícito [SIN 0].

MANTISA ENTERA O FRACCIONARIA

La mantisa puede ser entera o fraccionaria, y esto me lo especifican en el enunciado. Por


ejemplo, si me dan el número 0011 010 con 4 bits de mantisa fraccionaria BSS y 3 de
exponente BCS, la mantisa [M] será 0,011 = 2-2+2-3 y el exponente [E] será 010 = 2, entonces
reemplazamos Mx2E = (2-2+2-3) x 22 = 20+2-1 = 1,5

RANGO Y RESOLUCIÓN EN SISTEMA 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.

La RESOLUCIÓN es la diferencia entre dos representaciones sucesivas, y a diferencia del


Sistema en Punto Fijo, en el caso del Sistema Punto Flotante varía a lo largo del rango.
Podemos tener 4 resoluciones distintas:

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)

SUMAS EN SISTEMA PUNTO FLOTANTE Y CORRIMIENTO DEL 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

APROXIMACIÓN, ERROR ABSOLUTO, RELATIVO Y MÁXIMO

​ El error absoluto es la diferencia entre el valor representado y el valor que quiero


representar EA = |X-NaRepr|.

​ El error absoluto máximo cumple EAmax ≤ res/2.

​ El error relativo se calcula haciendo ER = EA/NaRepr

ESTÁNDAR IEEE 754 SIMPLE Y DOBLE PRECISIÓN

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.

Simple Precisión: el estándar IEEE-754 para la representación en simple precisión de números


en coma flotante exige una cadena de 32 bits. El primer bit es el bit de signo (S), los siguientes
8 son los bits del exponente (E) y los restantes 23 son la mantisa (M). La mantisa es
fraccionaria normalizada, con la coma después del primer bit que es siempre uno (1,) en M y
S; y el exponente se representa en exceso.

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).

SIMPLE PRECISIÓN DOBLE PRECISIÓN


S = 1 EXPONENTE = 8 MANTISA = 23 S = 1 EXPONENTE = 11 MANTISA = 52

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

EXPONENTE MANTISA SIGNO VALOR

0 < E < 255 [2047] Cualquiera 0|1 ± 2E-127[1023] x 1.M

255 [2047] No nulo 0|1 NaN (not a number)


255 [2047] 0 0|1 ±∞
0 No nulo 0|1 ± 2-126[-1022] x 0.M (sin normalizar)
0 0 0|1 ±0

[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

Identidad 1.A=A 0+A=A


Nula 0.A=0 1+A=1
Idempotencia A.A=A A+A=A
Inversa A . A̅ = 0 A + A̅ = 1
Conmutativa A.B=B.A A+B=B+A
Asociativa (A . B). C = A . (B . C) (A + B) + C = A + (B + C)
Distributiva A + (B . C) = (A + B) . (A + C) A . (B + C) = (A . B) + (A . C)
Absorción A . (A + B) = A A + (A . B) = A
De Morgan A̅.̅ ̅B̅ = A̅ + B̅ ̅ ̅ = A̅ . B̅
̅A̅+̅B

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

Las compuertas no se fabrican ni se venden individualmente, sino en unidades llamadas


circuitos integrados, también conocidos como IC o chips. Un IC es un trozo cuadrado de silicio
de unos 5mm en el que se han depositado algunas compuertas. Estos suelen montarse en
paquetes de plástico o cerámica rectangulares, cuyos lados largos cuentan con dos filas
paralelas de terminales conectadas a la entrada o salida de alguna compuerta del chip, a la
alimentación eléctrica o a tierra.

Circuitos combinacionales o combinatorios

Un circuito combinacional es un conjunto de puertas lógicas interconectadas, cuya salida, en


un momento dado, es función solamente de los valores de las entradas en ese instante. La
aparición de un valor en las entradas viene seguido casi inmediatamente por la aparición de
un valor en la salida, con un retardo propio de la puerta.

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 implementan las funciones esenciales de una computadora


digital. Sin embargo, ellos no proporcionan memoria, que es un elemento también esencial
para el funcionamiento. Para estos fines, se utilizan circuitos lógicos digitales más complejos
denominados circuitos secuenciales.

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:

Circuito con 2n entradas de datos, 1 salida de datos y n entradas de


control que seleccionan una de las entradas de datos. Estos pueden
usarse para seleccionar una de varias entradas o para implementar
una tabla de verdad. También como convertidor de datos paralelos a
seriales.

​Decodificadores:

Estos son circuitos que aceptan un número de n bits como entrada y


lo utilizan para seleccionar (poner en 1) una y sólo una de las dos
líneas de salida. Por ejemplo, imagínate una memoria que consiste
en 8 chips; un decodificador 3 a 8, tiene 3 entradas A, B, C para
seleccionar uno de los 8 chips, puesto que, gracias a la combinación,
sólo una línea de salida se pone en uno, sólo se podrá habilitar un
chip a la vez

21
​Comparadores:

Estos comparan dos palabras de entrada. En el ejemplo, el comparador


acepta dos entradas cada una de 4 bits y produce 1 si son iguales y 0 si
no.

Circuitos secuenciales

Los circuitos lógicos secuenciales se asocian al estudio de dispositivos de almacenamiento en


general, en donde una de sus características principales es que sus salidas dependen de las
entradas actuales, de entradas en tiempos anteriores y de una señal externa de reloj.

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.

Conceptos Generales de Latches y flip-flops:

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:

​ ASINCRÓNICOS: cuando en la entrada se establece una combinación, las salidas


cambiaran.

​ SINCRÓNICOS: la presencia de una entrada especial determina cuando cambian las


salidas, acorde a las entradas

Las salidas del circuito, además de ser función de las


entradas son función de la información almacenada en
elementos de memoria del circuito, en el momento que se
producen las entradas. Están formados por un circuito
combinacional y un bloque de elementos de memoria:

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:

Es un circuito biestable conformado por un detector de


transición de impulsos que está encargado de detectar cuándo
se tiene un flanco de subida o de bajada del reloj (CLK), dos
compuertas AND y dos compuertas NOR. En estas compuertas
NOR, una de las salidas está conectada a la entrada de la otra
compuerta, logrando una retroalimentación.

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:

El biestable SR presenta problemas cuando se activan


simultáneamente las dos entradas S y R. Podemos diseñan un
biestable similar que no presente estos problemas a partir de un
biestable D. Este es el Flip-Flop JK. En este caso, para lograr un
valor estable cuando se activan ambas entradas, se hace una
retroalimentación de Q y Q̅ con las compuertas de la entrad

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

Se forman a partir de biestables de tipo D conectados en cascada. Un registro con N biestables


es capaz de guardar N bits. Estos son circuitos sincrónicos y todos los biestables están
gobernados por la misma señal del reloj. Estos pueden ser de almacenamiento o de
desplazamiento.

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:

CPU-Memoria: los datos pueden


transferirse entre memoria y CPU.

CPU-E/S: los datos pueden transferirse


entre el CPU y E/S.

Procesamiento de datos: el CPU efectúa


operaciones aritméticas o lógicas en los
datos.

Control: se altera la secuencia de


ejecución de instrucciones (saltos).

Esquematización de búsqueda y ejecución


en un ciclo de instrucción

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.

1. El primer paso en el ciclo de instrucción es la búsqueda de la instrucción. El contenido del PC


se utiliza para direccionar la memoria y así poder hacer la lectura del código de la
instrucción. La dirección viaja por el Bus de Direcciones desde la PC hasta la MI. Luego, a
través del Bus de Datos va la información de la instrucción que vamos a ejecutar desde la
CPU al IR.

2. El segundo paso es la decodificación de la instrucción, la información del código de operación


que está copiado en el IR, es decodificada por la UC para así saber lo que tiene que hacer a
continuación. [ESTOS DOS PASOS SON COMUNES A TODAS LAS INSTRUCCIONES].

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

Este diagrama muestra los distintos estados por


los que pasa la CPU durante la ejecución de un
ciclo de instrucción. No todos los ciclos de
instrucción involucran todos los estados, algunos
estados pueden no darse y otros pueden llegar a
repetirse.

Cada uno de estos círculos representan un estado


dentro de un ciclo de instrucción, y las flechas
nos marcan el flujo de los estados. Los estados
por encima de la raya horizontal (2, 5 y 8) son
estados que involucran manejo de los buses, es decir acceso de la CPU a la memoria o a E/S
para leer o escribir información; y los estados que están por debajo de la raya horizontal (1, 3,
4, 6, 7) son operaciones internas de la CPU, es decir que no involucran el uso de los buses (sólo
los buses internos de la CPU).

ESTADO 1: cálculo de la dirección de la instrucción. Esto involucra utilizar el PC,


incrementarlo para que apunte a la próxima instrucción a ejecutar y así poder acceder a ella.
Una vez que tenemos la dirección de la instrucción pasamos al siguiente estado.

ESTADO 2: búsqueda de la instrucción. Se hace un acceso al Bus de Direcciones con la


dirección de la instrucción que se generó en el E1, se hace el acceso a la memoria para ir a
buscar la instrucción. Esta instrucción se va a colocar en el IR (es decir la instrucción viaja de
la memoria a la CPU y se guarda en el IR, mediante el Bus de Datos).

ESTADO 3: decodificación de la instrucción. Se analiza la instrucción para determinar qué tipo


de operación hay que hacer, que operandos y cuántos operandos se van a utilizar. Esto
dependerá de que instrucción se trate. [ESTOS TRES ESTADOS SON COMUNES A TODAS LAS
INSTRUCCIONES].

ESTADO 4: cálculo de la dirección del operando. Si la instrucción implica la referencia de un


operando en la memoria de E/S es acá donde se determina la dirección. Puede ser que la
instrucción nos indique directamente donde está el operando, o puede que tengamos que
realizar una cuenta antes para saber en dónde se encuentra dicho operando. Este estado está
asociado con los Modos de Direccionamiento. Además, si no necesitamos operando esta parte
no sería necesaria.

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.

ESTADO 8: almacenamiento del resultado. Se hace la operación de almacenar la información.


En este estado vuelve a ser necesario el uso de los buses, pues debo enviar el resultado ya sea
en Memoria o en E/S.

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.

Los elementos de una instrucción de máquina son:

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.

La mayoría de las operaciones aritméticas o lógicas involucran dos operandos, entonces


vamos a tener que poder especificar en la instrucción donde está el operando 1 y el operando
2 (si existiese). La referencia del operando resultado, nos indica donde colocar el resultado. La
referencia a la próxima instrucción, para saber dónde está la próxima instrucción. Lo natural
es tener un Contador de Programa [PC] que nos indique la dirección de la próxima instrucción
a ejecutar, puesto es que lo normal es que una instrucción esté a continuación de la otra en
posiciones consecutivas de memoria (en modo secuencial). Pero esto no siempre es así, puesto
que por ejemplo en el caso de haber instrucciones de control condicionales esto no se
cumpla.Los operando fuente y resultado pueden estar en tres lugares: pueden estar en
Memoria, en una Registro de la CPU, o dentro de los circuitos de E/S.

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

Podemos categorizar las instrucciones de máquina en:

Procesamiento de datos: instrucciones relacionadas con operaciones aritméticas y


lógicas.

Almacenamiento de datos: instrucciones relacionadas con transferencias dentro del


sistema, entre la memoria y el CPU.

Instrucciones de E/S: en algunos casos, la arquitectura requiere una salida específica


para la transferencia de datos entre la computadora y los mecanismos externos.

Instrucciones de control: manejan el flujo del programa, por ejemplo, instrucciones


de salto o ramificación. También hay instrucciones de control que modifican registros
especiales que afectan el comportamiento de la CPU, y esas instrucciones también
entran dentro de esta categoría.

¿Qué número de direcciones necesito en una instrucción de máquina? En principio las


direcciones que se necesitan son cuatro: dos direcciones para hacer referencia a los operandos
fuente, una que hace referencia al operando resultado y la dirección de la próxima instrucción
(y además necesitamos bits para indicar el Código de Operación, pero esto no es una
dirección).

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

Ya sabemos que las instrucciones en un programa se ordenan en


forma de secuencia entonces si sabemos que las mismas se
encuentran en posiciones contiguas de memoria bastaría contar
con un registro en el CPU llamado Contador de Programa, que
vaya haciendo el encadenamiento de instrucción a instrucción,
entonces de este modo cada vez que leemos una instrucción
incrementamos el PC y de este modo siempre estará apuntando a
la próxima instrucción. Entonces la dirección de la próxima
instrucción estará implícita en el PC, y ahora necesitaría sólo 3 direcciones por cada
instrucción de máquina. Esta es una máquina de 3 direcciones. Ahora se acorta la cantidad de
bits que tengo por instrucción dedicado a direcciones.

Cód. Operación Dir. Resultado Dir. Op1 Dir. Op2

Luego tenemos las máquinas de 2 direcciones, ¿Cómo podemos


reducir el tamaño de la instrucción en base a los bits dedicados
a las direcciones? Podemos tener alguna otra información
implícita. Esta información implícita sería la dirección en la
cual se guardará el resultado, la misma va a ser la dirección del
primer operando. [ADD AX,BX de modo implícito está
indicado que la suma entre el contenido del registro AX y el
registro BX va a ser guardado en la dirección del primer operando, es decir dentro del registro
AX.] Tenemos menos elección para guardar el resultado porque este va a ser guardado en la
dirección referenciada por el operando 1. La manera de compensar esta limitación es tener
una operación que nos permita mover la información contenida en el lugar al que apunta esa
dirección (por ejemplo, un MOV).

Cód. Operación Dir. Op1/Res Dir. Op2

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].

Cód. Operación Dir. Op2

Máquina de 3 direcciones Máquina de 2 direcciones Máquina de 1 dirección


ADD A , B , C | 1ac MI / 3ac MD MOV A , B | 1ac MI / 2ac MD LOAD B | 1ac MI / 1ac MD
MUL A , A , D | 1ac MI / 3ac MD ADD A , C | 1ac MI / 3ac MD ADD C | 1ac MI / 1ac MD
SUB A , A , E | 1ac MI / 3ac MD MUL A , D | 1ac MI / 3ac MD MUL D | 1ac MI / 1ac MD
3 INSTRUCCIONES EN TOTAL SON 3 SUB A , E | 1ac MI / 3ac MD B E | 1ac MI / 1ac MD STORE
ACCESOS A MI Y 9 ACCESOS 4 INSTRUCCIONES EN TOTAL SON 4 ac MI / 1ac MD 5 INSTRUCCIONES E
A MD ACCESOS A MI Y 11 ACCESOS A MD [la
1er instrucción accede a MD dos veces, TOTAL SON 5 ACCESOS A MI
una para buscar los datos de B y otra Y 5 ACCESOS A MD
para dejarlos en A; las otras acceden 3
veces, 2 para buscar operandos y luego
una vez más a A para dejar el resultado ]

El conjunto de instrucciones es el medio que tiene el programador para poder controlar la


CPU. El fabricante tuvo que tener determinadas consideraciones:

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:

Instrucciones de transferencia de datos: MOV, LOAD, STORE

Instrucciones aritméticas: ADD, SUB, MUL, INC, DEC

Instrucciones lógicas: AND, NOT, XOR, OR

Instrucciones de conversión: por ejemplo, de binario a decimal.

33
Instrucciones de transferencia de control: por ejemplo, las de bifurcación (condicionales) o los
saltos.

Instrucciones de control de sistema: estas son las que maneja el SO

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, esto es la manera que tenemos de especificar la dirección de un


operando o de una instrucción.

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.

Modo de Direccionamiento Directo [ADD BX , NUM]: en este caso se


nos da dentro de la instrucción en el campo de dirección,
directamente la dirección del operando, entonces usamos esa
dirección para ir a buscar el operando a la Memoria. Por ejemplo, si
el operando dice que es 11FFH entonces el CPU va a buscar el
operando (o la dirección a donde colocar el resultado) a la dirección
de memoria 11FFH. Es un modo simple, pero de nuevo estaremos limitados por la cantidad de
bits del campo de dirección de esta instrucción. Este modo de direccionamiento se usa para
acceder a variables globales cuya dirección se conoce al momento de la compilación. En estos
casos por lo general se va a utilizar una representación simbólica que indique a que dirección
ir a buscar el operando fuente o resultado (es decir, el nombre de la constante o variable).

Modo de Direccionamiento por Registro [ADD AL , BL]: en el


campo de dirección tenemos una referencia a un registro
interno del CPU. Con esa referencia vamos a buscar el dato,
sólo que esta vez no tenemos que acceder a Memoria, sino a los
registros de la CPU. Como los registros del CPU son pocos
comparados con la Memoria, entonces este campo de dirección
referenciando a un registro va a ocupar menos bits. Conceptualmente es igual al Modo de
Direccionamiento Directo, sólo que se especifica un registro interno de la CPU en lugar de una
posición de memoria. La referencia a registro ocupa menos bits que la especificación de la
dirección y no requiere acceso a memoria de datos. La desventaja es que los registros no son
muchos, entonces es un recurso limitado, por lo tanto, hay que analizar bien cómo usarlos.

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.

Modo de Direccionamiento Indirecto vía Registro [ADD AL , [BX]]:


en este caso, a través de un registro accedemos a una dirección de
memoria. Es decir, el campo de la instrucción tiene la dirección a un
registro de la CPU que guarda una dirección de memoria, en la cual
tenemos guardada el operando que queremos usar, esta es la
dirección efectiva del operando. La ventaja es que son muy pocos
bits para especificar el registro. Tenemos un espacio de direccionamiento grande y se accede
una sola vez a memoria, para ir a buscar el operando, ya que el paso indirecto se da dentro de
la CPU entonces es más rápido.

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 Relativo: el registro que está involucrado en el direccionamiento


está implícito y es el Contador de Programa. Entonces la dirección de la instrucción actual se
suma al campo de dirección (que sería el desplazamiento) para producir la dirección efectiva.
Este campo de dirección está dado en Ca2. Entonces nos permite referenciar posiciones
relativas a donde estamos parados en el programa. Esto tiene mucha utilidad, por ejemplo,
cuando estamos manejando instrucciones de salto, por lo general no saltamos a lugares muy
alejados del que nos encontramos, entonces este campo que nos indica que tanto tenemos que
saltar puede ser de pocos bits. Además, al ser el PC el registro implícito, esto nos permite
construir código que se llama reubicable, es decir el Contador de Programa yo lo corro más
arriba o más abajo en memoria, y toda la secuencia de instrucciones que conforman el
programa, al cambiarse el PC no importa si es más arriba o más hacia abajo, se va a mantener
y va a seguir referenciando la misma dirección.

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 visibles para el usuario:

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 exclusivos para trabajar con datos.

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.

Registros de estado en donde están almacenados los códigos de condición.

¿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.

La cantidad de registros que tenga en la CPU es importante pues:

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.

El número óptimo de registros suele ser entre 8 y 32 registros (direcciones de 3 y 5 bits). En


cuanto a la longitud de los registros:

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.

El CPU también cuenta con bits de condición [Flags]:

Estos son establecidos por la CPU como resultado de operaciones.

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.

Respecto a los registros de control y estado:

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.

Jerarquía de memoria: es la forma en la que están


organizados estos distintos niveles de memoria. En el tope
de la jerarquía de memoria, están los registros de la CPU
(memoria más rápida) mientras que en la base están las
memorias secundarias como los discos magnéticos o los
dispositivos de almacenamiento removibles como CD o DVD
(memorias más lentas).

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.

La memoria del computador va a estar distribuida en distintos niveles, y como el objetivo, en


cuanto a performance, costo y tamaño, van a ser diferentes en los distintos niveles, las
tecnologías utilizadas para su construcción e incluso los fundamentos físicos van a ser
distintos. Lo mismo pasa con la ubicación dentro del sistema, por ejemplo, los discos
magnéticos no están

accedidos a través de buses sino a través de dispositivos de


E/S. el objetivo entonces será tener una buena capacidad de
almacenamiento con un tiempo de acceso reducido.

Para que todo esto funcione, los mecanismos de pasaje de


información de los distintos niveles tienen que funcionar
correctamente, para que, desde un punto de vista macro, todo funcione a una alta velocidad
como si tuviera una memoria muy rápida, pero al costo por bit de una memoria lenta.

Las memorias tienen distintas características que nos permiten definirlas.

​ 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.

Memorias semiconductoras: el parámetro clave es el tiempo de acceso, que es el tiempo que


transcurre desde que se inicia la operación de lectura/escritura hasta que se obtiene o
almacena el dato. Ahora, una vez que se lee o escribe el dato, no
necesariamente se puede empezar otro ciclo de lectura, sino que muchas
veces, es necesario esperar un poco más antes de empezar un nuevo ciclo,
por esto es que se habla de tiempo de ciclo que es el tiempo mínimo que
tiene que haber entre dos operaciones sucesivas sobre una memoria.

Memorias magnéticas: en este tipo de memorias necesitamos movilizar partes mecánicas


sobre la superficie del disco entonces se necesita tiempo para posicionar el cabezal en el lugar
que va, que el disco gire lo suficiente para tener bajo el cabezal la
información que se está buscando y recién ahí comienza a contar
el tiempo de latencia o de lectura.

Tener en cuenta que la velocidad de transferencia se mide en bytes/segundos, y está


asociada en el caso de los discos magnéticos a la velocidad de giro del disco.

​ Método de acceso

Acceso aleatorio: es aquella en la que el tiempo de acceder a una ubicación es independiente


de la secuencia de accesos que hice antes y es constante, esto significa que da lo mismo en qué
lugar esté la información que busco pues el acceso no es secuencial. Por ejemplo, la Memoria
Principal, accedo a un dato por medio de una dirección y voy directamente a ese dato sin
pasar por los anteriores, entonces da lo mismo si el dato está ubicado en la primera posición
de memoria o en la última.

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).

¿Cómo es una celda de memoria dinámica basada en transistores y capacitores?

En el dibujo está esquematizada la celda básica. Tiene un transistor y un capacitor. El


capacitor es capaz de retener carga eléctrica, uno lo conecta a un circuito y lo puede cargar
eléctricamente, después uno desconecta el capacitor del circuito de carga, pero este queda
cargado. Entonces se considera que cuando el capacitor está cargado, almacenar un 1, y
cuando está descargado almacenar un 0. Para cargar o no el capacitor, se utiliza el transistor
que es comandado por la línea de selección y que cuando la selección este en 1, hace que el
transistor actúa como una llave que vincula a la línea de bit con el capacitor, entonces es
posible enviarle carga al capacitor y también descargarlo. Cuando la línea de selección este
inactiva, es decir este en 0, no está vinculado el capacitor con la línea de bit, por lo tanto, el
capacitor conserva su carga.

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.

​ Se puede escribir en ellas al menos una vez.

​ Se pueden leer para conocer su estado.

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.

El proceso de lectura/escritura de la celda es: primero se selecciona la celda mediante la línea


de selección, luego se le da la orden mediante la línea de control de lectura o escritura, y por
último, mediante la línea de escritura/lectura recibimos el dato a ser leído o enviamos el dato a
ser guardado.

En el siguiente esquema de una celda de memoria estática basada


en Flip-Flop. Como elemento de memoria biestable tenemos un
Flip-Flop D, en la línea de entrada y salida de datos tenemos un
buffer de tres estados, que tiene en su salida la posibilidad de
colocar

0 o 1 dependiendo lo que tenga en su entrada, pero además tiene


un tercer estado que es como si estuviera desconectado.

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.

Una memoria de un bit la implementamos con un Flip-Flop y armamos registros sencillos de n


bits juntando en paralelo n Flip-Flops. Para construir memorias más grandes se requiere una
organización diferente en la cual sea posible direccionar palabras individuales.

47
Organización del CHIP

Cada chip contiene un arreglo de celdas de memoria, y en las memorias de semiconductor se


utilizan dos enfoques organizacionales diferentes, el 2D y el 2½D.

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?

Primer caso: cada memoria cubre el espacio de


direccionamiento requerido, pero sólo cubre una
parte de la palabra (cantidad de palabras que quiero,
pero de menor cantidad de bits). Solución: usar varios
módulos en PARALELO.

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.

¿Cómo son las tecnologías de las memorias dinámicas actuales?

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.

Principios Clave para Cache

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é

● La Caché almacena bloques de la memoria principal para facilitar accesos futuros.


● La transferencia de datos entre Cache y CPU es por palabra, mientras que entre Cache y
Memoria Principal es por bloques.

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.

Eficiencia y Tamaño de los Bloques

● La eficiencia depende del porcentaje de aciertos (cuando la CPU encuentra en Cache lo


que busca).
● El tamaño de los bloques debe equilibrar el principio de localidad espacial y la
flexibilidad de la Caché.

Múltiples Niveles de Caché

● 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.

El diseño y operación de la Caché son fundamentales para optimizar la interacción entre la


CPU y la memoria, manteniendo un equilibrio entre velocidad, costo y capacidad.

53

También podría gustarte