Cara mengetahui apakah angka biner nol

16

Saya menerapkan ALU dari spesifikasi yang diberikan dalam buku The Elements of Computing system saya. Saya terjebak hanya pada satu masalah. Bagaimana saya menemukan jika angka yang diberikan adalah nol atau tidak. Satu hal yang bisa saya lakukan adalah atau setiap bit di bus, dan kemudian menerapkan gerbang tidak pada itu. Tetapi harus ada beberapa solusi elegan lainnya.

Rick_2047
sumber
6
itu tidak terdengar seperti Anda benar-benar terjebak - lebih seperti Anda tidak puas :)
vicatcu
7
input X NOR adalah solusi elegan. Untuk menentukan apakah register berisi nol, setiap bit harus diperiksa untuk melihat apakah register berisi 0. logis. Anda menentukan bahwa Anda memerlukan output bit tunggal. Karena itu Anda memerlukan beberapa fungsi dengan input X, dan satu output, seperti NOR.
W5VO

Jawaban:

14

Sama sekali tidak ada jalan lain ATAU semua bit, tidak memuaskan seperti yang tampak. Namun, Anda tidak terbatas pada dua gerbang input silikon juga. Anda dapat membangun 4-input gerbang NOR dalam logika CMOS dengan menempatkan 4 seri tipe-p transistor dalam jaringan pullup dan 4 transistor tipe-n paralel dalam jaringan pulldown. Itu mengurangi kedalaman topologi pohon Anda dan karenanya penundaan propagasi Anda. Anda hanya dapat mengambil teori itu sejauh ini sebelum jatuhnya voltase kumulatif pada transistor seri membuat pull-up tidak cukup pull-up menjadi "1" ... empat adalah aturan praktis yang baik jika saya ingat dengan benar.

vicatcu
sumber
Untuk jumlah bit yang lebih besar apakah menggunakan gerbang NOR dan NAND secara bergantian masuk akal? Misalnya, dengan kipas masuk 4 gerbang, uji 64-bit nol dapat menggunakan 16 gerbang NOR yang menghasilkan 1 jika 4 bit nol hingga 4 gerbang NAND yang mengumpankan hasil 0 jika semua 4 bit 1 (semua 16 bit asli adalah 0), keempat hasil ini kemudian akan dikirim ke gerbang NOR akhir. (Saya bukan EE, tapi itu tampaknya lebih baik daripada menggunakan inverter perantara — untuk mendapatkan hasil nol sepenuhnya kembali ke 0 — dan hanya menggunakan gerbang NOR.)
Paul A. Clayton
Mungkin juga ada cara untuk melipat sebagian latensi deteksi nol ke latensi tambahan.
Paul A. Clayton
Bagaimana dengan menggunakan NMOS: Satu resistor pull-up dan transistor X untuk menurunkan level ke 0 jika ada input 1?
Oskar Skog
13

Fungsi logika adalah gerbang NOR. Itu adalah fungsi logika paling sederhana yang ada.

Rex Logan
sumber
8

Solusi khas dengan mesin 8 bit adalah bahwa ALU akan menghasilkan sejumlah bit 'flag' yang akan mewakili hasil dari operasi terbaru. Meskipun dimungkinkan untuk memiliki jumlah bit flag sekitar (yaitu, Anda bisa memiliki flag 'Z' untuk setiap register di CPU Anda), biasanya hal yang baru saja Anda hitung yang paling menarik, jadi masuk akal untuk melakukannya dengan cara tertentu.

Beberapa dari CPU lama itu akan secara otomatis mengatur bit flag untuk hampir setiap pemindahan data, sementara yang lain meminta Anda untuk menempel instruksi 'bandingkan' spesifik dalam kode Anda jika Anda tiba-tiba perlu mengetahui apakah register tertentu nol. Dan apakah Anda memberikan cek nol untuk setiap register atau hanya untuk apa yang baru saja dihitung, benar-benar tidak ada cara yang lebih sederhana untuk memeriksa "apakah ini kata nol" daripada hanya ATAU semua bit secara bersamaan.

JustJeff
sumber
1
Ini juga khas dari chip ARM 32-bit, dan mungkin khas kebanyakan arsitektur. Untuk ARM, APSR (Daftar Status Program Aplikasi) menyimpan bit N, Z, C, V dan Q (Negatif, Nol, Carry, oVerflow, saturateQ) bit untuk menyediakan fungsi-fungsi lain selain bit nol yang Anda cari . Ini mungkin atau mungkin tidak berguna untuk mesin Anda.
Kevin Vermeer
Saya mendapatkan solusi atau baik-baik saja, tetapi itu mengganggu saya, saya harus menggunakan banyak logika untuk mendapatkan hanya satu bit. Pasti ada solusi elegan.
Rick_2047
@ Rick_2047 - Anda tidak menyebutkan apa yang Anda implementasikan dengan ini, tapi saya menduga FPGA? Itu akan menggangguku juga, harus mengikat berapa pun jumlah blok logika hanya untuk melakukan gerbang fan-in yang tinggi. Itu alasan yang bagus untuk hanya memasukkan satu saja.
JustJeff
bukan FPGA tetapi HDL dan simulator perangkat keras.
Rick_2047
3

Beberapa CPU, MIPS misalnya, memiliki register yang selalu berisi nol, membuat pengujian register lain untuk nol sangat cepat.

Leon Heller
sumber
Bagaimana saya memeriksa nomor jika saya memiliki register yang mengandung nol? Juga saya ingin menghasilkan hanya satu bit yang benar atau salah tergantung pada apakah bus 16 bit adalah nol atau tidak
Rick_2047
1
pembanding ... yang merosot menjadi gerbang NOR yang dimuliakan ...
vicatcu
Dia mungkin mendapatkan sesuatu dengan cara ini jika registernya murah (mereka berada di blok SRAM di FPGA) dan dia membutuhkan register yang membandingkan instruksi karena alasan lain.
jpc
@vicatu - sebenarnya jika Anda ingin membandingkan dua angka N bit, Anda perlu N 2 gerbang input XOR. Masalah OR / NOR hanya baik untuk tes nol.
JustJeff
tetapi pada akhirnya saya akan perlu menggunakan gerbang sebanyak yang saya punya bit input atau setidaknya banyak transistor.
Rick_2047
0

Saya penggemar berat or_reduce- sebagian besar alat sintesis akan mengoptimalkannya ke implementasi terbaik karena mereka tahu persis apa yang Anda lakukan.

Aaron D. Marasco
sumber