CPU가 덧셈과 곱셈을 구현하는 방법을 사용하여 디지털 처리 문제를 해결하기 위해 디지털 회로를 설계하는 방법에 대한 아이디어를 제공하려고합니다.
첫째, 프로그래밍 언어가 곱셈과 덧셈을 어떻게 효율적으로 평가 하는가 ? 대답은 간단합니다. 곱셈으로 컴파일하고 명령어를 추가합니다. 예를 들어, 다음 코드는
a = 1 + 1;
b = a * 20;
단순히 다음과 같이 컴파일됩니다.
ADD 1 1 a
MUL a 20 b
(위의 어셈블리는 단순성을 위해 존재하지 않는 가상의 CPU를위한 것입니다).
이 시점에서 위의 대답은 단순히 문제를 이동시키고 하드웨어 마술로 해결한다는 것을 알고 있습니다. 후속 질문은 분명히 그 하드웨어 마술이 어떻게 작동합니까?
간단한 문제를 먼저 살펴 보자.
먼저 우리는 익숙한 문제를 해결하면서 정기적으로 10 진수를 더합니다.
17
+28
첫 번째 단계는 7과 8을 더하는 것입니다. 그러나 결과적으로 한 자리 이상인 15가됩니다. 그래서 우리는 1 :
(1)
17
+28
= 5
이제 1, 1, 2를 더합니다 :
17
+28
=45
그래서 우리는 다음과 같은 규칙을 얻습니다.
덧셈 결과가 두 자리 이상일 때, 우리는 최하위 숫자를 유지하고 최상위 숫자를 앞으로 옮깁니다.
열에 숫자가 들어간 경우 추가 할 숫자와 함께 숫자를 더합니다.
이제 기본 2-부울 대수에서 위의 규칙을 해석 할 차례입니다.
따라서 부울 대수에서는 0과 1을 더하고 = 1을 더합니다. 0과 0 = 0을 더합니다. 그리고 1과 1 = 10을 두 자리 이상으로 더하면 1이 앞으로 나옵니다.
이것으로부터 우리는 진리표를 구성 할 수 있습니다 :
a b | sum carry
-------------------
0 0 | 0 0
0 1 | 1 0
1 0 | 1 0
1 1 | 0 1
이로부터 두 개의 회로 / 부울 방정식을 구성 할 수 있습니다. 하나는 합계 출력용이고 다른 하나는 캐리 출력용입니다. 가장 순진한 방법은 모든 입력을 간단히 나열하는 것입니다. 이 형식으로 아무리 크고 복잡한 것이 든 복원 할 수있는 모든 진리표 :
(AND inputs in first row) OR (AND of inputs in second row) OR ...
이것은 기본적으로 제품 형태의 합계입니다. 우리는 1을 초래하고 0을 무시하는 출력만을 봅니다.
sum = (NOT a AND b) OR (a AND NOT b)
AND OR와 NOT을 프로그래밍 언어 기호로 바꿔서 읽기 쉽도록하겠습니다.
sum = (!a & b) | (a & !b)
기본적으로 테이블을 다음과 같이 변환했습니다.
a b | sum equation
-------------------
0 0 | 0
0 1 | 1 (!a & b)
1 0 | 1 (a & !b)
1 1 | 0
이것은 회로로 직접 구현할 수 있습니다.
_____
a ------------| |
\ | AND |-. ____
\ ,-NOT--|_____| \ | |
\/ `--| OR |----- sum
/\ _____ ,--|____|
/ `-NOT--| | /
/ | AND |-`
b ------------|_____|
이 시점에서 관찰자들은 위의 논리가 실제로 단일 테이블, 즉 우리의 진리표에 의해 요구되는 행동을 갖는 XOR 게이트로 구현 될 수 있음을 주목할 것입니다 :
_____
a ------------| |
| XOR |---- sum
b ------------|_____|
그러나 하드웨어가 XOR 게이트를 제공하지 않는 경우 위의 단계는 AND, OR 및 NOT 게이트로 하드웨어를 정의하고 구현하는 방법입니다.
논리 게이트를 실제 하드웨어로 변환하는 방법은 사용중인 하드웨어에 따라 다릅니다. 메커니즘이 일종의 스위칭 동작을 제공하는 한 다양한 물리적 메커니즘을 사용하여 구현할 수 있습니다. 논리 게이트는 물 분사 또는 공기 퍼프 (유체)에서 트랜지스터 (전자 장치), 떨어지는 대리석에 이르기까지 모든 것으로 구현되었습니다. 그것은 그 자체로 큰 주제이기 때문에 나는 그것을 극복하고 논리 게이트를 물리적 장치로 구현할 수 있다고 말할 것입니다.
이제 캐리 신호에 대해서도 똑같이합니다. 캐리 신호가 참인 조건은 하나뿐이므로 방정식은 다음과 같습니다.
carry = a & b
따라서 캐리는 간단합니다.
_____
a ------------| |
| AND |---- carry
b ------------|_____|
그것들을 결합하면 우리는 반 가산기라고 알려진 것을 얻습니다.
_____
a ------;-----| |
| | XOR |---- sum
b --;---|-----|_____|
| | _____
| '-----| |
| | AND |---- carry
'---------|_____|
그런데 위의 회로에 대한 방정식은 다음과 같습니다.
sum = a ^ b
carry = a & b
반가산기에 무언가가 없습니다. 결과가 이월보다 두 자리 이상인 경우 첫 번째 규칙을 구현했지만 두 번째 규칙을 구현하지 않은 경우 캐리가 있으면 숫자와 함께 추가하십시오.
따라서 두 자리 이상의 숫자를 추가 할 수있는 추가 회로 인 완전 가산기를 구현하려면 진리표를 정의해야합니다.
a b c | sum carry
---------------------
0 0 0 | 0 0
0 0 1 | 1 0
0 1 0 | 1 0
0 1 1 | 0 1
1 0 0 | 1 0
1 0 1 | 0 1
1 1 0 | 0 1
1 1 1 | 1 1
합계에 대한 방정식은 다음과 같습니다.
sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)
우리는 동일한 과정을 거쳐 방정식을 분해하고 단순화하고 회로처럼 해석 할 수 있지만이 대답은 너무 길어지고 있다고 생각합니다.
이제 디지털 로직이 어떻게 설계되는지에 대한 아이디어를 얻게됩니다. Karnaugh 맵 (진실 테이블을 단순화하는 데 사용됨)과 같은 에스프레소와 같은 논리 컴파일러와 같이 언급하지 않은 다른 트릭이 있지만 (부울 방정식을 직접 계산할 필요가 없습니다) 기본은 기본적으로 위에서 설명한 :
단일 비트 (숫자) 수준에서 작업 할 수있을 때까지 문제를 분해하십시오.
진리표를 사용하여 원하는 출력을 정의하십시오.
표를 부울 방정식으로 변환하고 방정식을 단순화하십시오.
방정식을 논리 게이트로 해석하십시오.
논리 게이트를 구현하여 논리 회로를 실제 하드웨어 회로로 변환하십시오.
그것이 근본적인 (또는 오히려 저수준) 문제가 실제로 해결되는 방법입니다-많은 진실 테이블. 실제 창의적인 작업은 MP3 디코딩과 같은 복잡한 작업을 비트 수준으로 분류하여 진리표로 작업 할 수 있습니다.
곱셈을 구현하는 방법을 설명 할 시간이 없습니다. 곱셈이 얼마나 오래 작동하는지에 대한 규칙을 알아 낸 다음 이진수로 해석하여 진리표로 세분화하여 균열을 시도해 볼 수 있습니다. 또는 Wikipedia를 읽을 수 있습니다 : http://en.wikipedia.org/wiki/Binary_multiplier