8 비트 이진수의 제곱근 계산


14

디지털 조합이나 순차 논리 만 사용하여 주어진 8 비트 숫자의 제곱근을 계산하는 방법을 찾고있었습니다. 가능합니까?

분수 부분을 전혀 고려하지 않기 때문에 룩업 테이블을 사용하는 한 가지 방법이 있으므로 ( ) 이것보다 더 좋은 방법이 있어야합니다. 누군가 나를 가리킬 수 있습니까?10


4
범위가있는 간단한 조회 테이블을 사용합니다. 각 출력의 최소 숫자와 최대 값을 확인하십시오.
Kortuk

6
조회는 매우 간단 해 보입니다. 결국 8 비트 숫자의 제곱근에 대한 가능한 대답은 16 가지뿐입니다.
Olin Lathrop

3
흠 .. 유일한 답변은 0000에서 1111입니다. 64 이상의 입력 만 응답에서 최상위 비트가 설정되므로 입력의 상위 2 비트에 대한 OR입니다. 이제 8 비트의 세 가지 기능 만 사용하여 감소시킬 수 있습니다.
JustJeff

답변:


9

조회 테이블은 주석에서 언급되었습니다. 두 가지 접근 방식이 있습니다.

빠름
256 바이트 길이의 테이블을 만듭니다. 다음 값마다 해당 인덱스의 제곱근이 있습니다. 인수를 색인으로 사용하여 올바른 값에 직접 액세스하므로 이는 빠릅니다. 단점은 중복 값이 ​​많은 긴 테이블이 필요하다는 것입니다.

Compact
앞서 언급했듯이 8 비트 정수는 0에서 255까지의 값만 가질 수 있으며 해당 제곱근은 0에서 16 (반올림)입니다. 제곱근이 n 인 인수의 최대 값을 n 번째 항목으로 16 개의 항목 테이블 (0부터 시작)을 구성하십시오. 테이블은 다음과 같습니다.

 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

짧은 테이블에서 이진 검색을하면 평균 알고리즘 속도가 빨라질 수 있습니다. 조회 테이블 (위치 8)을 반쯤 시작한 후 찾은 값이 너무 높거나 낮은 지 여부를 결정하고 4 위 또는 4 위로 이동합니다. 끝날 때까지 반복하십시오.
jippie

7

8 비트로 작업하면 기본적으로 정수 솔루션으로 제한됩니다. X의 제곱근이 필요한 경우, 가장 가까운 정수는 제곱이 X보다 작거나 같은 가장 큰 정수입니다. 예를 들어, sqrt (50)의 경우 8이 8보다 크므로 sqrt (50)은 7이됩니다. 50.

1부터 시작하여 X에서 뺄 수있는 홀수를 세십시오. 8 비트 레지스터 R1은 7 비트 카운터 R2의 작동 값을 유지합니다. 는 홀수를 보유하고 (대부분) 4 비트 카운터 R3은 결과를 보유합니다. 재설정시 R1에 X 값이로드되고 R2가 0으로 해제되고 R3이 0으로 해제됩니다. 8 비트 감산기 회로에는 'A'입력에 대해 R1이 공급되고 R2의 값은 'B'입력에 대해 '1'(풀업을 통해)으로 고정 된 LSB와 결합됩니다. 감산기는 8 비트 차이 AB 및 차용 비트를 출력한다. 각 클럭에서, 차용 비트가 깨끗하지 않으면 R1에 감산기 출력이로드되고 R2가 증가하며 R3이 증가합니다. 차용 비트가 설정되고 R1이로드되지 않고 R2, R3이 증가하지 않으면 b / c 결과는 이제 R3에서 준비됩니다.

대안 적으로

가능한 출력 값은 16 개뿐이므로 답은 4 비트 숫자입니다. 기본적으로 8 개의 입력 비트 중 4 개의 단일 비트 기능이 있습니다. 이제 8 차원 Karnaugh 맵을 그릴 수는 없지만 원칙적으로 각 답의 조합 회로를 만들 수 있습니다. 이 4 개의 조합 회로의 출력을 함께 취하여 4 비트 응답으로 해석하십시오. 짜잔 시계도없고 레지스터도없고 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 프로그램을 사용했습니다. 간단한 파이썬 스크립트를 사용하여 각 정수 제곱근의 진리표를 생성했습니다. 위의 SOP 실제로 최소한의 형태로 프로그램이 최소화하는 데 사용하는 알고리즘의 능력 한계에 있습니다.
Bitrex

1
@CMP 당신이 말했듯이, 룩업 테이블을 사용하거나 정수 제곱근에 대한 알고리즘 중 하나를 코딩하고 선택한 HDL 언어가 그것을 합성하게 할 수 있기 때문에 정수 제곱근을 이런 식으로 구현하는 것은 미친 일입니다.
Bitrex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.