Máquina RAM


Parte I
Parte II
Parte III
Parte iv
Parte v


Um artigo sobre a máquina RAM já foi publicado na Habré.
Em geral, um artigo sobre uma máquina de RAM está na Wikipedia.

Os autores da máquina RAM , mencionados no livro "Compilação e análise de algoritmos computacionais": Aho, Hopcroft, Ulman - possuem um conjunto limitado de instruções aritméticas (adição, subtração, multiplicação, divisão), um comando de salto incondicional, dois comandos de salto condicional. No nosso caso, das equipes aritméticas, haverá apenas adição e subtração , os comandos de ramificação (transição) serão idênticos aos comandos fornecidos no livro.

A diferença entre o Little Man Computer (que descrevi nas partes anteriores do ciclo) da máquina RAM é o mecanismo que fornece endereçamento indireto (a capacidade de trabalhar com um número armazenado na memória como endereço).

Para trabalhar com o número armazenado na memória como endereço, conecte à entrada de endereço da Memória de Dados um multiplexador MUX que selecione entre o próprio endereço (proveniente da Memória de Comando ) e o número que representa o endereço e armazenado na Memória de Dados .



Carregaremos um número da memória no registro sempre que um novo comando for buscado na Memória de Comando . Quando você alterna o multiplexador MUX, ele vai para o endereço registrado no registro de endereços.



Também carregaremos, carregaremos o endereço de comando na bateria Acc como um número, para isso aumentaremos a profundidade de bits da entrada de endereço do multiplexador, que seleciona os dados a serem carregados na bateria Ass . O endereço é carregado na quarta entrada do multiplexador.



O processamento do comando será realizado em duas medidas. Para fazer isso, conecte dois flip-flops D ao relógio, que serão trocados quando um sinal de relógio chegar.



O 1º ciclo carrega o endereço no registrador de endereços, o 2º ciclo carrega o número no acumulador Acc ou na memória de dados .

Conecte 2 sinalizadores à bateria:

1. Sinalizar Acc = 0 . A bandeira é levantada se o conteúdo de Ass for zero.

2. Sinalizar Acc> 0 . A bandeira é levantada se o conteúdo de Ass for maior que zero.


O resultado é um esquema desse tipo, que pode ser baixado aqui.



A linha que vai para a entrada permissiva da bateria é necessária para que o circuito não fique com erros.

Desative alguns comandos e escreva um programa que carrega a célula zero da Memória de Dados no endereço armazenado na célula zero. No ciclo, aumentaremos o valor da célula zero em um. T.O. preencheremos a memória de dados com números de série.

1401 carregar em Acc o número 1
1100 adicione o número em Acc ao número na célula zero
2000 salve o resultado na célula zero
2080 carrega o número de Acc no endereço referenciado pela célula zero
0010 pula para o início do programa




Escreveremos um programa resumindo nnúmeros naturais.
Escreveremos números naturais na 1ª célula e sua soma na 0ª célula.
Primeiro, escreva um programa que carrega números naturais na primeira célula
1401 carregar em Acc o número 1
1101 adicione o número em Acc ao número na 1ª célula
2001 salve o resultado na 1ª célula

Na célula 0, realizaremos a soma. Depois de aumentar o número na 1ª célula, você precisa adicionar esse número à 0ª célula.
1300 carregam em Acc o número da célula 0
1101 adicione o número em Acc ao número na 1ª célula
2000 salve o resultado na célula 0
0010 pula para o início do programa

Texto completo do programa
1401
1101
2001
1300
1101
2000
0010

Para calcular nEm termos de progressão aritmética, é necessário carregar o primeiro termo na 0ª célula a0, na primeira carga de célula, a diferença da progressão aritmética d.
Em seguida, você precisa resumir:
1300 carregam em Acc o número da célula 0
1101 adicione o número em Acc ao número na 1ª célula
2000 salve o resultado na célula 0
Em seguida, você precisa recuar 3 equipes e repetir esse conjunto de operações nvezes.


O emulador de uma máquina RAM clássica (com fitas de leitura / gravação separadas) pode ser baixado aqui .



Vamos verificar como funciona o circuito composto por dois disparadores-d. Este circuito fornece um modo de dois relógios.
Vamos escrever o esquema de um d-trigger regular (sem redefinir e ativar). Ele terá duas portas de entrada - uma porta de dados e uma porta de relógio.
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 


O LED led mostra o status do d-trigger.
Conectamos dois dffs ao circuito comum.
O status do primeiro d-trigger será indicado pelo LED q1_led .
O status do segundo d-trigger será indicado pelo LED q2_led .
Nós emitimos o sinal do relógio para um 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 

O modelo RTL do módulo dff_dff se parece com isso

Este circuito não funcionará em todas as placas; em algumas placas, é necessário inicializar os d-flip-flops. Pelo mesmo motivo, esse esquema não será simulado no ModelSim.

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


All Articles