ALU (Arithmetic and Logic Unit) is a digital system that performs integer arithmetic and logical operations. In this post we introduce ATmega169 base ALU simulation using Proteus. This is 8bit ALU, and functionally it is similar to other entry level ALUs such as Motorola MC14581, 74LS181, etc. This unit can perform 80 arithmetic and logic operations and all these operations are listed in below of this post.
Firmware of this ALU is developed using AVR-GCC. While at the development we try to isolate firmware with platform as maximum as possible, because of that, this firmware can be modified to run on top of PIC, 8051 or MSP430 MCUs with minor set of changes.
The Proteus simulation and ATmega169 firmware is available to download at google drive. This is an open source software project and all the content are licensed under the terms of MIT license.
schematic of ATmega169 base 8bit ALU simulation |
Firmware of this ALU is developed using AVR-GCC. While at the development we try to isolate firmware with platform as maximum as possible, because of that, this firmware can be modified to run on top of PIC, 8051 or MSP430 MCUs with minor set of changes.
- A: Input A
- B: Input B
- Z: Output
- EO: Overflow
- Ei: A = B
- FF = 0xFF ( = 255)
Instruction |
Expression |
Comments |
||
00 |
Z = A |
EO = 0 |
||
01 |
Z = B |
EO = 0 |
||
02 |
Z = ¬A |
EO = 0 |
||
03 |
Z = ¬B |
EO = 0 |
||
04 |
Z = A ∧ B |
EO = 0 |
||
05 |
Z = ¬ (A ∧ B) |
EO = 0 |
||
06 |
Z = (¬A) ∧ B |
EO = 0 |
||
07 |
Z = A ∨ B |
EO = 0 |
||
08 |
Z = ¬ (A ∨ B) |
EO = 0 |
||
09 |
Z = (¬A) ∨ B |
EO = 0 |
||
0A |
Z = A ⊕ B |
EO = 0 |
||
0B |
Z = ¬(A ⊕ B) |
EO = 0 |
||
0C |
Z = (¬A) ⊕ B |
EO = 0 |
||
0D |
Z = 0 |
EO = 0 |
||
0E |
Z = A + B |
((A + B) > FF) → (EO = 1) |
||
0F |
Z = A - B |
(B > A) → (EO = 1) |
||
10 |
Z = A × B |
((A × B) > FF) → (EO = 1) |
||
11 |
Z = A ÷ B |
(B > A) → (EO = 1) |
||
12 |
Z = max{A,B} |
EO = 0 |
||
13 |
Z = min{A,B} |
EO = 0 |
||
14 |
Z ≈ √A |
EO = 0 |
||
15 |
Z = !A |
(A > 5) → (EO = 1) |
||
16 |
Z = AB |
(AB > FF) → (EO = 1) |
||
17 |
Z = A - 1 |
(A = 0) → (EO = 1) |
||
18 |
Z = A + 1 |
(A = FF) → (EO = 1) |
||
19 |
Z = (A ∧ B) - 1 |
((A ∧ B) = 0) → (EO = 1) |
||
1A |
Z = (¬ (A ∧ B)) - 1 |
(¬ (A ∧ B) = 0) → (EO = 1) |
||
1B |
Z = (A ∧ B) + 1 |
((A ∧ B) = FF) → (EO = 1) |
||
1C |
Z = (¬ (A ∧ B)) + 1 |
(¬ (A ∧ B) = FF) → (EO = 1) |
||
1D |
Z = ((¬A) ∧ B) + 1 |
(((¬A) ∧ B) = FF) → (EO = 1) |
||
1E |
Z = (A ∧ (¬B)) + 1 |
((A ∧ (¬B)) = FF) → (EO = 1) |
||
1F |
Z = ((¬A) ∧ B) - 1 |
(((¬A) ∧ B) = 0) → (EO = 1) |
||
20 |
Z = (A ∧ (¬B)) - 1 |
((A ∧ (¬B)) = 0) → (EO = 1) |
||
21 |
Z = (A ∨ B) - 1 |
((A ∨ B) = 0) → (EO = 1) |
||
22 |
Z = (¬ (A ∨ B)) - 1 |
(¬ (A ∨ B) = 0) → (EO = 1) |
||
23 |
Z = (A ∨ B) + 1 |
((A ∨ B) = FF) → (EO = 1) |
||
24 |
Z = (¬ (A ∨ B)) + 1 |
(¬ (A ∨ B) = FF) → (EO = 1) |
||
25 |
Z = ((¬A) ∨ B) + 1 |
(((¬A) ∨ B) = FF) → (EO = 1) |
||
26 |
Z = (A ∨ (¬B)) + 1 |
((A ∨ (¬B)) = FF) → (EO = 1) |
||
27 |
Z = ((¬A) ∨ B) - 1 |
(((¬A) ∨ B) = 0) → (EO = 1) |
||
28 |
Z = (A ∨ (¬B)) - 1 |
((A ∨ (¬B)) = 0) → (EO = 1) |
||
29 |
Z = B - 1 |
(B = 0) → (EO = 1) |
||
2A |
Z = B + 1 |
(B = FF) → (EO = 1) |
||
2B |
Z = (A ⊕ B) - 1 |
((A ⊕ B) = 0) → (EO = 1) |
||
2C |
Z = (¬ (A ⊕ B)) - 1 |
(¬ (A ⊕ B) = 0) → (EO = 1) |
||
2D |
Z = (A ⊕ B) + 1 |
((A ⊕ B) = FF) → (EO = 1) |
||
2E |
Z = (¬ (A ⊕ B)) + 1 |
(¬ (A ⊕ B) = FF) → (EO = 1) |
||
2F |
Z = ((¬A) ⊕ B) + 1 |
(((¬A) ⊕ B) = FF) → (EO = 1) |
||
30 |
Z = (A ⊕ (¬B)) + 1 |
((A ⊕ (¬B)) = FF) → (EO = 1) |
||
31 |
Z = ((¬A) ⊕ B) - 1 |
(((¬A) ⊕ B) = 0) → (EO = 1) |
||
32 |
Z = (A ⊕ (¬B)) - 1 |
((A ⊕ (¬B)) = 0) → (EO = 1) |
||
33 |
Z = (A ∨ B) - A |
((A ∨ B) = 0) → (EO = 1) (A > (A ∨ B)) → (EO = 1) |
||
34 |
Z = (¬ (A ∨ B)) - A |
(¬ (A ∨ B) = 0) → (EO = 1) (A > ¬ (A ∨ B)) → (EO = 1) |
||
35 |
Z = (A ∨ B) + A |
((A ∨ B) = FF) → (EO = 1) |
||
36 |
Z = (¬ (A ∨ B)) + A |
(¬ (A ∨ B) = FF) → (EO = 1) |
||
37 |
Z = ((¬A) ∨ B) + A |
(((¬A) ∨ B) = FF) → (EO = 1) |
||
38 |
Z = (A ∨ (¬B)) + A |
((A ∨ (¬B)) = FF) → (EO = 1) |
||
39 |
Z = ((¬A) ∨ B) - A |
(((¬A) ∨ B) = 0) → (EO = 1) (A > ((¬A) ∨ B)) → (EO = 1) |
||
3A |
Z = (A ∨ (¬B)) - A |
((A ∨ (¬B)) = 0) → (EO = 1) (A > (A ∨ (¬B))) → (EO = 1) |
||
3B |
Z = (A ∧ B) - A |
((A ∧ B) = 0) → (EO = 1) (A > (A ∧ B)) → (EO = 1) |
||
3C |
Z = (¬ (A ∧ B)) - A |
(¬ (A ∧ B) = 0) → (EO = 1) (A > ¬ (A ∧ B)) → (EO = 1) |
||
3D |
Z = (A ∧ B) + A |
((A ∧ B) = FF) → (EO = 1) |
||
3E |
Z = (¬ (A ∧ B)) + A |
(¬ (A ∧ B) = FF) → (EO = 1) |
||
3F |
Z = ((¬A) ∧ B) + A |
(((¬A) ∧ B) = FF) → (EO = 1) |
||
40 |
Z = (A ∧ (¬B)) + A |
((A ∧ (¬B)) = FF) → (EO = 1) |
||
41 |
Z = ((¬A) ∧ B) - A |
(((¬A) ∧ B) = 0) → (EO = 1) (A > ((¬A) ∧ B)) → (EO = 1) |
||
42 |
Z = (A ∧ (¬B)) - A |
((A ∧ (¬B)) = 0) → (EO = 1) (A > (A ∧ (¬B))) → (EO = 1) |
||
43 |
Z = (A ⊕ B) - A |
((A ⊕ B) = 0) → (EO = 1) (A > (A ⊕ B)) → (EO = 1) |
||
44 |
Z = (¬ (A ⊕ B)) - A |
(¬ (A ⊕ B) = 0) → (EO = 1) (A > ¬ (A ⊕ B)) → (EO = 1) |
||
45 |
Z = (A ⊕ B) + A |
((A ⊕ B) = FF) → (EO = 1) |
||
46 |
Z = (¬ (A ⊕ B)) + A |
(¬ (A ⊕ B) = FF) → (EO = 1) |
||
47 |
Z = ((¬A) ⊕ B) + A |
(((¬A) ⊕ B) = FF) → (EO = 1) |
||
48 |
Z = (A ⊕ (¬B)) + A |
((A ⊕ (¬B)) = FF) → (EO = 1) |
||
49 |
Z = ((¬A) ⊕ B) - A |
(((¬A) ⊕ B) = 0) → (EO = 1) (A > ((¬A) ⊕ B)) → (EO = 1) |
||
4A |
Z = (A ⊕ (¬B)) - A |
((A ⊕ (¬B)) = 0) → (EO = 1) (A > (A ⊕ (¬B))) → (EO = 1) |
||
4B |
Z = flip{A} |
EO = 0 |
||
4C |
Z = flip{B} |
EO = 0 |
||
4D |
Z = random{0..FF} |
EO = 0 ; see note in below |
||
4E |
Z = Z | random0 = A |
EO = EO ; see note in below |
||
4F |
Z = Z | random0 = B |
EO = EO ; see note in below |
Note 1:
In this system random numbers are generated using linear congruential generator algorithm, therefore:
randomn + 1 = (a randomn + C) mod m
If not initialized random0 = 0.
The Proteus simulation and ATmega169 firmware is available to download at google drive. This is an open source software project and all the content are licensed under the terms of MIT license.
Comments