CSCI 320 — Introducing Logisim

This is a lab experience. There will be no grade for this lab.

It is mostly to give those who did not use Logisim last semester, a chance to refresh their skills.

If you’ve never used Logisim or have forgotten everything you know about it, you should review Tasks 1 to 4 of the CSCI 255 Introducing Logisim lab.

The truth table of interest

Here’s the truth table for a modulo-3 adder. Notice the use of don’t cares.

inputsoutputs
a1a0b1b0s1s0
000000
000101
001010
0011xx
010001
010110
011000
0111xx
100010
100100
101001
1011xx
1100xx
1101xx
1110xx
1111xx

In this implementation numbers from 0 to 2 are encoded in binary as two bits `0b00` to `0b10` (using the Java 7 notation). We are assuming the 3, `0b11`, never occurs. This allows us to use don’t cares for 7 of the 16 possible input combinations.

In the usual digital logic notation, this can be expressed as follows:

• s1(a1,a0,b1,b0) = Σ(2,5,8) + d(3,7,11,12,13,14,15)
• s0(a1,a0,b1,b0) = Σ(1,4,10) + d(3,7,11,12,13,14,15)

Stuff to do

First, using Karnaugh maps, derive a boolean expression to implement the modulo-3 adder.

Second, start up Logisim and use the circuit analyzer to implement this boolean expression in a subcircuit called `Add3`. Start by defining input pins `A1`, `A0`, `B1`, `B0` and output pins for `S1` and `S0` in your subcircuit. Then use the Analyze Circuit feature of Logisim to generate the circuit. (See Task 4 of the Introducing Logisim lab for more information.)

Third, use the almost-impossible-to-use splitters of Logisim to modify your circuit so that its input is two pairs of wires, called `in0` and `in1`, and its output is one pair of wires, called `out`. Be sure to change the pins to have a data width of two.

Fourth, make a new subcircuit called `Inc3`. The subcircuit `Inc3` should have a input port called `in` and an output port called `out`. Both will have a data width of two. `Inc3` receives a two-bit input and increments it modulo-3. This means in Java-speak that `Inc3`(x) is something like `Add3`(x,1). Do not just copy your implementation of `Add3` to `Inc3`. Use `Add3` as a subcomponent, just as you would have one method call another in Java. All you have to do is “pass” a constant 1.

Fifth, make a third subcircuit called `Count3`. This circuit will have a clock input port `clock`. and an output port called `out`. On clock ticks, this ciruit will count from 0 to 2 using modulo-3 addition (0,1,2,0,1,2,0,1,2, …). `Count3` should be built with a two-bit register and an single “instance” of `Inc3`. There’s really only one legal way to wire these two components together.