Desain CPU yang sangat sederhana di LogiSim


8

Saat ini saya masih sekolah menengah pertama, dan saya sudah tertarik dengan teknik komputer / elektro, khususnya desain mikroprosesor. Saya telah membaca Kode oleh Charles Petzold ,, dan telah mulai membaca Wikibook Desain Mikroprosesor (yang tampaknya tidak lengkap.) Melalui membaca Kode , saya memahami logika dasar di balik CPU, dan mulai membangun satu di LogiSim. Bab 17 dalam Kode merinci CPU yang ingin saya bangun, tetapi sirkuit tidak memiliki komponen utama - sinyal jam, dan decoding instruksi. Beberapa sinyal clock tampaknya cukup jelas (PC tampaknya membutuhkan sinyal clock yang stabil) tetapi yang lain (seperti cara mengunci nilai RAM) Saya harus memikirkan dan mencoba untuk bekerja.

Saya dapat membangun akumulator yang berfungsi (itu tidak dapat secara akurat disebut ALU, saya pikir, karena tidak memiliki bagian L) yang beralih antara penambahan dan pengurangan dengan satu input, dan saya mengerti ini yang saya butuhkan untuk bagian aritmatika - begitu saya mendapatkan opcodes lompat bekerja, saya dapat menerapkan perkalian dan pembagian dalam kode. Bagian yang saya perjuangkan adalah decoding instruksi. Melalui beberapa pencarian google, saya melihat bahwa setiap opcode perlu diinterpretasikan sebagai beberapa microinstructions, tetapi saya bingung bagaimana saya membutuhkan ini untuk bekerja. Saat ini, instruksi decoder saya hanyalah rangkaian analisis kombinasional dengan output biner tunggal untuk setiap opcode - 13 secara keseluruhan.

Cara kode bekerja adalah ia memiliki satu nilai kode 8 bit (saya hanya menggunakan byte low-end), dan kemudian dua nilai alamat 8 bit terpisah yang kemudian saya gabungkan menjadi input alamat 16 bit ke RAM. Untuk mengunci nilai, saya memiliki penghitung terpisah yang menghitung hingga 10b dan kemudian reset ke 00b. Ini adalah input jam untuk setiap kait secara bergantian (untuk tiga kait, ada a, b, dan c. Jam kedua memiliki be 1 sedangkan b & c adalah 0, kemudian b adalah 1 dan 1 & c adalah 0, lalu c adalah satu dan 1 & b adalah 0, lalu reset). Tetapi pada instruksi seperti ADD 000Ah, PC melompat ke 000AH ... yang seharusnya ditambahkan ke dalam akumulator, tetapi sebenarnya terkunci ke dalam kait kode, dan kemudian ditafsirkan sebagai opcode berikutnya, yang membuat semuanya berjalan gila.

Saya merasa seperti saya kehilangan beberapa informasi besar mengenai decoding instruksi dan bagaimana saya perlu melakukan sinyal jam ...

Berikut adalah file .circ LogiSim: https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdder.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdderSubtractor.circ https // dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitInverter.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitLatch.circ https://dl.dropboxusercontent.com/u/6167645/Petzold ID.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/PetzoldMk5.circ

PetzoldMk5 adalah CPU utama, bergantung pada file lain yang akan diimpor sebagai perpustakaan.

Berikut daftar opcode (semua biner):

Load                 0001
Add                  0010
Add w/ Carry         0011
Sub                  0100
Sub w/ Borrow        0101
Jump                 0110
Jump w/ Carry        0111
Jump W/ 0            1000
Jump w/o C           1001
Jump W/o 0           1010
Store                1011
Halt                 1100
Reset                1101

1
Apakah Anda bersedia membagikan file .circ Logisim CPU yang ada? Dan hanya untuk membuat hidup sedikit lebih rumit, Anda harus hati-hati membaca dan memahami bantuan Logisim, di bawah judul "Propagasi Nilai." Jika belum, sudah. (Anda mungkin telah, mengingat semua pekerjaan yang telah Anda lamar. Sangat senang mendengar Anda menerima ini!)
Jonk

@jon terima kasih atas kata-kata yang bagus. Mengedit posting dengan file .circ yang terkait.
Will Hodges

Apakah itu 6 file, semuanya? (Saya menganggap ini untuk LogiSim 2.7.1, 2011?)
Jon

@ Oke ya, itu, pada kedua pertanyaan
Will Hodges

Bagaimana Anda menangani pengurangan? Apakah Anda menggunakan / Q dari kait input ke salah satu input A / B ALU Anda dan memodifikasi carry-in? Atau metode lain?
Jonk

Jawaban:


3

Benci untuk memposting "tautan saja" seperti jawaban, tapi saya pikir Anda harus menyadari pekerjaan Warren Toomey dengan CPU di Logisim, karena mungkin itulah yang Anda cari.

Dia memiliki beberapa tutorial membangun CPU yang cukup sederhana di sini ...

http://minnie.tuhs.org/CompArch/Tutes/

Dan jika itu tidak melayang perahu Anda, ia memiliki CPU yang lebih canggih di sini ...

http://minnie.tuhs.org/Programs/UcodeCPU/

... Semuanya dijelaskan dengan baik, dan memiliki unduhan ke file .circ.


