Menghitung akar kuadrat dari angka biner 8-bit

14

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?103

Rick_2047
sumber
4
Saya akan menggunakan tabel pencarian sederhana dengan rentang. Jumlah minimum dan maksimum untuk setiap output dan Anda baru saja memeriksa.
Kortuk
6
Pencarian tampaknya cukup sederhana. Lagi pula, hanya ada 16 kemungkinan jawaban untuk akar kuadrat dari angka 8 bit.
Olin Lathrop
3
hmm .. satu-satunya jawaban adalah 0000 hingga 1111; hanya input 64 atau lebih besar yang akan memiliki bit paling atas yang diatur dalam jawaban, jadi itu hanya OR dari dua bit teratas dari input. Sekarang Anda hanya memiliki tiga fungsi 8 bit untuk mengurangi ..
JustJeff

Jawaban:

9

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:

 0  
 2  
 6  
12  
20
etc.

Anda berjalan melalui tabel dan berhenti ketika Anda menemukan nilai yang lebih besar atau sama dengan argumen Anda. Contoh: akar kuadrat dari 18

set index to 0
value[0] = 0, is less than 18, go to the next entry  
value[1] = 2, is less than 18, go to the next entry  
value[2] = 6, is less than 18, go to the next entry  
value[3] = 12, is less than 18, go to the next entry
value[4] = 20, is greater than or equal to 18, so sqrt(18) = 4

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.

stevenvh
sumber
2
Jika Anda membalikkan tabel itu secara rata
Federico Russo
Pencarian biner pada tabel yang lebih pendek dapat mempercepat algoritma rata-rata. Anda mulai setengah jalan melalui tabel pencarian (posisi 8) maka Anda memutuskan apakah nilai yang ditemukan terlalu tinggi atau terlalu rendah dan Anda naik 4 tempat ke atas atau ke bawah 4. Ulangi sampai selesai.
jippie
7

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.

JustJeff
sumber
Saya telah merenungkan ini sepanjang malam. Bit 8 dalam output jelas merupakan fungsi dari dua bit input paling signifikan. Demikian pula, saya pikir bit 4 dalam output kemungkinan fungsi hanya bit input top 4: 00x1, 001x, 1xx1, dan 11x1 tampaknya mengaturnya. Akan memverifikasi ini nanti.
JustJeff
1
Jika Anda melakukan ini dalam FPGA, Anda bisa melemparkannya ke casepernyataan 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.
The Photon
5

Saya tidak tahu apakah ini bisa membantu, tetapi ada cara sederhana untuk menghitung akar kuadrat:

unsigned char sqrt(unsigned char num)
{
    unsigned char op  = num;
    unsigned char res = 0;
    unsigned char one = 0x40;

    while (one > op)
        one >>= 2;

    while (one != 0)
    {
        if (op >= res + one)
        {
            op -= res + one;
            res = (res >> 1) + one;
        }
        else
        {
            res >>= 1;
        }

        one >>= 2;
    }
    return res;
}

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.

Roket
sumber
4

28

    A =     a
     or     b;

    B =     a and     b
     or not b and     c
     or not b and     d;

    C =     a and     b and     c
     or     a and     b and     d
     or     a and not b and not c and not d
     or     a and not c and not d and     e
     or     a and not c and not d and     f
     or not a and     c and     d
     or not a and     c and     e
     or not a and     c and     f
     or not a and not b and not d and     e
     or not a and not b and not d and     f;

     D =     a and     b and     c and     e
     or     a and     b and     c and     f
     or     a and     c and     d
     or     a and not b and not c and not d
     or     a and not b and not d and     e and     f
     or     a and not b and not d and     e and     g
     or     a and not b and not d and     e and     h
     or     a and not c and not d and not e and not f
     or     b and     c and not d and not e and not f and     g
     or     b and     c and not d and not e and not f and     h
     or not a and     b and not c and     d and     e
     or not a and     b and not c and     d and     f
     or not a and     b and not c and     d and     g
     or not a and     b and not c and     d and     h
     or not a and     c and not d and not e and not f
     or not a and     d and     e and     f
     or not a and     d and     e and     g
     or not a and     d and     e and     h
     or not a and not b and     c and not e and not f and     g
     or not a and not b and     c and not e and not f and     h
     or not a and not b and not c and     e and     f
     or not b and     c and     d and     e
     or not b and     c and     d and     f
     or not b and not c and not d and not f and     g
     or not b and not c and not d and not f and     h;
Bitrex
sumber
1
Wow, perangkat lunak apa yang melakukan itu? Apakah ini berfungsi untuk dimensi besar yang sewenang-wenang? Bagaimana Anda memperoleh jumlah minimal gerbang untuk benar-benar membangunnya dari formulir SOP itu? Sepertinya pada titik ini cpld atau lebih baik pasti akan menjadi cara paling praktis untuk membangunnya.
captncraig
@CMP Maaf atas keterlambatan balasan saya. Saya menggunakan program yang tersedia di sini: home.roadrunner.com/~ssolver yang dapat menerima tabel kebenaran - Saya menggunakan skrip Python sederhana untuk menghasilkan tabel kebenaran untuk setiap digit akar pangkat tiga integer. Mereka SOP di atas sebenarnya adalah dalam bentuk minimal mereka, dengan batas-batas kemampuan algoritma menggunakan program untuk meminimalkan mereka.
Bitrex
1
@ CMP Seperti yang Anda katakan, akan gila untuk mengimplementasikan akar kuadrat integer dengan cara ini, karena orang bisa menggunakan tabel pencarian, atau membuat kode salah satu algoritma untuk akar kuadrat integer dan membiarkan bahasa pilihan HDL Anda mensintesisnya.
Bitrex