Tính căn bậc hai của số nhị phân 8 bit


14

Tôi đang tìm cách tính căn bậc hai của một số 8 bit nhất định chỉ bằng cách sử dụng kết hợp kỹ thuật số hoặc logic tuần tự. Điều đó có thể không?

Một cách có thể là chỉ sử dụng bảng tra cứu vì tôi hoàn toàn không xem xét các phần phân số (vì vậy ) nhưng phải có cách tốt hơn thế này. Ai đó có thể chỉ cho tôi điều đó?103


4
Tôi sẽ sử dụng một bảng tra cứu đơn giản với phạm vi. Số lượng tối thiểu và tối đa cho mỗi đầu ra và bạn chỉ cần kiểm tra.
Kortuk

6
Một tra cứu có vẻ khá đơn giản. Rốt cuộc, chỉ có 16 câu trả lời có thể có cho căn bậc hai của một số 8 bit.
Olin Lathrop

3
hmm .. câu trả lời duy nhất là 0000 đến 1111; chỉ các đầu vào 64 trở lên mới có bit trên cùng được đặt trong câu trả lời, vì vậy đó chỉ là OR của hai bit trên cùng của đầu vào. Bây giờ bạn chỉ còn ba chức năng 8 bit để giảm ..
JustJeff

Câu trả lời:


9

Bảng tra cứu đã được đề cập trong các ý kiến. Có hai cách tiếp cận.

Nhanh
Tạo một bảng dài 256 byte, với mỗi giá trị tiếp theo là căn bậc hai của chỉ mục tương ứng. Điều này rất nhanh vì bạn sử dụng đối số làm chỉ mục để truy cập trực tiếp vào giá trị đúng. Hạn chế là nó cần một bảng dài, với nhiều giá trị trùng lặp.

Nhỏ gọn
Như đã nói, một số nguyên 8 bit chỉ có thể có các giá trị từ 0 đến 255 và các căn bậc hai tương ứng là 0 đến 16 (làm tròn). Xây dựng bảng nhập 16 (dựa trên zero) với mục nhập thứ n giá trị tối đa cho đối số mà căn bậc hai là n. Bảng sẽ trông như thế này:

 0  
 2  
 6  
12  
20
etc.

Bạn đi qua bảng và dừng lại khi bạn gặp một giá trị lớn hơn hoặc bằng với đối số của bạn. Ví dụ: căn bậc hai của 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

Mặc dù bảng tra cứu nhanh có thời gian thực hiện cố định (chỉ một lần tra cứu), ở đây thời gian thực hiện dài hơn đối với các đối số có giá trị cao hơn.

Đối với cả hai phương pháp, bằng cách chọn các giá trị khác nhau cho bảng, bạn có thể chọn giữa giá trị làm tròn hoặc giá trị rút gọn cho căn bậc hai.


2
Nếu bạn lật ngược bàn đó, bạn sẽ cần ít lần lặp hơn trung bình
Federico Russo

Một tìm kiếm nhị phân trên bảng ngắn hơn có thể tăng tốc trung bình algoritm. Bạn bắt đầu đi được nửa đường qua bảng tra cứu (vị trí 8) sau đó bạn quyết định xem giá trị tìm thấy quá cao hay quá thấp và bạn đi 4 bậc lên hoặc 4 xuống. Lặp lại cho đến khi hoàn thành.
jippie

7

Làm việc trong 8 bit, về cơ bản bạn bị ràng buộc với các giải pháp số nguyên. Nếu bạn cần căn bậc hai của X, số gần nhất bạn có thể nhận được là số nguyên lớn nhất có bình phương nhỏ hơn hoặc bằng X. Ví dụ: đối với sqrt (50) bạn sẽ nhận được 7, vì 8 * 8 sẽ nhiều hơn 50.

