Saltar al contenido principal
← Informática

Seguir cada paso

CPU y arquitectura de von Neumann

Introduces un cálculo en la pantalla y al poco tiempo aparece la respuesta. Lo ocurrido entre ambos momentos queda oculto: ¿adónde fue la entrada, dónde se hizo el cálculo y cómo regresó el resultado? Esta página abre la máquina para seguir la información.

Un programa es un conjunto de instrucciones para que el ordenador complete una tarea. Las que ejecuta el procesador son concretas: leer un número, sumar dos números o guardar un resultado. En lugar de memorizar todos los componentes a la vez, elige una instrucción y observa dónde está ahora y qué componente necesita después. A lo largo de esa ruta, cada pieza adquiere una función reconocible; si olvidas su nombre, vuelve a lo que acaba de hacer.

Si has leído complejidad temporal, allí contábamos el trabajo del algoritmo; aquí explicamos cómo lo realiza la máquina. Cuando una instrucción esté clara, estudiaremos cómo se superpone la ejecución de varias instrucciones. La animación está ralentizada para que puedas detenerte y seguir la información; sus segundos no representan la velocidad de un procesador real.

01

Dale una tarea a la CPU: lee un número, súmale 5 y muestra la respuesta.

Supón que introduces 7. Para obtener 12, el ordenador no necesita solo ese 7, sino también instrucciones que le digan leer, sumar y mostrar. La arquitectura de programa almacenado de von Neumann guarda las instrucciones y los datos en la misma memoria principal. La CPU, es decir, la unidad central de procesamiento, lee y ejecuta esas instrucciones.

EntradaPrepara el valor
→
CPULee y ejecuta
↔
MemoriaInstrucciones + datos
·
SalidaCPU → Pantalla

La memoria contiene muchas posiciones numeradas. El número de una posición es su dirección, y la información que guarda es su contenido. Pedir la dirección 12 es como elegir el cajón número 12; no significa que dentro haya forzosamente el número 12.

La información se representa con bits, y cada bit es un 0 o un 1. Un bus es un conjunto de conexiones que transportan señales. El bus de direcciones indica a dónde acceder, el bus de datos transporta los bits y las señales de control especifican operaciones como READ (leer) o WRITE (escribir). Las propias instrucciones también viajan como bits por el bus de datos. Por eso los colores de abajo distinguen la función de las señales, no tres tipos de instrucción.

02

¿Cómo sabe la CPU qué hacer después?

Supón que la instrucción recién leída es «suma el número que está en la dirección 12». Tenemos que recordar esa instrucción y, a la vez, conservar el número ya introducido; de lo contrario, al leer un número nuevo podríamos sobrescribir algo que aún necesitamos. Por eso la CPU dispone en su interior de varios almacenes pequeños y rápidos llamados registros. Uno conserva la instrucción, otro el número con el que se está calculando y otro recuerda dónde está la siguiente instrucción. Las abreviaturas del aparato dan nombre a estos almacenes. La guía de abajo explica cada abreviatura para que podamos seguir una transferencia y ver qué valores se guardan y cuáles se mueven.

La CPU toma una instrucción de la memoria; eso se llama búsqueda. Después identifica la operación y el operando que pide la instrucción, es decir, el valor o la posición que se usa esta vez; eso se llama decodificación. Con esa información, puede ejecutar la instrucción. Cada fase puede incluir varias transferencias más pequeñas, llamadas microoperaciones. El programa inicial tiene cinco instrucciones; abajo puedes sustituirlas por tus propios comandos. «Reproducir este paso» muestra la transferencia actual, y el estado inicial se mantiene hasta que decidas avanzar. Tras cada transferencia, puedes averiguar de dónde vino el valor, a qué parte llegó y qué valores no cambiaron. Puedes repetir la transferencia, volver a un paso anterior o activar la reproducción continua. Sus pausas de cuatro segundos son tiempo de observación, no un plazo para terminar de leer.

Distinguir primero la función de cada valor temporal

