Skip to the content
2 layers160.5 × 100.2 mm8080 Board, the printed circuit board in 3D

This is my attempt to build a single-board microcomputer based on the Intel 8080 CPU. It contains the following features:

Size
160.5 × 100.2 mm
Copper layers
2
Thickness
1.6 mm
Parts
112
Nets
290
Pads
851
Tracks, vias
3,526, 488
Pours
2
Routed
Yes
KiCad
KiCad 7 (file 20221018)
Created
20 Apr 2025
Updated
31 May 2025

Overview

8080 Board is an open-source printed circuit board by sladek, from the sladek/SBC_8080_ECB repository on GitHub. It is a 2-layer board of 160.5 × 100.2 mm with 112 parts on 290 nets, routed with 3,526 tracks and 488 vias.

It is built around the 74LS245SC, 74LS125DC and 74LS240DC, with the MAX232N, TC7660HEOA and 74LS32SC among its other parts. Its parts include 45 capacitors, 30 ICs, 11 resistors, 6 diodes and 4 connectors.

Main components

12

README

README.md

SBC 8080 ECB microcomputer

This is my attempt to build a single-board microcomputer based on the Intel 8080 CPU. It contains the following features:

  • Extended 512k x 8-bit SRAM that can be fully accessed via paging.

  • 128 x 8-bit FLASH EPROM that is accessible after RESET so it can contain a bootloader, which can be moved to SRAM and boot the operating system or monitor program.

  • Programmable Interrupt Controller Intel 8259.

  • Programmable Interval Timer Intel 8253, which is used for baud rate generation and can also generate an interrupt and be connected to the speaker.

  • Universal Synchronous/Asynchronous Receiver/Transmitter (USART) Intel 8251 used as serial console so SBC can be accessed directly via RS232 interface.

  • ECB bus interface, which can be used for microcomputer extensions. The ECB bus interface facilitates communication between the main processor and various peripheral devices, enabling system expansion and enhancing functionality. Additionally, it allows for the integration of specialized hardware components, which can further optimize performance and adaptability in various applications. History of ECB bus is described below.

  • Voltage power supply for CPU: +5V, -5V, +12V which follows the requirement that -5V must be the first voltage present. It also contains inverter for -5V generation and a boost converter from 5V to 12V so the SBC can be powered only from one +5V power supply.

Here you can find a schematics for the SBC. Kicad files are also available in this repository. SBC_8080_ECB schematics.

ECB bus history

