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
  • 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




Note1:

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.




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.

References


ATmega169 - 8-bit AVR Microcontroller with 16K Bytes In-System Programmable Flash.
MC14581 - 4-Bit Arithmetic Logic Unit
SN74LS181 - Arithmetic Logic Unit/Function Generator