The diagram at the bottom of this page provides an overview of my 4-bit contraption. You can also click on any of the subsystem rectangles to link directly to the respective page, or review some assembly instructions.

I began construction of this processor with its memory, by building a simple circuit to drive a 256×4 bit static RAM chip (2112) that I picked up at a local electronics store. At the time, it wasn't yet clear exactly where I was heading with this project; so I installed a set of microswitches to set the memory address and data, and two 7-segment LED displays to read my data switch settings and show the data at the current address in RAM.

Once I realized that this is going to be more than just a toy circuit to play with a RAM chip, the next step was to develop the operational concepts for my processor.

Once I had my instruction set, microcode instruction set, and register design, I was able to proceed with designing what really is the heart of the processor: a microcode instruction sequencer. This circuit turns instruction codewords into control signals that activate other processor components which in turn perform operations.

The simplest subsystems are the processor's internal registers: its accumulator, data address register, and program counter. Still, these are subsystems on their own right as they respond, and perform a variety of functions, in response to control signals.

Actual computations in this processor are done by its arithmetic and logic unit, or ALU. Most operations either use, or alter the contents of the processor's main internal register, its accumulator. Another internal register, the data address register, is used to facilitate access to memory for fetching, or writing, data words. The program counter register, on the other hand, is used to fetch instruction words; it is also incremented automatically as instructions are executed. Its contents can also be altered directly by conditional or unconditional jump instructions.

Not shown in the logic diagram, but vital to the operation of the computer, is its clock generator. The computer uses a two-phase clock. The idea is simple; on the first clock phase, internal states are preset in accordance with the current microcode instruction, and on the second phase, register values are fetched. For instance, if the current microcode instruction is to increment the program counter, the first clock phase configures the ALU to emit PC+1 on its output, while the second clock phase instructs the PC to fetch this new value from the ALU.

Finally, all the components of the processor are connected to each other via a variety of buses, some bidirectional, some unidirectional:

The memory address bus is an 8-bit bus that carries address information from the DA or PC to the memory module.

The memory data bus is a 4-bit bidirectional bus. It carries data from the AC or PC to memory; or, from memory to the AC or DA.

The instruction microcode bus carries the 22 microcode signals from the sequencer to all other system components.

The ALU communicates with other components via three 8-bit buses. Two input buses are used to send data to the ALU from the accumulator, DA, and PC. The ALU output is used to send results to the accumulator, DA, or PC.

Lastly, ALU flags (namely, the Carry, Data, and Zero flags) are sent from the ALU to the PC; the PC uses these flag results during the execution of conditional jump instructions.

Interface Summary


Functional Unit

MA - W - W R -
MD R/W W R R R/W -
A1 W - - - - R
A2 - W - W - R
AO R R - R - W
AF - R - - - R/W