Close

Side quest

A project log for Zara80

A modern-retro computer based on the Z80.

trevor-rh-clarkeTrevor R.H. Clarke 06/08/2026 at 13:360 Comments

Finally getting back to the project. I decided I want to play around with different circuits for the bus master, etc. but didn't especially want to use breadboards or spin a new board every couple of days. I figured I'd start working it out on an FPGA. That gave me an idea for a separate but related project. A compact and modern system for retro style computers that still captures the essentials.

The idea is to have some generic FPGA boards that plug into a backplane using cheap, standard connectors but still using the STEbus layout so it's relatively easy to build an adapter or re-implement on a real STEbus. There will be one (initially) or more FPGA boards with external connectors or a proto area (space permitting) with access to some of the FPGA outputs. Most of the GPIOs would function as STEbus lines. A couple of obvious choices for physical connectors would be SODIMM or M.2. I opted for M.2 because of the size.

I did a quick mapping of the various bus lines to an M.2 key M. I tried to set some of the power pins such that accidental insertion into a real M.2 socket wouldn't blow things up then mapped the remaining lines, grouping them by similar function.

I decided to play around with some GenAI to do an initial signal integrity check so I fed the pinout to GPT 5.4. It seemed to do a decent job, making a couple of suggested changes which at first glance seemed reasonable. Given STEbus uses a relatively low clock rate I probably won't run any openEMS simulations and just spin the boards.


Conversation Title: Evaluate M.2 Pinout for Signal Integrity and Current

Agent: ONEchat

[06/05/2026 20:24:39 +00:00] Trevor Clarke:
Evaluate the following pinout for possible signal integrity issues. Estimate the maximum current for each of the power lines. The physical connection is an M keyed M.2 socket. This is a custom, non-standard use of the M.2 connector. SYSCLK is a fixed 16MHz clock. All other lines are typically much lower than this and will never exceed it. 

Socket 3 Key M
74 TRST TMS 75
72 TCK GND 73
70 TDI TDO 71
68 3V3 GND 69
SYSRST 67




58 3v3 GND 57
56 3v3 GND 55
54 SYSCLK GND 53
52 A19 GND 51
50 A17 A18 49
48 A15 A16 47
46 A13 A14 45
44 A11 A12 43
42 GND A10 41
40 A9 A8 39
38 A7 A6 37
36 A5 A4 35
34 A3 GND 33
32 A1 A2 31
30 ADRSTB A0 29
28 DATCK GND 27
26 DATSTB D7 25
24 D6 D5 23
22 D4 D3 21
20 D2 D1 19
18 D0 GND 17
16 ATNRQ6 ATNRQ7 15
14 ATNRQ4 ATNRQ5 13
12 ATNRQ2 ATNRQ3 11
10 ATNRQ0 ATNRQ1 9
8 BUSAK0 BUSAK1 7
6 BUSRQ0 BUSRQ1 5
4 CM2 TRFERR 3
2 CM0 CM1 1

Response:
## Plan

1. Assess the pinout for signal-integrity risks based on adjacency, return paths, and the 16 MHz max clock.
2. Estimate current capability of the 3.3 V pins from typical M.2 connector/contact ratings rather than SSD-system power budgets.
3. Summarize practical layout/routing recommendations and the likely safe current envelope.
## Plan

I’ll assess three things: the connector’s likely bandwidth margin, the pin-field layout for return-path/crosstalk risk, and the current limit of the 3.3 V pins.[doc1][doc2]

## Assumptions

I am assuming your stated operating condition is a direct M-keyed M.2 card/socket interconnect, with SYSCLK fixed at 16 MHz and all other signals at or below that rate. I am also assuming these are single-ended logic signals rather than controlled-impedance differential pairs.

## Bottom line

This pinout is likely workable at 16 MHz, because M-key M.2 connectors are commonly sold for PCIe Gen4/Gen5 service and use a 67-contact, 0.5 mm-pitch interface, so the connector itself has far more bandwidth than your stated clock rate.[doc1][doc2] The main signal-integrity risks are therefore not “M.2 is too fast/too small,” but rather single-ended bus crosstalk, shared return paths, simultaneous-switching noise, and any very fast logic edge rates you may have on the address/data/control lines.[doc1][doc2]

## Signal-integrity review

### What looks good

Your two obvious clocks, SYSCLK and DATCK, each have an adjacent ground in the pin map you posted, which is exactly what you want for a clean local return path and reduced crosstalk. This is a strong feature of the assignment.