SiglaNecesidadLugar de almacenamiento temporal
PC¿Dónde leemos la siguiente instrucción?Contador de programa: guarda esa dirección de memoria.
MAR¿A qué posición de memoria accedemos ahora?Registro de direcciones de memoria: guarda temporalmente la dirección seleccionada.
MDR¿Qué valor atraviesa esta vez la conexión con la memoria?Registro de datos de memoria: guarda temporalmente el valor que se transfiere.
IR¿Qué instrucción se está ejecutando?Registro de instrucciones: conserva la instrucción actual.
ACC¿Dónde se guarda el número con el que calculamos?Acumulador: conserva el número utilizado en el cálculo actual.

Estos pequeños espacios de almacenamiento no deciden solos el siguiente paso. La unidad de control CU organiza las operaciones; la unidad aritmético-lógica ALU realiza sumas y otros cálculos. Este procesador didáctico guarda el resultado en ACC; los procesadores reales pueden organizar sus registros de otras maneras.

Por ejemplo, introducir 7 y ejecutar ADD [12] significa «sumar el número guardado en la dirección 12». Si allí hay un 5, antes del cálculo IR conserva ADD [12], MAR conserva 12, MDR recibe 5 y ACC aún conserva 7. Solo tras calcular la ALU cambia ACC a 12. La dirección 12 y el resultado 12 coinciden numéricamente, pero cumplen funciones distintas.

Escribe tus propias instrucciones para el ordenador

Queremos leer 7, sumarle 5, guardar la respuesta y mostrarla. Cada línea pide a la CPU una operación. El ejemplo de abajo produce 12; si cambias un número o una instrucción, los registros, la memoria y la pantalla seguirán tu nuevo programa.

  1. IN 7 pone el 7 en el puerto de entrada; la CPU lo lee en ACC, su registro de trabajo.
  2. ADD 5 suma 5 al valor de ACC: 7 + 5 = 12. Si lo cambias por SUB 5, en cambio restará 5.
  3. STORE 13 copia la respuesta en la posición 13 de la memoria. LOAD [13] recupera la respuesta guardada allí; LOAD 13 coloca en ACC el número 13 en sí. Los corchetes distinguen una dirección de un valor.
  4. OUT envía ACC a la pantalla y HALT termina el programa. Usa “Cargar programa” y luego “Ejecutar programa” o los controles paso a paso para seguir cada transferencia.
Referencia de instrucciones y límites de la máquina

IN n lee el siguiente número preparado desde el teclado. LOAD n sustituye ACC; ADD n y SUB n lo aumentan o lo reducen. Si tras LOAD, ADD o SUB usas [12], [13], [14] o [15], en su lugar se lee la memoria. STORE 12–15 guarda ACC, OUT actualiza la pantalla y HALT detiene la ejecución. Todos los valores son enteros.

Esta máquina didáctica tiene 16 palabras de memoria de 12 bits. Las direcciones 0–11 guardan hasta 12 instrucciones; las 12–15 guardan datos, con valor inicial cero. Una palabra representa valores con signo de −2048…2047. Una instrucción reserva cuatro bits para la operación y deja ocho para un valor inmediato (−128…127). IN acepta todo el rango de 12 bits porque su valor llega aparte desde el teclado. Los resultados fuera de rango se rechazan con una explicación, sin dar la vuelta en silencio. Este es un conjunto de instrucciones didáctico, no el lenguaje ensamblador de una CPU comercial.

1 / 37
Instrucción 1/5: IN 7Captación de instrucciónListo para seguir este paso

Seleccionar la dirección de la instrucción

PC vale 0. Copiamos esta dirección a MAR para que la memoria sepa qué posición debe leer.

Ruta de datos PC → MAR0
Cargando el modelo del ordenador…
Arrastra para girar · rueda para acercar · clic en un componente
Corte funcional · las señales van más lentas para poder observarlas

Partes de la placa: IN entrada · OUT salida · RAM memoria · PC contador de programa · MAR registro de dirección de memoria · MDR registro de datos de memoria · IR registro de instrucción · CU unidad de control · ACC acumulador · ALU unidad aritmético-lógica.

