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 = (arandomn + 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.

InstructionExpressionCommentsmax{A,B}min{A,B}(A > (A ∨ B)) → (EO = 1)

(A > ¬ (A ∨ B)) → (EO = 1)

(A > ((¬A) ∨ B)) → (EO = 1)

(A > (A ∨ (¬B))) → (EO = 1)

(A > (A ∧ B)) → (EO = 1)

(A > ¬ (A ∧ B)) → (EO = 1)

(A > ((¬A) ∧ B)) → (EO = 1)

(A > (A ∧ (¬B))) → (EO = 1)

(A > (A ⊕ B)) → (EO = 1)

(A > ¬ (A ⊕ B)) → (EO = 1)

(A > ((¬A) ⊕ B)) → (EO = 1)

(A > (A ⊕ (¬B))) → (EO = 1)

flip{A}flip{B}random{0..FF}random0 = Arandom0 = BNote1:In this system random numbers are generated using linear congruential generator algorithm, therefore:

randomn + 1 = (arandomn +C) modmIf 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,8051orMSP430MCUs 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