Bagian IBagian IIBagian IIIBagian ivBagian vArtikel tentang
mesin RAM telah diterbitkan di Habré.
Secara umum,
artikel tentang
mesin RAM ada di Wikipedia.
Mesin RAM , yang disebutkan dalam buku "Kompilasi dan Analisis Algoritma Komputasi" penulis: Aho, Hopcroft, Ulman - memiliki serangkaian instruksi aritmatika terbatas (penambahan, pengurangan, perkalian, pembagian), perintah lompatan tanpa syarat, dua perintah lompatan bersyarat. Dalam kasus kami, dari tim aritmatika, hanya akan ada
penambahan dan
pengurangan , perintah cabang (transisi) akan identik dengan perintah yang diberikan dalam buku ini.
Perbedaan antara
LIttle Man Computer (yang saya jelaskan di bagian sebelumnya dari siklus) dan
mesin RAM adalah mekanisme yang menyediakan pengalamatan tidak langsung (kemampuan untuk bekerja dengan nomor yang disimpan dalam memori sebagai alamat).
Agar dapat bekerja dengan nomor yang disimpan dalam memori sebagai alamat, sambungkan ke input alamat
dari Memori Data multiplekser MUX yang memilih antara alamat itu sendiri (berasal dari
Memori Perintah ) dan nomor yang mewakili alamat dan disimpan dalam
Memori Data .

Kami akan memuat nomor dari memori ke register setiap kali perintah baru diambil dari
Memori Perintah . Ketika Anda mengganti
multiplexer MUX, itu pergi ke alamat yang dicatat dalam register alamat.

Kami juga akan memuat, memuat alamat perintah ke baterai
Acc sebagai angka, untuk ini kami akan meningkatkan kedalaman bit dari input alamat multiplexer, yang memilih data yang akan dimuat ke dalam
Ass baterai. Alamat tersebut dimuat pada input ke-4 dari multiplexer.

Pemrosesan perintah akan dilakukan dalam dua langkah. Untuk melakukan ini, sambungkan dua D-flip-flop ke jam, yang akan saling beralih ketika sinyal jam tiba.

Siklus 1 memuat alamat ke register alamat, siklus 2 memuat nomor ke dalam akumulator
Acc atau ke
memori Data .
Hubungkan 2 bendera ke baterai:
1. Tandai
Acc = 0 . Bendera dinaikkan jika konten
Ass adalah nol.
2. Tandai
Acc> 0 . Bendera dinaikkan jika konten
Ass lebih besar dari nol.

Hasilnya adalah skema seperti itu, yang dapat
diunduh dari sini.
Jalur menuju input permisif baterai diperlukan agar sirkuit tidak bermasalah.
Matikan beberapa perintah dan tulis program yang memuat sel nol
Memori Data di alamat yang disimpan di sel nol. Dalam siklus, kita akan meningkatkan nilai sel nol satu. T.O. kami akan mengisi
memori data dengan nomor seri.
1401 memuat dalam
Acc angka
11100 menambahkan angka dalam
Acc ke nomor dalam sel nol
2000 menyimpan hasilnya dalam sel nol
2080 memuat nomor dari
Acc di alamat yang dirujuk oleh sel nol
0010 melompat ke awal program

Kami akan menulis ringkasan program
bilangan alami.
Kami akan menulis angka alami di sel 1, dan jumlah mereka di sel 0.
Pertama, tulis sebuah program yang memuat bilangan asli di sel pertama
1401 memuat dalam
Acc angka
11101 menambahkan nomor dalam
Acc ke nomor di sel 1
2001 menyimpan hasilnya di sel 1
Di sel 0, kami akan melakukan penjumlahan. Setelah menambah angka di sel 1, Anda perlu menambahkan nomor ini ke sel 0.
1300 memuat
Acc nomor dari sel 0
1101 menambahkan nomor dalam
Acc ke nomor di sel 1
2000 menyimpan hasilnya di sel ke-0
0010 melompat ke awal program
Teks lengkap program
1401110120011300110120000010Untuk menghitung
Dalam hal perkembangan aritmatika, perlu memuat istilah pertama di sel ke-0
, di sel pertama memuat perbedaan perkembangan aritmatika
.
Selanjutnya, Anda perlu meringkas:
1300 memuat
Acc nomor dari sel 0
1101 menambahkan nomor dalam
Acc ke nomor di sel 1
2000 menyimpan hasilnya di sel ke-0
Selanjutnya, Anda perlu melompat 3 tim kembali dan mengulangi rangkaian operasi ini
kali.
Emulator mesin RAM klasik (dengan kaset baca / tulis terpisah) dapat diunduh
dari sini .
Mari kita periksa bagaimana rangkaian yang terdiri dari dua pemicu d bekerja. Sirkuit ini menyediakan mode dua jam.
Mari kita menulis skema pemicu d biasa (tanpa reset dan aktifkan). Ini akan memiliki dua port input - port data dan port jam.
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
LED yang
dipimpin menunjukkan status pemicu-d.
Kami menghubungkan dua
dff ke sirkuit umum.
Status pemicu d pertama akan ditunjukkan oleh LED
q1_led .
Status pemicu d-kedua akan ditunjukkan oleh LED
q2_led .
Kami mengeluarkan sinyal jam ke LED
q3_led terpisah.
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
Model RTL dari modul
dff_dff terlihat seperti ini

Sirkuit ini tidak akan bekerja pada semua papan, pada beberapa papan, perlu menginisialisasi d-flip-flop. Untuk alasan yang sama, skema seperti itu tidak akan disimulasikan di ModelSim.