The supply pins are also distributed rather than concentrated at only one end, which helps reduce shared impedance in the power feed.

Because the connector family is designed for much higher-speed protocols than 16 MHz, the contact geometry itself is unlikely to be the limiting factor here.[doc1][doc2]

### Main concerns

The address and data buses are mostly arranged as signal-next-to-signal rather than signal-next-to-ground. That means the dominant risk is capacitive/inductive coupling between adjacent lines, especially where multiple address or data bits switch at the same time.

The ground pins are present, but they are not densely interleaved through the entire wide bus. That can force return currents to spread through the connector and nearby planes instead of staying tightly local to each signal, which increases crosstalk and ground bounce.

If your drivers have fast edges, the electrical behavior will be set more by rise/fall time than by the 16 MHz repetition rate. In practice, that means a “slow” 16 MHz clock can still ring or overshoot if the launch edge is sharp and the trace plus connector path is electrically long enough.

JTAG is probably fine, since it is usually low activity, and TCK has a nearby ground in your map. Still, TMS/TDI/TDO are not fully shielded, so I would not route them with unnecessarily aggressive edge rates.

### Highest-risk signal groups

1. **Address bus A0-A19**  
   Large single-ended bus, many adjacent signal neighbors, not much ground interleaving.

2. **Data bus D0-D7 plus DATSTB/DATCK**  
   DATCK placement is good, but the surrounding data lines can still inject crosstalk into one another if the source edges are fast.

3. **Handshake/request groups**  
   ATNRQx, BUSRQx, BUSAKx, CMx, and TRFERR are probably low rate, but simultaneous edges in clusters can still create local ground movement.

## Practical SI recommendations

Keep all connector-associated routing over a continuous solid reference plane on both boards. A split plane under this connector will hurt you more than the connector choice itself.

Add source termination on the fastest and most timing-sensitive outputs first, especially SYSCLK, DATCK, and possibly TCK. In practice, that usually means a small series resistor near the driver, tuned empirically.

If possible, use the weakest output drive strength and slowest acceptable slew rate in the transmitter devices. That usually gives a bigger benefit than rearranging a few low-speed pins.

If you revise the pinout later, the biggest improvement would be to interleave more grounds inside the wide address/data fields, not because 16 MHz demands transmission-line-style shielding everywhere, but because it reduces crosstalk and simultaneous-switching noise margin loss.

Place local decoupling near the connector on both sides of the interconnect, especially because your 3.3 V rail is shared across multiple logic groups.

## Power-pin current estimate

### What the connector data says

I found two relevant M-key M.2 connector data points from the same general connector family: one lists **0.5 A per pin** current rating,[doc1] while a newer Gen5 variant lists **1 A on power pins**.[doc2] That means the exact allowable current depends on the specific receptacle part number you are actually using, and you should not assume all M-key sockets have the same power rating.[doc1][doc2]

### Conservative estimate

If you do **not** have the exact socket datasheet, I would use **0.5 A maximum per 3.3 V contact** as the safe estimate, because that is explicitly stated for one M-key M.2 connector datasheet.[doc1]

You appear to have three 3.3 V pins in the posted map, so the conservative connector-limited total is:

$$I_{\text{total, conservative}} = 3 \times 0.5\text{ A} = 1.5\text{ A}$$

### Less conservative upper bound

If your exact connector is a variant that specifically rates **power pins at 1 A**, then the upper bound becomes:

$$I_{\text{total, upper}} = 3 \times 1.0\text{ A} = 3.0\text{ A}$$

### Per-line estimate table

| 3.3 V line | Conservative max | Upper bound if exact socket is 1 A/power-pin type |
|---|---:|---:|
| Pin 68 | 0.5 A[doc1] | 1.0 A[doc2] |
| Pin 58 | 0.5 A[doc1] | 1.0 A[doc2] |
| Pin 56 | 0.5 A[doc1] | 1.0 A[doc2] |
| **Total 3.3 V rail** | **1.5 A**[doc1] | **3.0 A**[doc2] |

## Contact drop and heating estimate

One cited M-key connector spec gives **55 mΩ contact resistance**.[doc1] Using that value, one power contact at 0.5 A drops about:

$$V = I R = 0.5 \times 0.055 = 0.0275\text{ V}$$

So the drop is about **27.5 mV per contact** at 0.5 A.[doc1]

The power dissipated in one contact at 0.5 A is:

$$P = I^2R = 0.5^2 \times 0.055 = 0.01375\text{ W}$$

