การคำนวณสแควร์รูทของเลขฐานสอง 8 บิต


14

ฉันกำลังมองหาวิธีในการคำนวณสแควร์รูทของตัวเลข 8 บิตที่กำหนดโดยใช้การผสมแบบดิจิตอลเท่านั้นหรือตรรกะแบบเรียงลำดับ เป็นไปได้ไหม

วิธีหนึ่งอาจใช้ตารางค้นหาเนื่องจากฉันไม่ได้พิจารณาส่วนที่เป็นเศษเลย (ดังนั้น) แต่ต้องมีวิธีที่ดีกว่านี้ ใครบางคนสามารถชี้ให้ฉันเห็นว่า?103


4
ฉันจะใช้ตารางการค้นหาอย่างง่ายที่มีช่วง จำนวนต่ำสุดและสูงสุดสำหรับแต่ละเอาต์พุตและคุณเพียงตรวจสอบ
Kortuk

6
การค้นหาดูค่อนข้างง่าย ท้ายที่สุดมีเพียง 16 คำตอบที่เป็นไปได้สำหรับสแควร์รูทของตัวเลข 8 บิต
Olin Lathrop

3
อืม .. คำตอบเดียวคือ 0000 ถึง 1111; เฉพาะอินพุต 64 หรือสูงกว่าเท่านั้นที่จะมีการตั้งค่าบิตสูงสุดในคำตอบดังนั้นนั่นเป็นเพียง OR ของบิตสองบิตแรกสุดของอินพุต ตอนนี้คุณมีฟังก์ชั่น 8 บิตสามตัวเพื่อลด ..
JustJeff

คำตอบ:


9

มีการพูดถึงตารางการค้นหาในความคิดเห็น มีสองวิธี


สร้างตารางที่มีความยาว 256 ไบต์อย่างรวดเร็วโดยทุกค่าถัดไปคือรากที่สองของดัชนีที่เกี่ยวข้อง นี่เป็นสิ่งที่รวดเร็วเนื่องจากคุณใช้อาร์กิวเมนต์เป็นดัชนีเพื่อเข้าถึงค่าที่ถูกต้องโดยตรง ข้อเสียเปรียบก็คือมันต้องการตารางที่ยาวและมีค่าซ้ำซ้อนกันมากมาย

Compact
ตามที่กล่าวไว้จำนวนเต็ม 8 บิตสามารถมีค่า 0 ถึง 255 เท่านั้นและรากที่สองที่สอดคล้องกันคือ 0 ถึง 16 (ปัดเศษ) สร้างตารางรายการ 16 (อิงตามศูนย์) ด้วยรายการ n-th ค่าสูงสุดสำหรับอาร์กิวเมนต์ที่สแควร์รูทคือ n ตารางจะมีลักษณะเช่นนี้:

 0  
 2  
 6  
12  
20
etc.

คุณเดินผ่านโต๊ะและหยุดเมื่อคุณพบมูลค่าที่มากกว่าหรือเท่ากับอาร์กิวเมนต์ของคุณ ตัวอย่าง: รากที่สองของ 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

ในขณะที่ตารางการค้นหาอย่างรวดเร็วมีเวลาดำเนินการคงที่ (เพียงหนึ่งการค้นหา) ที่นี่เวลาดำเนินการจะนานขึ้นสำหรับอาร์กิวเมนต์ค่าที่สูงขึ้น

สำหรับวิธีการทั้งสองวิธีนั้นโดยการเลือกค่าที่แตกต่างกันสำหรับตารางคุณสามารถเลือกระหว่างค่าที่ปัดเศษหรือค่าที่ถูกตัดทอนสำหรับสแควร์รูท


2
หากคุณเปิดตารางนั้นกลับหัวกลับหางคุณจะต้องทำซ้ำโดยเฉลี่ยน้อยกว่า
Federico Russo

การค้นหาแบบไบนารีบนตารางที่สั้นกว่าสามารถเพิ่มความเร็วของ algoritm โดยเฉลี่ย คุณเริ่มครึ่งทางผ่านตารางการค้นหา (ตำแหน่ง 8) จากนั้นคุณตัดสินใจว่าค่าที่พบสูงเกินไปหรือต่ำเกินไปและคุณไปทั้ง 4 ตำแหน่งขึ้นไปหรือ 4 ลง ทำซ้ำจนกว่าจะเสร็จ
jippie

7

ทำงานเป็น 8 บิตโดยพื้นฐานแล้วคุณถูก จำกัด ด้วยวิธีแก้ปัญหาจำนวนเต็ม หากคุณต้องการสแควร์รูทของ X สิ่งที่ใกล้เคียงที่สุดที่คุณจะได้คือจำนวนเต็มที่มากที่สุดซึ่งสแควร์น้อยกว่าหรือเท่ากับ X ตัวอย่างเช่นสำหรับ sqrt (50) คุณจะได้รับ 7 เนื่องจาก 8 * 8 จะมากกว่า 50