El azul selecciona una dirección de memoria; el ámbar transporta bits de datos, incluidas las direcciones que se copian entre registros; el violeta transporta señales de control como READ. Cada punto luminoso representa una transferencia, y en la demostración el tiempo de tránsito está muy ampliado.

Consultar la memoria y la notación de los números

Las direcciones y los valores están en decimal. 0x marca una palabra en hexadecimal: cada dígito corresponde a cuatro bits. Las instrucciones se guardan a partir de la dirección 0; las posiciones 12–15 contienen tus datos y su valor inicial es cero. Los datos negativos se guardan en complemento a dos de 12 bits, así que −1 se almacena como 0xFFF.

DirecciónPalabraSignificado
00x100IN 7
10x205ADD 5
20x30DSTORE 13
30x400OUT
40x500HALT
50x0000
60x0000
70x0000
80x0000
90x0000
100x0000
110x0000
120x0000
130x0000
140x0000
150x0000

Elige un componente: ¿por qué tiene que existir?

PC · Contador de programa

Recuerda la dirección de la siguiente instrucción; sin ella, la CPU no sabría por dónde continuar. En esta máquina direccionada por palabras, cada instrucción ocupa una palabra, así que la ejecución secuencial suma 1 al PC.

Este modelo tridimensional muestra un corte funcional, con espacio extra entre las partes para poder seguir las señales; no es la disposición de transistores de un chip comercial concreto. Esta máquina usa un acumulador, palabras de datos de 12 bits, un espacio de direcciones de 4 bits e instrucciones explícitas de entrada/salida. La organización concreta de las CPU modernas puede ser muy distinta.

03

La memoria guarda bits; ¿de dónde sale entonces «ADD»?

Un bit solo puede valer 0 o 1. Un número fijo de bits forma una palabra; aquí una palabra tiene 12 bits. Los cuatro primeros forman el código de operación u opcode y los ocho restantes, el campo de operando. ADD 5 escribe el número 5 en ese campo; ADD [12] escribe en él la dirección 12. Por eso estas dos sumas necesitan opcodes distintos, para que la unidad de control sepa si debe usar el número del campo o ir antes a memoria. STORE también usa una dirección. El editor reserva las posiciones 12–15 para datos, manteniéndolos separados del programa.

Instrucción legibleOpcode | operandoSignificado
IN0001 | 00000000Entrada → ACC
ADD [12]1001 | 00001100ACC + memoria[12] → ACC
STORE [13]0011 | 00001101ACC → memoria[13]
OUT0100 | 00000000ACC → salida
HALT0101 | 00000000Detener la búsqueda

De derecha a izquierda, las posiciones binarias valen 1, 2, 4, 8, 16 y así sucesivamente, duplicándose en cada paso. Por eso, en 00001100 solo las posiciones del 8 y del 4 contienen 1, y el valor es 8+4=128+4=12. La notación hexadecimal usa un solo símbolo para los valores de 0 a 15, y de 10 a 15 se escriben A, B, C, D, E y F, así que 12 se escribe C. El prefijo 0x indica hexadecimal: 0x00C, el binario 000000001100 y el decimal 12 representan el mismo número. Por ejemplo, 1001 selecciona la ADD que toma el número de memoria y 00001100 representa 12. Así, 1001 00001100 significa «suma el valor guardado en la dirección 12». El IR guarda estos bits y la unidad de control los decodifica. ADD es el nombre legible de ese código, no una palabra que el hardware entienda como inglés. En cambio, ADD 5 se codifica como 0010 00000101: el opcode 0010 elige un número escrito directamente en la instrucción y 00000101 es 5.

¿Por qué se separan los registros de instrucciones y de datos?

Supón que primero guardamos 5 en la dirección 12 y luego ejecutamos ADD [12]. Ahora el MDR debe recibir ese 5 desde la memoria. Si el MDR fuera nuestra única copia de la instrucción, esa lectura sustituiría la instrucción por 5. Por eso al buscar la instrucción, primero se copia en el IR: así podemos leer datos sin perder la operación que estamos realizando.

El reloj coordina cuándo cambian los valores almacenados. Una instrucción de programa no equivale necesariamente a un ciclo de reloj: la búsqueda, la decodificación y la ejecución pueden necesitar varios ciclos. La animación ralentiza las transferencias para que puedas examinarlas; los segundos que dura no miden la velocidad real de la CPU.

