Mesin RAM


Bagian I
Bagian II
Bagian III
Bagian iv
Bagian v


Artikel 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 1
1100 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 nbilangan 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 1
1101 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
1401
1101
2001
1300
1101
2000
0010

Untuk menghitung nDalam hal perkembangan aritmatika, perlu memuat istilah pertama di sel ke-0 a0, di sel pertama memuat perbedaan perkembangan aritmatika d.
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 nkali.


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.

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


All Articles