So that is about **13.8 mW per contact** at 0.5 A.[doc1]

At 1 A on a power-rated contact, the drop is about **55 mV** and the dissipation is about **55 mW per contact**.[doc1][doc2]

Those numbers are not alarming by themselves, but real current sharing across three pins is rarely perfect, so I would still derate unless you validate temperature rise on the actual hardware.

## Final assessment

For your stated 16 MHz maximum signaling, this custom use of an M-key M.2 socket is **probably electrically reasonable**.[doc1][doc2] The connector family has ample intrinsic speed margin for that rate,[doc1][doc2] and your two clock-like lines are placed sensibly with adjacent grounds. The main risks are bus crosstalk and return-path sharing across the large single-ended address/data fields, not the connector technology itself.

For current, I would treat **0.5 A per 3.3 V pin, 1.5 A total** as the default design limit unless you can confirm a socket datasheet that explicitly allows **1 A on power pins**, in which case **3.0 A total** is a reasonable connector-only upper bound.[doc1][doc2]

If you want, I can next turn this into a **pin-by-pin SI risk table** and suggest a **revised pin assignment with better ground interleaving**.

[06/05/2026 20:34:09 +00:00] Trevor Clarke:
create a pin-by-pin SI risk table and suggest a revised pin assignment.

Response:

I created a markdown artifact with a pin-by-pin SI risk table for the current pinout and a revised assignment that improves return-path placement for the most sensitive control nets.


# Custom M.2 Socket 3 Key M Pinout SI Review

## Scope

This review assumes:

- M-keyed M.2 card/socket interconnect with no cable in between
- Single-ended digital signals
- Maximum signal frequency of **16 MHz**
- The real SI limiter is **edge rate**, not the 16 MHz repetition rate
- Both PCBs can provide a continuous reference plane under the connector breakout

## Risk legend

- **Low**: Good local return path and/or low switching activity; unlikely to be the first SI problem
- **Medium**: Acceptable at 16 MHz, but worth routing carefully and possibly damping with small series resistors
- **High**: Most likely place to see crosstalk, ringing, or ground-bounce sensitivity if edge rates are fast

## Overall observations on the current pinout

1. **SYSCLK (54)** is well placed with **GND (53)** adjacent.
2. **DATCK (28)** is also well placed with **GND (27)** adjacent.
3. The largest SI concern is the **wide single-ended address/data field** with limited ground interleaving.
4. The **address reset/strobe area** is less optimal than the main clocks.
5. The lower control cluster is not high speed, so its SI risk is driven more by **asynchronous behavior and shared return current** than by raw bandwidth.

## Pin-by-pin SI risk table for the current assignment

