Skip to the content
2 layers100 × 100 mmPortcard RevC, the printed circuit board in 3D

Portcard RevC

retrac0/retelex

Retro telephone exchange. Also retro telex exchange.

Size
100 × 100 mm
Copper layers
2
Thickness
1.6 mm
Parts
75
Nets
168
Pads
541
Tracks, vias
0, 0
Routed
Not yet
KiCad
KiCad 10.0 (file 20260206)
Created
28 Sep 2026
Updated
28 Sep 2026

Overview

Portcard RevC is an open-source printed circuit board by retrac0, from the retrac0/retelex repository on GitHub. It is a 2-layer board of 100 × 100 mm with 75 parts on 168 nets.

It is built around the 74HC244D, 74HC151D and 74HC688D, with the 74HC00D, 74HC02 and 74HC11D among its other parts. Its parts include 18 capacitors, 14 diodes, 13 ICs, 11 resistors and 4 connectors.

Main components

11

README

README.md

Retelex

Retro telephone exchange. Also retro telex exchange.

MF8 — a six-channel digital voice carrier in discrete logic

Six 64 kbps channels and a sub-commutated signalling channel in an 8-bit frame, over one twisted pair, built in 74HC. A channel slot is equivalent to DS0: 64 kbps and octet-aligned.

Works with a CVSD voice card (the normal Retelex protocol), a synchronous data card, or a G.711 PCM stream.

text
[ F ][ C1 ][ C2 ][ C3 ][ S ][ C4 ][ C5 ][ C6 ]      8 bits, 15.625 µs, 64 kHz
                                                    512 kbps, 1.024 MBaud

The superframe is a sequence of 8 frames. It carries signalling (one bit per channel at 8 kHz), it carries the framing word, and it is the octet counter, so at a 64 kHz frame rate, the superframe rate is 8 kHz, the PCM sample rate exactly, and one superframe carries one sample.

But we don't use PCM in practice. Though byte-boundary support does exist.

Exchange

Sixty-four line exchange. Supports MF8 trunks between exchanges.

Up to 48 subscriber lines. 0x and 1x are reserved for trunk and supervisor features.

Anywhere from 1 to 64 lines can be trunks. Each exchange supports connections up to four different exchanges, in any number of lines. For example, MF8 can be doubled so an exchange has 12 lines tying it to its neighbour. This could be done on two fronts for a total of 24 tie lines.

The directions are labelled after the compass points NSEW but this is purely notional.

Digital switching, CVSD or data.

Pulse flood protocol. Sending exchange calls all outward directions which is passed on by all exchanges until dropped or accepted. Preliminary traffic simulation suggests this scales to about a thousand lines across a few dozen exchanges.

General purpose architecture. Chains, stars and rings are possible.

Layout

text
common/     the cards, and everything that belongs to neither shelf nor block
mf8/        the MF8 carrier: frame, line, backplane
exchange/   the exchange: the design as built, proposed/, analysis/
newimpl/    the exchange in Verilog, the reference the documents describe
pcb/        KiCad boards: the block header, the port card, the bus, SU-1, the lamp panel
sim/        every model, and the committed run beside each
falstad/    the voice path as Falstad circuits
spice/      analog circuits in ngspice
mf2/        MF2, the two-channel member of the MF8 family
old/        retired trees (old/verilog)

A card plugs into an MF8 shelf or an exchange block unchanged, so its specification belongs to neither: common/ is that, and it is why the split exists. Run the models from the repo root — python3 sim/mf8.py.

Documents

common/ — the cards, the socket they share, and the line to the telephone

