< Multiplier and Division >MultiplierThe datapath of the twos-complement multiplier.HDL description of the multiplier for 8-bit twos-complement fractions.2Cmultiplier(in : INBUS; out : OUTBUS);register A[7:0], M[7:0], Q[7:0], COUNT[2:0], F;bus INBUS[7:0], OUTBUS[7:0]BEGIN:A:=0, COUNT := 0, F:=0,INPUT:M:=INBUS;Q:=INBUS;ADD:A[7:0]:=A[7:0] + M[7:0] × Q[0],F:=(M[7] and Q[0]) or F;RSHIFT:A[7]:=F, A[6:0].Q:=A.Q[7:1],COUNT:=COUNT + 1TEST:If COUNT≠7 then go to ADD;SUBTRACT:A[7:0]:=A[7:0] - M[7:0] × Q[0], Q[0]:=0;OUTPUT:OUTBUS:=Q;OUTBUS:=A;End 2Cmultiplier블럭도와 알고리즘 분석회로는 처음 8bit, 2의 보수인 수 X와 Y를 입력으로 받는다. X는 Multiplier register인 Q레지스터에 입력한다. Y는 Multicand register인 M레지스터에 입력한다. 그리고 Accumulator A와 Sign Logic인 F, 그리고 Control Unit의 COUNT를 0으로 초기화한다. 처음 덧셈으로 시작하고 후에 Right-shift를 하는데, COUNT가 7이 될 때까지 덧셈과 Right-shitf를 반복한다. 8번의 루프를 다 돌면 마지막으로 각각 한번의 뺄셈과 Right-shift를 하여 끝나게 된다. 덧셈할 때에는 Q[0] 비트의 값이 0일 때는 A레지스터의 값을 변화시키지 않으며, Q[0] bit가 1일 때에는 A와 M레지스터를 서로 더한다. F레지스터의 값은 M[7] bit와 Q[0] bit의 AND 연산을 통하여 나온 값을 다시 F 자신과 OR 연산을 하여 나온 결과를 가지게 된다. 이 F레지스터는 곱셈 과정의 부호를 결정하여 준다. Right-shift 연산은 A[7] bit에 F레지스터 값을 주며, A[6:0].Q 에는 A.Q[7:1] 값을 주게 된다. 이 때, COUNT를 1 증가시킨다. 8번의 루프를 돌고 나면 뺄셈을 하게 된다. Q[0] bit의 값이 0일 때는 A레지스터의 내용을 변화시키지 않으며, Q[0]의 값이 1일 때는 A에서 M레지스터를 빼게 된다. 곱셈의 결과는 16bit이고 A가 결과 값의 15 ~ 8번째 bit로 Q가 7 ~ 0번째 bit로 표현된다.예제X * Y = 0111 1001(2) * 0101 1001(2) = 121(10) * 89(10)StepActionFAccumulator ARegister Q0Initialize registers0000*************= multiplier X,M = Y = 010110011Add M to ARight-shift F.A.Q*************1**************************00Q[0] = 1COUNT = 12Add zero to ARight-shift F.A.Q000000*************0*************001011110Q[0] = 0COUNT = 23Add zero to ARight-shift F.A.Q0000000*************0*************00101111Q[0] = 0COUNT = 34Add M to ARight-shift F.A.Q*************0**************************11Q[0] = 1COUNT = 45Add M to ARight-shift F.A.Q***************************************011Q[0] = 1COUNT = 56Add M to ARight-shift F.A.Q***************************************101Q[0] = 1COUNT = 67Add zero to ARight-shift F.A.Q**************************0*************10Q[0] = 1COUNT = 78Subtract zeroSet Q[0] to 000000*************0101*************01000109Right-shift F.A.Q*************001= product PX * Y = 0111 1001(2) * 0101 1001(2) = 121(10) * 89(10)= 0010 1010 0001 0001(2) = 10769(10)DivisionThe Datapath of a sequential n-bit binary divider.Nonrestoring division algorithm for unsigned integers.NRdivider(in : INBUS; out : OUTBUS);register S, A[n-1:0], M[n-1:0], Q[n-1:0], COUNT[┌log2n┐:0];Bus INBUS[n-1:0], OUTBUS[n-1:0];BEGIN:COUNT := 0, S := 0;INPUT:A := INBUS; {Input the left half of the dividend D}Q := INBUS; {Input the right half of the dividend D}M := INBUS; {Input the divisor V}SUBTRACT:S.A := S.A - M; {S is the sign of the result}TEST:if S = 0 thenbegin Q[0] := 1;if COUNT = n - 1 then go to CORRECTION; elsebegin COUNT := COUNT + 1, S.A.Q[n-1:1] := A.Q; endS.A := S.A - M, go to TEST; endelse {if S = 1}begin Q[0] := 0;if COUNT = n - 1 then go to CORRECTION; elsebegin COUNT := COUNT + 1, S.A.Q[n-1:1] := A.Q; endS.A := S.A + M, go to TEST; endCORRECTION:if S = 1 then S.A := S.A + M;OUTPUT:OUTBUS := Q; {Output the quotient Q}OUTBUS := A; {Output the remainder R}end NRdivider;블럭도와 알고리즘 분석2n-bit의 unsigned integer를 n-bit의 unsigned integer로 나누어 그 몫과 나머지를 구하는 것이다.회로는 2n개의 bit를 가지는 Quotient Q와 n개의 bit를 가지는 Divisor를 각각 D와 V로 입력을 받는다. Quotient로 받은 입력 값의 최상위 n개 bit는 Accumulator레지스터에 입력하고 최하위 n개 bit는 Quotient레지스터에 입력한다. 그리고 Divisor V는 Divisor레지스터에 입력한다. Control Unit의 COUNT를 0으로 초기화하며, SUBTRACT 결과의 부호를 결정하는 S 레지스터도 0으로 초기화한다.맨 처음 뺄셈으로 시작하며 후에 Left-shift를 하는데, COUNT가 n-1이 될 때까지 뺄셈과 Left-shift를 반복한다. 루프를 다 돌면 마지막으로 CORRECTION이라는 과정을 수행하는데, 이는 S레지스터의 값이 1일 때, S.A의 값에 M레지스터 값을 더하는 일을 한다. 처음 시작 후 뺄셈을 한 후에 TEST 오퍼레이션으로 들어가게 된다. 이 때, S의 값이 0일 때에는 Q[0] bit에 1을 대입하고, S.A.Q[n-1:1]의 bit들을 Left-shift하게 된다. 그 다음에 뺄셈을 하며 COUNT가 n-1이 아닐 때에는 다시 TEST 오퍼레이션의 처음으로 돌아가게 된다. TEST 오퍼레이션에 들어 왔을 때, S의 값이 1일 때에는 Q[0] bit에 0을 대입하고, Left-shift를 수행한 후에 덧셈을 수행하게 된다. 이 후, COUNT가 n-1이 아닐 때에 역시 TEST 오퍼레이션의 처음으로 돌아간다.n-1번의 이러한 과정을 수행하면, COUNT가 n-1이 되어 TEST 오퍼레이션을 빠져 나오게 되고 CORRECTION을 수행하게 된다 이 과정에서는 S가 0일 경우에는 아무런 동작을 하지 않지만, S가 1일 경우에는 S.A의 값에 M레지스터를 더한다.나눗셈의 결과는 Q레지스터의 값이 Quotient이 되고, A레지스터의 값이 Remainder가 된다.예제X * Y = 0101 1100(2) / 0111(2) = 92(10) / 7(10)StepActionSAQ0Initialize registers010111000= dividend D1Subtract M to AReset Q[0]Left-shift S.A.Q**************************10010= divisor V = MQ[0] = 1COUNT = 12Subtract M to AReset Q[0]Left-shift S.A.Q*************10*************110Q[0] = 1COUNT = 23Subtract M to ASet Q[0]Left-shift S.A.Q*************0*************1100Q[0] = 0COUNT = 34Add M to AReset Q[0]000*************001101Q[0] = 100011101= quotient Q= remainder RQ = 13, R = 1