El manejo de instrucciones en la CPU se lleva a cabo mediante un
ciclo de instrucciones que incluye la búsqueda, decodificación y ejecución. La
CPU primero busca la instrucción en la memoria, luego la decodifica para
determinar qué operación realizar y finalmente la ejecuta, guardando el
resultado en memoria o en un registro interno. Este ciclo se repite
continuamente mientras el programa está en ejecución.
Pasos del ciclo de instrucciones:
1. 1. Búsqueda (Fetch):
La CPU obtiene la siguiente instrucción desde la memoria principal,
generalmente la RAM, utilizando la dirección almacenada en el contador de
programa (PC).
2. 2. Decodificación (Decode):
La unidad de control interpreta la instrucción, determinando qué operación se
debe realizar, qué operandos se necesitan y dónde están ubicados en la
memoria.
3. 3. Ejecución (Execute):
La CPU realiza la operación especificada, utilizando la Unidad Aritmético-Lógica
(ALU) para cálculos, o la unidad de control para otras tareas.
4. 4. Escribir (Writeback):
El resultado de la ejecución se guarda en la memoria principal o en un registro
interno de la CPU.
Consideraciones adicionales:
Ciclo de reloj:
La CPU utiliza un ciclo de reloj para sincronizar sus operaciones internas,
determinando la velocidad a la que puede ejecutar instrucciones.
Registros:
La CPU utiliza registros, que son ubicaciones de almacenamiento internas, para
almacenar datos e instrucciones de forma temporal durante la ejecución.
Unidad de control:
La unidad de control es la parte de la CPU que interpreta las instrucciones y las
coordina para que se ejecuten.
Unidad Aritmético-Lógica (ALU):
La ALU realiza las operaciones aritméticas y lógicas necesarias para ejecutar
las instrucciones.
Pipelining:
En las CPU modernas, se utiliza el pipelining para ejecutar múltiples
instrucciones en paralelo, mejorando la eficiencia.
Una CPU lo que hace es ejecutar las instrucciones de un programa situado en
una memoria. Pero, ¿sabíais que todos siguen las mismas normas generales?
Todos siguen el mismo ciclo de instrucción, el cual se divide en tres etapas
diferenciadas llamadas Fetch, Decode y Execute, las cuales se traducen
como captación, descodificación y ejecución. Os explicamos cómo funcionan
estas etapas y cómo se organizan.
Con tal de simplificar y hacer más entendible los conceptos explicados en este
artículo hemos decidido describir un procesador sumamente simple para los
tiempos que corren, por lo que en este artículo veréis una explicación de lo que
son los ciclos de instrucción de manera generalizada que se puede aplicar
desde los primeros procesadores de 8 bits a los más complejos que hay hoy en
día. Pensad en una especie de cadena de montaje de cualquier producto que
os venga a la mente y cómo el procesador es capaz de ir paso a paso
manipulando la información hasta darle la forma de lo que vemos en pantalla,
en un complejo sistema que icumbe a varios componentes.
Obviamente, los actuales procesadores, los más avanzados, cuentan con
tecnologías mucho más complejas y avanzadas que imprimen más potencia
que los modelos de hace algunas décadas pero que, en el fondo, su manera de
trabajar está inspirada en lo que os contaremos a continuación. Y como hemos
dicho, lo hemos simplificado al máximo para que sea más fácil de entender y
cuando terminéis este artículo tengáis una imagen clara de todo lo que ocurre
en el interior de lo que muchos definen como el cerebro del PC.
Así funciona el ciclo de instrucción del procesador
Los procesadores no son diferentes desde cierto punto de vista a un motor de
combustión de los que se vienen montando en coches, motos o camiones, los
cuales siempre realizan un proceso continuo de explosión del combustible en
diferentes etapas, ya sean de 2 tiempos o de 4 tiempos. El motivo de ello es
que los procesadores funcionan en tres etapas distintas en su versión más
simple que son las siguientes y que, de manera general, podemos entender
que son invariables de cualquier modelo que se vende en el mercado.
Fetch o Captación: En la que la instrucción es captada desde la
memoria RAM y copiada a dentro del procesador.
Decode o Descodificación: En la que la instrucción previamente
captada es descodificada y enviada a las unidades de ejecución.
Execute o Ejecución: Donde la instrucción es resuelta y el resultado
escrito en los registros internos del procesador o en una dirección de
memoria de la RAM.
Estas tres etapas de procesamiento de la información se cumplen
envariablemente dentro de todo procesador, aunque es cierto que existe una
cuarta etapa que es la de Write-Back que es cuando las unidades de ejecución
escriben el resultado, aunque normalmente esto se cuenta dentro de la etapa
de ejecución del ciclo de instrucción. Pero os obvio que una vez que los datos
han sidp rocesados, es importante llevarlos a un lugar en el que sean útiles
para la tarea que hemos requerido y que, normalmente, tiene una repercusión
en pantalla: abrir una página web, jugar con un videojuego, aplicar un filtro de
Photoshop… lo que sea.
Primera etapa del ciclo de instrucción: Fetch
La primera etapa del ciclo de instrucción se encarga de captar las instrucciones
que hay en la memoria RAM asignada al procesador a través de una serie de
unidades y registros que son las siguientes. Es en esa memoria donde se
encuentra la información que la CPU debe procesar por lo que ese primera
paso tiene que ver con recolectarla, con leerla para comenzar las operaciones.
1. Program Counter o Contador de Programa: El cual apunta a la
siguiente línea de memoria donde se encuentra la siguiente instrucción
del procesador. Se incrementa en 1 su valor cada vez que se termina un
ciclo completo de instrucción o cuando una instrucción de salto cambia
el valor del contador de programa.
2. Memory Address Register o registro de direccionamiento de
memoria: El MAR copia el contenido del PC y lo envía a la RAM a través
de los pines de direccionamiento de la CPU, los cuales están cableados
con los pines de direccionamiento de la propia memoria RAM.
3. Memory Data Register o registro de datos a memoria : En el caso
que la CPU tenga que realizar una lectura a memoria, lo que hace el
MDR es copiar el contenido de esa dirección de memoria a un registro
interno de la CPU, el cual es un registro temporal de paso antes de que
su contenido sea copiado al Instruction Register. El MDR al contrario del
MAR esta conectado a los pines de datos de la RAM y no a los de
direccionamiento y en el caso de que se trate de una instrucción de
escritura el contenido de lo que se quiere escribir en la RAM también se
escribe en el MDR
4. Instruction Register o Registro de Instrucción: La parte final de la
etapa de captación o fetch es la escritura de la instrucción en el registro
de instrucción, del cual la unidad de control del procesador copiará su
contenido para la segunda etapa del ciclo de instrucción.
Estas 4 sub-etapas ocurren en todos los procesadores sea cual sea su utilidad,
arquitectura y compatibilidad binaria o lo que llamamos ISA. Por lo que es
aplicable a prácticamente cualquier modelo que os podáis encontrar en el
mercado. Eso sí, en muchos casos variarán las tecnologías utilizadas u otros
componentes que entran a formar parte de este proceso para agilizar trabajos
mucho más específicos.
La unidad de control
La unidad de control es la pieza más compleja que existe en un procesador y
sus tareas son las siguientes que os detallamos aquí debajo. Como en todos los
casos, se trata de un conjunto de mínimos, que son esenciales, aunque algunos
modelos seguramente incluyan extras que son los que acaban repercutiendo
en el precio del componente. A mayores prestaciones, mayor desembolso
debemos hacer para beneficiarnos de esos extras:
Se encarga de coordinar el movimiento y el orden en que de los datos
que se mueven dentro y fuera del procesador, así de las diferentes
subunidades que se encargan de ello.
En general se considera que las unidades de la etapa de captación o
Fetch forman parte del hardware que llamamos unidad de control y
dicho hardware es llamado también el Front-End de un procesador.
Interpreta las instrucciones y las envía a las diferentes unidades de
ejecución a las que está conectado.
Está comunicado a las las diferentes ALUs y unidades de ejecución del
procesador que actúan
Se encarga de captar y descodificar las instrucciones, sino también de
escribir los resultados en los registros, caches o en la dirección
correspondiente de la RAM.
La unidad de control lo que hace es descodificar las instrucciones y esto lo
hace porque cada instrucción en realidad no deja de ser una especie de
oración en donde primero va el verbo y luego el objeto directo u objeto sobre el
que se hace la acción. El sujeto se acaba eliminando en este lenguaje interno
de los ordenadores por el hecho que se sobrentiende que es el propio
ordenador el que lo ejecuta, así pues cada cantidad de bits es una oración
donde los primeros 1 y 0 corresponden a la acción y los que vienen a
continuación es el dato o la localización del dato que se quiere manipular.
La segunda etapa: Decode
Hay diferentes tipos de instrucciones y no todas hacen lo mismo, por lo que
dependiendo del tipo de instrucción necesitamos saber hacía que unidades de
ejecución se van a enviar y la manera más clásica de hacerlo es a través de lo
que llamamos un descodificador, el cual toma cada instrucción, la divide
internamente según el opcode o instrucción y el dato o la dirección de
memoria donde se encuentra este.
Por ejemplo en el diagrama de arriba tenemos el diagrama de un procesador
de solo 8 instrucciones, las cuales se pueden codificar en solo 3 bits. Cada una
de las instrucciones una vez descodificadas se envían a las diferentes unidades
de ejecución que las resolverán.
Este ciclo de instrucción es el más complejo de todo y el que define el tipo de
arquitectura. Dependiendo si tenemos un conjunto de instrucciones reducido o
complejo esto afectará a la naturaleza de la unidad de control, dependiendo
del formato de la instrucción o de cuantas se procesen al mismo tiempo la fase
de descodificación y por tanto la unidad de control tendrá una naturaleza u
otra.
La forma más fácil de visualizar lo que ocurre es pensar en las instrucciones
como trenes circulando a través de una compleja red ferroviaria y la unidad de
control dirigiéndolos a una estación termino, la cual es la unidad de ejecución
que se encargará de resolver la instrucción.
Tercera etapa: Execute
La última etapa es la de la ejecución de las instrucciones, en esta etapa las
instrucciones son resueltas, pero no todos los tipos de instrucción se resuelven
de la misma forma, ya que la forma de utilizar el hardware dependerá de la
función de cada una de ellas, en general tenemos cuatro tipos de
instrucciones:
Instrucciones de movimiento de bits: En el cual se manipula el
orden de los bits que contienen el dato.
Instrucciones aritméticas: Donde se realizan operaciones
matemáticas y también lógicas, estas se solucionan en las llamadas ALU
o unidades aritmético-lógicas.
Instrucciones de salto: En la que se cambia la siguiente el valor del
contador de programa, lo que permite utilizar el código de manera
recursiva.
Instrucciones a memoria: Son con las que el procesador lee y escribe
la información de la memoria del sistema.
El otro punto son los formatos de la instrucción, ya que una instrucción se
puede aplicar a un dato, escalar o a varios datos al mismo tiempo, lo que
conocemos como SIMD. Para terminar y dependiendo del formato de los datos,
hay diferentes tipos de ALU para la ejecución de las instrucciones aritméticas,
por ejemplo tenemos unidades de enteros y en coma flotante como unidades
diferenciadas a día de hoy.
Una vez la instrucción ha sido terminada se escribe el resultado sobre una
dirección de memoria en concreto y se pasa a ejecutar la siguiente, algunas
instrucciones no manipulan los valores de memoria sino ciertos registros. Así
pues el registro del contador de programa es modificado por las instrucciones
de salto, si queremos leer o escribir un dato entonces se manipulan los
registros MAR y MDR.
¿Todos los procesadores funcionan de la misma manera?
La respuesta corta a esta pregunta es que sí, pero cuando hablamos de
procesadores de PC. Existen otros tipos de procesadores, como los RISC-V y
ARM que utilizan sus propios métodos para ejecutar las instrucciones que les
llegan de los programas, pero en líneas generales, cuando hablamos de
procesadores de PC –AMD o Intel–, funcionan de la manera que os hemos
contado aquí, siempre.
Con ligeras excepciones pero como norma general, todo lo que tenéis en este
artículo os servirá para comprender mejor cuál es el flujo de la información y
cómo se procesa la información y los datos cada vez que hacéis uso de un
componente que es el cerebro de todo el sistema. Ahora pensad a la velocidad
que lo hace todo y cómo de increíble es que hayamos alcanzo los niveles de
computación en los que nos movemos ahora mismo y que eran impensables
hace apenas 20 años.
Y es que en líneas generales, los procesadores no han evolucionado tanto en
las últimas décadas. Sí, se ha mejorado la litografía para hacer que los
transistores sean cada vez más pequeños, lo que permite meter una mayor
cantidad de ellos en el mismo espacio y eso ha mejorado tanto la capacidad de
cómputo como la eficiencia energética, y sí, se ha mejorado notablemente la
velocidad de funcionamiento, pero en general los procesadores llevan
funcionando igual décadas, y no pinta que esto vaya a cambiar.
Últimamente sí que han surgido nuevos procesadores que cambian las reglas
del juego, como hemos comentado antes los procesadores RISC-V y ARM
funcionan de manera un poco diferente, aunque en esencia el flujo de trabajo
sigue siendo bastante parecido: reciben la instrucción, la procesan y la
ejecutan.
Los **estados** y **variables de estado** son conceptos fundamentales en el
manejo de instrucciones en una computadora, ya que definen las condiciones y
los datos necesarios para que la CPU ejecute correctamente cada etapa del
ciclo de instrucciones. A continuación, te explico ambos conceptos:
---
### **1. Estados en el Manejo de Instrucciones**
Los **estados** representan las **fases o condiciones temporales** por las que
pasa la CPU durante el procesamiento de una instrucción. Estos estados están
vinculados al **ciclo de instrucciones** (Fetch, Decode, Execute, Writeback) y
garantizan que cada paso se realice de manera secuencial y sincronizada.
#### **Ejemplos de estados clave:**
- **Fetch (Búsqueda)**: La CPU está leyendo una instrucción desde la memoria.
- **Decode (Decodificación)**: La unidad de control está interpretando la
instrucción.
- **Execute (Ejecución)**: La ALU está realizando una operación
aritmética/lógica.
- **Writeback (Escritura)**: La CPU está guardando el resultado en memoria o
registros.
- **Espera (Stall)**: La CPU está detenida temporalmente (por ejemplo, por un
fallo de caché o una dependencia de datos).
---
### **2. Variables de Estado**
Las **variables de estado** son los **registros, señales o datos** que
almacenan información crítica sobre el estado actual de la CPU y permiten
transitar entre estados. Estas variables son esenciales para la sincronización y
el control del flujo de ejecución.
#### **Variables de estado clave en una CPU:**
1. **Contador de Programa (PC)**:
- Almacena la dirección de memoria de la **siguiente instrucción a buscar**.
- Se actualiza después de cada ciclo (ejemplo: `PC = PC + 4` en una
arquitectura de 32 bits).
2. **Registro de Instrucción (IR)**:
- Guarda la instrucción actual que está siendo decodificada o ejecutada.
3. **Registros de Propósito General (R0, R1, ..., Rn)**:
- Almacenan datos temporales o operandos durante la ejecución.
4. **Registro de Dirección de Memoria (MAR)**:
- Indica la dirección de memoria desde la que se leerá o escribirá un dato.
5. **Registro de Datos de Memoria (MDR)**:
- Almacena temporalmente los datos transferidos entre la CPU y la memoria.
6. **Registro de Estado (Flags)**:
- Contiene **banderas** que indican condiciones resultantes de operaciones
(ejemplo: `Zero`, `Carry`, `Overflow`).
7. **Señales de Control**:
- Variables generadas por la **unidad de control** para coordinar
componentes (ejemplo: señal para activar la ALU o leer memoria).
---
### **Relación entre Estados y Variables de Estado**
La CPU utiliza las **variables de estado** para:
- Saber en qué etapa del ciclo de instrucciones se encuentra.
- Decidir cómo avanzar al siguiente estado.
- Gestionar excepciones o interrupciones (ejemplo: si ocurre un error, se
actualiza una bandera y se cambia al estado de manejo de excepción).
#### **Ejemplo de transición entre estados:**
1. **Fetch**:
- **Estado actual**: Búsqueda.
- **Variables involucradas**: PC (dirección de la instrucción), MAR (dirección
enviada a memoria), MDR (instrucción leída).
2. **Decode**:
- **Estado actual**: Decodificación.
- **Variables involucradas**: IR (instrucción almacenada), señales de control
(interpretación de la instrucción).
3. **Execute**:
- **Estado actual**: Ejecución.
- **Variables involucradas**: ALU (operación a realizar), registros de
operandos (R1, R2).
4. **Writeback**:
- **Estado actual**: Escritura.
- **Variables involucradas**: Registro destino (R3), MDR (si se escribe en
memoria).
---
### **Importancia en el Diseño de CPUs**
- **Sincronización**: El ciclo de reloj gobierna cómo y cuándo cambian los
estados y variables.
- **Pipeline**: En CPUs modernas, múltiples instrucciones están en diferentes
estados simultáneamente (ejemplo: una instrucción en Fetch y otra en
Execute).
- **Manejo de Errores**: Las variables de estado (como las banderas) permiten
detectar fallos y cambiar a estados de recuperación.
---
### **Resumen Gráfico**
```
[Estados] [Variables de Estado]
Fetch ⟷ PC, MAR, MDR
Decode ⟷ IR, Unidad de Control
Execute ⟷ ALU, Registros (R1, R2)
Writeback ⟷ Registro destino (R3), MDR
```