Saya akan mencoba memberi Anda gambaran tentang bagaimana sirkuit digital dirancang untuk memecahkan masalah pemrosesan digital dengan menggunakan masalah yang Anda ajukan: bagaimana CPU menerapkan penambahan dan perkalian.
Pertama, mari kita ajukan pertanyaan langsung: bagaimana bahasa pemrograman secara efisien mengevaluasi perkalian dan penambahan. Jawabannya sederhana, mereka mengkompilasinya menjadi banyak dan menambah instruksi. Misalnya, kode berikut:
a = 1 + 1;
b = a * 20;
hanya dikompilasi untuk sesuatu seperti:
ADD 1 1 a
MUL a 20 b
(perhatikan, bahwa perakitan di atas adalah untuk CPU imajiner yang tidak ada, demi kesederhanaan).
Pada titik ini Anda menyadari bahwa jawaban di atas hanya menggeser masalah dan menyelesaikannya dengan sihir perangkat keras. Pertanyaan lanjutannya adalah bagaimana cara kerja sihir perangkat keras itu?
Mari kita lihat masalah yang lebih sederhana: penambahan.
Pertama-tama kita melakukan masalah yang biasa, menambahkan dalam basis 10 angka biasa:
17
+28
Langkah pertama adalah menambahkan 7 dan 8. Tetapi ini menghasilkan 15 yang lebih dari satu digit. Jadi kami membawa 1:
(1)
17
+28
= 5
Sekarang kita tambahkan 1, 1 dan 2 bersama-sama:
17
+28
=45
Jadi dari ini kita mendapatkan aturan berikut:
ketika hasil penambahan lebih dari satu digit, kami mempertahankan digit paling tidak signifikan dan meneruskan digit paling signifikan ke depan
jika kita memiliki angka yang dibawa ke dalam kolom kita, kita menambahkannya bersama dengan angka yang kita tambahkan
Sekarang saatnya menafsirkan aturan di atas dalam basis 2 - aljabar boolean.
Jadi dalam aljabar boolean, menambahkan 0 dan 1 bersama-sama = 1. Menambahkan 0 dan 0 = 0. Dan menambahkan 1 dan 1 = 10 yang lebih dari satu digit sehingga kami membawa 1 maju.
Dari sini kita dapat membuat tabel kebenaran:
a b | sum carry
-------------------
0 0 | 0 0
0 1 | 1 0
1 0 | 1 0
1 1 | 0 1
Dari ini, kita dapat membangun dua sirkuit / persamaan boolean - satu untuk output jumlah dan satu untuk output carry. Cara yang paling naif adalah mencantumkan semua input. Tabel kebenaran apa pun, tidak peduli seberapa besar dan kompleks dapat disajikan kembali dalam bentuk ini:
(AND inputs in first row) OR (AND of inputs in second row) OR ...
Ini pada dasarnya adalah jumlah dari bentuk produk. Kami hanya melihat output yang menghasilkan 1 dan mengabaikan 0s:
sum = (NOT a AND b) OR (a AND NOT b)
Mari ganti DAN ATAU dan BUKAN dengan simbol bahasa pemrograman agar lebih mudah dibaca:
sum = (!a & b) | (a & !b)
Pada dasarnya, kami telah mengonversi tabel seperti ini:
a b | sum equation
-------------------
0 0 | 0
0 1 | 1 (!a & b)
1 0 | 1 (a & !b)
1 1 | 0
Ini dapat langsung diimplementasikan sebagai sirkuit:
_____
a ------------| |
\ | AND |-. ____
\ ,-NOT--|_____| \ | |
\/ `--| OR |----- sum
/\ _____ ,--|____|
/ `-NOT--| | /
/ | AND |-`
b ------------|_____|
Pembaca yang jeli pada saat ini akan memperhatikan bahwa logika di atas sebenarnya dapat diimplementasikan sebagai gerbang tunggal - gerbang XOR yang dengan mudah memiliki perilaku yang diperlukan oleh tabel kebenaran kami:
_____
a ------------| |
| XOR |---- sum
b ------------|_____|
Tetapi jika perangkat keras Anda tidak memberi Anda gerbang XOR, langkah-langkah di atas adalah bagaimana Anda akan mendefinisikan dan mengimplementasikannya dalam hal gerbang AND, ATAU dan BUKAN.
Bagaimana Anda akan mengubah gerbang logika menjadi perangkat keras aktual tergantung pada perangkat keras yang Anda miliki. Mereka dapat diimplementasikan dengan menggunakan berbagai mekanisme fisik selama mekanisme tersebut menyediakan semacam perilaku switching. Gerbang logika telah diimplementasikan dengan segala sesuatu mulai dari semburan air atau embusan udara (fluidics) hingga transisitor (elektronik) hingga kelereng yang jatuh. Ini adalah topik besar dalam haknya sendiri jadi saya akan mengabaikannya dan mengatakan bahwa mungkin untuk menerapkan gerbang logika sebagai perangkat fisik.
Sekarang kita melakukan hal yang sama untuk membawa sinyal. Karena hanya ada satu kondisi di mana sinyal pembawa benar, persamaannya sederhana:
carry = a & b
Jadi, bawa barang sederhana:
_____
a ------------| |
| AND |---- carry
b ------------|_____|
Menggabungkan mereka bersama-sama kita dapatkan apa yang dikenal sebagai setengah penambah:
_____
a ------;-----| |
| | XOR |---- sum
b --;---|-----|_____|
| | _____
| '-----| |
| | AND |---- carry
'---------|_____|
Persamaan untuk sirkuit di atas dengan cara terlihat seperti ini:
sum = a ^ b
carry = a & b
Setengah penambah kehilangan sesuatu. Kami telah menerapkan aturan pertama - jika hasilnya lebih dari satu digit daripada meneruskan, tapi kami belum menerapkan aturan kedua - jika ada carry tambahkan bersama-sama dengan angka.
Jadi untuk mengimplementasikan penambah penuh, sirkuit tambahan yang dapat menambahkan angka yang lebih dari satu digit, kita perlu mendefinisikan tabel kebenaran:
a b c | sum carry
---------------------
0 0 0 | 0 0
0 0 1 | 1 0
0 1 0 | 1 0
0 1 1 | 0 1
1 0 0 | 1 0
1 0 1 | 0 1
1 1 0 | 0 1
1 1 1 | 1 1
Persamaan untuk jumlah sekarang:
sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)
Kita bisa melalui proses yang sama untuk memfaktorkan dan menyederhanakan persamaan dan menafsirkannya sebagai rangkaian, dll. Seperti yang telah kita lakukan di atas, tetapi saya pikir jawaban ini terlalu panjang.
Sekarang Anda harus mendapatkan ide tentang bagaimana logika digital dirancang. Ada trik lain yang belum saya sebutkan seperti peta Karnaugh (digunakan untuk menyederhanakan tabel kebenaran) dan kompiler logika seperti espresso (sehingga Anda tidak perlu memperhitungkan persamaan boolean dengan tangan) tetapi dasarnya adalah apa yang saya miliki diuraikan di atas:
Mengurai masalah sampai Anda dapat bekerja pada level bit tunggal (digit).
Tentukan output yang Anda inginkan menggunakan tabel kebenaran.
Konversikan tabel menjadi persamaan boolean dan sederhanakan persamaan tersebut.
Menafsirkan persamaan sebagai gerbang logika.
Ubah sirkuit logika Anda menjadi sirkuit perangkat keras nyata dengan menerapkan gerbang logika.
Begitulah masalah mendasar (atau lebih tepatnya, level rendah) benar-benar diselesaikan - banyak dan banyak tabel kebenaran. Karya kreatif yang sebenarnya adalah dalam penguraian tugas yang kompleks seperti decoding MP3 ke bit level sehingga Anda dapat mengerjakannya dengan tabel kebenaran.
Maaf saya tidak punya waktu untuk menjelaskan cara menerapkan perkalian. Anda dapat mencoba mengambil celah dengan mencari tahu aturan berapa lama perkalian bekerja kemudian menafsirkannya dalam biner kemudian mencoba untuk memecahnya ke tabel kebenaran. Atau Anda dapat membaca Wikipedia: http://en.wikipedia.org/wiki/Binary_multiplier