Summary: How to design with differential traces in Altium Designer
Recently, the Raspberry Pi Pico was released by the Raspberry Pi Foundation. Notably, it features two Programmable I/O (PIO) blocks that comprise several state machines for simple, high speed I/O control. This means that these peripherals can be used to bit-bang more complicated interfaces not normally available to the Pico. I came across this article by Luke Wren, where he demonstrates how to bit-bang DVI on the Pico. I wanted to make my own PCB for it, so why not walk you through the process of differential pair routing?
Following Luke's lead, we make our schematic in Altium Designer by creating the necessary footprints for the Pico and other components. This tutorial is widely available elsewhere so I'll just gloss over it here. We add in the pins for the Pico board, and create the footprint using castellated pads.
Next, we add the appropriate connections for the DVI signals, which are the 3 data signals and the clock signal. All of these are differential signals, which we have to name with the suffixes "_N" and "_P", and label with the differential pair symbol.
To add the differential symbol, find it in the top of the toolbox add it to the signal line in the schematic.
Next, we add the HDMI connector and connect the signals with the appropriate coupling resistors. This should allow for a clean differential signal when we drive it with the Pico's PIOs. We also add a pin header for easy access to some pins of the Pico UART, for debugging purposes.
Now, let's transfer these components to the PCB in Altium!
Next, we arrange the components in a logical manner to facilitate routing. This allows us to minimise track lengths and cross-overs, simplifying routing on the PCB.
Next, to minimise the space of the PCB to save on cost and size, we only want to PCB to take up the area with routed signals, not the whole length of the Raspberry Pi Pico board.
Before we can start routing the PCB, we need to define Design Rules for our differential traces. To get the correct parameters, we have to use the specifications from our PCB house and the provided calculator. This will give us the appropriate trace width and trace separation for the desired differential impedance. In this case, we want a single ended impedance of 50 Ohms and a differential line impedance of 100 Ohms. This is given in the HDMI specification for TMDS signals. Playing around with the calculator, we find a suitable combination that minimises cost (6mm trace separation) for our given stackup. This would be a edge-coupled surface microstrip, as we are running the differential signals on the top layer with a ground plane on the bottom layer of the 2-layer PCB.
Next, we transfer these values of track space and track width to our Design Rules in Altium.
Finally! We can get to actual routing on the PCB. Under Routing > Interactive Differential Routing, we can use this tool to route differential signals while adhering to our defined design rules. As long as we've set up the schematic correctly, Altium will automatically recognise the differential pairs as long as we click on one of them. This will keep the traces coupled for as long as possible, while respecting the other Design Rules you've set (such as the minimum track-track spacing).
Repeating the same process on the rest of the signals, we can obtain a routed board.
The board is fairly clean with almost all signals routed on the Top Side. The only major signal left to connect is GND, which we'll do so with a ground plane on the bottom layer of the board. This style of routing: keeping signals on the Top Side, GND/PWR plane on the bottom side, simplifies design and generally keeps maintaining signal integrity easier. We can add the GND plane using a polygon pour mapped to the outline of the board.
Just like that, we've finally routed our first board with differential traces in HDMI! Using the 3D View in Altium, we can obtain the final product in its beautiful CAD form (minus the Pico, since we didn't design that in).