

Program Counter
a custom 16bit cpu
- Size
- 100 × 100 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 34
- Nets
- 77
- Pads
- 183
- Tracks, vias
- 0, 0
- Routed
- Not yet
- KiCad
- KiCad 8.0 (file 20240108)
- Created
- 9 Jun 2024
- Updated
- 20 Oct 2024
Overview
Program Counter is an open-source printed circuit board by Shmerlard, from the Shmerlard/SH8 repository on GitHub. It is a 2-layer board of 100 × 100 mm with 34 parts on 77 nets.
It is built around the 74LS245SC and 74LS161DC. Its parts include 16 diodes, 6 ICs and 6 connectors.
Main components
274LS245SC
-0℃~+70℃ 12ns@5V,45pF 15mA 24mA 4.75V~5.25V 74LS 8 Bidirectional Output enable Schmitt trigger Tri-State - Buffers, Drivers, Receivers, Transceivers ROHSTexas InstrumentsBuffers, Drivers, Receivers, Transceivers74LS161DC
-0℃~+70℃ 14ns 32MHz 4 4.75V~5.25V 74LS 93mW Asynchronous Binary Counter Programmable divide ratio、Reset function、Cascade counter、Synchronous counting Rising Edge Synchronous - Counters, DividersTexas InstrumentsCounters, Dividers
README
README.mdThe shmerlard 16
hi, my name is elad and Im an electrical engineering student in Ben gurion university. I designed a small 16bit cpu, with a mix of jdh8, src, msp430 and the Hack computer. this is still a work in progress, but so far it works.
I used logisim for the logic design, draw.io for the diagrams.
in order to see the working cpu in logisim: you need to build version 3.9.0 from source here, then just open the .circ file.
Specs
- a common 16-bit data and address bus
- a total of 128kB of usable memory
- 6 GP register (up to 14 available)
- modular design for easy troubleshooting
- port for outside connections
Contents
- Registers
- Instruction Register
- Program Counter
- ALU
- Control Unit
- Memory Registers
- Condition Logic
- Shift Control
- Gallery
Instruction set
0x00: NOP
0x01: MOV Ra/#, Rb | Ra/# -> Rb
0x02: ST Ra/#, Rb/# | Ra/# -> M[Rb]/
0x03: PUSH Ra/# | Ra/# -> @SP; SP--
0x04: POP Ra | SP++; @SP -> Ra
0x05: ADD Ra/#, Rb | Ra/# + Rb -> Rb
0x06: ADDC Ra/#, Rb | Ra/# + Rb + c -> Rb
0x07: SUB Ra/#, Rb | Rb - Ra/# -> Rb
0x08: CMP Ra/#, Rb | Rb - Ra/#
0x09: SHR Ra/#, Rb | SHR Rb (Ra/# times) -> Rb
0x0A: SHL
0x0B: RRC Ra/#, Rb | RRC Rb (Ra/# times) -> Rb
0x0C: RLC
0x0D: AND Ra/#, Rb | Ra/# AND Rb -> Rb
0x0E: OR Ra/#, Rb | Ra/# OR Rb -> Rb
0x0F: XOR Ra/#, Rb | Ra/# XOR Rb -> Rb
0x10: NOT
0x11: CALL DST | PC -> @SP; DST -> PC; SP-- -> SP;
0x12: RET
0x13: JMP DST | DST -> PCfor more simulated instructions see: Simulated Instructions
Registers
0: SP/REG0 : STACK pointer
1: SR/REG1 : Status register
2: REG2 : GP Input
3: REG3 : GP Output
4: REG3 : GP
5: REG4 : GP
6: REG5 : GP
7: REG6 : GPMemory
the memory ranges from 0x0000 to 0xFFFF.
the memory is mapped in the following way:
0x0000 - 0x7FFF: GP ROM (32KiB ROM)
0x8000 - 0xBFFF: GP RAM (16KiB RAM)
0xC000 - 0xCFFF: VRAM (4KiB RAM) #CURRENTLY NOT IN USE#
0xD000 - 0xFFFF: NOT IN USE (12KiB UNUSED)Instruction format
The instruction register is a 16-bit register
the format is XXXX-XUMM-SSSS-DDDD
X = the opcode of the instruction
U = Currently not in use
M = indicates the addressing mode
S = indicates the source register
D = indicates the destination register(see addressing modes) for more info
Full diagram
for the full gallery go to Gallery

Parts
34| Qty | Value | Footprint | References |
|---|---|---|---|
| 16 | LED | LED_THT:LED_Rectangular_W3.0mm_H2.0mm | D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15 |
| 4 | 74LS161 | Package_DIP:DIP-16_W7.62mm_Socket_LongPads | U1, U2, U3, U4 |
| 4 | MountingHole_Pad | MountingHole:MountingHole_2.2mm_M2_DIN965_Pad | H1, H2, H3, H4 |
| 3 | Conn_01x02_Socket | Connector_JST:JST_XH_S2B-XH-A_1x02_P2.50mm_Horizontal | J2, J4, J5 |
| 2 | 74LS245 | Package_DIP:DIP-20_W7.62mm_Socket_LongPads | U5, U6 |
| 2 | Conn_01x08_Socket | Connector_JST:JST_XH_S8B-XH-A_1x08_P2.50mm_Horizontal | J1, J3 |
| 2 | R_Network08_US | Resistor_THT:R_Array_SIP9 | RN1, RN2 |
| 1 | Conn_01x03_Socket | Connector_JST:JST_XH_S3B-XH-A-1_1x03_P2.50mm_Horizontal | J6 |
More from Shmerlard/SH8
9- 2 layers100 × 100 mm

- 2 layers100 × 100 mm

- 2 layers100 × 100 mm

- 2 layers100 × 100 mm

- 2 layers100 × 100 mm

- 2 layers100 × 100 mm

- 2 layers100 × 100 mm

- 2 layers100 × 100 mm

- 2 layers100 × 100 mm

Similar boards
- 2 layers365.1 × 203.2 mm

DIAG
Nakazoto/CenturionComputer
This is just a simple backup of all the files related to the Centurion that I have stored on my HD. The Wiki itself has far more in-depth information about the Centurion and it's individual cards.
150 parts172 - 2 layers370.8 × 298.5 mm

8 Bit Computer
The-Invent0r/8-bit-Computer-PCB
These are the KiCAD files for my 8-Bit Computer.
323 parts142 - 2 layers155.2 × 78.6 mm

80ColumnCard
btb/80ColumnCard
An Apple II 80-Column Card. Based on the Videx Videoterm
47 parts43Apache-2.0 - 4 layers170 × 181 mm

- 2 layers

- 2 layers157.5 × 73.9 mm

- 2 layers236.8 × 169.8 mm

TK2000
clemarfolly/Microdigital-TK2000
Reprodução da PCB do TK-2000 da Microdigital, clone do Micro-Professor MPF-II
212 parts17 - 2 layers111.8 × 121.9 mm

Questions
How big is the Program Counter PCB?
It measures 100 × 100 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Program Counter use?
34 parts, built around the 74LS245SC and 74LS161DC. 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 Program Counter KiCad files?
From the Shmerlard/SH8 repository on GitHub, at the commit this page was made from: the board is KiCad/Program_Counter/Program_Counter.kicad_pcb and its schematic KiCad/ALU/ALU_Extra/ALU_Extra.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Program Counter design in my own project?
Its repository states no licence, so its author keeps all rights: ask Shmerlard before reusing the design.