MICROHW1

Entendiendo la arquitectura Von Newmann

JohnvonNeumann-LosAlamos

John von Neumann nació en la ciudad de Budapest (Antiguo imperio austrohúngaro) el 28 de diciembre de 1803. Su padre era un banquero judío que se casó con una mujer de una familia muy adinerada de Pest. Desde pequeño tenía mucho talento y recibió clases particulares de matematicas por recomendación de sus profesores. Era un niño superdotado.

Tras estudiar y doctorarse en matemáticas en Europa comenzó a viajar a Estados Unidos y fué con la llegada de los nazis al poder cuando él y muchos otros judíos tuvieron que establecerse en otros paises. En su caso Estados Unidos.

Von Newmann participó en el proyecto Manhattan el cual fué el precursor de la bomba atómica.
Aparte de esto, Von Newmann ha realizado contribuciones exitosas en campos como el análisis funcional, teoría de conjuntos, física cuántica, teoría de juegos, ciencias de la computación, economía, análisis numérico, cibernética, hidrodinámica, estadística y muchos otros.

John von Neumann diseño una arquitectura para computadoras la cual está vigente en la actualidad puesto que en mayor o menor medida, todos los ordenadores se basan en la misma.

Este modelo esta basado en tres características básicas las cuales definen cómo va a funcionar el ordenador:

  • 1. El ordenador está dividido en 4 subsistemas:
    1. La memoria.
      La ALU o UAL (Unidad Aritmético Lógica).
      La Unidad de Control.
      El sistema de Entrada/Salida (I/O System).
  • 2. Los programas tienen que estar almacenados en memoria durante su ejecución.
  • 3. Los programas se ejecutan de manera secuencial.
  • vonnewmanndiseño

    La memoria se encarga de almacenar los datos y los programas (los cuales son un conjunto de instrucciones que se ejecutarán de forma secuencial y que realizarán una tarea concreta).

    El procesador está compuesto por una Unidad de Control la cual es la encargada de ejecutar todos y cada uno de los programas y una Unidad Aritmético lógica la cual es la “calculadora” del sistema la cual realizará operaciones aritmética (sumas, restas,etc) y operaciones lógicas (and, or, not, etc) requeridas por los programas.

    Además, deberá existir una unidad de entrada/salida la cual comunique el equipo con el exterior. Antiguamente la comunicación no era mediante teclado, ratón y pantalla. Las tarjetas perforadas eran el método de comunicación con el exterior de muchos ordenadores.

    tarjetaperforada

    La fotografía anterior era un ejemplo de tarjeta la cual se perforaba y servía tanto para enviar información al ordenador como para recibir información del mismo.

    La memoria

    La memoria también se denominará RAM (Random Access Memory – Memoria de acceso aleatorio) la cual consiste en una serie de celdas (cada una contiene una serie de bits). Cada bit en la celda tendrá almacenado alguno de estos valores: 0, 1 o nada. Generalmente en cada celda hay un byte (1 byte = 8 bits).

    Todas estas celdas tienen una dirección determinada. La unidad mínima de la memoria es la celda la cual podrá leerse o escribirse de forma completa.

    El tiempo que tarda el sistema para leer o escribir en las celdas es el mismo para cualquiera de ellas.

    Como se ha dicho, los programas son una serie de instrucciones que se ejecutan en el procesador y que para ejecutarse tienen que estar en memoria. También los datos de estos programas deberán estar en memoria.

    memoria

    Veamos la imagen anterior. En ella puedes ver que cada celda de memoria ocupará 1 byte.

    La memoria como puedes ver tiene una serie de celdas 0, 1, 2N-1 las cuales tienen una dirección en binario. Si nuestro sistema utiliza 2 bytes (16 bits) para direccionar la memoria, la celda 1 se expresaría en binario como 0000000000000001. Cuando queramos acceder a la celda 1 le tendremos que decir al sistema que queremos acceder a la celda 0000000000000001.

    Por lo tanto podremos tener (como mucho) 2N celdas, lo que implica que podremos tener desde la celda 0000000000000000 a la celda 1111111111111111.

    Ten en cuenta que tienes que distinguir la diferencia entre:

  • Dirección de una celda de memoria. La dirección se expresa con un número binario (2 bytes) e indica en qué lugar de memoria se encuentran los datos.
  • Contenido de una celda de memoria. La dirección de memoria tiene un contenido (en nuestro ejemplo 1 byte/8 bits).
  • Ten en cuenta también que dependiendo del número de bits que utilicemos para direccionar una celda de memoria, la capacidad de memoria será mayor o menor.

    Con una dirección de memoria de N bits, podré tener un espacio de direcciones de 2N direcciones (de la 0 a la 2N-1).

    Tiempo de acceso a memoria.

    Es el tiempo que tarda la memoria en hacer una operación de lectura o escritura. Se suele medir en nanosegundos. Un nanosegundo es la milmillonésima parte de un segundo.

    ¿Qué operaciones se pueden realizar con la memoria?

  • Lectura (dirección). Leer de una dirección de memoria equivale a obtener el contenido de una celda concreta. La lectura no modifica el valor de la celda el cual permanece inalterado.
  • Almacenar (dirección,valor). Escribir en una dirección de memoria equivale a volcar el contenido de un registro en una celda concreta. La escritura modifica el valor de la celda.
  • Por lo tanto, a la memoria deberemos de enviarle una señal de lectura o escritura y tendremos que tener un registro de direcciones y un registro de datos.

    operacionlecturaescritura

    Veamos paso a paso cómo funcionan las operaciones de lectura y escritura.

    Operación de lectura (dirección):

  • Se carga la dirección en el registro de direcciones.
  • Se decodifica la dirección (se localiza la celda de memoria en cuestión).
  • Se copia el contenido de la celda de memoria en el registro de datos.
  • Operación de escritura (dirección , valor):

  • Se carga la dirección en el registro de direcciones.
  • Se carga el valor o dato que se quiere escribir en el registro de datos.
  • Se decodifica la dirección (se localiza la celda de memoria en cuestión).
  • Se copia el contenido del registro de datos en la celda de memoria seleccionada.
  • Subsistema de Entrada/Salida

    Controla los dispositivos que van a permitir al sistema comunicarse con el exterior (pantalla, teclado, impresora, ratón, etc.). También permite al sistema almacenar información en dispositivos de almacenamiento secundario como discos duros, etc.

    ¿Sabías que…?.

    El tiempo que tarda la memoria en hacer una operación se suele medir en nanosegundos mientras que en los discos duros se mide en milisegundos.

    La UAL o ALU

    La Unidad Aritmético Lógica es un circuito integrado que realiza operaciones aritméticas (+, -, x, /, …) y lógicas (=, <, >, and, or, not, …).

    Consiste en un conjunto de circuitos para realizar las operaciones y una serie de registros que almacenan los resultados intermedios.

    También necesita un bus que interconecta dichos registros con la circuitería que realiza las operaciones.

    alu

    Como puedes ver en el esquema anterior la ALU es capaz de coger hasta dos operandos y realizar la operación que se le indique. El resultado lo suele almacenar en un registro al que podemos llamar acumulador (ACC).

    La Unidad de control o UC

    Los programas como hemos explicado son un conjunto de instrucciones que se almacenan en memoria. Esas instrucciones están en binario que es el lenguaje que entiende la máquina (también se les llama instrucciones máquina).

    La UC se encarga de ir ejecutando una a una las instrucciones. Los pasos que da para ejecutarlas son los siguientes:
    1. Leer la instrucción de memoria.
    2. Decodificarla o lo que es lo mismo, conocer la operación a realizar.
    3. Ejecutarla. Para ello la unidad de control deberá enviar las señales apropiadas a la ALU, a la memoria y al subsistema de entrada/salida.
    4. Continuar ejecutando instrucciones hasta que se encuentre con una instrucción de fin (HALT).

    Las instrucciones máquina.

    Una instrucción binaria o en lenguaje máquina esta compuesta por 2 campos:

  • El código de operación
  • Los valores o direcciones de memoria donde están dichos valores para realizar la operación.
  • instrucción

    Imagina que la instrucción de la imagen anterior es SUMA A + B. El código de la suma es el 105 o 1101001 en binario mientras que los datos A y B son 7291 y 15484 que en binario serían 0001110001111011 y 0011110001111100 respectivamente.

    CISC vs RISC

    Los ordenadores pueden tener dos tipos de instrucciones:

  • Pocas y simples y que se ejecuten muy rápido (dado que la circuitería es menor). Esta arquitectura se denomina RISC.
  • Muchas y complejas que y tarden más en ejecutarse. Estas instrucciones complejas equivalen a varias simples. Tardan más pero hacen más trabajo. Esta arquitectura se denomina CISC.
  • Nuestra máquina HW1

    Llegados a este punto vamos a trabajar con una máquina “inventada” que sigue la filosofía Von Newmann y que nos va a servir para ver cómo funciona un ordenador básico y cómo ejecuta las instrucciones.

    Ten en cuenta que nuestro micro como hemos dicho es inventado. Este micro no existe y obviamente el funcionamiento de los micros es mucho más complicado que el que vamos a ver. No obstante, al hacerlo más simple nos va a permitir entender mejor el concepto y trabajar con él de una forma más directa.

    En primer lugar vamos a ver qué componentes tendría nuestro ordenador básico:

    MICROHW1

    Como se puede ver en la imagen anterior se pueden diferenciar los siguientes componentes:

  • UC. La unidad de control o UC nos va a permitir ejecutar los programas en nuestro microprocesador de ejemplo. Es la encargada de activar la circuitería para realizar las operaciones necesarias.
  • Memoria. Almacenará el código del programa que vayamos a ejecutar y los datos del mismo.
  • ALU. Unidad Aritmético Lógica. Encargada de ejecutar las operaciones. Puede tomar dos operandos como máximo y el resultado de la operación lo almacena en un buffer llamado acumulador o ACC. El contenido del acumulador se puede volcar como se puede observar en un operando.
  • ACC. Es un buffer donde se almacena el resultado de las operaciones realizadas.
  • Registros (A-J). Nos van a permitir almacenar los resultados intermedios de las operaciones que realicemos en nuestro micro.
  • Buffer de teclado. Almacena las pulsaciones de las teclas de un hipotético teclado. Cuando se pulsa una tecla se almacena en el buffer de teclado y nos va a permitir leer esos datos para luego procesarlos.
  • Memoria de vídeo. Nos va a permitir comunicarnos con el exterior. Cualquier dato que llevemos a la memoria de vídeo aparecerá en pantalla.
  • Instrucciones de nuestra máquina HW1

    Operaciones aritméticas:

  • SUMA ACC RX
  • Esta instrucción suma el contenido del Acumulador y el registro RX (puede ser RA – registro A -, RB – registro B -, etc.) y el resultado lo vuelve a colocar en el acumulador. Un ejemplo de esta instrucción sería SUMA ACC RC.

  • RESTA RX ACC
  • Esta instrucción resta al contenido del Acumulador el registro RX (puede ser RA – registro A -, RB – registro B -, etc.) y el resultado lo vuelve a colocar en el acumulador. Un ejemplo de esta instrucción sería RESTA RC ACC.

    Lectura de teclado:

  • READ RX
  • Esta instrucción lee por teclado un dato y lo coloca en el registro que digamos (registro RX – la X podrá ser A, B,…J).

    Escritura por pantalla:

  • PRINT RX
  • Esta instrucción saca por pantalla el contenido del registro que digamos (registro RX – la X podrá ser A, B,…J).

  • PRINT “TEXTO”
  • Esta instrucción saca por pantalla el texto que nosotros decidamos. Por ejemplo PRINT “Fin de la ejecución” mostrará por pantalla “Fin de la ejecución”.

    Instucciones de asignación:

  • MOVE RX ACC
  • Esta instrucción copia el contenido del Acumulador en el Registro que digamos (registro RX – la X podrá ser A, B,…J).

  • MOVE ACC RX
  • Esta instrucción copia el contenido de un Registro en el Acumulador.

  • MOVE ACC DATO
  • Esta instrucción coloca un dato concreto en el Acumulador. Por ejemplo MOVE ACC 5 colocará en el Acumulador el número 5.

    Instrucciones de salto:

  • JMP SI CERO INSTX
  • Estas instrucciones de salto permiten romper la secuencialidad de las órdenes. Por ejemplo, esta instrucción saltaría a la instrucción X si el contenido del Acumulador es 0. La instrucción JMP SI CERO 15 salta a la instrucción 15 si el contenido del Acumulador es 0.

  • JMP SI NO CERO INSTX
  • Esta instrucción salta a la instrucción X si el contenido del Acumulador NO es 0. La instrucción JMP SI CERO 15 salta a la instrucción 15 si el contenido del Acumulador NO es 0.

  • JMP INSTX
  • Esta instrucción salta a la instrucción X independientemente del contenido del Acumulador.

    Ejercicios (máquina HW1)

    Realiza un programa con instrucciones de la máquina HW1 que lea dos datos por teclado y muestre por pantalla la suma.

    Solución (Utilizo “//” para indicar que esta línea es un comentario – no son órdenes):

    READ RA
    READ RB
    // Leemos los dos números a sumar en los registros A y B.
    // El resultado lo guardamos en el C y después de eso lo sacamos por pantalla.
    MOVE ACC RB
    // Movemos el sumando B al acumulador y realizamos la suma
    SUMA ACC RA
    // Sumamos el acumulador que contenía B con RA que contiene A
    MOVE RC ACC
    // El resultado lo llevamos al registro C
    PRINT “LA SUMA ES:”
    PRINT RC
    // Sacamos el resultado por pantalla.

    Realiza un programa con instrucciones de la máquina HW1 que lea TRES datos por teclado y muestre por pantalla la suma.

    Solución (Utilizo “//” para indicar que esta línea es un comentario – no son órdenes):
    // Este ejercicio es muy parecido al anterior.
    // Nos servimos del mismo para adaptarlo y solucionar el problema.
    READ RA
    READ RB
    READ RC
    // Leemos los dos números a sumar en los registros A, B y C.
    // El resultado lo guardamos en el D y después de eso lo sacamos por pantalla.
    MOVE ACC RB
    // Movemos el sumando B al acumulador y realizamos la suma
    SUMA ACC RA
    SUMA ACC RC
    // Sumamos el acumulador que contenía B con RA que contiene el sumando A y RC que contiene el sumando C.
    MOVE RD ACC
    // El resultado lo llevamos al registro D
    PRINT “LA SUMA ES:”
    PRINT RD
    // Sacamos el resultado por pantalla.

    Realiza un programa con instrucciones de la máquina HW1 que muestre por pantalla del 1 al 10.

    Solución (Utilizo “//” para indicar que esta línea es un comentario – no son órdenes):
    MOVE ACC 11
    MOVE RB ACC
    //Coloco un 11 en el registro B que lo voy a utilizar como tope.
    //Utilizo un contador que lo almaceno en el registro A y cuando este llegue a 11 el programa termina.
    //Ten en cuenta que pongo 11 porque quiero que muestre el número 10 por pantalla
    //(si colocase un 10 el programa no muestra el último número).
    MOVE ACC 1
    MOVE RA ACC
    // El contador (RA) lo inicializo a 1.

    BUCLE:
    PRINT RA
    MOVE ACC 1
    SUMA ACC RA
    MOVE RA ACC
    // En las instrucciones anteriores saco el contenido del registro A y le sumo 1 (hago esto hasta que llegue a 11).
    MOVE ACC RB
    RESTA ACC RA
    // Le resto al registro A 11. Si me da 0 es que tiene que finalizar el programa.
    // En caso contrario hago que vuelva a bucle para que siga ejecutándose el programa ya que no ha llegado a 11 el contador.
    JMP SI NO CERO BUCLE
    PRINT “FIN DEL PROGRAMA”

    Resumen
    Nombre del artículo
    Entendiendo la arquitectura Von Newmann
    Autor
    Descripción
    En este artículo se describe cómo funciona la arquitectura Von Newmann y se explican varios ejercicios para practicar con estos conceptos.

    Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

    Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>