ดังนั้นนี่คือเคล็ดลับสำหรับการทำเช่นนั้น: นับจำนวนคี่ที่เริ่มต้นด้วย 1 คุณสามารถลบออกจาก X คุณสามารถทำมันด้วยตรรกะเช่น: ทะเบียน 8 บิต R1 เก็บค่าการทำงานเคาน์เตอร์ 7 บิต R2 เก็บจำนวนคี่ (ส่วนใหญ่) และตัวนับ 4 บิต R3 เก็บผลลัพธ์ เมื่อรีเซ็ต R1 จะถูกโหลดด้วยค่า X, R2 จะถูกล้างเป็นศูนย์และ R3 จะถูกล้างเป็นศูนย์ วงจรตัวลบ 8 บิตถูกป้อน R1 สำหรับอินพุต 'A' และค่าของ R2 รวมกับ LSB คงที่ที่ '1' (ผ่านการดึงขึ้น) สำหรับอินพุต 'B' ตัวลบจะแสดงผลต่าง AB 8 บิตและบิตยืม ในแต่ละนาฬิกาถ้าบิตยืมชัดเจน R1 จะถูกโหลดด้วยเอาท์พุทตัวลบ R2 จะเพิ่มขึ้นและ R3 จะเพิ่มขึ้น ถ้าบิตยืมถูกตั้งค่าไว้ R1 จะไม่ถูกโหลดและ R2, R3 จะไม่เพิ่มขึ้น b / c ผลลัพธ์จะพร้อมใน R3

อีกวิธีหนึ่งคือ

มีเอาต์พุตที่เป็นไปได้เพียง 16 ค่าดังนั้นคำตอบคือตัวเลขสี่บิต โดยพื้นฐานแล้วคุณมีฟังก์ชั่นสี่บิตเดียวของ 8 บิตอินพุต ตอนนี้ฉันไม่สามารถวาดแผนที่ Karnaugh 8 มิติได้ แต่โดยหลักการแล้วคุณสามารถสร้างวงจร combinatorial สำหรับแต่ละคำตอบได้ นำเอาท์พุทของวงจร combinatorial สี่ตัวมารวมกันแล้วตีความมันเป็นคำตอบสี่บิต voila ไม่มีนาฬิกาไม่มีการลงทะเบียนเพียงแค่กลุ่มของ NAND และ NOR เท่านั้นที่จะพอเพียง


ฉันครุ่นคิดอย่างนี้ตลอดทั้งคืน บิต 8 ในเอาต์พุตนั้นชัดเจนว่าเป็นฟังก์ชันของบิตอินพุตที่สำคัญที่สุดสองตัว ในทำนองเดียวกันฉันคิดว่าบิตของ 4 ในเอาต์พุตน่าจะเป็นฟังก์ชันของบิตอินพุต 4 อันดับแรกเท่านั้น: 00x1, 001x, 1xx1 และ 11x1 ดูเหมือนจะตั้งค่าไว้ จะยืนยันในภายหลัง
JustJeff

1
หากคุณทำสิ่งนี้ใน FPGA คุณสามารถโยนมันลงไปในcaseคำสั่งขนาดใหญ่แล้วปล่อยให้เครื่องมือสังเคราะห์ทำทุกอย่างได้ ในอีกด้านหนึ่งมันเหมือนกับการทำตารางค้นหาขนาดใหญ่ใน RAM แบบกระจาย (ใช้เป็น ROM) ในทางกลับกันเครื่องมือควรค้นหาการปรับให้เหมาะสมเหมือนที่คุณพูดถึงในความคิดเห็นของคุณ
โฟตอน

5

ฉันไม่รู้ว่านี่เป็นความช่วยเหลือใด ๆ หรือไม่ แต่มีวิธีง่ายๆในการคำนวณรากที่สอง:

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;
}

ฉันไม่รู้มากเกี่ยวกับสิ่งที่สามารถและไม่สามารถทำได้ในลำดับตรรกะ แต่เนื่องจากอัลกอริทึมนี้เสร็จสิ้นในเวลาเพียง 4 ลูปคุณอาจจะสามารถนำไปใช้ใน 4 ขั้นตอน


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;

1
ว้าวซอฟต์แวร์ทำอะไรได้บ้าง? มันใช้งานได้กับขนาดใหญ่โดยพลการหรือไม่? คุณจะได้จำนวนประตูน้อยที่สุดเพื่อสร้างจากแบบฟอร์ม SOP เหล่านั้นได้อย่างไร ดูเหมือนว่า ณ จุดนี้ cpld หรือดีกว่าจะเป็นวิธีที่ใช้งานได้จริงที่สุดในการสร้าง
captncraig

@CMP ขออภัยในความล่าช้าในการตอบกลับของฉัน ฉันใช้โปรแกรมที่มีให้ที่นี่: home.roadrunner.com/~ssolver ซึ่งสามารถยอมรับตารางความจริง - ฉันใช้สคริปต์ Python ง่าย ๆ เพื่อสร้างตารางความจริงสำหรับแต่ละหลักรากที่สองของจำนวนเต็ม จริง ๆ แล้วระเบียบวิธีปฏิบัติด้านบนเหล่านี้อยู่ในรูปแบบน้อยที่สุดตามขีดจำกัดความสามารถของอัลกอริทึมที่โปรแกรมใช้เพื่อย่อ
Bitrex

1
@CMP อย่างที่คุณพูดมันคงจะบ้าที่จะใช้รากที่สองของจำนวนเต็มด้วยวิธีนี้เพราะใคร ๆ ก็สามารถใช้ตารางการค้นหาหรือรหัสอัลกอริทึมสำหรับสแควร์รูทจำนวนหนึ่งและให้ภาษา HDL ของคุณเลือกทำการสังเคราะห์
Bitrex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.