| Pin | Signal | Group | Risk | Why | Suggested handling |
|---:|---|---|---|---|---|
| 75 | TMS | JTAG | Medium | Adjacent to TRST, no immediate ground on the same row | Keep slew rate low; route with TCK separated where possible |
| 74 | TRST | JTAG | Low | Low activity; little timing sensitivity | No special action beyond normal routing |
| 73 | GND | Return | Low | Good return for TCK and nearby signals | Tie solidly into the reference plane |
| 72 | TCK | JTAG | Low | Immediate adjacent ground on pin 73 | Good as assigned; series damping optional |
| 71 | TDO | JTAG | Medium | Adjacent to TDI; no same-row ground | Keep JTAG edge rates modest |
| 70 | TDI | JTAG | Medium | Adjacent to TDO; no same-row ground | Keep routing short and away from clocks |
| 69 | GND | Return | Low | Local return for upper power area | Stitch well to plane near connector |
| 68 | 3V3 | Power | Low | Adjacent ground helps local return | Decouple near connector entry |
| 67 | SYSRST | Control | Medium | Isolated control net with no immediate same-row return | Filter or debounce if needed; avoid fast edges |
| 58 | 3V3 | Power | Low | Part of distributed 3.3 V feed | Decouple close to the connector |
| 57 | GND | Return | Low | Return for nearby power | Stitch to plane with multiple vias |
| 56 | 3V3 | Power | Low | Good power distribution point | Decouple and share current evenly |
| 55 | GND | Return | Low | Return next to SYSCLK region | Excellent place for stitching |
| 54 | SYSCLK | Clock | Low | Immediate adjacent ground on 53; short return path | Keep as assigned; add source series resistor if edges are sharp |
| 53 | GND | Return | Low | Return for SYSCLK and upper address area | Keep solidly referenced |
| 52 | A19 | Address | Low | High-order address bit; adjacent ground on 51 helps | Good candidate for a sensitive control net if reassigned |
| 51 | GND | Return | Low | Return boundary for top of address field | Very useful anchor point |
| 50 | A17 | Address | Medium | Adjacent to A18; limited local shielding | Fine at 16 MHz but route over solid plane |
| 49 | A18 | Address | Medium | Adjacent to A17 | Same as above |
| 48 | A15 | Address | Medium | In a signal-dense part of the address bus | Keep trace lengths consistent |
| 47 | A16 | Address | Medium | Adjacent to A15 | Same as above |
| 46 | A13 | Address | Medium | Surrounded by address activity, no immediate ground | Moderate crosstalk risk if edges are fast |
| 45 | A14 | Address | Medium | Surrounded by address activity | Same as above |
| 44 | A11 | Address | Medium | Mid-bus location, no same-row ground | Moderate simultaneous-switching sensitivity |
| 43 | A12 | Address | Medium | Mid-bus location, adjacent active address line | Same as above |
| 42 | GND | Return | Low | Important return point inside address field | Keep well stitched to plane |
| 41 | A10 | Address | Low | Adjacent ground on 42 reduces coupling | Good location for a timing-sensitive address-side control if needed |
| 40 | A9 | Address | Medium | Neighbors are active address lines | Acceptable with good plane reference |
| 39 | A8 | Address | Medium | Same as A9 | Same as above |
| 38 | A7 | Address | Medium | Same bus-density issue | Same as above |
| 37 | A6 | Address | Medium | Same bus-density issue | Same as above |
| 36 | A5 | Address | Medium | Same bus-density issue | Same as above |
| 35 | A4 | Address | Medium | Same bus-density issue | Same as above |
| 34 | A3 | Address | Low | Close to ground boundary at 33 | Good location for a lower-order address bit |
| 33 | GND | Return | Low | Useful return boundary between address and lower field | Stitch aggressively |
| 32 | A1 | Address | Medium | Next to address activity, no same-row ground | Fine at 16 MHz with solid plane |
| 31 | A2 | Address | Medium | Same as A1 | Same as above |
| 30 | ADRSTB | Address control | High | Timing-sensitive control with no immediate same-row ground | Best candidate to move to a ground-adjacent pin |
| 29 | A0 | Address | Medium | Lower-order bit may toggle often; no same-row ground | Keep short and matched with nearby address lines |
| 28 | DATCK | Data clock | Low | Immediate adjacent ground on 27 | Good as assigned; series damping optional |
| 27 | GND | Return | Low | Return for DATCK and lower data group | Keep solid to plane |
| 26 | DATSTB | Data strobe | Medium | Near DATCK and data cluster, but still coupled to adjacent signal | Acceptable as-is; keep route matched to data |
| 25 | D7 | Data | Medium | Adjacent to DATSTB and D6 | Moderate coupling risk |
| 24 | D6 | Data | Medium | In a dense data cluster | Match routing and keep over a solid plane |
| 23 | D5 | Data | Medium | In a dense data cluster | Same as above |
| 22 | D4 | Data | Medium | Center of data field; no same-row ground | Moderate simultaneous-switching risk |
| 21 | D3 | Data | Medium | Center of data field | Same as above |
| 20 | D2 | Data | Medium | Dense switching neighborhood | Same as above |
| 19 | D1 | Data | Medium | Dense switching neighborhood | Same as above |
| 18 | D0 | Data | Low | Close to ground boundary at 17 | Good location for a frequently used data bit |
| 17 | GND | Return | Low | Return boundary for data/control transition | Stitch to plane close to breakout |
| 16 | ATNRQ6 | Control | Medium | Control cluster with no interleaved grounds | Fine if edge rates are slow |
| 15 | ATNRQ7 | Control | Medium | Same as above | Same as above |
| 14 | ATNRQ4 | Control | Medium | Same as above | Same as above |
| 13 | ATNRQ5 | Control | Medium | Same as above | Same as above |
| 12 | ATNRQ2 | Control | Medium | Same as above | Same as above |
| 11 | ATNRQ3 | Control | Medium | Same as above | Same as above |
| 10 | ATNRQ0 | Control | Medium | Same as above | Same as above |
| 9 | ATNRQ1 | Control | Medium | Same as above | Same as above |
| 8 | BUSAK0 | Control | Medium | Low-rate control but no local return segregation | Keep routing short |
| 7 | BUSAK1 | Control | Medium | Same as above | Same as above |
| 6 | BUSRQ0 | Control | Medium | Same control-cluster issue | Same as above |
| 5 | BUSRQ1 | Control | Medium | Same as above | Same as above |
| 4 | CM2 | Control | Medium | Low-speed but in a dense low-end cluster | No special action if timing is relaxed |
| 3 | TRFERR | Control | Medium | Asynchronous/error line in dense control cluster | Consider filtering at receiver if needed |
| 2 | CM0 | Control | Medium | Low-speed clustered control line | Fine at 16 MHz context |
| 1 | CM1 | Control | Medium | Low-speed clustered control line | Fine at 16 MHz context |