Vì vậy, đây là một mẹo để làm điều đó: đếm có bao nhiêu số lẻ, bắt đầu bằng 1, bạn có thể trừ đi X. Bạn có thể làm điều đó với logic như vậy: một thanh ghi 8 bit R1 giữ giá trị làm việc, bộ đếm 7 bit R2 giữ (hầu hết) số lẻ và bộ đếm 4 bit R3 giữ kết quả. Khi thiết lập lại, R1 được tải với giá trị của X, R2 bị xóa thành 0 và R3 bị xóa về 0. Mạch trừ 8 bit được cung cấp cho đầu vào 'A' và giá trị của R2 kết hợp với LSB được cố định ở '1' (thông qua kéo lên) cho đầu vào 'B'. Phép trừ xuất ra chênh lệch 8 bit AB và bit vay. Ở mỗi đồng hồ, nếu bit vay rõ ràng, thì R1 được tải với đầu ra phép trừ, R2 được tăng lên và R3 được tăng lên. Nếu bit mượn được đặt, R1 không được tải và R2, R3 không được tăng lên, b / c kết quả đã sẵn sàng trong R3.

THAY ĐỔI

Chỉ có 16 giá trị đầu ra có thể, vì vậy câu trả lời là một số bốn bit. Về cơ bản, bạn có bốn hàm đơn bit của 8 bit đầu vào. Bây giờ, tôi không thể vẽ bản đồ Karnaugh 8 chiều, nhưng về nguyên tắc, bạn có thể đưa ra một mạch tổ hợp cho mỗi bit của câu trả lời. Lấy các đầu ra của bốn mạch tổ hợp đó với nhau và giải thích chúng là câu trả lời bốn bit. Voila. Không có đồng hồ, không có đăng ký, chỉ cần một loạt NAND và NOR là đủ.


Tôi đã nghiền ngẫm chuyện này suốt đêm. Bit 8 trong đầu ra rõ ràng là một chức năng của hai bit đầu vào quan trọng nhất. Tương tự, tôi nghĩ rằng bit 4 trong đầu ra có khả năng là một hàm chỉ có 4 bit đầu vào hàng đầu: 00x1, 001x, 1xx1 và 11x1 dường như đặt nó. Sẽ xác minh điều này sau.
JustJeff

1
Nếu bạn đang làm điều này trong một đồ họa, bạn có thể đưa nó vào một casecâu lệnh lớn và để công cụ tổng hợp thực hiện tất cả công việc. Một mặt, nó giống như làm một bảng tra cứu lớn trong RAM phân tán (được sử dụng làm ROM); mặt khác, công cụ sẽ tìm thấy tối ưu hóa như bạn đề cập trong bình luận của bạn.
Photon

5

Tôi không biết đây có phải là bất kỳ trợ giúp nào không, nhưng có một cách đơn giản để tính căn bậc hai:

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

Tôi không biết nhiều về những gì có thể và không thể được thực hiện trong logic tuần tự, nhưng vì thuật toán này kết thúc chỉ sau 4 vòng, bạn có thể thực hiện nó trong 4 giai đoạn.


4

2số 8

    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
Wow, phần mềm nào vậy? Nó hoạt động cho kích thước lớn tùy ý? Làm thế nào bạn có được số lượng cổng tối thiểu để thực sự xây dựng nó từ các hình thức SOP đó? Có vẻ như tại thời điểm này, một cpld hoặc tốt hơn chắc chắn sẽ là cách thiết thực nhất để xây dựng nó.
captncraig

@CMP Xin lỗi vì sự chậm trễ trong câu trả lời của tôi. Tôi đã sử dụng chương trình có sẵn ở đây: home.roadrunner.com/~ssolver có thể chấp nhận các bảng chân lý - Tôi đã sử dụng một tập lệnh Python đơn giản để tạo một bảng chân lý cho mỗi chữ số căn bậc hai. Những quy trình tác nghiệp trên thực tế trong hình thức tối thiểu của họ, các giới hạn về khả năng của các thuật toán chương trình sử dụng để giảm thiểu chúng.
Bitrex

1
@CMP Như bạn nói, sẽ thật điên rồ khi thực hiện căn bậc hai số nguyên theo cách này, vì người ta có thể sử dụng bảng tra cứu hoặc mã hóa một trong các thuật toán cho căn bậc hai số nguyên và để ngôn ngữ HDL của bạn lựa chọn tổng hợp.
Bitrex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.