The ALU (arithmetic logic unit) represents the state of knowledge,
that I had at the end of the year 2004.
For details, consult the last page of my first ALU article.
After building/testing the ALU modules, I figured out that some of
the circuitry isn't needed, and that it would be possible to build the
ALU modules about 30 percent smaller...
So I decided to describe the newer/smaller version.
MT15 ALU uses Bitslice modules, one module processes one Bit.
ALU A_input is connected to ACC, PC output.
ALU B_input is connected to data bus.
First stage basically consists of two 4:1 multiplexers,
working as configurable logic gates.
(Two inverters for negating A, B not shown).
It produces the low_active propagate/generate signals.
Imagine this part as a 74153 with inverted outputs.
Propagate means, the carry input should be propagated
through to the next higher ALU Bitslice module.
Generate indicates an overflow, setting the output carry
active to be passed to the next higher Bit.
Since I didn't knew, if my carry circuitry would work
as expected, I decided to make the high and low active
propagate/generate_signals available outside the ALU
Bitslice module.
The inverter for producing the high active generate_signal
isn't shown in this schematic, and could probably be
removed/eliminated.
To be on the safe side, I decided to make the input/output
of the red marked carry inverter available outside the ALU modules,
as well as the inverted/non_inverted carry inputs for the last ALU
stage.
What makes it possible, to wire up the ALU modules to a low active
or high active carry signal, without any further modifications.
The next stage (carry chain) is described at the next page of this article.
Last stage is, basically, an XOR gate, working as a half_adder.
Plus another gate, that takes over during ALU shift right.
For more details, please read my two articles about ALU design.
Now the control signals for some ALU operations:
SHR=1, !SHR=0, shift right: GS:321 PS:3210 ||| |||| 000 1010 shift right register 000 1100 shift right memoryFor all other arithmetic/logic functions:
SHR=0, !SHR=1, anything but shift right: GS:321 PS:3210 ||| |||| 101 0000 shift left register 110 0000 shift left memory 000 0000 zero 000 1111 $FFFF 000 1010 pass through register 000 1100 pass through memory 000 1000 register AND memory 000 0110 register XOR memory 000 1110 register OR memory 100 0110 register + memory 001 1001 register - memory 110 0011 memory -1
Incrementing register/memory is a pass_through with the ALU
carry_input forced active.
GS0 was 0 for all ALU functions that made sense, so it was removed.
Again, for more details/functions, please read the articles about ALU design.
[HOME] [UP]/ [BACK] [1] [2] [3] [4] [5] [6] [7] [8] [NEXT]
(c) Dieter Mueller 2005