Saya sedang membangun CPU 16-bit sederhana di Logisim dan memiliki ALU yang siap dan opcodes yang ingin saya miliki. Sekarang saya merasa sangat sulit untuk menemukan pengkodean yang tepat untuk perintah-perintah sehingga sub-sirkuit yang berbeda (misalnya logika, aritmatika) tidak memerlukan semua kabel kontrol (yang membangun pengkodean) sebagai input, tetapi sesedikit mungkin. Apakah ada strategi atau metode yang membantu dengan desain opcode yang efisien?
terima kasih sebelumnya
cpu
computer-architecture
Benjoyo
sumber
sumber
Jawaban:
Saya pikir itu adalah pendekatan yang baik untuk mempelajari beberapa set instruksi lainnya.
Yang kecil akan menjadi MSP430 dari TI itu adalah Prosesor 16bit dengan sekitar 22 instruksi.
http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf
Anda juga bisa melihat ke dalam Atmel AVR yang mereka juga memiliki set instruksi yang cukup kecil.
Dalam proyek kecil saya, saya mencoba mengembangkan prosesor 32 bit sederhana di VHDL dengan set instruksi kecil (14 instruksi):
http://www.blog-tm.de/?p=80
Karena waktu luang saya saat ini belum sepenuhnya selesai. Instruksi dilaksanakan tetapi dua tidak diuji dan mungkin beberapa flag status hilang.
sumber
Pelajari (tetapi jangan mereplikasi) pendekatan ARM untuk pengkodean instruksi. Ini sangat berorientasi pada awalan (seperti pendekatan pohon Huffman yang direkomendasikan oleh Dzarda) dan sangat seragam dalam hal di mana register memilih bagian dari instruksi tersebut.
Pendekatan tidak imajinatif tetapi dapat diandalkan adalah untuk menghitung semua sinyal kontrol yang Anda miliki, yang mungkin akan lebih dari 16 bit, dan kemudian mencoba untuk melakukan minimalisasi logika gaya peta-Karnaugh pada mereka.
sumber
Suatu kali saya mencoba melakukan CPU 4-bit dengan inti instruksi panjang 8-bit di Logisim. Berakhir dengan mesin negara sederhana, lebih dari CPU, sungguh.
Hal-hal acak untuk dicari
Video luar biasa di Computerphile tentang pohon Huffman:
sumber
ISA yang saya tulis untuk kelas dulu memiliki kode op 4 bit seperti:
1XXX ALU instructions 01XX jump, jump register, call etc 001X branch not equal, branch equal zero 000X 0 - load, 1 - store
Alih-alih menjadi yang paling optimal, ini adalah salah satu gaya yang lebih mudah untuk membangun / mendesain gerbang karena sinyal input dari bit tunggal dapat sepenuhnya mengendalikan jalur logika apa yang diambil. Atau, Anda dapat Huffman Code simbol Anda yang paling sering digunakan dan nol pad mereka untuk mendapatkan kode op panjang tetap.
sumber
Satu hal yang perlu Anda pertimbangkan adalah apakah akan mengizinkan segala bentuk instruksi multi-kata, atau apa pun yang dapat "bertindak" seperti instruksi multi-kata; jika ya, Anda mungkin ingin mempertimbangkan apakah akan menggunakan kata-kata instruksi tambahan mengikuti instruksi utama, atau kata-kata awalan sebelumnya. Mengizinkan awalan dan kata-kata tindak lanjut dapat meningkatkan kompleksitas penanganan interupsi, tetapi dapat menghindari kebutuhan untuk mencocokkan instruksi yang jarang digunakan dalam ruang opcode yang sama dengan yang biasa digunakan.
Jika instruksi diambil pada siklus sebelum dieksekusi, seseorang dapat memiliki instruksi "cabang kondisional" yang dapat menyebabkan kata instruksi berikutnya dilewati atau kontennya ditransfer langsung ke penghitung program; desain seperti itu mungkin menambah beberapa kompleksitas tambahan untuk menginterupsi urutan, tetapi bisa meringankan kebutuhan untuk menggunakan sebagian besar ruang opcode untuk instruksi "cabang", "lompat" dan "panggil", sambil memungkinkan jangkauan kondisi cabang yang jauh lebih luas. dari yang seharusnya mungkin terjadi. Karena cabang yang diambil umumnya akan memerlukan siklus mati setelah pelaksanaan instruksi itu sendiri terlepas dari mana alamat itu berasal, memiliki alamat berasal dari kata berikut yang telah diambil tetapi tidak akan dieksekusi tidak memerlukan biaya tambahan waktu.
Meskipun memindahkan alamat target dari instruksi cabang akan mengurangi seberapa banyak ruang opcode yang mereka makan, format opcode 16-bit masih cukup ketat. Menggunakan instruksi awalan dapat membantu hal itu. Jika, misalnya, seseorang ingin memiliki 32 register, yang memungkinkan setiap register untuk ditentukan secara independen sebagai source1, source2, dan tujuan akan memerlukan 15 bit dalam opcode, yang memungkinkan total dua instruksi. Sangat tidak berguna. Di sisi lain, bisa menggunakan 32 register untuk masing-masing dari ketiga operan akan menyenangkan. Satu dapat menyeimbangkan dua tujuan dengan memiliki operasi ALU yang tidak didahului oleh awalan menggunakan delapan bit untuk membuat dua satu dari enam belas pilihan register, tetapi memiliki operasi ALU yang segera mengikuti awalan menggunakan beberapa bit dalam awalan bersama dengan delapan dari instruksi berikut, sehingga memungkinkan pemilihan independen dari kedua sumber dan tujuan dari set lengkap 32. Instruksi yang menggunakan register atas akan mengambil dua kata / siklus daripada satu, tetapi dalam beberapa kasus tradeoff semacam itu bisa bermanfaat. Kesulitan terbesar dalam menggunakan awalan adalah bahwa seseorang harus mencegah interupsi dari terjadi antara awalan dan instruksi berikutnya atau memastikan bahwa jika interupsi memang terjadi di sana, instruksi setelah awalan masih akan menggunakan register yang tepat [misalnya dengan memiliki program -counter save logic menyimpan alamat instruksi non-awalan terakhir yang dijalankan]. tetapi dalam beberapa kasus pengorbanan seperti itu bisa bermanfaat. Kesulitan terbesar dalam menggunakan awalan adalah bahwa seseorang harus mencegah interupsi dari terjadi antara awalan dan instruksi berikutnya atau memastikan bahwa jika interupsi memang terjadi di sana, instruksi setelah awalan masih akan menggunakan register yang tepat [misalnya dengan memiliki program -counter save logic menyimpan alamat instruksi non-awalan terakhir yang dijalankan]. tetapi dalam beberapa kasus pengorbanan seperti itu bisa bermanfaat. Kesulitan terbesar dalam menggunakan awalan adalah bahwa seseorang harus mencegah interupsi dari terjadi antara awalan dan instruksi berikutnya atau memastikan bahwa jika interupsi memang terjadi di sana, instruksi setelah awalan masih akan menggunakan register yang tepat [misalnya dengan memiliki program -counter save logic menyimpan alamat instruksi non-awalan terakhir yang dijalankan].
Menggunakan instruksi multi-kata akan membuat beberapa aspek desain lebih sulit, tetapi mungkin mengurangi kebutuhan untuk membuat keputusan sulit lainnya.
sumber
Orang ini memiliki perincian terbaik tentang memahami pengabelan hardcoded bagian dari Decoder, yang menjelaskan garis kontrol untuk hardcoded CPU: http://minnie.tuhs.org/CompArch/Tutes/week03.html Seperti yang Anda lihat, Anda pilihan dalam Opcodes benar-benar memengaruhi betapa rumitnya logika Decode.
sumber