(https://www.retrobrewcomputers.org/doku.php?id=boards:ecb:start)

Below is an image depicting the latest definition of the ECB bus as utilized by the RetroBrew Computers group. It also addresses issues related to the /RESET and /RESOUT pin definitions and the solutions implemented. This design incorporates a 3-pin jumper header to allow for the selection of the appropriate configuration.

The German firm Kontron defined what is believed to be the earliest bus using the 96-pin DIN 41612 EuroCard connectors. The bus for their Z80 offering used only the A-row and C-row pins; the B-row was left entirely unused to allow for the use of 64-pin connectors in the 96-pin format.

The earliest known RetroBrew bus definition included B-row pin definitions to facilitate the anticipated expansion of the Z80 bus to other processors, particularly Intel. To this day, the ECB SBC v2 (Z80) does not use the B-row pins.

One error occurred in defining the first RetroBrew bus: confusion between signals RESET (C-31) and RESOUT (C-26). The error resulted in a bad guess at what Kontron's intentions were with these two signals. SBC v1 (Z80) used RESET as an output from the CPU board to peripheral boards and did not use the RESOUT signal at all. Peripheral boards were designed with this assumption. When it was pointed out several years ago (I am unsure of the date) that Kontron's intention was for RESET to be an input to the CPU board only and that the CPU board would then put out a signal, RESOUT, to all of the peripheral boards in the system.

The resolution to the above mistake is that all the newer CPU and peripheral boards have a reset selection jumper to select which RetroBrew reset convention is to be used. Look for a 3-pin jumper header: shorting pins 1-2 indicates the older, erroneous, reset convention for use with older boards; shorting pins 2-3 indicates the use of the Kontron convention. The Kontron convention is essential if RESET is to be received from any of the ECB backplanes, and only newer boards are allowed in such a system. Old CPU boards have a 2-pin Reset (in) connection as well as a reset switch right on the CPU card.

Generate baud rate for 8251

Response:

The 8253 Programmable Interval Timer (PIT) can be used as a baud rate generator for serial communication by generating clock pulses at the required frequency. This is done by programming one of its three counters to divide an input clock signal down to the desired baud rate.

Steps to Use 8253 as Baud Rate Generator

  1. Select the Counter: The 8253 has three counters (Counter 0, Counter 1, Counter 2). You need to choose one for generating the baud rate.

  2. Provide the Clock Input:

    The 8253 typically receives a clock input (e.g., 1.8432 MHz or some other standard clock frequency). Ensure the clock is stable and properly connected.

  3. Calculate the Divider Value:
    The baud rate is generated by dividing the input clock using a counter. The formula is:

     Input Frequency RateDivider=Baud RateClock Input Frequency​

    For example, if the input clock is 1.8432 MHz and you need a baud rate of 9600, the divider value is:

    1843200÷9600=192

  4. Program the 8253:

    • Load the appropriate mode (typically Mode 2 – Rate Generator or Mode 3 – Square Wave).

    • Load the divider value into the selected counter.

    • Start the timer and route its output to the serial communication hardware (like 8251 USART or UART).

  5. Connect Output to Serial Device: The output of the 8253 counter is connected to the baud rate clock input of a serial communication device like the 8251 USART or a UART module.

Example: Setting Baud rate for 9600 using 1.8432 MHz Clock

  • Use Counter 0 of 8253.

  • Program it in Mode 2 (Rate Generator).

  • Load 192 as the divider value.

Programming Steps (for an x86-based system)

Assembly code

text
    MOV AL, 34H    ; Control Word: Counter 0, Mode 2, LSB/MSB
    OUT 43H, AL    ; Send control word to 8253
    MOV AL, 192    ; Load LSB (Least Significant Byte)
    OUT 40H, AL    ; Send LSB to Counter 0
    MOV AL, 0      ; Load MSB (Most Significant Byte)
    OUT 40H, AL    ; Send MSB to Counter 0
  • 43H → Control port of 8253

  • 40H → Counter 0 data port

Modes Used in 8253 for Baud Rate

  • Mode 2 (Rate Generator) → Outputs a frequency suitable for baud generation.

  • Mode 3 (Square Wave Generator) → Outputs a symmetrical square wave (useful in some applications).

Final Connection

The OUT0 pin of 8253 (if using Counter 0) is connected to the clock input of 8251 USART or UART for serial communication.

Summary

  • Use Mode 2 (Rate Generator)

  • Compute the divider value using the formula

  • Program the control word and counter value

  • Connect output to the serial device clock input.

This setup allows the 8253 to act as a baud rate generator for serial communication.

Baud rate divider

As crystal frequency is 18.432 Mhz and it is outputted from I8224, we can use that frequency to generate baud rate clock signal for I8251. Below is the solution.

74LS390 contains two decade counters, where /CP0 → Q0 functions as a divider by 2, and /CP1 → Q1, Q2, Q3 operates as a divider by 5. We send an 18.432 MHz clock signal from I8224 to /CP1; it is divided by 5 and then fed to /CP0, where it is divided by 2. This arrangement will generate a square signal with an exact 50% duty cycle. The output signal from Q0 is then fed to the I8252 timer, where the appropriate baud rate can be generated.

Shadow FLASH select logic

In the picture below you can see shadow FLASH select logic schematics.

After /RESET (at this point, the /SRAMSELECT signal from the IO decoder is HIGH), /SRAM_SEL is HIGH and /FLASH_SEL is LOW. Now /SRAM_OE is HIGH (the DATA from RAM are in high impedance, although writing is not prohibited), so the /RD signal has no effect on /SRAM_OE. Only changes in /MEMRQ will impact the /FLASH_MREQ signal, which means that only FLASH memory can be accessed, either for reading or for writing. So it is also possible to flash the memory using a programmer connected to the ECB bus. A simulation has also been conducted in Verilog (via iVerilog) and can be seen below.

text
/*
 Test bench
*/

`timescale 10ns/10ns

module shadow_flash_select_logic_tb();

   reg MEMRQ, RESET, SRAMSEL, RD;
   wire SRAM_SEL, FLASH_SEL, SRAM_OE, FLASH_MEMRQ;

   initial begin
      $dumpfile ("shadow_flash_select_logic.vcd");
      $dumpvars;
   end

  initial begin
     RESET = 1;
     #10
     RESET = 0;
     #5
     RESET = 1;
  end

Simulation result in gtkwave is shown below.

ECB bus data direction

As we also have to send and read data from the ECB bus, we have to make sure that bus data buffers are properly directed if there is a bus request (BUSRQ) from the bus itself.

Signal DATA_DIR Select the direction of the data buffer. If DATA_DIR is log 0, data direction is from the board to the ECB bus, and if DATA_DIR is log 1, 1data can flow from the ECB bus to the board.

This is done by the circuit below. Basically, the upper part (/MEMRQ, /RD, /IOSEL, which is low when internal peripherals are selected) takes care of standard operations, and the upper part is involved when there is a request from the ECB bus. (/RD, /BUSAK)

Below you can see simulation code and simulation result.

text
/*
 Test bench
*/

`timescale 10ns/10ns

module shadow_flash_select_logic_tb();

   reg MREQ, IOSEL, RD, BUSAK;
   wire DATA_DIR, MREQ_IOSEL, RD_BUSAK, DATAEN;

   initial begin
      $dumpfile ("ecb_data_dir_logic.vcd");
      $dumpvars;
   end

  initial begin
    MREQ = 1;
    IOSEL = 1;
    RD = 1;
    BUSAK = 1;
/* MREQ and RD */
    #50
      MREQ = 0;

And the simulation result is below.

Peripherals address space

Internal peripherals are selected by the following decoder.

The address space with this circuit is 0x40 – 0x7f.

Where base addresses of peripherals are in the following table.

PeripheralAddress range
PIC 8259A0x40 – 047
PIT 82530x48 - 0x4F
SIO 82510x50 - 0x57
RAM bank/ SD card select register (/BANK/SD_SEL )0x58 - 0x5F
RAM select signal (/SRAMSEL)0x78 - 0x7F

Below is verilog simulation result for the decoder.

And the source code. I intentionally use primitives for simulation of 74LS138 to prevent some simulation glitches I got when I tried to use behavioral modeling. It is quite simplified as I’ve just wanted to verify address space for peripherals.

text
/*
 Test bench
*/

`timescale 10ns/10ns

module SN74LS138(input [2:0] ADDR, input E0_n, E1_n, E2, output wire [7:0] Y_n);

  not(E2_n, E2);
  nor(ENBL, E2_n, E0_n, E1_n);
  not(A_n, ADDR[0]);
  not(B_n, ADDR[1]);
  not(C_n, ADDR[2]);
  not(A, A_n);
  not(B, B_n);
  not(C, C_n);
  nand(Y_n[0], A_n, B_n, C_n, ENBL);
  nand(Y_n[1], A, B_n, C_n, ENBL);
  nand(Y_n[2], A_n, B, C_n, ENBL);
  nand(Y_n[3], A, B, C_n, ENBL);
  nand(Y_n[4], A_n, B_n, C, ENBL);
  nand(Y_n[5], A, B_n, C, ENBL);
  nand(Y_n[6], A_n, B, C, ENBL);
  nand(Y_n[7], A, B, C, ENBL);

Parts

112
QtyValueFootprintReferences
310.1uFCapacitor_THT:C_Disc_D4.3mm_W1.9mm_P5.00mmC10, C11, C12, C13, C14, C15, C18, C20, C26, C27, C28, C29, C30, C31, C32, C33 +15
41.0 uFCapacitor_THT:C_Rect_L7.2mm_W3.0mm_P5.00mm_FKS2_FKP2_MKS2_MKP2C22, C23, C24, C25
4Jumper_3_Bridged12Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJP2, JP3, JP4, JP6
31k5Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_HorizontalR3, R7, R8
374LS245Package_DIP:DIP-20_W7.62mm_SocketU11, U12, U14
21.0uFCapacitor_THT:C_Disc_D4.7mm_W2.5mm_P5.00mmC17, C19
210kResistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_HorizontalR10, R11
2220uFCapacitor_THT:CP_Radial_D5.0mm_P2.00mmC44, C45
2470uFCapacitor_THT:CP_Radial_D6.3mm_P2.50mmC3, C5
274LS08Package_DIP:DIP-14_W7.62mm_SocketU1, U30
274LS125Package_DIP:DIP-14_W7.62mm_SocketU2, U6
274LS32Package_DIP:DIP-14_W7.62mm_SocketU25, U27
1+5V/5A8080Board:694106301002_1J1
1+5VPLED_THT:LED_D3.0mmD3
10.01uFCapacitor_THT:C_Disc_D3.0mm_W1.6mm_P2.50mmC21
110Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_HorizontalR2
1100kResistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_HorizontalR4
110kResistor_THT:R_Array_SIP5RN1
110kResistor_THT:R_Array_SIP8RN3
110kResistor_THT:R_Array_SIP9RN2
118,432MHzCrystal:Crystal_HC49-U_VerticalY1
11N4148Diode_THT:D_DO-35_SOD27_P7.62mm_HorizontalD1
11N5818Diode_THT:D_DO-41_SOD81_P10.16mm_HorizontalD6
11kResistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_HorizontalR6
1220kResistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_HorizontalR1
133Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_HorizontalR5
133uFInductor_THT:L_Radial_D6.0mm_P4.00mmL1
139pCapacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mmC1
1470Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_HorizontalR9
147uFCapacitor_THT:CP_Radial_D5.0mm_P2.00mmC16
14u7Capacitor_THT:CP_Radial_D4.0mm_P1.50mmC2
174HC374Package_DIP:DIP-20_W7.62mm_SocketU22
174LS00Package_DIP:DIP-14_W7.62mm_SocketU24
174LS04Package_DIP:DIP-14_W7.62mm_SocketU3
174LS138Package_DIP:DIP-16_W7.62mm_SocketU23
174LS240Package_DIP:DIP-20_W7.62mm_SocketU16
174LS243Package_DIP:DIP-14_W7.62mm_SocketU13
174LS244Package_DIP:DIP-20_W7.62mm_SocketU15
174LS390Package_DIP:DIP-16_W7.62mm_SocketU17
174LS74Package_DIP:DIP-14_W7.62mm_SocketU4
18080APackage_DIP:DIP-40_W15.24mm_SocketU5
18224Package_DIP:DIP-16_W7.62mm_SocketIC1
18228Package_DIP:DIP-28_W15.24mm_SocketIC2
18251Package_DIP:DIP-28_W15.24mm_SocketU20
18253Package_DIP:DIP-24_W15.24mm_SocketU18
18259APackage_DIP:DIP-28_W15.24mm_SocketU19
1AS6C4008-55PCNPackage_DIP:DIP-32_W15.24mm_SocketU28
1AT-1224-TWT-RBuzzer_Beeper:MagneticBuzzer_ProSignal_ABT-410-RCSP1
1Bank0/Bank1Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJP5
1C96ABCConnector_DIN:DIN41612_C_3x32_Male_Horizontal_THTU10
1Conn_01x07Connector_PinSocket_2.54mm:PinSocket_1x07_P2.54mm_VerticalJ3
1DISKLED_THT:LED_D3.0mmD4
1HALTLED_THT:LED_D3.0mmD2
1IRF4905LPBF8080Board:TO254P483X1016X1501-3PQ1
1Jumper_3_Bridged23Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJP1
1LT1109APackage_DIP:DIP-8_W7.62mm_SocketU7
1MAX232Package_DIP:DIP-16_W7.62mm_SocketU21
1PN2222APackage_TO_SOT_THT:TO-92_InlineQ2
1RESETConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalSW1
1RS232Connector_PinHeader_2.54mm:PinHeader_2x05_P2.54mm_VerticalJ4
1RUNLED_THT:LED_D3.0mmD5
1SPEAKERConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ2
1SST39SF010Package_DIP:DIP-32_W15.24mm_SocketU29
1TC7660HPackage_DIP:DIP-8_W7.62mm_SocketU9

The 111 most common of 112 parts.

Similar boards

  • 4 layers253.6 × 137.7 mmS100 Thunder186-1.0-006, the printed circuit board in 3D

    S100 Thunder186-1.0-006

    RichCini/LomasBoards

    Small repository of files/data related to Lomas Data Products S-100 boards.

    118 parts1
  • 2 layers244 × 244 mm6809PC-6U, the printed circuit board in 3D

    6809PC-6U

    danwerner21/6809PC

    6809 PC

    167 parts2
  • 6 layers244 × 244 mmRetroslop, the printed circuit board in 3D

    Retroslop

    CPTforever/8088-MicroATX-Computer

    A 8088 based, IBM 5150 like computer compatible with the MicroATX motherboard form factor.

    193 parts
  • 2 layers232.8 × 204.2 mmTIM-011B, the printed circuit board in 3D

    TIM-011B

    Board-Folk/TIM011B

    TIM-011 B Replica Board

    162 parts8
  • 2 layers235 × 137.5 mmTTY Clock, the printed circuit board in 3D

    TTY Clock

    tergav17/RDP-9

    Homebrew TTL ISA-compatible PDP-9 clone

    120 parts6
  • 2 layers235 × 160 mmProcessor.80C188, the printed circuit board in 3D

    Processor.80C188

    lynchaj/duodyne

    Duodyne is a hobbyist retrocomputer system designed to run ROMWBW. It is comprised of modules on a system bus

    111 parts15
  • 2 layers630 × 300 mmSecretBase, the printed circuit board in 3D

    SecretBase

    stonedDiscord/SecretBase

    SEGA Secret Base Arcade Game

    441 parts
  • 2 layers279.4 × 203.2 mmZ180GDC, the printed circuit board in 3D

    Z180GDC

    lynchaj/rhyophyre

    Single Board Computer featuring Zilog Z180 processor and NEC µPD7220 Graphics Display Controller

    249 parts12

Questions

How big is the 8080 Board PCB?

It measures 160.5 × 100.2 mm and has 2 copper layers, 1.6 mm thick.

What parts does the 8080 Board use?

112 parts, built around the 74LS245SC, 74LS125DC, 74LS240DC and MAX232N. 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 8080 Board KiCad files?

From the sladek/SBC_8080_ECB repository on GitHub, at the commit this page was made from: the board is kicad/8080_ECB_SBC/8080_Board.kicad_pcb and its schematic kicad/8080_ECB_SBC/8080_Board.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the 8080 Board design in my own project?

Its repository states no licence, so its author keeps all rights: ask sladek before reusing the design.