Skip to the content
PCBKitNew board
2 layers163 × 66 mmNandboard, the printed circuit board in 3D

NANDboard: hands-on Boolean algebra

Size
163 × 66 mm
Copper layers
2
Thickness
1.6 mm
Parts
74
Nets
103
Pads
493
Tracks, vias
758, 78
Pours
1
Routed
Yes
KiCad
KiCad 8.0 (file 20240108)
Created
5 Oct 2015
Updated
7 Jan 2025

Overview

Nandboard is an open-source printed circuit board by danpage, from the danpage/nandboard repository on GitHub, published under the CC-BY-SA-4.0 licence. It is a 2-layer board of 163 × 66 mm with 74 parts on 103 nets, routed with 758 tracks and 78 vias.

It is built around the APT2012SGC and B3FS-1010. Its parts include 20 diodes, 18 connectors, 4 ICs, 4 switches and 2 capacitors.

Main components

2

README

rev_f/README.md

High-level structure

At a high level, (the top-side of) a given NANDboard is organised into a set of somewhat groups (or regions) reflected by annotation on the PCB:

text
+----------+----------+----------+----------+----------+
|    input |     NAND |     NAND |   output |    power |
|    group |    group |    group |    group |    group |
|          |       #0 |       #1 |          |          |
|          +----------+----------+          |          |~~~~ USB
|          |     NAND |     NAND |          |          |
|          |    group |    group |          |          |
|          |       #2 |       #3 |          |          |
+----------+----------+----------+----------+----------+

Each group designed to support a specific purpose, as explained in detail below. Again at a high level, however, use of the NANDboard can be summarised as follows. Imagine you are tasked with using a NANDboard to implement some 4-input, 1-output Boolean function R = f( X_0, X_1, X_2, X_3 ) To do so, the idea is you

  • use the input group to model (and control) the input,
  • use the NAND groups to implement f by decomposing it into a NAND-based expression,
  • use the output group to model (and visualise) the output,

using jumper wire to form connections to inputs, outputs, and between intermediate signals.

Low-level detail

The power group

Viewed from top-to-bottom, the power group comprises

The basic idea is that:

  • The USB connector supplies the NANDboard with power from some host (e.g., a workstation).

  • The pin headers allow multiple NANDboards to be "daisy-chained" together, e.g., to implement larger, more complex designs: doing so basically means

    • supplying one "powered" NANDboard with power via the USB connector
    • supplying other "tethered" NANDboards with power via their pin headers by connecting their 5V and GND pins to those of the "powered" NANDboard.

    This demands care, however, because misconnection can potentially damage the board and/or workstation: the safest approach would be to cover the pins with jumpers when not in use.

The input group

Viewed from left-to-right, the input group comprises

so can be thought of conceptually as the following block diagram:

text
switches           pins 
 __|__         _____|_____ 
/     \       /           \
               +-----+-----+
+-----+       | X_0 | X_0 |
| X_0 | ~~~>  +-----+-----+
+-----+       | X_0 | X_0 |
              +-----+-----+
+-----+       | X_1 | X_1 |
| X_1 | ~~~>  +-----+-----+
+-----+       | X_1 | X_1 |
              +-----+-----+
+-----+       | X_2 | X_2 |
| X_2 | ~~~>  +-----+-----+
+-----+       | X_2 | X_2 |
              +-----+-----+
+-----+       | X_3 | X_3 |
| X_3 | ~~~>  +-----+-----+
+-----+       | X_3 | X_3 |
              +-----+-----+

The basic idea is that each switch is connected to a group of 4 pins: the state of each group of pins (i.e., 0 or 1) is determined by that of the associated switch, so when the switch is pressed (resp. not pressed) the pins will be 1 (resp. 0).

The output group

Viewed from left-to-right, the output group comprises

text
     pins            LEDs
 _____|_____        __|__
/           \      /     \

+-----+-----+
| R_0 | R_0 |      +-----+
+-----+-----+ ~~~> | R_0 |
| R_0 | R_0 |      +-----+
+-----+-----+
| R_1 | R_1 |      +-----+
+-----+-----+ ~~~> | R_1 | 
| R_1 | R_1 |      +-----+
+-----+-----+
| R_2 | R_2 |      +-----+
+-----+-----+ ~~~> | R_2 |
| R_2 | R_2 |      +-----+
+-----+-----+
| R_3 | R_3 |      +-----+
+-----+-----+ ~~~> | R_3 |
| R_3 | R_3 |      +-----+
+-----+-----+

