Merancang ALU sederhana

8

Saya perlu merancang ALU dengan dua input 8-bit A dan B dan mengontrol input x, y, dan z yang mendukung operasi berikut:

x  y  z  |  operation

0  0  0  |  S = A-B
0  0  1  |  S = A+B
0  1  0  |  S = A*8
0  1  1  |  S = A/8
1  0  0  | S = A NAND B (bitwise)
1  0  1  | S = A XOR B (bitwise)
1  1  0  | s = reverse the bits of A
1  1  1  | S = NOT A (bitwise)

Ini seharusnya dilakukan dengan penambah 8-bit dan extender aritmatika-logika. Membaca melalui buku teks saya, saya melihat bahwa tujuan dari AL-extender adalah untuk mengubah bit input sehingga adder, daripada banyak komponen tambahan, dapat digunakan untuk melakukan segalanya (atau setidaknya itulah yang saya pahami dari itu. ). Sebagai contoh, AL-extender dapat menempatkan bit dalam komplemen dua sehingga penambah melakukan pengurangan. Demikian juga, untuk operasi logis bitwise, bit dapat diubah dengan tepat dan salah satu input adder bisa saja nol sehingga hasilnya datang dengan benar.

Tetapi apa yang sebenarnya saya lakukan tentang perkalian? Buku saya sangat kabur, jadi saya tidak yakin apakah AL-extender akan meminta saya untuk melakukan sesuatu yang pintar untuk membuat adder melakukan pekerjaannya (cukup tambahkan 8 kali dalam kasus saya? ... ha ha), atau jika saya bisa melempar pengganda di sana. Saya harus membaca di divisi, tapi saya yakin ini mirip dengan perkalian.

Yah, pokoknya, intinya masih, apa yang AL extender "diizinkan" dapat / dapat miliki di dalamnya? Apakah satu-satunya tujuan untuk mengubah input sehingga dapat diumpankan ke penambah?

* EDIT: Ya, ini adalah perkalian / pembagian dengan 8, jadi ini dapat dengan mudah dilakukan dengan menggeser ke kiri atau kanan dengan 3. Apakah saya masih memiliki AL-extender yang nyata / tepat jika saya menambahkan beberapa pemindah di sana? (Mungkin aku terlalu memikirkan ini sebagai pemula yang lengkap ...)

nicole
sumber
1
Apa itu 00011111 * 8? Apa itu 00000000-00000111? Jika AL-extender Anda bergeser ke kiri 3 kali untuk kode op "010", ia kemudian dapat menetapkan B ke 0 dan kemudian memanggil kode op "001" atau "000" dalam ALU.
Tony Ennis

Jawaban:

5

Pendekatan paling sederhana adalah mendekode input xyz menjadi delapan baris. Kemudian dari ini, Anda menerapkan logika yang mendorong garis pilih chip untuk mengaktifkan unit yang sesuai yang menangani input, serta setiap transformasi yang diperlukan agar unit melakukan operasi yang benar.

Saya tidak berpikir Anda dapat menggunakan adder untuk operasi logika Anda karena adder membawa (kecuali ia memiliki beberapa input yang menonaktifkan perilaku propagasi carry). Tetapi Anda dapat memiliki satu unit untuk melakukan semua logika.

Mungkin ada alasan mengapa mereka memanggil ALU ini, dengan A dan L. yang terpisah :)

Perkalian dengan 8 hanya berarti mengarahkan nol pada tiga jalur input terendah, mengabaikan tiga baris atas, dan memetakan garis 0 ke baris 3, 1 hingga 4, dan seterusnya. Ini seperti saklar kereta api.

Kaz
sumber
6

(Cheat)
Solusi paling sederhana namun paling kuat adalah dengan menggunakan memori Flash sebagai tabel pencarian untuk hasilnya. 8-bit A input + 8-bit B input + 3 bit kode operasi adalah 19 bit. Pilih 512 k×16 bit Flash (sekitar $ 2), gunakan 19 baris input sebagai alamat, dan programkan dengan hasil untuk setiap kombinasi input. Dengan cara ini Anda dapat memiliki operasi apa pun yang Anda suka. Anda menginginkan dosa (A)? Cukup tambahkan tabel pencarian 256 kata sinus, Anda bahkan dapat memiliki hasil 16-bit yang tepat. Anda tidak terbatas pada mengalikan dengan 8; Anda dapat memperbanyak A dengan B. Seperti bijaksana, Anda dapat membagi A dengan B, dan mendapatkan hasil bagi 8-bit dan 8-bit sisanya. Untuk penggandaan dan pembagian Anda akan menggunakan semua bit dalam blok 64 kword, tetapi misalnya pembalikan bit membuat penggunaannya kurang efisien: itu tidak tergantung pada nilai B, jadi Anda akan memiliki 256 nilai identik untuk setiap input A, dan byte orde tinggi bahkan tidak akan digunakan. Jadi, sementara Anda hanya perlu 256× 8 = 2048 bit untuk pembalikan bit yang akan Anda gunakan 65536 ×16 = 1048576 bit; itu tidak terlalu efisien. Anda dapat menyebut ini kelemahan serius dari solusi Flash, tetapi saya ingin melihat Anda menerapkan 8× 8 pengganda menggunakan gerbang logika dasar sebesar $ 2.

