Discrete logic POV clock

I've always been interested in electronics. I have fond memories of sitting at my grandfather's workbench watching him solder — but, as a software engineer, I never got much exposure to the hardware field.

In 2006, I decided to change that. I picked up a vintage oscilloscope and The Art of Electronics and began my studies in earnest.

First, I built a flash trigger based on someone else's plans. It worked, but I really wanted to design something of my own — I figured if I could design a circuit from scratch and bring it to fruition, I must have really learned something.

The first time I saw a persistence-of-vision clock, I was hooked. The designs I found online used microcontrollers, but that felt like cheating — I wanted to build my clock using only CMOS discrete logic.

I started designing the clock in March 2007 and finished the project two years later in April 2009. To my knowledge it's the only POV clock implemented entirely in discrete logic.

Design

My POV clock uses three separate modules:

  1. The digit board, which keeps time
  2. The display board, which scans the digit board and converts the time to an LED pattern
  3. The power board, which connects and provides power to the above.
Each module is independently testable with no dependencies on other boards.

The digit board

Every second, a pulse increments the value stored in a counter. When it overflows, the next counter is incremented. Each counter represents a digit in the time. A decoder selects one digit at a time and puts that digit's value on the output bus.

The current time is stored in six 74HC192 synchronous BCD counters. Each counter represents a digit — the least-significant seconds digit, then the most-significant digit, then the least-significant minutes digit, etc. Each counter is incremented when its predecessor overflows, typically when transitioning from 9 to 0. Most-significant digits require additional logic to overflow when they transition from 5 to 6. A brief glitch occurs when the counter reads 6 and hasn't yet been reset to 0, but it doesn't cause a problem in practice.

The least-significant seconds digit is incremented by the divide-by-256 output of an ICM7242 counter and RC circuit. A crystal oscillator and 74HC4060 would keep time more accurately, but the CMOS output from the 4060 is unable to get the crystal started. An SPDT switch allows the user to advance the clock using the divide-by-2 output of the ICM7242.

Each counter is connected to a shared output bus through a 74HC244 3-state buffer. The buffers default to a high-impedance state that is invisible to the bus. A 74HC137 decoder enables one buffer at a time, making that counter's value visible on the bus. The digit board drives the decoder to read each digit in sequence. For example, selecting buffer 0 puts the least-significant seconds digit on the bus; selecting buffer 1 puts the most-significant seconds digit on. By looping through every buffer we can read all the digits in the time.

The digit board interfaces with the display board through a ten-pin connector:

  1. Three bits of input to select which buffer should be enabled
  2. Four bits of output for the digit value from the shared bus
  3. 5v, ground, and (partially implemented) reset

The display board

A pulse from an external source wakes up the display board. It selects the leftmost digit from the digit board, formats it for a 7-segment-display, and chops up the result into a 5 x 5 pixel matrix. It lights up LEDs for each column in sequence then selects the next digit to the right.

The display board sleeps until a pulse from an H21A1 optical interrupter indicates that the LEDs are about to sweep across the face of the clock. The pulse sets a 74HC74 flip-flop and starts a 555 timer oscillating. The 555 increments a 74HC590 8-bit counter which coordinates actions across the rest of the display board. The counter output is used as follows:

  1. Bits 0-1 (LSB): not used
  2. Bits 2-4: select column to display on the LEDs (0 - 7)
  3. Bits 5-7 (MSB): select digit to read from the digit board (0 - 7)

Bits 5-7 interface with the digit board through the ten-pin connector. Although these bits count up, they are negated with a 74HC04 hex inverter to count down from 7 to 0, selecting the hours digit first. This matches the left-to-right sweep of the LED arm.

The four output bits from the digit board are read by a 74HC4511 BCD to 7-segment decoder. It converts the digit value into the segments of a physical digit.

While this digit is selected from the digit board, bits 2-4 from the counter cycle from 0-7. These are demultiplexed by a 74HC237 into 7 individual lines. Each line goes high in turn, indicating which column of the physical digit to display:

  1. Lines 1-2: the left-most column
  2. Lines 3-4: the middle column
  3. Lines 4-5: the right-most column
  4. Lines 6-7: blank padding before the next digit
These lines and the output of the 74HC4511 are fed into a complex network of AND and OR gates — 2x 74HC08, 2x 74HC32, and a 74HC4075. They determine which LEDs should light up for each column in the digit. For example, if the middle segment of the digit should be lit up (for a 2, 3, 4, 5, 6, 8, or 9), then the AND and OR gates will enable the middle LED on columns 1-5. If the upper-left segment should be lit up (for a 0, 4, 5, 6, 8, or 9) then the top three LEDs will be lit up, but only on column 1.

The LEDs are driven by a 74HC541 high-output-current buffer. The LEDs are connected to the display board by a second 10-pin connector — five pins are outputs (one per LED), the other five form a common ground shared by all the LEDs.

When bits 2-4 of the 74HC590 have cycled through every column, bits 5-7 select the next digit and the digit-to-LED conversion process repeats again.

When the 74HC590 counter overflows, it resets the flip-flop and stops the 555 oscillator. The board sleeps until the next pulse from the optical interrupter.

The power board
[pcb]

Provides power to the clock and display boards.

The ten-pin connectors from the clock and display boards plug into the power board using ribbon cables. The power board bridges the two connectors with a common bus and provides 5V via a MAX603 linear regulator configured per the datasheet. A 9V battery connected is a convenient power source.

The power board bus also provides convenient access points for a logic analyzer.

Hardware

Five LEDs are arranged on an arm which sweeps side-to-side. When the arm begins to sweep toward the right, an object trips the optical interrupter and wakes up the display board.

Designing the hardware mechanism was a challenge. Microcontroller-based POV clocks typically spin the entire board along with the LEDs, but discrete logic doesn't lend itself to that. My original design called for a slip ring to connect the circuit boards and spinning LED arm, but I wanted to avoid expensive specialty parts. Instead I use a treadle linkage mechanism to convert a spinning motor shaft into side-to-side motion.

A sewing pin attached to the motor shaft sweeps through the optical interrupter when the LED arm begins to sweep from left to right. This wakes up the display board and displays the current time.

Test equipment

I began the project with a Tektronix 465 analog scope but quickly outgrew it. An HP 1631D logic analyzer helped me design the digit board and an HP 16500B helped me design and integrate the display board.

PCB design

I laid out each PCB by hand and drew the traces in Adobe Illustrator. I wrote a PDF to Gerber converter to convert my designs from PDF to Gerber + NC Drill and ordered the boards through BatchPCB.

Project files and license

Files associated with this project can be found here. You can browse them individually or download a .zip archive.

The project files include:

This project is released as open-source hardware under the TAPR Open Hardware License. Please let me know if you incorporate elements of it into your own design.

Contact

If you have comments, suggestions, or issues — or if this project inspires you to build something cool — I'd love to hear from you. Email me at swannman@mac.com.

[more photos]