Status Update

Finals are over, so we can devote more time to this project. We intend to finish as much as we can by this Tuesday, because that's when Olin has it's Fall Expo. We also intend to make a simulation of the computer to better explain exactly how the computation is carried out.

In the meantime, I will explain how this whole thing works:

Computers work in binary, meaning that everything is either a 1 or a 0, 'on' or 'off'. The first challenge of building a mechanical computer is deciding how to represent a 1 and a 0. You may have seen the Lego logic gates that represent 1's and 0's with pushing and pulling rods. This works fine until you have many gates linked together, at which point the friction is too much. While writing this post I just found that someone else is also making K'NEX logic gates using this rod technique. (Although K'NEX purists might complain that he used rubber bands to implement the OR gate) Still pretty impressive though.

We decided to get around the friction problem by doing our computation with balls. The main motivation behind this was that balls are really cool to watch and listen to as they propagate through the machine. Also, we can make it as big as we want without worrying about friction since the balls transmits the 1's and 0's instead of rods. This makes the machine much slower, but it doesn't really matter since its only job is to look cool.

Now the question comes down to how to represent a 1's and 0's with balls. At first we thought a ball is a 1, and no ball is a zero. To realize why this is a bad idea, imagine a NOT gate: if you don't get a ball (zero), you need to magically output a ball (one). We didn't want to have to prime each gate with a magazine of extra balls, so this idea was out.

Instead we decided that it is the position of the ball that matters. If the ball is on one side of the machine, it's a one, and on the other it's a zero. Logic gates can divert the path of their input balls to create the proper output. The only drawback is that gates have the same number of inputs as outputs. For example the AND gate has inputs (A,B) and outputs (A, A&B). The half-adder takes (A,B) and outputs (A xor B, A&B).

The other challenge is that balls need to arrive in a certain order for the results to be correct. Most of these problems can be fixed by being clever with the design, but in certain cases timing conflicts are unavoidable. These situations have been resolved with the creation of a 'wait' gate. It takes two inputs (A,B) and outputs (A,B) at the same time. There is one of these gates in the new adder-subtracter.

The project has been a blast to work on. Designing this stuff is really fun, especially since there isn't a lot of work out there on how to make computers with balls. I imagine this is what is was like for the first engineers designing electronic computers... except they had the added rush of knowing that their work might actually go somewhere other than a display case.

16 Bits of Memory

This prototype memory unit consists of 16, 1-bit registers arranged such that we have 4 memory locations, each 4 bits long. The unit is addressable using 4 decoders, which make up the top of the structure. The decoders are set using 3-bit; 2 for the address and one to determine reading or writing.
After developing the unit, we actually decided to scrap this format for a number of reasons. The first is that we want something more vertical, so we can put it directly on top of the adder-subtracter. The other reason is that the decoders were difficult to set using balls.

We have already developed the new memory and are in the process of making all 16 bits.

4-Bit Adder

If you look closely, you can see that this 4-bit adder is 4, 1-bit full adders connected together. The carry-out of one adder drops into the carry-in of the next, moving from right to left.

Since these pictures were taken, we modified the adder to be an adder-subtracter. We also added a zero flag.