04

¿Tiene que esperar la siguiente instrucción a que termine del todo la anterior?

Ahora ya podemos seguir una instrucción. Imagina que repartimos su trabajo en cinco etapas: cuando la primera instrucción sale de la etapa de búsqueda, esa etapa puede empezar a buscar la siguiente mientras la primera se decodifica en otra etapa. Esta forma de solapar la ejecución se llama pipeline. Es una técnica de implementación, no un requisito inevitable de la arquitectura de von Neumann.

IF · Captación de instrucción

Lee la instrucción de la memoria.

ID · Decodificación / lectura de registros

Identifica la operación y obtén sus entradas.

EX · Ejecución

Realiza la operación aritmética o calcula una dirección.

MEM · Acceso a memoria

Lee o escribe datos cuando la instrucción lo requiere.

WB · Escritura de vuelta

Guarda el resultado en su registro de destino.

La siguiente demostración usa una máquina distinta de cinco etapas con registros R1, R2, … en lugar de un solo acumulador. Ri nombra la posición i del banco de registros. Cada fila es una instrucción y cada columna, un ciclo de reloj. Los bancos dorados entre etapas son registros de pipeline: guardan valores intermedios, los números de registro de destino y los bits de control entre flancos de reloj.

Ciclo 0 / 8
0 / 8 ciclos
I1 · R1 ← R2 + R3

Ciclo 0:Esta instrucción todavía no ha entrado en el pipeline.

IF—
ID—
EX—
MEM—
WB—
Instrucción / ciclo →12345678
I1: R1 ← R2 + R3IFIDEXMEMWB
I2: R4 ← R6 + R5IFIDEXMEMWB
I3: R7 ← R8 + R9IFIDEXMEMWB
I4: R10 ← R11 + R12IFIDEXMEMWB

Distintas instrucciones pueden usar etapas distintas a la vez.

En el ciclo 3, I1 se está ejecutando, I2 se está decodificando e I3 se está buscando. Los registros de segmentación entre etapas conservan la información intermedia de cada instrucción, de modo que en el ciclo siguiente cada una puede avanzar por separado sin mezclarse.

Primero supongamos que cada etapa dura un ciclo, que las instrucciones son independientes y que no hay esperas. Ejecutar cuatro instrucciones por separado cuesta 4×5=204 \times 5 = 20 ciclos. Al solaparlas, la primera tarda 5 ciclos y las 3 siguientes terminan una por ciclo: 8 en total. Para k instrucciones:

Tseparate=5kTpipeline=5+(k−1)=k+4\begin{gathered}T_{\mathrm{separate}}=5k\\T_{\mathrm{pipeline}}=5+(k-1)=k+4\end{gathered}

La primera instrucción sigue tardando cinco ciclos. Lo que mejora es el rendimiento: cuántas instrucciones terminan en un intervalo de tiempo. Cambia al ejemplo de dependencia de datos para ver por qué un pipeline real no siempre termina una instrucción por ciclo. Cuando el resultado que se necesita aún no está listo, hay que esperar, salvo que otro mecanismo, como el reenvío, pueda entregarlo antes de forma segura.

¿La búsqueda de instrucción y el acceso a datos pueden usar a la vez la misma memoria?

Si la memoria tiene un solo puerto de acceso, no. Una lectura o escritura en la etapa MEM puede entrar en conflicto con la IF, lo que exige esperar o usar otra organización de la memoria. Las instrucciones de la tabla solo suman registros, así que su etapa MEM se limita a pasar los valores sin acceder a la memoria. Por eso el ejemplo no supone que una memoria de un solo puerto complete dos accesos a la vez.

Comprueba: ¿la señal azul de dirección lleva la respuesta?

No. Solo indica una ubicación. La señal de datos lleva el contenido y la señal de control dice si se lee o se escribe. Para guardar una respuesta hacen falta las tres funciones.

Inicia sesión para ver más

Inicia sesión para continuar el resto de esta lección y mantener tu progreso sincronizado.