The basic idea is that each LED is connected to a group of 4 pins: the state of each group of pins (i.e., 0 or 1) determines that of the associated LED, so when the pins are 1 (resp. 0) the LED will be on (resp. off).

The NAND group(s)

Viewed from left-to-right, each NAND group comprises

so can be thought of conceptually as the following block diagram:

text
constant pins
 _____|_____
/           \

+-----+-----+
|  1  |  1  |
+-----+-----+
|  1  |  1  |
+-----+-----+

 input pins                NAND gates             output pins         LEDs
 _____|_____        ___________|__________        _____|_____        __|__
/           \      /                      \      /           \      /     \

+-----+-----+      +----------------------+      +-----+-----+
| x_0 | x_0 | ~~~> |                      |      | r_0 | r_0 |      +-----+
+-----+-----+      | r_0 = ~( x_0 & y_0 ) | ~~~> +-----+-----+ ~~~> | r_0 |
| y_0 | y_0 | ~~~> |                      |      | r_0 | r_0 |      +-----+
+-----+-----+      |                      |      +-----+-----+
| x_1 | x_1 | ~~~> |                      |      | r_1 | r_1 |      +-----+
+-----+-----+      | r_1 = ~( x_1 & y_1 ) | ~~~> +-----+-----+ ~~~> | r_1 |
| y_1 | y_1 | ~~~> |                      |      | r_1 | r_1 |      +-----+
+-----+-----+      |                      |      +-----+-----+
| x_2 | x_2 | ~~~> |                      |      | r_2 | r_2 |      +-----+

The basic idea is that:

  • Each group houses 4 replicated instances of the same structure, the i-th of which computes r_i = ~( x_i & y_i ). We use on the 0-th, top-most instance as an example throughout the following.

  • The computation of r_0 = ~( x_0 & y_0 ) relates to the top 4 pins (i.e., top 2 rows) of both the input and output pins headers: the input pins marked x_0 and y_0 provided an input to the NAND gate, which produces a result reflected on the output pins marked r_0.
    Each output pin is also connected to an LED, allowing the state (i.e., 0 or 1) to be visualised.

  • Note there are 2 pins marked x_0 and y_0 on the input pin header: since they are connected together, either of the 2 pins (i.e., the left- or right-hand pin marked x_0) can be used to provide the associated input. Likewise, there are 4 pins marked r_0 on the output pin header: the NAND gate output is replicated on each of those pins.

  • Each input pin is pulled-down, meaning that x_0 and y_0 are 0 and r_0 is 1 by default. However, an input pin can be freely connected (via jumper wire) to any other

    • constant pin,
    • input group pin,
    • NAND group input pin,
    • NAND group output pin

    elsewhere on the NANDboard.

  • Since each input pin is 0-by-default, the constant pins can be used to "override" this. Imagine that rather than r_0 = ~( x_0 & y_0 ), you need to compute r_0 = ~( x_0 & 1 ) for some reason: a reasonable approach is to connect the y_0 input pin of the NAND gate to one of the 1-by-default constant pins.

  • The NAND groups and hence operators are independent, meaning you can form inter- and intra-group connections (i.e., inside one group and between two groups).

Misc.

The bottom-side of the NANDboard includes a 10-pin TagConnect header: those pins connect to

  • the 5V and GND pins in the power group,
  • each pin in the input group, i.e., X_0, X_1, X_2, and X_3, and
  • each pin in the output group, i.e., R_0, R_1, R_2, and R_3.

By connecting the NANDboard to a host using a compliant pogo-pin style cable, one can therefore programmatically control input to and inspect output generated by it; an example use-case would be to automatically, and exhaustively test whether the NANDboard correctly implements a given function.

Parts

