ATmega169 base 8bit Arithmetic and Logic Unit

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.

 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.