Designing a
Divider
With contributions from
J. Kubiatowicz (CS152)
Digital Integrated Circuits 2/e
Divide: Paper & Pencil
1001 Quotient
Divisor 1000 1001010 Dividend
–1000
10
101
1010
–1000
10 Remainder (or Modulo result)
See how big a number can be subtracted, creating quotient
bit on each step
Binary => 1 * divisor or 0 * divisor
Dividend = Quotient x Divisor + Remainder
=> | Dividend | = | Quotient | + | Divisor |
Digital Integrated Circuits 2/e
DIVIDE HARDWARE Version 1
° 64-bit Divisor reg, 64-bit ALU, 64-bit Remainder reg,
32-bit Quotient reg
Shift Right
Divisor
64 bits
Quotient Shift Left
64-bit A/S
32 bits
Write
Remainder Control
64 bits
Digital Integrated Circuits 2/e
Start: Place Dividend in Remainder
Divide Algorithm Version 1
°Takes n+1 steps for n-bit Quotient & Rem.
1. Subtract the Divisor register from the
Remainder Quotient Divisor Remainder register, and place the result
0000 0111 0000 0010 0000 in the Remainder register.
Remainder ≥ 0 Test Remainder < 0
Remainder
2a. Shift the 2b. Restore the original value by adding the
Quotient register Divisor register to the Remainder register, &
to the left setting place the sum in the Remainder register. Also
the new rightmost shift the Quotient register to the left, setting
bit to 1. the new least significant bit to 0.
3. Shift the Divisor register right1 bit.
n+1 No: < n+1 repetitions
repetition?
Yes: n+1 repetitions (n = 4 here)
Done Digital Integrated Circuits 2/e
Divide Algorithm I example (7 / 2)
Remainder Quotient Divisor
0000 0111 00000 0010 0000
1: 1110 0111 00000 0010 0000
2: 0000 0111 00000 0010 0000
3: 0000 0111 00000 0001 0000
1: 1111 0111 00000 0001 0000 Answer:
2: 0000 0111 00000 0001 0000
3: 0000 0111 00000 0000 1000 Quotient = 3
1: 1111 1111 00000 0000 1000 Remainder = 1
2: 0000 0111 00000 0000 1000
3: 0000 0111 00000 0000 0100
1: 0000 0011 00000 0000 0100
2: 0000 0011 00001 0000 0100
3: 0000 0011 00001 0000 0010
1: 0000 0001 00001 0000 0010
2: 0000 0001 00011 0000 0010
3: 0000 0001 00011 0000 0001
Digital Integrated Circuits 2/e
Observations on Divide Version 1
° 1/2 bits in divisor always 0
=> 1/2 of 64-bit adder is wasted
=> 1/2 of divisor is wasted
° Instead of shifting divisor to right,
shift remainder to left?
Digital Integrated Circuits 2/e
Divide Algorithm I example: wasted space
Remainder Quotient Divisor
0000 0111 00000 0010 0000
1: 1110 0111 00000 0010 0000
2: 0000 0111 00000 0010 0000
3: 0000 0111 00000 0001 0000
1: 1111 0111 00000 0001 0000
2: 0000 0111 00000 0001 0000
3: 0000 0111 00000 0000 1000
1: 1111 1111 00000 0000 1000
2: 0000 0111 00000 0000 1000
3: 0000 0111 00000 0000 0100
1: 0000 0011 00000 0000 0100
2: 0000 0011 00001 0000 0100
3: 0000 0011 00001 0000 0010
1: 0000 0001 00001 0000 0010
2: 0000 0001 00011 0000 0010
3: 0000 0001 00011 0000 0010
Digital Integrated Circuits 2/e
DIVIDE HARDWARE Version 2
° 32-bit Divisor reg, 32-bit ALU, 64-bit Remainder reg,
32-bit Quotient reg
Divisor
32 bits
Quotient Shift Left
32-bit ALU 32 bits
Shift Left
Remainder Control
64 bits Write
Digital Integrated Circuits 2/e
Start: Place Dividend in Remainder
Divide Algorithm Version 2
Remainder Quotient Divisor 1. Shift the Remainder register left 1 bit.
0000 0111 0000 0010
2. Subtract the Divisor register from the
left half of the Remainder register, & place the
result in the left half of the Remainder register.
Remainder ≥ 0 Test Remainder < 0
Remainder
3a. Shift the 3b. Restore the original value by adding the Divisor
Quotient register register to the left half of the Remainderregister,
to the left setting &place the sum in the left half of the Remainder
the new rightmost register. Also shift the Quotient register to the left,
bit to 1. setting the new least significant bit to 0.
nth No: < n repetitions
repetition?
Yes: n repetitions (n = 4 here)
Done Digital Integrated Circuits 2/e
Divide Algorithm I version 2 (shift remainder)
Remainder Quotient Divisor
0000 0111 00000 0010
1: 1110 0111 00000 0010
2: 0000 0111 00000 0010
3: 0000 1110 00000 0010
1: 1110 1110 00000 0010
2: 0000 1110 00000 0010
3: 0001 1100 00000 0010
1: 1111 1100 00000 0010
2: 0001 1100 00000 0010
3: 0011 1000 00000 0010
1: 0001 1000 00001 0010
2: 0001 1000 00001 0010
3: 0011 0000 00001 0010
1: 0001 0000 00011 0010
2: 0001 0000 00011 0010
Digital Integrated Circuits 2/e
Divide: Revisited
Non-restoring divider
1001 Quotient
Divisor 1000 1001010 Dividend
-1000
00010
-1000
110101
+1000
111010
+1000
00010 Remainder (or Modulo result)
Avoids extra step of “restoration” when partial result is negative.
Instead of subtract, adds divisor on next iteration
Digital Integrated Circuits 2/e
Divide Algorithm I example: non-restoring
Remainder Quotient Divisor
0000 0111 00000 0010
1: 1110 0111 00000 0010
2: 1100 1110 00000 0010
1: 1110 1110 00000 0010
2: 1101 1100 00000 0010
1: 1111 1100 00000 0010
2: 1111 1000 00000 0010
1: 0001 1000 00001 0010
2: 0011 0000 00001 0010
1: 0001 0000 00011 0010
Digital Integrated Circuits 2/e