OKE, mungkin Anda tidak menginginkan itu; gerbang logika jauh lebih menantang. Seperti yang dikatakan Kaz , mulailah dengan decoder 3-ke-8 untuk mendapatkan sinyal unik untuk setiap opcode. Anda bisa membuatnya dengan gerbang dasar, tapi saya sarankan untuk menggunakan 74HC238 untuk memulainya. Saat ALU berfungsi, Anda masih bisa mengganti HC238 dengan koleksi gerbang.

Apa yang tidak Anda inginkan untuk pengali adalah register geser yang bergeser ke kiri 3 kali. Itu adalah fungsi terdaftar yang membutuhkan jam, alih-alih fungsi kombinatorik yang langsung menghasilkan hasilnya. (Perhatikan bahwa Flash juga memproduksi setiap hasil dalam nanodetik, meskipun lebih lambat dari dengan logika combinatory.) Memiliki jalan dari A0 ke Y3, A1 untuk Y4, dll, yang Anda mengaktifkan dengan "010" opcode diterjemahkan. Demikian juga, Y3 akan terhubung ke A6 jika sinyal "011" aktif (divisi), dan ke A4 ketika opcoe adalah "110" (bit reversal). Itu berarti banyak multiplexing.

Untuk kembali ke Flash, Anda juga dapat membuat kombinasi logika kombinasi untuk operasi sederhana, seperti NAND, NOR, bergeser ke kiri, bergeser ke kanan(), dan hanya menggunakan Flash untuk perkalian dan pembagian. Anda dapat menggunakan Flash yang lebih kecil (128 kword, bukan 512 kword), atau menambahkan fungsi yang lebih canggih, seperti sinus yang saya berikan sebagai contoh (mungkin bukan yang terbaik, tapi saya yakin Anda dapat memikirkan sesuatu).



()Kenapa Anda memiliki kalikan dengan 8, tetapi bukan pergeseran yang lebih mendasar yang tersisa? Bergeser ke kiri / kanan, memutar ke kiri / kanan (baik melalui carry dan tidak) harus dimiliki untuk ALU apa pun, dan Anda dapat membaginya dengan 8 menggunakan 3 hak bergeser, sedangkan Anda tidak dapat membaginya dengan 2. Pembalikan bit adalah khas DSP berfungsi, tetapi Anda tidak ingin membangun DSP untuk memulai, bukan? Saya akan mengubah fungsinya menjadi

x  y  z  |  operation

0  0  0  |  S = A - B
0  0  1  |  S = A + B
0  1  0  |  S = shift left A by 1 bit
0  1  1  |  S = shift right A by 1 bit
1  0  0  |  S = A NAND B (bitwise)
1  0  1  |  S = A XOR B (bitwise)
1  1  0  |  S = rotate left A
1  1  1  |  S = NOT A (bitwise)
stevenvh
sumber
1

Saya terjebak pada masalah yang sama dari buku yang sama. Untungnya saya menemukan utas ini yang memberi saya ide apa yang harus dilakukan. Kaz memiliki poin yang sangat bagus tentang mengemudi nol dan memetakan garis. Extender ALU dalam buku ini dirancang dari n (n yang mewakili jumlah bit untuk dioperasikan) komponen kombinasional yang identik tetapi terpisah dan satu komponen berbeda untuk dibawa masuk. Komponen ini memiliki lima input dan dua output. Kelima input tersebut adalah: 'X', 'Y', 'Z' (untuk memilih operasi) dan 'a', 'b' (bit individual A dan B dengan signifikansi yang sama). Saya kira idenya di sini adalah untuk membagi masalah menjadi potongan-potongan kecil untuk memiliki tabel kebenaran ukuran yang masuk akal. Itu adalah 5 input vs 8 + 8 + 3 = 19 input jika extender akan menerima semua bit dari A dan B plus input kontrol. Sekarang, jika extender dikomposisi sedemikian rupa (19 input) saya pikir logika untuk multiplikasi dapat diimplementasikan dalam komponen tunggal itu, tetapi menulis tabel kebenaran untuk ini akan keluar dari pertanyaan. Jadi, solusi saya adalah menggunakan muxes setelah setiap komponen yang menangani bit individu a dan b dengan asumsi bahwa komponen sudah dirancang sedemikian rupa sehingga input XYZ = 010 melewati 'a' sedikit tidak berubah dan menyaring 'b', yaitu 'b' = 0. Mux harus memiliki dua input, satu dari komponen di atas, dan satu dari komponen tiga tempat di sebelah kanan. Tiga muxes paling kanan harus memiliki nol sebagai input kedua. Logika kombinasional sederhana dengan gerbang AND dan dua inverter dapat mengatur muxes ketika XYZ = 010.

Marin
sumber