Saya punya pertanyaan dari ujian yang gagal saya pecahkan:
Saya perlu membangun sirkuit logika digital yang menerima nomor 4 bit dan kembali true
jika nomornya 0
, 7
atau 14
. Saya hanya memiliki satu XOR
gerbang (2 input), satu NOR
(3 input), satu NAND
(2 input) dan satu decoder 3-ke-8.
Saya pikir pertanyaan itu tidak dapat diselesaikan, saya tidak menemukan kombinasi yang dapat melakukannya. Adakah cara mengatasinya?
Jawaban:
Saya menulis sebuah algoritma dalam C # yang mencoba setiap kombinasi yang mungkin dari mereka
Nor 3->1
Xor 2->1
Nand 2->1
danDecoder 3->8
.Setelah menjalankannya selama
7½ juta tahun2 jam, ia mengembalikan42Salah. Saya percaya ini membuktikan bahwa pertanyaan tidak memiliki jawaban karena algoritma ini memeriksa setiap kombinasi yang mungkin. :)Saya diminta untuk menjelaskannya, jadi bagian selanjutnya adalah penjelasan tentang bagian-bagian kode, bagian demi bagian. TL; DR - Anda bisa langsung beralih ke kode di akhir :)
Mari kita bicara tentang jalur input, mereka memiliki status 0 atau 1 dan untuk masing-masing input yang mungkin (0 hingga 15) mereka memiliki nilai yang berbeda:
untuk baris pertama terlihat seperti itu: 0 1 0 1 0 1 ... Yang kedua adalah: 0 0 1 1 0 0 1 1 ... yang ketiga: 0 0 0 0 1 1 1 1 .... seperti biner menghitung ... Anda mendapat ide: P
Jadi saya membuat objek yang mewakili setiap baris di masing-masing negara:
Seperti yang dikatakan bitLine.IsActiveWhenInputIs [5] mengembalikan apakah saluran aktif ketika inputnya 5.
Ini adalah kode yang membuat jalur input sama sekali:
Kami akan membuat garis bit "selalu benar" dan "selalu salah" - untuk memberikan input "0" atau "1" yang konstan.
Sekarang jika Anda perhatikan, apa yang kami cari sebenarnya adalah bitLine spesifik, yang benar ketika inputnya 0, 7, 14. Mari kita wakili di kelas kami:
Ini membuat hal-hal yang sangat sederhana: apa yang sebenarnya kita cari adalah cara untuk "memalsukan" BitLine yang diperlukan ini dari baris bit input (ini adalah bagaimana saya mewakili ke program saya apa yang saya inginkan output saya menjadi).
Sekarang, ini adalah bagaimana kita pergi tentang: setiap kali kita menggunakan beberapa elemen logis pada bitLines kami seperti
Xor
,Nor
,Nand
atau bahkanDecoder
, kita sebenarnya menciptakan bitline baru \ s. Kami tahu nilai setiap baris dalam setiap input yang mungkin dari 0 hingga 15, sehingga kami dapat menghitung nilai bitLine baru di setiap input yang mungkin juga!Nand Nor dan Xor semuanya langsung:
Untuk setiap input yang mungkin, ini menunjukkan bagaimana BitLine baru akan bertindak.
Menangani decoder sedikit rumit, tetapi idenya adalah "jika bit pada input mewakili angka x dalam biner, maka baris bit output x-th akan benar, sedangkan yang lainnya akan salah. Tidak seperti yang lain fungsi, yang satu ini mendapatkan array dari bitline, dan menambahkan 8 bitline baru ke array.
Sekarang kita memiliki semua elemen dasar kita, jadi mari kita bicara tentang algoritma:
Kami akan melakukan algoritma rekursif, pada setiap kedalaman akan mencoba menggunakan elemen lain (atau \ n dan \ xatau decoder) pada bitline yang saat ini tersedia, dan kemudian mengatur elemen menjadi tidak dapat digunakan untuk kedalaman rekursif berikutnya. Setiap kali kami tiba di bagian bawah dan kami tidak memiliki elemen lagi untuk digunakan, kami akan memeriksa apakah kami memiliki bitline yang kami cari.
Kode ini memeriksa kapan saja apakah grup baris saat ini berisi baris yang kita cari:
Ini adalah fungsi yang digunakannya untuk memeriksa apakah dua baris sama:
Ok, jadi sekarang untuk bagian utama, ini adalah algoritma utama:
Fungsi ini menerima daftar bitLines yang tersedia, panjang daftar, boolean yang mewakili apakah setiap elemen saat ini tersedia (xor / nor / nand / decoder), dan bitLine mewakili bitLine yang kami cari.
Pada setiap tahap, ia memeriksa apakah kami memiliki lebih banyak elemen untuk digunakan, jika tidak - memeriksa apakah kami mengarsipkan bitline yang kami butuhkan.
Jika kita masih memiliki lebih banyak elemen, maka untuk setiap elemen ia memanggil fungsi yang seharusnya menangani pembuatan bitLines baru menggunakan elemen-elemen tersebut dan memanggil kedalaman rekursif berikutnya setelahnya.
Fungsi-fungsi handler selanjutnya semuanya sangat mudah, mereka dapat diterjemahkan menjadi "pilih 2 \ 3 dari bitline yang tersedia, dan gabungkan mereka menggunakan elemen yang relevan. Kemudian panggil kedalaman rekursi berikutnya, hanya saja kali ini tidak akan mengandung elemen ini! ".
itulah fungsinya:
Dan ini dia, kita sebut saja fungsi ini dengan jalur yang diperlukan yang kita cari, dan memeriksa setiap kemungkinan kombinasi bagian listrik untuk memeriksa apakah mungkin untuk menggabungkannya sedemikian rupa sehingga pada akhirnya satu baris akan dikeluarkan dengan nilai yang dibutuhkan.
* perhatikan bahwa saya menggunakan daftar yang sama setiap saat, jadi saya tidak perlu membuat instance bitlines baru setiap saat. Saya berikan buffer 200 untuk alasan itu.
Ini adalah program lengkap:
Semoga kali ini penjelasan yang valid: P
sumber
Ini bukan jawaban, untuk membuang solusi yang paling jelas.
Namun, penyederhanaan dari ungkapan sebelumnya adalah:
itu bukan yang diharapkan:
Untuk alasan ini, saya pikir kemungkinan kesalahan dalam pertanyaan, menjadi "nand" gerbang "atau" satu.
sumber
Jawaban yang valid untuk pertanyaan Anda adalah setiap rangkaian yang mengembalikan selalu benar. Karena itu akan mengembalikan true juga jika angka inputnya 0,7, atau 14.
Saya pikir pertanyaannya harus secara eksplisit meminta rangkaian yang ouputs benar jika angka-angka input adalah 0,7, atau 14. Dan itu menghasilkan false jika tidak.
sumber
Itu bisa dilakukan. Sebagai petunjuk, dua bit tengah sama untuk semua pola bit ini sehingga xoring mereka akan menghasilkan 0 yang kemudian dapat menjadi input ke decoder dengan dua bit lainnya. Gerbang yang tersisa diterapkan pada tiga output decoder untuk memberikan output bit tunggal yang benar.
sumber