Parte 1Parte IIParte IIIParte ivParte vYa 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
11100 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
Nú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
11101 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.
1401110120011300110120000010Para calcular
En términos de progresión aritmética, es necesario cargar el primer término en la celda 0
, en la primera celda de carga la diferencia de la progresión aritmética
.
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.
tiempos
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.