곱셈기

**곱셈기**(multiplier)는 디지털 회로에서 두 이진값을 곱하는 목적의 하드웨어 회로이다. 다양한 컴퓨터 산술 기술은 디지털 곱셈을 수행하는 데 사용할 수 있다. 대부분의 기술은 계산된 “부분적 곱”의 집합을 포함하고, 그러면 부분적 곱은 동시에 합계된다. 이 과정은 10진 정수형으로 지도되는 긴 곱셈에서 초등학생을 가르치는 방법과 비슷하지만, 2진 기수법에 응용하여 여기에 수정해서 적용할 수 있다.
# 부호 없는 정수형의 예시
예시로, 두 개의 부호없는 정수형 8비트를 곱셈한다고 가정하자: *a*[7:0]와 *b*[7:0]가 있다. 여덟개의 한 비트 곱셈 연산에 의하여 여덟 개의 부분적 곱을 만들며, 피승수 *a*에 대한 각 비트는 다음과 같다: p0[7:0] = a[0] × b[7:0] = {8{a[0] & b[7:0] p1[7:0] = a[1] × b[7:0] = {8{a[1] & b[7:0] p2[7:0] = a[2] × b[7:0] = {8{a[2] & b[7:0] p3[7:0] = a[3] × b[7:0] = {8{a[3] & b[7:0] p4[7:0] = a[4] × b[7:0] = {8{a[4] & b[7:0] p5[7:0] = a[5] × b[7:0] = {8{a[5] & b[7:0] p6[7:0] = a[6] × b[7:0] = {8{a[6] & b[7:0] p7[7:0] = a[7] × b[7:0] = {8{a[7] & b[7:0] 곱을 마무리하기 위해서, 다음에 보이는 것처럼, 모든 여덟 개의 부분적 곱을 더할 필요가 있다: {| |- | || || || || || || || || p0[7] || p0[6] || p0[5] || p0[4] || p0[3] || p0[2] || p0[1] || p0[0] |- | || || || || || || + || p1[7] || p1[6] || p1[5] || p1[4] || p1[3] || p1[2] || p1[1] || p1[0] || 0 |- | || || || || || + || p2[7] || p2[6] || p2[5] || p2[4] || p2[3] || p2[2] || p2[1] || p2[0] || 0 || 0 |- | || || || || + || p3[7] || p3[6] || p3[5] || p3[4] || p3[3] || p3[2] || p3[1] || p3[0] || 0 || 0 || 0 |- | || || || + || p4[7] || p4[6] || p4[5] || p4[4] || p4[3] || p4[2] || p4[1] || p4[0] || 0 || 0 || 0 || 0 |- | || || + || p5[7] || p5[6] || p5[5] || p5[4] || p5[3] || p5[2] || p5[1] || p5[0] || 0 || 0 || 0 || 0 || 0 |- | || + || p6[7] || p6[6] || p6[5] || p6[4] || p6[3] || p6[2] || p6[1] || p6[0] || 0 || 0 || 0 || 0 || 0 || 0 |- | + || p7[7] || p7[6] || p7[5] || p7[4] || p7[3] || p7[2] || p7[1] || p7[0] || 0 || 0 || 0 || 0 || 0 || 0 || 0 |- | P[15] || P[14] || P[13] || P[12] || P[11] || P[10] || P[9] || P[8] || P[7] || P[6] || P[5] || P[4] || P[3] || P[2] || P[1] || P[0] |} 다른 말로 하면, *P*[15:0]는 *p*0, *p*1 << 1, *p*2 << 2, 과 나머지 다섯 개를 덧셈해서, 최종 부호없는 16 비트 곱셈값이 된다.
# 부호 정수형의 연산
만약 *b*가 부호없는 정수형 대신에 부호 정수형이었다면, 부분적 곱은 합계이전에 폭을 확장해야 할 것이다. 만약 *a*가 부호 정수형이었다면, 부분적 곱 *p7*은 최종 합계에서 더하는 대신에, 뺄셈해야 한다. 위의 배열 곱셈은 몇 개 곱항의 반전에 의하여 2의 보수법 부호 숫자를 지원하기 위해서 수정할 수 있고, 첫 번째 부분적 곱항의 왼쪽에 하나를 삽입한다: {| |- | || || || || || || || 1 || -p0[7] || p0[6] || p0[5] || p0[4] || p0[3] || p0[2] || p0[1] || p0[0] |- | || || || || || || || -p1[7] || +p1[6] || +p1[5] || +p1[4] || +p1[3] || +p1[2] || +p1[1] || +p1[0] || 0 |- | || || || || || || -p2[7] || +p2[6] || +p2[5] || +p2[4] || +p2[3] || +p2[2] || +p2[1] || +p2[0] || 0 || 0 |- | || || || || || -p3[7] || +p3[6] || +p3[5] || +p3[4] || +p3[3] || +p3[2] || +p3[1] || +p3[0] || 0 || 0 || 0 |- | || || || || -p4[7] || +p4[6] || +p4[5] || +p4[4] || +p4[3] || +p4[2] || +p4[1] || +p4[0] || 0 || 0 || 0 || 0 |- | || || || -p5[7] || +p5[6] || +p5[5] || +p5[4] || +p5[3] || +p5[2] || +p5[1] || +p5[0] || 0 || 0 || 0 || 0 || 0 |- | || || -p6[7] || +p6[6] || +p6[5] || +p6[4] || +p6[3] || +p6[2] || +p6[1] || +p6[0] || 0 || 0 || 0 || 0 || 0 || 0 |- | 1 || +p7[7] || -p7[6] || -p7[5] || -p7[4] || -p7[3] || -p7[2] || -p7[1] || -p7[0] || 0 || 0 || 0 || 0 || 0 || 0 || 0 |- | P[15] || P[14] || P[13] || P[12] || P[11] || P[10] || P[9] || P[8] || P[7] || P[6] || P[5] || P[4] || P[3] || P[2] || P[1] || P[0] |} 위의 음의 부호 (-) 표시를 잊으면 안된다. 그것은 산술 부정 ( -(7) = -7)을 의미하지는 않고, 대신에 이진 보수를 의미하며, 보다 일반적으로 x' (엑스프라임 혹은 엑스바로 읽음)로 나타내거나 모든 비트를 조작한다. 음의 숫자를 얻기 위해 2의 보수에서, 숫자를 보수화하고 1을 더한다. 그래서 NOT과 동등하다. 보이지 않고 분명하지 않은 위의 비트 배열에 많은 간이화가 있어서, 몇 가지만 설명할 것이다. 비보수 비트에 의한 하나의 보수 비트의 순서는 부호 확장을 피하기 위해 2의 보수 편법을 사용한다. p7 (모든 보수 비트에 의한 비보수 비트)의 순서는 이 항을 빼기 때문에 시작하면서 모두 부정한다(그리고 1은 최하위 위치에 더한다). 순서의 모든 형태에서, 마지막 비트는 조작되고 음의 -1은 바로 아래의 최상위 비트를 더할 것이다. p7의 비트 위치 0(최하위 비트)에 2의 보수 부정의 +1과 모든 -1의 비트행 7에서 15까지(최상위 비트가 위치하는 곳의 각각) 한꺼번에 더해질 때, 하나의 1로 간소화될 수 있어서 "신기하게" 왼쪽으로 떨어져 나간다. 왜 조작된 최상위 비트가 부호 확장을 저장하는 것에 대한 설명과 증명을 위해서, 전산학 개론서를 참고할 수 있다.
# 실행
오래된 곱셈기 구조는 부분적 누계를 합계하기 위해 시프터와 누산기를 채용하여, 한 주기에 하나의 부분적 곱을 연산하며, 기판 면적은 작아지지만 속도는 감소된다. 현대의 곱셈기 구조는 한 클럭에 부분적 곱을 모두 더하기 위해 바우-울리 알고리즘, 월리스 트리, 다다 곱셈기를 사용한다. 월리스 트리 실행의 성능은 가끔 두 개의 피승수 중 하나의 부스 인코딩에 의하여 향상되어, 반드시 합계해야 할 부분적 곱의 개수를 감소시킨다.