## Recommended revised assignment

### Design goals for the revision

The revision below tries to improve SI without adding pins or changing connector type:

1. Keep **SYSCLK** and **DATCK** on their current ground-adjacent pins.
2. Move the **address-side timing/control net** onto a ground-adjacent location.
3. Put the **highest-order, lowest-toggle address bit** onto the isolated pin.
4. Keep the **data bus compact** so board-level length matching remains straightforward.
5. Avoid large functional reshuffles in the low-speed control cluster.

### Recommended revised pin map

```text
Socket 3    Key M
74  TRST            TMS      75
72  TCK             GND      73
70  TDI             TDO      71
68  3V3             GND      69
    A19             67

58  3V3             GND      57
56  3V3             GND      55
54  SYSCLK          GND      53
52  SYSRST          GND      51
50  A18             A17      49
48  A16             A15      47
46  A14             A13      45
44  A12             A11      43
42  GND             ADRSTB   41
40  A10             A9       39
38  A8              A7       37
36  A6              A5       35
34  A4              GND      33
32  A3              A2       31
30  A1              A0       29
28  DATCK           GND      27
26  DATSTB          D7       25
24  D6              D5       23
22  D4              D3       21
20  D2              D1       19
18  D0              GND      17
16  ATNRQ6          ATNRQ7   15
14  ATNRQ4          ATNRQ5   13
12  ATNRQ2          ATNRQ3   11
10  ATNRQ0          ATNRQ1   9
8   BUSAK0          BUSAK1   7
6   BUSRQ0          BUSRQ1   5
4   CM2             TRFERR   3
2   CM0             CM1      1
```

## What changed and why

| Change | Reason | Expected effect |
|---|---|---|
| **A19 moved from pin 52 to pin 67** | A19 is the lowest-toggle address bit and tolerates the isolated position best | Reduces pressure on the better SI locations inside the address field |
| **SYSRST moved from pin 67 to pin 52** | Reset is important but low toggle; pin 52 has adjacent ground on 51 and nearby ground on 53 | Cleaner reset reference and less sensitivity to noise pickup |
| **ADRSTB moved from pin 30 to pin 41** | Pin 41 sits next to **GND 42**, making it a much better location for a timing-sensitive address-side control | Lower crosstalk and better return path for the address-side strobe/reset |
| **Address lines re-packed so A0-A18 occupy the main address field cleanly** | Keeps the bus visually and electrically grouped while reserving a better SI location for ADRSTB | Easier PCB routing and more consistent address-bus timing |

## Why I did not move DATSTB

Although **DATSTB** is a timing-sensitive net, it is already relatively well placed because:

- it remains inside the **data cluster**
- it is close to **DATCK**
- it is near the **GND boundary at pin 27**

Moving it farther up the connector would improve local shielding only slightly, but would usually make **board-level matching to D[7:0] harder**.

## Practical routing guidance for either pinout

1. Route all connector breakouts over a **continuous reference plane**.
2. Add **source series resistors** first on:
   - SYSCLK
   - DATCK
   - ADRSTB
   - DATSTB
   - TCK
3. Use the **lowest practical drive strength / slowest acceptable slew rate**.
4. Keep the **data group and its strobe/clock tightly length-controlled** on the PCB, even though the connector itself is short.
5. Put **several stitching vias** near the connector ground pins, especially at 17, 27, 33, 42, 51, 53, 55, 57, 69, and 73.
6. Place **local decoupling** near the connector entry for the 3.3 V pins.

## Priority list if you only make two changes

1. **Move ADRSTB to pin 41 and use GND 42 as its local return reference.**
2. **Move A19 to pin 67 and free pin 52 for SYSRST.**

That gives the biggest SI improvement with the least disruption to the rest of the bus grouping.

Discussions