Parte IParte IIParte IIIParte ivParte vUm
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
11100 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
nú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
11101 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
1401110120011300110120000010Para calcular
Em termos de progressão aritmética, é necessário carregar o primeiro termo na 0ª célula
, na primeira carga de célula, a diferença da progressão aritmética
.
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
vezes.
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.