Saya sedang mencari cara untuk menghitung akar kuadrat dari angka 8-bit yang diberikan hanya menggunakan kombinasi digital atau logika sekuensial. Apakah itu mungkin?
Salah satu cara mungkin hanya menggunakan tabel mencari karena saya tidak mempertimbangkan bagian pecahan sama sekali (jadi ) tetapi harus ada cara yang lebih baik dari ini. Adakah yang bisa mengarahkan saya ke sana?
digital-logic
Rick_2047
sumber
sumber
Jawaban:
Tabel pencarian telah disebutkan dalam komentar. Ada dua pendekatan.
Cepat
Buat tabel panjang 256 byte, dengan setiap nilai berikutnya akar kuadrat dari indeks yang sesuai. Ini cepat karena Anda menggunakan argumen sebagai indeks untuk mengakses nilai yang tepat secara langsung. Kekurangannya adalah itu membutuhkan tabel panjang, dengan banyak nilai duplikat.
Compact
Seperti dikatakan, integer 8-bit hanya dapat memiliki nilai 0 hingga 255, dan akar kuadrat yang sesuai adalah 0 hingga 16 (bulat). Buat tabel entri 16 (berbasis nol) dengan entri ke-n nilai maksimum untuk argumen yang akar kuadratnya adalah n. Tabel akan terlihat seperti ini:
Anda berjalan melalui tabel dan berhenti ketika Anda menemukan nilai yang lebih besar atau sama dengan argumen Anda. Contoh: akar kuadrat dari 18
Sementara tabel pencarian cepat memiliki waktu eksekusi yang tetap (hanya satu pencarian), di sini waktu eksekusi lebih lama untuk argumen nilai yang lebih tinggi.
Untuk kedua metode, dengan memilih nilai yang berbeda untuk tabel, Anda dapat memilih antara nilai bulat atau terpotong untuk akar kuadrat.
sumber
Bekerja dalam 8 bit, Anda pada dasarnya dibatasi untuk solusi integer. Jika Anda membutuhkan akar kuadrat X, yang terdekat dengan Anda adalah integer terbesar yang kuadratnya kurang dari atau sama dengan X. Misalnya, untuk sqrt (50) Anda akan mendapatkan 7, karena 8 * 8 akan lebih dari 50.
Jadi, inilah trik untuk melakukan itu: hitung berapa angka ganjil, dimulai dengan 1, Anda dapat mengurangi dari X. Anda bisa melakukannya dengan logika seperti: register 8-bit R1 menyimpan nilai kerja, konter 7-bit R2 memegang (sebagian besar) nomor ganjil, dan penghitung 4-bit R3 memegang hasilnya. Saat reset, R1 dimuat dengan nilai X, R2 dihapus ke nol, dan R3 dihapus ke nol. Sirkuit pengurang 8-bit diumpankan R1 untuk input 'A', dan nilai R2 dikombinasikan dengan LSB tetap pada '1' (melalui pull-up) untuk input 'B'. Subtractor menampilkan perbedaan 8-bit AB dan bit pinjaman. Pada setiap jam, jika bit pinjaman jelas, R1 dimuat dengan output subtractor, R2 bertambah, dan R3 bertambah. Jika bit pinjaman diatur, R1 tidak dimuat dan R2, R3 tidak bertambah, b / c hasilnya sekarang siap dalam R3.
KALAU TIDAK
Hanya ada 16 nilai output yang mungkin, jadi jawabannya adalah angka empat bit. Pada dasarnya, Anda memiliki empat fungsi bit tunggal dari 8 bit input. Sekarang, saya tidak bisa menggambar peta Karnaugh 8-dimensi, tetapi pada prinsipnya Anda hanya bisa membuat sirkuit kombinatorial untuk setiap bit jawabannya. Ambil output dari empat sirkuit kombinatorial bersama-sama dan menafsirkannya sebagai jawaban empat bit. Voila. Tidak ada jam, tidak ada register, hanya sekelompok NAND dan NOR akan cukup.
sumber
case
pernyataan besar dan biarkan alat sintesis melakukan semua pekerjaan. Di satu sisi itu seperti melakukan tabel pencarian besar dalam RAM terdistribusi (digunakan sebagai ROM); di sisi lain alat tersebut harus menemukan pengoptimalan seperti yang Anda sebutkan dalam komentar Anda.Saya tidak tahu apakah ini bisa membantu, tetapi ada cara sederhana untuk menghitung akar kuadrat:
Saya tidak tahu banyak tentang apa yang bisa dan tidak bisa dilakukan dalam logika sekuensial, tetapi karena algoritma ini selesai hanya dalam 4 loop, Anda mungkin dapat mengimplementasikannya dalam 4 tahap.
sumber
sumber