CPU / komputer DIY yang hebat, dan bisa dibilang lebih fungsional adalah Magic-1 yang ditemukan di http://www.homebrewcpu.com/ . Meskipun tidak dilakukan di Logisim, ini didokumentasikan dengan cukup baik, termasuk gambar, skema, deskripsi. Ini juga lebih dari sekedar CPU dalam simulator. Ini memiliki kompiler ANSI C, OS, dan beberapa perangkat lunak. Ini juga memiliki keuntungan berbeda dari perangkat keras bawaan. Bahkan, saat ini sedang berjalan dan menjalankan dan melayani halaman web!


Akhirnya , Elemen Sistem Komputasi dan situs terkait nand2tetris.org hadir sebagai sumber informasi yang direkomendasikan # 1 untuk membangun komputer Anda sendiri dari bawah ke atas setiap kali saya melihatnya. Saya yakin, banyak (semua?) Konten gratis. YouTube akan setuju; banyak orang telah membuat proyek mulai dari sumber yang satu ini.


1
Menonton video Youtbue Ben Eater tentang membangun komputer papan roti 8bit juga sangat membantu!
Francis Cugler

1

Saya pikir Anda kehilangan aspek kunci tentang cara kerja ALU. Biasanya setiap bit akumulator terhubung ke masing-masing dari berbagai blok fungsi melalui demultiplexer. Menggunakan byte perintah, fungsi dipilih dan setiap bit akumulator terhubung ke input yang tepat dari blok fungsi. Ukuran demultiplexer menentukan berapa banyak fungsi yang bisa ditangani ALU. Dalam contoh saya yang sangat kasar yang ditunjukkan di bawah ini, ALU dengan input 4 bit dapat mereferensikan 16 fungsi yang berbeda menggunakan demultiplexer:

Menghubungkan akumulator ke berbagai blok fungsi dalam ALU

Perhatikan bahwa di sebagian besar CPU, desain ini dioptimalkan menjadi kekacauan gerbang untuk mengurangi jumlah transistor.

Lebih banyak fungsi dapat digunakan dengan memiliki register perintah yang lebih besar, tetapi ini juga akan memerlukan lebih banyak siklus jam untuk memuat perintah.

Saya sangat merekomendasikan membaca buku berikut jika Anda ingin mempelajari lebih lanjut tentang desain digital: Dasar-dasar Desain Logika edisi ke-7.


Jawaban ini membingungkan instruksi dengan operasi ALU. Secara khusus demultiplexer ini hanya akan digunakan untuk memilih operasi aritmatika mana yang akan dipilih untuk instruksi aritmatika. Anda akan memberi makan demultiplexer dengan, katakanlah, 3 bit dari instruksi 8-bit, untuk memilih operasi aritmatika mana. Anda memerlukan mekanisme yang sepenuhnya terpisah untuk mendekode dan mengurutkan instruksi secara umum. Sebagai tambahan, sebagian besar CPU yang saya lihat tidak menggunakan demultiplexer seperti ini di ALU, tetapi gunakan kekacauan gerbang yang dioptimalkan untuk melakukan operasi yang benar.
Ken Shirriff

1
@KenShirriff Saya membuat beberapa perubahan untuk kejelasan. Jangan ragu untuk melakukan beberapa pengeditan sesuai keinginan Anda.
Bawa

1

Sepertinya Anda berada di jalan yang benar.

Ketika Anda merencanakan mikro-instruksi Anda, Anda perlu menentukan dengan jelas dalam pikiran Anda sendiri pola "traffic" untuk pergerakan data Anda melalui berbagai blok Anda. Melakukan ADD akan membutuhkan beberapa langkah. Jika Anda memiliki register register untuk dua operan ALU Anda, maka mereka harus dimuat dari RAM, atau register atau bus. Jika Anda memiliki bus internal bersama maka Anda mungkin perlu memuat satu operan pada suatu waktu. Setelah Anda tahu apa byte (alamat, literal langsung, data RAM, pointer) perlu bergerak di mana, rencanakan urutan gerakan byte melalui bus masuk dan keluar dari berbagai register. Anda mungkin macet dan perlu menambahkan register induk internal karena beberapa nilai menengah harus dipertahankan hingga langkah mikro-instruksi berikutnya.

Saya pikir hal yang Anda curigai hilang adalah kompleksitas yang diperlukan untuk logika untuk mengambil instruksi atau opcode dan menerjemahkannya ke berbagai negara di dalam CPU Anda. Ini bisa rumit, tetapi dimungkinkan untuk membuat mesin negara yang agak sederhana kemudian mengembangkannya dengan konsep logika dasar.

Misalnya, Anda membuat langkah-langkah instruksi mikro untuk operasi MOVE. Itu bisa secara longgar dijelaskan oleh 3 langkah: 1) Menegaskan isi register sumber ke bus internal, 2) strobo jam tulis register target, 3) Menegaskan isi register sumber dari bus internal. Langkah 1) hingga 3) menjelaskan waktu untuk register output enable (OE) dan register write enable (WE) yang dapat didistribusikan secara selektif ke register sumber apa pun dan register target apa pun yang terhubung ke bus internal bersama dengan demultiplexer.

Jika Anda tidak memiliki banyak latihan membuat Mesin Hingga Negara, mungkin berguna untuk melihat pendekatan yang berbeda untuk memberi Anda blok bangunan lain untuk menghasilkan sinyal kontrol dari sekuens mikro Anda.

Tetap dengan itu. Jumlah pengetahuan yang Anda peroleh akan sangat fenomenal. Dan semoga Anda akan bersenang-senang.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.