Máquina de RAM


Parte 1
Parte II
Parte III
Parte iv
Parte v


Ya se ha publicado un artículo sobre la máquina RAM en Habré.
En general, un artículo sobre una máquina RAM está en Wikipedia.

La máquina RAM , que se menciona en el libro "Compilación y análisis de algoritmos computacionales" autores: Aho, Hopcroft, Ulman - tiene un conjunto limitado de instrucciones aritméticas (suma, resta, multiplicación, división), un comando de salto incondicional, dos comandos de salto condicional. En nuestro caso, de los equipos de aritmética, solo habrá suma y resta , los comandos de ramificación (transición) serán idénticos a los comandos dados en el libro.

La diferencia entre Little Man Computer (que describí en las partes anteriores del ciclo) de la máquina RAM es el mecanismo que proporciona direccionamiento indirecto (la capacidad de trabajar con un número almacenado en la memoria como una dirección).

Para trabajar con el número almacenado en la memoria como una dirección, conecte a la entrada de dirección de la Memoria de datos un multiplexor MUX que selecciona entre la dirección en sí (proveniente de la Memoria de comandos ) y el número que representa la dirección y se almacena en la Memoria de datos .



Cargaremos un número de la memoria en el registro cada vez que se obtenga un nuevo comando de la Memoria de comandos . Cuando cambia el multiplexor MUX, va a la dirección registrada en el registro de direcciones.



También cargaremos la carga de la dirección del comando en la batería Acc como un número, para esto aumentaremos la profundidad de bits de la entrada de dirección del multiplexor, que selecciona los datos que se cargarán en la batería Ass . La dirección se carga en la cuarta entrada del multiplexor.



El procesamiento del comando se realizará en dos medidas. Para hacer esto, conecte dos flip-flops D al reloj, que se cambiarán entre sí cuando llegue una señal de reloj.



El primer ciclo carga la dirección en el registro de direcciones, el segundo ciclo carga el número en el acumulador Acc o en la memoria de datos .

Conecte 2 banderas a la batería:

1. Indicador Acc = 0 . La bandera se levanta si el contenido de Ass es cero.

2. Marcar Acc> 0 . La bandera se levanta si el contenido de Ass es mayor que cero.


El resultado es un esquema de este tipo, que se puede descargar desde aquí.



La línea que va a la entrada permisiva de la batería es necesaria para que el circuito no tenga errores.

Apagamos algunos comandos y escribimos un programa que carga la celda cero de la Memoria de Datos en la dirección almacenada en la celda cero. En el ciclo, aumentaremos el valor de la celda cero en uno. T.O. llenaremos la memoria de datos con números de serie.

1401 carga en Acc el número 1
1100 agregue el número en Acc al número en la celda cero
2000 guardar el resultado en la celda cero
2080 carga el número de Acc en la dirección referenciada por la celda cero
0010 saltar al comienzo del programa




Escribiremos un programa resumiendo nNúmeros naturales.
Escribiremos números naturales en la primera celda y su suma en la celda 0.
Primero, escriba un programa que cargue números naturales en la primera celda
1401 carga en Acc el número 1
1101 agregue el número en Acc al número en la primera celda
2001 guardar el resultado en la primera celda

En la celda 0, realizaremos la sumatoria. Después de aumentar el número en la primera celda, debe agregar este número a la celda 0.
1300 cargar en Acc el número de la celda 0
1101 agregue el número en Acc al número en la primera celda
2000 guardar el resultado en la celda 0
0010 saltar al comienzo del programa

Texto completo del programa.
1401
1101
2001
1300
1101
2000
0010

Para calcular nEn términos de progresión aritmética, es necesario cargar el primer término en la celda 0 a0, en la primera celda de carga la diferencia de la progresión aritmética d.
A continuación, debe resumir:
1300 cargar en Acc el número de la celda 0
1101 agregue el número en Acc al número en la primera celda
2000 guardar el resultado en la celda 0
A continuación, debe saltar 3 equipos hacia atrás y repetir este conjunto de operaciones. ntiempos


El emulador de una máquina RAM clásica (con cintas de lectura / escritura separadas) se puede descargar desde aquí .



Veamos cómo funciona el circuito que consta de dos d-triggers. Este circuito proporciona un modo de dos relojes.
Escribamos el esquema de un d-trigger regular (sin reinicio y habilitación). Tendrá dos puertos de entrada: un puerto de datos y un puerto de reloj.
module dff ( input [1:0] key, output led ); wire clk; assign clk = key [0]; //   wire d = key [1]; //   reg q; always @(posedge clk) q <= d; assign led = q; endmodule 


El LED led muestra el estado del d-trigger.
Conectamos dos dffs al circuito común.
El estado del primer d-trigger se indicará mediante el LED q1_led .
El estado del segundo disparador d se indicará mediante el LED q2_led .
Emitimos la señal del reloj a un LED q3_led separado.

 module dff_dff ( input clk, output q1_led, q2_led,q3_led ); assign q3_led = clk; wire d1_in; assign d1_in=~q2_led; dff dff1( .clk(clk), .d(d1_in), .q(q1_led) ); wire d2; assign d2=q1_led; dff dff2( .clk(clk), .d(d2), .q(q2_led) ); endmodule 

El modelo RTL del módulo dff_dff se ve así

Este circuito no funcionará en todas las placas; en algunas placas, es necesario inicializar d-flip-flops. Por la misma razón, dicho esquema no se simulará en ModelSim.

Source: https://habr.com/ru/post/es432726/


All Articles