common/terms.mdone name per object, and what not to call it
common/clocks.mdevery clock in MF8 and in the exchange: one 4.096 MHz crystal, its taps, three domains; no card makes a clock
common/common-cards.mdthe channel socket: pins by card, on an MF8 shelf and on a block's J4; rails; the FXO's one jumper; connectors
common/channel-cards.mdthe channel cards: the CVSD subscriber line card, the analog FXS/FXO card, the data card; signalling through the A bit, measured
common/subscriber-line.mdthe subscriber line: raw CVSD four-wire, hook and ring as held bit patterns, dialling as the line card sees it; the phone is loop-timed
common/tones.mdthe tone plan and the tone cards: the warble for progressing, the buzz for stop, the ROM planes, the analog card, the MF8 tone bus
common/cvsd-codec.mdthe CVSD codec circuit and its riser
common/su-1.mdSU-1 subscriber set: native CVSD, 4P4C handset, Autovon pad → dial pulses, three boards (SU-D / SU-A / SU-K)
common/sdu-1.mdSDU-1 data set: 32 kb/s insert-1 on the raw line (switched); RAW64 for nailed 64 kb/s
common/stu-1.mdSTU-1 test set: the lineman's butt set — a lamp field that names the fault, a violation counter on real copper, the phantom in volts
common/subscriber-adapter.mda stock dial telephone on that line: where the 2-wire conversion sits, the adapter, its ringing and its power budget

mf8/ — the carrier

mf8/mf8-spec.mdMF8 specification — line frame, F word, framer, cards, line code, circuits
mf8/mf8-backplane.mdMF8 shelf backplane — six channel slots, slot interface, three clock domains and where they meet, and the measured cost of the plesiochronous slip
mf8/mf8-psu.mdMF8 shelf power: 15–18 V in, regulated −48 V talk battery and ~80 Vrms / 20 Hz ring as two converter paths, split across noisy and quiet 100 × 100 end boards
mf8/mf8-trunk.mdMF8 trunk split: Trunk-D / Trunk-A on 100 × 100, classifier on A, pass-header pinout
mf8/mf8-pico.mdthe Pico adapter: host gateway to Asterisk, trunk and channel emulator, reference line terminal — the model as an instrument for the breadboard; the receiver's timing grid, measured
mf8/line-codes.mdnine line codes explored; differential Manchester against AMI
mf8/frame-rate.mdwhat the frame rate should be: reach against quality, capacity and DS0
mf8/mfspec.mdthe predecessor this design replaced the F word of

exchange/, newimpl/, falstad/

exchange/the exchange: 64 ports, the pulse flood; the design as built, what is proposed, the analysis behind it, the glossary and the open questions
newimpl/the exchange in Verilog: rtl/, tb/, the benches and the fault list; the reference the documents describe
falstad/the voice path as Falstad circuits built from subcircuit modules: CVSD encoder, differential Manchester, a line with noise and impulses, the receiver and its recovered clock, the decoder; what to try, and how each matches the model

Tools

