8bit+ALU+Simulation+using+ATmega169

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.


 * A: Input A
 * B: Input B
 * Z: Output
 * E O : Overflow
 * E i : A = B


 * FF = 0xFF ( = 255)

(A > (A ∨ B)) → (E O = 1) || (A > ¬ (A ∨ B)) → (E O = 1) || (A > ((¬A) ∨ B)) → (E O = 1) || (A > (A ∨ (¬B))) → (E O = 1) || (A > (A ∧ B)) → (E O = 1) || (A > ¬ (A ∧ B)) → (E O = 1) || (A > ((¬A) ∧ B)) → (E O = 1) || (A > (A ∧ (¬B))) → (E O = 1) || (A > (A ⊕ B)) → (E O = 1) || (A > ¬ (A ⊕ B)) → (E O = 1) || (A > ((¬A) ⊕ B)) → (E O = 1) || (A > (A ⊕ (¬B))) → (E O = 1) ||
 * **Instruction** ||  || **Expression** ||   || **Comments** ||
 * 00 ||  || Z = A ||   || E O = 0 ||
 * 01 ||  || Z = B ||   || E O = 0 ||
 * 02 ||  || Z = ¬A ||   || E O = 0 ||
 * 03 ||  || Z = ¬B ||   || E O = 0 ||
 * 04 ||  || Z = A ∧ B ||   || E O = 0 ||
 * 05 ||  || Z = ¬ (A ∧ B) ||   || E O = 0 ||
 * 06 ||  || Z = (¬A) ∧ B ||   || E O = 0 ||
 * 07 ||  || Z = A ∨ B ||   || E O = 0 ||
 * 08 ||  || Z = ¬ (A ∨ B) ||   || E O = 0 ||
 * 09 ||  || Z = (¬A) ∨ B ||   || E O = 0 ||
 * 0A ||  || Z = A ⊕ B ||   || E O = 0 ||
 * 0B ||  || Z = ¬(A ⊕ B) ||   || E O = 0 ||
 * 0C ||  || Z = (¬A) ⊕ B ||   || E O = 0 ||
 * 0D ||  || Z = 0 ||   || E O = 0 ||
 * 0E ||  || Z = A + B ||   || ((A + B) > FF) → (E O = 1) ||
 * 0F ||  || Z = A - B ||   || (B > A) → (E O = 1) ||
 * 10 ||  || Z = A × B ||   || ((A × B) > FF) → (E O = 1) ||
 * 11 ||  || Z = A ÷ B ||   || (B > A) → (E O = 1) ||
 * 12 ||  || Z = //max//{A,B} ||   || E O = 0 ||
 * 13 ||  || Z = //min//{A,B} ||   || E O = 0 ||
 * 14 ||  || Z ≈ √A ||   || E O = 0 ||
 * 15 ||  || Z = !A ||   || (A > 5) → (E O = 1) ||
 * 16 ||  || Z = A B ||   || (A B > FF) → (E O = 1) ||
 * 17 ||  || Z = A - 1 ||   || (A = 0) → (E O = 1) ||
 * 18 ||  || Z = A + 1 ||   || (A = FF) → (E O = 1) ||
 * 19 ||  || Z = (A ∧ B) - 1 ||   || ((A ∧ B) = 0) → (E O = 1) ||
 * 1A ||  || Z = (¬ (A ∧ B)) - 1 ||   || (¬ (A ∧ B) = 0) → (E O = 1) ||
 * 1B ||  || Z = (A ∧ B) + 1 ||   || ((A ∧ B) = FF) → (E O = 1) ||
 * 1C ||  || Z = (¬ (A ∧ B)) + 1 ||   || (¬ (A ∧ B) = FF) → (E O = 1) ||
 * 1D ||  || Z = ((¬A) ∧ B) + 1 ||   || (((¬A) ∧ B) = FF) → (E O = 1) ||
 * 1E ||  || Z = (A ∧ (¬B)) + 1 ||   || ((A ∧ (¬B)) = FF) → (E O = 1) ||
 * 1F ||  || Z = ((¬A) ∧ B) - 1 ||   || (((¬A) ∧ B) = 0) → (E O = 1) ||
 * 20 ||  || Z = (A ∧ (¬B)) - 1 ||   || ((A ∧ (¬B)) = 0) → (E O = 1) ||
 * 21 ||  || Z = (A ∨ B) - 1 ||   || ((A ∨ B) = 0) → (E O = 1) ||
 * 22 ||  || Z = (¬ (A ∨ B)) - 1 ||   || (¬ (A ∨ B) = 0) → (E O = 1) ||
 * 23 ||  || Z = (A ∨ B) + 1 ||   || ((A ∨ B) = FF) → (E O = 1) ||
 * 24 ||  || Z = (¬ (A ∨ B)) + 1 ||   || (¬ (A ∨ B) = FF) → (E O = 1) ||
 * 25 ||  || Z = ((¬A) ∨ B) + 1 ||   || (((¬A) ∨ B) = FF) → (E O = 1) ||
 * 26 ||  || Z = (A ∨ (¬B)) + 1 ||   || ((A ∨ (¬B)) = FF) → (E O = 1) ||
 * 27 ||  || Z = ((¬A) ∨ B) - 1 ||   || (((¬A) ∨ B) = 0) → (E O = 1) ||
 * 28 ||  || Z = (A ∨ (¬B)) - 1 ||   || ((A ∨ (¬B)) = 0) → (E O = 1) ||
 * 29 ||  || Z = B - 1 ||   || (B = 0) → (E O = 1) ||
 * 2A ||  || Z = B + 1 ||   || (B = FF) → (E O = 1) ||
 * 2B ||  || Z = (A ⊕ B) - 1 ||   || ((A ⊕ B) = 0) → (E O = 1) ||
 * 2C ||  || Z = (¬ (A ⊕ B)) - 1 ||   || (¬ (A ⊕ B) = 0) → (E O = 1) ||
 * 2D ||  || Z = (A ⊕ B) + 1 ||   || ((A ⊕ B) = FF) → (E O = 1) ||
 * 2E ||  || Z = (¬ (A ⊕ B)) + 1 ||   || (¬ (A ⊕ B) = FF) → (E O = 1) ||
 * 2F ||  || Z = ((¬A) ⊕ B) + 1 ||   || (((¬A) ⊕ B) = FF) → (E O = 1) ||
 * 30 ||  || Z = (A ⊕ (¬B)) + 1 ||   || ((A ⊕ (¬B)) = FF) → (E O = 1) ||
 * 31 ||  || Z = ((¬A) ⊕ B) - 1 ||   || (((¬A) ⊕ B) = 0) → (E O = 1) ||
 * 32 ||  || Z = (A ⊕ (¬B)) - 1 ||   || ((A ⊕ (¬B)) = 0) → (E O = 1) ||
 * 33 ||  || Z = (A ∨ B) - A ||   || ((A ∨ B) = 0) → (E O = 1)
 * 34 ||  || Z = (¬ (A ∨ B)) - A ||   || (¬ (A ∨ B) = 0) → (E O = 1)
 * 35 ||  || Z = (A ∨ B) + A ||   || ((A ∨ B) = FF) → (E O = 1) ||
 * 36 ||  || Z = (¬ (A ∨ B)) + A ||   || (¬ (A ∨ B) = FF) → (E O = 1) ||
 * 37 ||  || Z = ((¬A) ∨ B) + A ||   || (((¬A) ∨ B) = FF) → (E O = 1) ||
 * 38 ||  || Z = (A ∨ (¬B)) + A ||   || ((A ∨ (¬B)) = FF) → (E O = 1) ||
 * 39 ||  || Z = ((¬A) ∨ B) - A ||   || (((¬A) ∨ B) = 0) → (E O = 1)
 * 3A ||  || Z = (A ∨ (¬B)) - A ||   || ((A ∨ (¬B)) = 0) → (E O = 1)
 * 3B ||  || Z = (A ∧ B) - A ||   || ((A ∧ B) = 0) → (E O = 1)
 * 3C ||  || Z = (¬ (A ∧ B)) - A ||   || (¬ (A ∧ B) = 0) → (E O = 1)
 * 3D ||  || Z = (A ∧ B) + A ||   || ((A ∧ B) = FF) → (E O = 1) ||
 * 3E ||  || Z = (¬ (A ∧ B)) + A ||   || (¬ (A ∧ B) = FF) → (E O = 1) ||
 * 3F ||  || Z = ((¬A) ∧ B) + A ||   || (((¬A) ∧ B) = FF) → (E O = 1) ||
 * 40 ||  || Z = (A ∧ (¬B)) + A ||   || ((A ∧ (¬B)) = FF) → (E O = 1) ||
 * 41 ||  || Z = ((¬A) ∧ B) - A ||   || (((¬A) ∧ B) = 0) → (E O = 1)
 * 42 ||  || Z = (A ∧ (¬B)) - A ||   || ((A ∧ (¬B)) = 0) → (E O = 1)
 * 43 ||  || Z = (A ⊕ B) - A ||   || ((A ⊕ B) = 0) → (E O = 1)
 * 44 ||  || Z = (¬ (A ⊕ B)) - A ||   || (¬ (A ⊕ B) = 0) → (E O = 1)
 * 45 ||  || Z = (A ⊕ B) + A ||   || ((A ⊕ B) = FF) → (E O = 1) ||
 * 46 ||  || Z = (¬ (A ⊕ B)) + A ||   || (¬ (A ⊕ B) = FF) → (E O = 1) ||
 * 47 ||  || Z = ((¬A) ⊕ B) + A ||   || (((¬A) ⊕ B) = FF) → (E O = 1) ||
 * 48 ||  || Z = (A ⊕ (¬B)) + A ||   || ((A ⊕ (¬B)) = FF) → (E O = 1) ||
 * 49 ||  || Z = ((¬A) ⊕ B) - A ||   || (((¬A) ⊕ B) = 0) → (E O = 1)
 * 4A ||  || Z = (A ⊕ (¬B)) - A ||   || ((A ⊕ (¬B)) = 0) → (E O = 1)
 * 4B ||  || Z = //flip//{A} ||   || E O = 0 ||
 * 4C ||  || Z = //flip//{B} ||   || E O = 0 ||
 * 4D ||  || Z = //random//{0..FF} ||   || E O = 0 ; see note in below ||
 * 4E ||  || Z = Z | //random// 0 = A ||   || E O = E O ; see note in below ||
 * 4F ||  || Z = Z | //random// 0 = B ||   || E O = E O ; see note in below ||


 * Note1:**

In this system random numbers are generated using linear congruential generator algorithm, therefore:

//random// n + 1 = (//a// //random// n + //C//) mod //m//

If not initialized //random// 0 = 0.

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 fewer changes.

This is an open source software project and all the content are licensed under the terms of MIT license.

Project Related Downloads
[|Proteus simulation and firmware of 8bit Arithmetic and Logic Unit.]