Divide A/B (shift reg)
This layout divides
A
by
B
using a shift register. It displays the output as
Q
remainder
r
.
eg. 14/4 = 3 rem 2.
Division is the most difficult operator to implement. The layout conducts a 'long division' calculation. It uses the following functions:
- Sequential Read of register A into r register.
- Shift Left of r register.
- Compare B and r register.
- Subtract B from r .
- Shift Left of output Q register.
There are also several small circuits on the right hand side. These prevent shifts of empty registers, so speeding up the long division operation.
- The first, just below the start, detects any leading zeros and returns the train to read out the next bit from A .
- A 'first return latch' returns the first 1 read out from A and prevents a shift of an empty r register.
- Finally, the pair of linked points prevents shifts of register Q until it holds a 1 .
How it works
Each bit is read out from
A
in turn. Any leading
0
's are returned.
When a
1
is read out it is held in a single 'hold' point.
Registers
r
and
Q
are shifted left (if not empty). LSB's are set to
0
.
The held
1
is read into register
r
LSB.
If
B
is less than
r
then
B
is subtracted from
r
and a
1
is placed into register
Q
LSB.
Note that the inputs to both shift left functions are shared lines with the output line from the function above.
Operation
Enter numerator into register A and denominator into register B (eg 15/3 or 27/5) and set the train running. Only points in the A , B along with Q and r registers can be changed.
|
| Click layout to pause/run train | Click points to switch 0/1 | Click start circle to reset train/points |
|
|
Lazy points switch between upper
0
or lower
1
branch lines
Trains arriving on a branch line switch the point to that line |
|
|
Sprung points allow branch line trains to join the main line
All main line trains go straight ahead and never 'branch off' |
Zero
If
A
is
0
the circuit outputs a
0
, as anything divided by 0 is 0.
If
B
is
0
the comparator will produce a 'divide by zero' error, as anything divided by 0 is infinite and cannot be computed. The pair of linked lazy points circuit detects if
B
is
0
on the first use of the comparator.
In this circuit 0/0 is output as 0, instead of 'undetermined', as the denominator is checked first. In a Duplo computer, its best to check the value of A with a ' Zero Detect ' function before using the divider circuit.