mf8.pyreference model and frame-layer battery — the F word, false locks, superframe phase, where S sits, slot rules over every byte in every seat, line errors, slip recovery
mf8_line.pyend to end: six independent talkers, real CVSD, a real waveform, both line codes
linecodes.pythe line itself — which code, how it fails, what the rate costs
impulse_sweep.pythe impulse falloff curve: 23 rates, both codes, error bars, thresholds
mf8_render.pyrenders 15 s of every channel to sim/out/ under nine line conditions in both codes, for listening
subline.pythe subscriber line: CVSD against the held patterns, the hook and ring detectors, dial pulses as the line card sees them, the register end to end, DTMF through the codec
cvsd_law.pythe codec law: MIL-STD-188-113 read from the standard's own test patterns, against the previous law, whether it is bit-rate specific, and a DNVT on a 64 kbps channel
tolerance.pyCVSD encoder/decoder component-mismatch tolerance at 64 kbps, I_min included
falstad_cvsd.pybuilds the Falstad (CircuitJS) modules and the three circuits in falstad/ from the codec law and the line constants; and check, which compares a Falstad run with cvsd.py and fast.mono_decode
falstad/sim.mjsruns a circuit in falstad.com's simulator in headless Chromium and records every labeled node, for that check
audio.py cvsd.py phy.py fast.pyshared: audio I/O and scoring, the CVSD codec, the physical layer, C-accelerated inner loops
talkers.pybuilds the seven independent test talkers from LibriSpeech
tones.pycall-progress tones as looped CVSD: the shortest seamless loop, what ROM depth buys, eight tone plans compared, five ways to make a warble, and the cadence as a binary divide. Renders the plan to sim/out/
exch.pythe exchange: the fabric cell by cell, calls a millisecond at a time, the flood across a network, traffic. exchange/README.md §4 lists its runs
text
python3 sim/mf8.py            frame layer (8-bit / 6 ch)  (mf8.log)
python3 sim/mf8_line.py       over the line              (mf8_line.log)
# measured, not taken: mf8_16.py, mf8_10.py, mf8_10_16.py, mf8_baud.py
python3 sim/linecodes.py      line codes and rate  (linecodes.log)
python3 sim/impulse_sweep.py  impulse falloff      (impulse_sweep.log, .csv)
python3 sim/mf8_render.py     listenable renders   (mf8_render.log; wavs in out/)
python3 sim/subline.py        subscriber line      (subline.log)
python3 sim/cvsd_law.py       the codec law        (cvsd_law.log)
python3 sim/tolerance.py      codec tolerances     (tolerance.log)
python3 sim/tones.py          call-progress tones   (tones.log; wavs in sim/out/)
python3 sim/falstad_cvsd.py   Falstad prototypes   (falstad_cvsd.log; falstad/*.txt)

sim/out/ is not committed. Each render is the full 15 s as the link delivers it — muted wherever the framer was not locked, so outages are heard in place rather than edited out. Files are {dm,ami}_{condition}_ch{n}.wav, with source_ch{n}.wav as the reference.

The .log files beside each in sim/ are the committed runs. Every table in the documents is reproducible from them.

Test audio

sim/talker1.wav … sim/talker7.wav are seven independent LibriSpeech dev-clean speakers, 30 s each, and are not committed — they are extracts from third-party material. Rebuild them with python3 sim/talkers.py --root <dev-clean>. sim/phy_fast.c builds to sim/libphyfast.so; see the header of fast.py.

What is settled and what is not

Settled: the frame, the F word, the framer, and that the carrier is transparent — six talkers through the whole chain in both line codes add +0.00 dB.

Not settled, and not settleable here: the impulse rate on the target loops. The curve is measured (impulse_sweep.py, mf8/line-codes.md §4.5): each impulse costs differential Manchester about 0.77 breaks and AMI about 0.14, so differential Manchester reaches one click a second at 1.3 impulses/s and AMI at about 8. AMI holds that advantage until it collapses outright between 800 and 900 impulses/s. Which matters depends on the loop, and that is a counter on a real pair.

Todo

  • Hook flash - put the call on hold! Implemented probably in the subscriber card When on hold the keypad could become available

Parts

75
QtyValueFootprintReferences
13100nCapacitor_THT:C_Disc_D3.0mm_W1.6mm_P2.50mmC5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17
10LED 3mmtelco:LED_D3.0mm_RowD5, D6, D7, D8, D9, D10, D11, D12, D13, D14
41N4148Diode_THT:D_DO-35_SOD27_P2.54mm_Vertical_AnodeUpD1, D2, D3, D4
4M3MountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
310kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P2.54mm_VerticalR1, R10, R11
3680Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P2.54mm_VerticalR2, R3, R4
218kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P2.54mm_VerticalR6, R8
21kResistor_THT:R_Array_SIP6RN4, RN5
21nCapacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mmC3, C4
21uCapacitor_THT:C_Rect_L7.2mm_W3.5mm_P5.00mm_FKS2_FKP2_MKS2_MKP2C1, C2
2270kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P2.54mm_VerticalR7, R9
22N7000Package_TO_SOT_THT:TO-92_InlineQ1, Q2
233Resistor_THT:R_Array_SIP8RN1, RN3
274HC151Package_DIP:DIP-16_W7.62mmU2, U3
274HC688Package_DIP:DIP-20_W7.62mmU4, U5
110kResistor_THT:R_Array_SIP5RN2
110uCapacitor_THT:CP_Radial_D4.0mm_P1.50mmC18
14.7kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P2.54mm_VerticalR5
174HC00Package_DIP:DIP-14_W7.62mmU11
174HC02Package_DIP:DIP-14_W7.62mmU9
174HC11Package_DIP:DIP-14_W7.62mmU8
174HC14Package_DIP:DIP-14_W7.62mmU7
174HC157Package_DIP:DIP-16_W7.62mmU12
174HC244Package_DIP:DIP-20_W7.62mmU13
174HC273Package_DIP:DIP-20_W7.62mmU1
174HC4002Package_DIP:DIP-14_W7.62mmU10
174HC74Package_DIP:DIP-14_W7.62mmU6
1C_TXConnector_PinHeader_2.54mm:PinHeader_2x08_P2.54mm_VerticalJP3
1EDGE HEADER TO THE SUBSCRIBER CARDConnector_IDC:IDC-Header_2x17_P2.54mm_HorizontalJ4
1POSConnector_PinHeader_2.54mm:PinHeader_2x03_P2.54mm_VerticalJP1
1STACK LEFTtelco:Stack_2x25_P2.54mm_LongTailJ1
1STACK RIGHTtelco:Stack_2x25_P2.54mm_LongTailJ2
1TEST STRIPConnector_PinHeader_2.54mm:PinHeader_1x12_P2.54mm_HorizontalJ5
1WORDConnector_PinHeader_2.54mm:PinHeader_2x08_P2.54mm_VerticalJP4
1WRConnector_PinHeader_2.54mm:PinHeader_2x08_P2.54mm_VerticalJP2

More from retrac0/retelex

5
  • 2 layers100 × 100 mmBlkhdr logic RevA, the printed circuit board in 3D

    Blkhdr logic RevA

    retrac0/retelex

    Retro telephone exchange. Also retro telex exchange.

    60 parts
  • 2 layers100 × 100 mmBlkhdr bus RevA, the printed circuit board in 3D

    Blkhdr bus RevA

    retrac0/retelex

    Retro telephone exchange. Also retro telex exchange.

    56 parts
  • 2 layers50 × 100 mmLamp card, the printed circuit board in 3D

    Lamp card

    retrac0/retelex

    Retro telephone exchange. Also retro telex exchange.

    23 parts
  • 2 layers50 × 100 mmInterface card, the printed circuit board in 3D

    Interface card

    retrac0/retelex

    Retro telephone exchange. Also retro telex exchange.

    9 parts
  • 2 layers100 × 100 mmMainbus, the printed circuit board in 3D

    Mainbus

    retrac0/retelex

    Retro telephone exchange. Also retro telex exchange.

    6 parts

Similar boards

  • 2 layers299.7 × 198.1 mmCisc-8, the printed circuit board in 3D

    Cisc-8

    nailed-barnacle/Cisc-8-ttl-processor

    A cut-down version of the 8080 processor using HCTTL and including a discrete ALU and instruction decoder

    319 parts1MIT
  • 2 layers297 × 210 mmCpu, the printed circuit board in 3D

    Cpu

    tetrix450/masic-cpu

    MASIC CPU schematics and PCB

    197 partsMIT
  • 2 layers100 × 100 mmHC4 KiCad, the printed circuit board in 3D

    HC4 KiCad

    nasu8151/HC4

    Schematics and board of HC4 E (E means "for Education").

    175 parts8
  • 2 layers208 × 110 mm8 16 computer 2, the printed circuit board in 3D

    8 16 computer 2

    halfburnttoast/TCPU816-v1

    Version 1.1 of my 8-bit, TTL computer.

    120 parts21
  • 2 layers200 × 150 mmMicro, the printed circuit board in 3D

    Micro

    jurendono/VMC

    A Versitile 6502 Based Microcomputer

    235 parts
  • 2 layers178 × 711 mmMSAP-2 rev.A SMD, the printed circuit board in 3D

    MSAP-2 rev.A SMD

    mehrantsi/MSAP-2

    An 8-bit computer. Successor to MSAP-1

    658 parts13MIT

Questions

How big is the Portcard RevC PCB?

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

What parts does the Portcard RevC use?

75 parts, built around the 74HC244D, 74HC151D, 74HC688D and 74HC00D. 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 Portcard RevC KiCad files?

From the retrac0/retelex repository on GitHub, at the commit this page was made from: the board is pcb/portcard_RevC/portcard_RevC.kicad_pcb and its schematic pcb/blkhdr_bus_RevA/blkhdr_bus_RevA.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Portcard RevC design in my own project?

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