74
QtyValueFootprintReferences
20APT2012SGCLED_SMD:LED_0805_2012MetricD5.1, D5.2, D5.3, D5.4, D6.1, D6.2, D6.3, D6.4, D7.1, D7.2, D7.3, D7.4, D8.1, D8.2, D8.3, D8.4 +4
1010k ohmRN-1206-Convex-LongSideTerminals:RN-1206-Convex-LongSideTerminalsRN4, RN5.1, RN6.1, RN6.2, RN7.1, RN7.2, RN8.1, RN8.2, RN9.1, RN9.2
10Conn_02x08_Odd_EvenConnector_PinHeader_2.54mm:PinHeader_2x08_P2.54mm_Vertical_SMDJ4, J5, J6.1, J6.2, J7.1, J7.2, J8.1, J8.2, J9.1, J9.2
5560 ohmRN-1206-Convex-LongSideTerminals:RN-1206-Convex-LongSideTerminalsRN5.2, RN6.3, RN7.3, RN8.3, RN9.3
41k ohmRN-1206-Convex-LongSideTerminals:RN-1206-Convex-LongSideTerminalsRN6.4, RN7.4, RN8.4, RN9.4
47400Package_SO:SOIC-14_3.9x8.7mm_P1.27mmU1, U2, U3, U4
4B3FS-1010Button_Switch_SMD:SW_SPST_Omron_B3FS-101xPSW1, SW2, SW3, SW4
4Conn_02x02_Odd_EvenConnector_PinHeader_2.54mm:PinHeader_2x02_P2.54mm_Vertical_SMDJ6.3, J7.3, J8.3, J9.3
4MountingHole_PadMountingHole:MountingHole_3.2mm_M3_PadH1, H2, H3, H4
25.1k ohmResistor_SMD:R_0603_1608MetricR1.1, R1.2
2Conn_02x02_Counter_ClockwiseConnector_PinHeader_2.54mm:PinHeader_2x02_P2.54mm_Vertical_SMDJ2.1, J2.2
10.1 uFCapacitor_SMD:C_0805_2012MetricC1.2
1100 uFCapacitor_SMD:C_1210_3225MetricC1.1
1Conn_02x05_Counter_ClockwiseConnector:Tag-Connect_TC2050-IDC-NL_2x05_P1.27mm_VerticalJ3
1Fuse_PolarizedFuse:Fuse_1206_3216MetricF1
1USB_C_Receptacle_USB2.0GSB1C41110SSHR:AMPHENOL_GSB1C41110SSHRJ1

Questions

How big is the Nandboard PCB?

It measures 163 × 66 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Nandboard use?

74 parts, built around the APT2012SGC and B3FS-1010. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Nandboard KiCad files?

From the danpage/nandboard repository on GitHub, at the commit this page was made from: the board is rev_f/nandboard.kicad_pcb and its schematic rev_f/nandboard.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Nandboard design in my own project?

Its repository publishes it under the CC-BY-SA-4.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers94 × 85 mmSumoBot, the printed circuit board in 3D

    SumoBot

    ErichStyger/McuMiniSumoRobot

    Mini Sumo Robot

    86 parts25
  • 2 layers53.3 × 47.2 mmRAMPS WiFi Adapter, the printed circuit board in 3D

    RAMPS WiFi Adapter

    ODDepot/RAMPS-WiFi-Adapter

    The RAMPS WiFi Adapter provides wireless networking for RepRap's RAMPS (Arduino Mega Pololu Shield) controller.

    21 parts10
  • 2 layers105 × 90 mmWs uc06, the printed circuit board in 3D

    Ws uc06

    wildsystems/ws-uc06

    Custom ESP32-C6 development board with power input protection, relay outputs, opto-isolated I/O, NTC sensor input, and JTAG debugging. Designed as a DIY-friendly controller base.

    84 parts2
  • 2 layers160 × 100 mmInterface board, the printed circuit board in 3D

    Interface board

    cepr/daly-to-lithium-balance-adapter

    Replacement traction battery for a 2018 Energica Ego. The original Lithium Balance s-BMS master (BMCU) stays in the bike.

    112 parts
  • 2 layers90 × 60 mmFlappy esp32c3-revb, the printed circuit board in 3D

    Flappy esp32c3-revb

    Soulboy420/BP_flappyBird

    Eigenständiger KiCad-10-Entwurf für das HAW-Bachelorprojekt. Der ursprüngliche Entwurf unter hardware/ und absichtliche Benutzerlöschungen wurden nicht überschrieben. Es wurde nichts bestellt, committed oder gepusht.

    111 parts
  • 4 layers159.9 × 99.9 mmEurocard, the printed circuit board in 3D

    Eurocard

    worlickwerx/pi-cluster-two

    Eurocard based raspberry pi cluster (take 2)

    79 parts8GPL-3.0
  • 2 layers159.9 × 99.9 mmEurocard, the printed circuit board in 3D

    Eurocard

    kitspace-test-repos/kicad6-file-collection

    82 partsMIT
  • 2 layers141.1 × 126.8 mmCalculator, the printed circuit board in 3D

    Calculator

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    74 parts915