Bienvenido al Curso
En este espacio encontrarás toda la información relevante para el curso de Arquitectura de Máquinas de Computadoras 2. Utiliza la barra de navegación superior para seleccionar la unidad que deseas estudiar.
Cada sección ha sido preparada con resúmenes detallados, conceptos clave y analogías para facilitar tu aprendizaje de los componentes fundamentales que hacen funcionar a una computadora.
🏛️ Unidad 1: Introducción a la Arquitectura
Para empezar, debemos diferenciar dos conceptos clave que a menudo se confunden:
- Arquitectura: Es la "descripción funcional" del sistema. Son los atributos visibles para un programador, como el conjunto de instrucciones, los tipos de datos o los modos de direccionamiento.
Analogía: Son los planos de una casa (dónde están los cuartos, los baños, las puertas). - Organización: Es la "implementación física" de esa arquitectura. Se refiere a cómo se interconectan los componentes de hardware (chips, buses, tecnología de memoria) para cumplir con el diseño de la arquitectura.
Analogía: Son los materiales de la casa (ladrillos, madera, tipo de tubería).
El pilar de las computadoras modernas es el modelo de Máquina Secuencial de Programa Almacenado (creado por John von Neumann), que se basa en tres ideas revolucionarias:
- Programa Almacenado: Tanto las instrucciones (el programa) como los datos se almacenan juntos en la misma memoria principal.
- Ejecución Secuencial: La CPU ejecuta las instrucciones de forma secuencial, una tras otra (a menos que una instrucción de "salto" le diga que vaya a otra parte).
- Componentes Clave: La máquina se divide en unidades funcionales: la Unidad Central de Procesamiento (CPU), la Memoria Principal y el Sistema de Entrada/Salida (E/S), todos conectados por un Bus.
🧠 Unidad 2: El Corazón de la Computadora: La CPU
La Unidad Central de Procesamiento (CPU) es el cerebro de la computadora. Su único trabajo es ejecutar instrucciones. Para ello, sigue incansablemente el Ciclo de Instrucción, que se divide en fases:
- 1. Fase de Búsqueda (Fetch):
- La CPU pregunta: "¿Cuál es la siguiente instrucción?".
- Consulta un registro especial llamado Contador de Programa (PC), que tiene la dirección de memoria de esa instrucción.
- Trae la instrucción de la memoria y la guarda en el Registro de Instrucción (IR).
- 2. Fase de Decodificación (Decode):
- La Unidad de Control (CU) lee la instrucción en el IR y la "traduce", entendiendo qué operación debe hacer (ej. "sumar") y qué datos necesita.
- 3. Fase de Ejecución (Execute):
- La CU envía señales a la Unidad Aritmético-Lógica (ALU) para que realice la operación matemática o lógica (la "calculadora" de la CPU).
- Los datos se mueven desde la memoria o registros a la ALU, y el resultado se guarda de nuevo en un registro o en la memoria.
Resumiendo, los componentes principales de la CPU son:
- Unidad de Control (CU): El "director de orquesta" que coordina todas las acciones.
- Unidad Aritmético-Lógica (ALU): La "calculadora" que hace las operaciones.
- Registros: Memorias ultra-rápidas y pequeñas. Son como la "pizarra" o las "manos" de la CPU para sostener los datos con los que está trabajando en el momento.
📜 Unidad 3: El Lenguaje del Procesador
El Conjunto de Instrucciones (ISA) es el vocabulario único que entiende un procesador. Es el atributo más importante de una arquitectura y actúa como la interfaz entre el hardware y el software.
Las instrucciones se clasifican por su función:
- Transferencia de Datos: Mueven información entre la memoria y los registros (ej. `MOVE`, `LOAD` (cargar de memoria a registro), `STORE` (guardar de registro a memoria)).
- Aritméticas: Operaciones matemáticas (ej. `ADD`, `SUBTRACT`, `MULTIPLY`).
- Lógicas: Operaciones bit a bit (ej. `AND`, `OR`, `NOT`, `SHIFT` (desplazamiento)).
- Control de Flujo: Permiten saltar a otras partes del programa (bifurcaciones) o llamar a funciones (ej. `JUMP` (salto incondicional), `BRZ` (saltar si es cero), `CALL` (llamar subrutina)).
Un desafío clave es: ¿cómo le dice la instrucción a la CPU dónde encontrar los datos (operandos)? A esto se le llama Modos de Direccionamiento. Los más comunes son:
- Inmediato: El dato (operando) es parte de la instrucción misma.
Ejemplo: `ADD R1, 5` (Suma el número 5 al registro R1). - Directo (Registro): El dato está en otro registro.
Ejemplo: `ADD R1, R2` (Suma el contenido de R2 a R1). - Absoluto (Memoria): La instrucción contiene la dirección de memoria exacta donde está el dato.
Ejemplo: `ADD R1, [1000]` (Va a la celda 1000 de la RAM, toma ese dato y lo suma a R1). - Indirecto de Registro: El registro no contiene el dato, sino que *apunta* a la dirección de memoria donde está el dato. Es un puntero.
Ejemplo: `ADD R1, [R2]` (Si R2 vale 1000, la CPU irá a la celda 1000, tomará el dato y lo sumará a R1).
🔢 Unidad 4: La Unidad de Ejecución y los Datos
Esta unidad es la parte "práctica" de la CPU, compuesta por la ALU y los registros. Se encarga de procesar datos, pero la computadora no entiende de números o letras, solo de patrones de bits (0 y 1). Por eso, toda la información debe ser representada numéricamente.
Representación de Números Enteros (con signo)
- Signo-Magnitud: Es la forma más intuitiva. Se usa el primer bit para el signo (0=+ , 1= -) y el resto para el número.
Problema: Es ineficiente. Tiene dos representaciones para el cero (+0 y -0) y requiere circuitos separados para sumar y restar. - Complemento a 2 (C2): Es el método estándar universal. Los números positivos se representan normal. Para un número negativo, se invierten todos los bits del positivo y se le suma 1.
Ventaja: Tiene un solo cero y, lo más importante, la resta se convierte en una suma (ej. `A - B` es igual a `A + (-B)`). Esto significa que la CPU solo necesita un circuito sumador, ahorrando espacio y complejidad.
Representación de Números Reales (con decimales)
- Punto Flotante (Estándar IEEE 754): Es el método universal para números con decimales. Funciona exactamente igual que la notación científica (`5.23 x 10²`). Un número de 32 bits se divide en tres partes:
- Signo (1 bit): 0 si es positivo, 1 si es negativo.
- Exponente (8 bits): La potencia a la que se eleva la base (en binario).
- Mantisa (23 bits): Los dígitos significativos del número (la parte decimal).
🕹️ Unidad 5: El Director de Orquesta: La Unidad de Control
La Unidad de Control (UC) es el componente más complejo y el verdadero "cerebro" de la CPU. Su trabajo es dirigir el ciclo de instrucción, generando señales de control (impulsos eléctricos) que le dicen a cada componente qué hacer y cuándo hacerlo.
Imagina que es un titiritero: sus hilos son las señales de control que van a la ALU ("¡suma ahora!"), a los registros ("¡abre tu compuerta y recibe este dato!") y a la memoria ("¡ponte en modo lectura!").
Existen dos formas opuestas de construir una Unidad de Control:
1. Unidad de Control Alambrada (Fija)
- Se construye directamente con circuitos lógicos (compuertas AND, OR, NOT). Es un diseño fijo.
- Analogía: Una caja de música. Toca una melodía fija (la instrucción) de forma perfecta y rápida, pero no puedes cambiar la canción.
- Ventaja: Es extremadamente rápida, ya que las señales se generan a la velocidad de la electricidad.
- Desventaja: Es rígida. Si se quiere añadir una nueva instrucción, hay que rediseñar todo el chip.
- Usada en procesadores RISC (como los de celulares, ARM), que tienen pocas instrucciones pero muy veloces.
2. Unidad de Control Microprogramada
- Utiliza una pequeña memoria interna (Memoria de Control) donde se guardan "microprogramas".
- Cada instrucción (ej. `ADD`) tiene su propio "microprograma" (una secuencia de "microinstrucciones") que le dice a la UC qué señales activar paso a paso.
- Analogía: Un piano automático. Puedes cambiar el rollo de papel (el microprograma) para tocar diferentes canciones (instrucciones).
- Ventaja: Es flexible. Para añadir una nueva instrucción, solo se añade un nuevo microprograma a la memoria.
- Desventaja: Es más lenta, porque tiene que leer las microinstrucciones de su memoria interna en cada paso.
- Usada en procesadores CISC (como los de PC, x86), que tienen instrucciones muy complejas.
📚 Unidad 6: El Sistema de Memoria
La memoria ideal sería infinitamente grande, súper rápida y muy barata. Como eso no existe, los ingenieros crearon la Jerarquía de Memoria, que es una pirámide de memorias organizada para simular tener una memoria grande Y rápida.
Los niveles de la pirámide son (del más rápido y caro al más lento y barato):
- Nivel 0: Registros del CPU. Dentro del procesador. Velocidad máxima, capacidad mínima (cientos de bytes).
- Nivel 1: Memoria Caché (L1, L2, L3). Una memoria pequeña (Megabytes) y muy rápida (SRAM) que actúa como un "borrador" de la RAM.
- Nivel 2: Memoria Principal (RAM). La memoria de trabajo (DRAM) donde se cargan los programas y datos en uso (Gigabytes).
- Nivel 3: Memoria Secundaria. Almacenamiento masivo y permanente (Terabytes). Es la más lenta (Discos Duros HDD, SSD).
La Magia de la Memoria Caché
La Caché es el componente que hace que la computadora se sienta rápida. Funciona gracias al Principio de Localidad, que dice que los programas no acceden a la memoria al azar, sino que siguen dos patrones:
- Localidad Temporal: Si la CPU usa un dato ahora, es muy probable que lo vuelva a usar pronto (ej. una variable dentro de un bucle).
- Localidad Espacial: Si la CPU usa un dato, es muy probable que pronto use los datos que están almacenados físicamente a su lado (ej. los elementos de un vector o un arreglo).
Funcionamiento: Cuando la CPU necesita un dato, primero lo busca en la Caché.
- If the data is there, it's a Cache Hit. The CPU gets it instantly.
- If the data is NOT there, it's a Cache Miss. The CPU must wait. The Cache goes to the RAM, brings not only the requested data, but the entire "block" of surrounding data (betting on spatial locality), and stores it for future access.
🔌 Unidad 7: Conectando con el Mundo Exterior (E/S)
El Sistema de Entrada/Salida (E/S) es el conjunto de componentes que permite a la computadora comunicarse con los periféricos (teclado, monitor, disco duro, impresora, red, etc.).
El principal desafío de la E/S es la diferencia de velocidad. La CPU es miles de veces más rápida que un disco duro o un teclado. Dejar que la CPU espere a que un humano termine de presionar una tecla sería un desperdicio gigantesco de poder de cómputo.
Para gestionar esta comunicación de forma eficiente, existen tres técnicas:
- E/S Programada (Polling):
- La CPU se encarga de todo. Está en un bucle preguntándole constantemente al dispositivo: "¿Terminaste? ¿Terminaste? ¿Terminaste?".
- Desventaja: Es muy ineficiente. La CPU queda 100% ocupada en esa tarea de espera y no puede hacer nada más.
- Analogía: Llamar por teléfono a alguien y negarse a colgar, repitiendo "¿ya?" hasta que te contesten.
- E/S por Interrupciones:
- Es la técnica más común y un pilar de los sistemas operativos modernos.
- La CPU le dice al dispositivo: "Cuando estés listo, avísame" y se va a ejecutar otras tareas.
- Cuando el dispositivo termina, le envía una señal eléctrica a la CPU (una "interrupción").
- La CPU detiene (interrumpe) lo que estaba haciendo, atiende al dispositivo, y luego continúa con su tarea anterior.
- Analogía: Enviar un mensaje de texto y seguir con tu vida. Tu teléfono sonará (te interrumpirá) cuando te respondan.
- Acceso Directo a Memoria (DMA):
- Es la técnica más avanzada, ideal para mover grandes bloques de datos (ej. un archivo del disco a la RAM).
- La CPU le delega toda la operación a un chip especialista: el Controlador DMA.
- La CPU le dice al DMA: "Mueve 5MB desde el disco (dirección X) a la RAM (dirección Y)".
- El DMA toma control del bus y realiza la transferencia directamente entre el periférico y la RAM, sin que los datos pasen por la CPU.
- La CPU queda totalmente libre para ejecutar otros programas. Cuando el DMA termina, le envía una sola interrupción a la CPU.
- Analogía: Eres el jefe (CPU) y en lugar de mover tú mismo las cajas (datos), contratas a un equipo de mudanza (DMA) para que lo haga.
🤖 Arduino Uno: Arquitectura en un Microcontrolador
Arduino Uno es una plataforma de **código abierto** (open-source) y un excelente ejemplo de un **sistema embebido** (integrado). Su objetivo es simplificar la interacción entre la programación y el mundo físico, utilizando un hardware compacto y un software de desarrollo accesible.
A diferencia de la arquitectura de las PC (que manejan sistemas operativos complejos), Arduino está diseñado para realizar una **única tarea** de forma continua, demostrando el concepto de la **Máquina Secuencial de Programa Almacenado** de manera directa.
I. Arquitectura Interna (El Chip ATmega328P)
El núcleo de la placa es el **Microcontrolador ATmega328P**. Este chip integra en su interior los tres componentes principales que componen el modelo de von Neumann:
- Unidad Central de Procesamiento (CPU): Es un procesador de 8 bits con una frecuencia de 16 MHz. Realiza las operaciones aritméticas y lógicas, y sigue el ciclo de instrucción (Búsqueda, Decodificación, Ejecución) de forma ininterrumpida.
- Memoria: El ATmega328P cuenta con tres tipos de memoria con capacidades muy limitadas (una gran diferencia con la RAM y HDD/SSD de una PC):
- Memoria Flash (32 KB): Funciona como el disco duro, pero para el código. Es donde se almacena permanentemente el programa que escribes (el firmware).
- SRAM (Static RAM, 2 KB): Es la memoria de trabajo temporal (como la RAM de una PC) que utiliza el programa para guardar variables y datos mientras está en ejecución.
- EEPROM (1 KB): Se utiliza para guardar datos de configuración que deben persistir incluso si se apaga la placa.
- Sistema de Entrada/Salida (E/S): Se gestiona a través de los pines digitales (para señales on/off) y analógicos (para medir voltajes), que son los puertos directos de comunicación con sensores y actuadores.
II. Lenguaje y Modelo de Ejecución
El lenguaje de programación de Arduino está basado en **C/C++**, pero con funciones y estructuras simplificadas que facilitan la interacción con el hardware. Es un lenguaje compilado, lo que significa que el código de alto nivel se traduce directamente a las instrucciones binarias que el microcontrolador entiende.
- El Ciclo de Programa: El código se organiza en dos funciones que ilustran la naturaleza secuencial y cíclica del microcontrolador:
void setup(): Se ejecuta **una única vez** al encender la placa, para inicializar variables, pines y comunicaciones (similar al arranque de un sistema).void loop(): Se ejecuta de forma **continua** hasta que se apaga la placa. Aquí reside la lógica principal del programa (es el bucle infinito del ciclo de instrucción).
- Uso de Interrupciones: Al igual que en la Unidad 7, el Arduino puede utilizar **interrupciones** externas. Esto permite que el CPU (ATmega328P) no tenga que estar "preguntando" constantemente (Polling) a un botón, sino que el botón, al ser presionado, genera una señal que detiene temporalmente al CPU para atender el evento.