디지털 조합이나 순차 논리 만 사용하여 주어진 8 비트 숫자의 제곱근을 계산하는 방법을 찾고있었습니다. 가능합니까?
분수 부분을 전혀 고려하지 않기 때문에 룩업 테이블을 사용하는 한 가지 방법이 있으므로 ( ) 이것보다 더 좋은 방법이 있어야합니다. 누군가 나를 가리킬 수 있습니까?
디지털 조합이나 순차 논리 만 사용하여 주어진 8 비트 숫자의 제곱근을 계산하는 방법을 찾고있었습니다. 가능합니까?
분수 부분을 전혀 고려하지 않기 때문에 룩업 테이블을 사용하는 한 가지 방법이 있으므로 ( ) 이것보다 더 좋은 방법이 있어야합니다. 누군가 나를 가리킬 수 있습니까?
답변:
조회 테이블은 주석에서 언급되었습니다. 두 가지 접근 방식이 있습니다.
빠름
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
빠른 조회 테이블에는 고정 된 실행 시간 (단 하나의 조회)이 있지만 여기서는 더 높은 값의 인수에 대해 실행 시간이 더 깁니다.
두 방법 모두 테이블에 대해 다른 값을 선택하여 제곱근에 대해 반올림 또는 잘린 값 중에서 선택할 수 있습니다.
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 만 있으면 충분하다.
case설명을 작성하고 합성 도구가 모든 작업을 수행하도록 할 수 있습니다. 한편으로는 분산 RAM (ROM으로 사용)에서 큰 조회 테이블을 수행하는 것과 같습니다. 반면에 도구는 의견에서 언급 한 것처럼 최적화를 찾아야합니다.
이것이 도움이되는지 모르겠지만 제곱근을 계산하는 독창적 인 간단한 방법이 있습니다.
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 단계로 구현할 수 있습니다.
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;