# 4B5B

In telecommunications, 4B5B is a form of data communications line code. 4B5B maps groups of 4 bits of data onto groups of 5 bits for transmission. These 5-bit words are predetermined in a dictionary and they are chosen to ensure that there will be sufficient transitions in the line state to produce a self-clocking signal. A collateral effect of the code is that 25% more bits are needed to send the same information.
An alternative to using 4B5B coding is to use a scrambler. Some systems use scramblers in conjunction with 4B5B coding to assure DC balance and improve electromagnetic compatibility.
Depending on the standard or specification of interest, there may be several 5-bit output codes left unused. The presence of any of the unused codes in the data stream can be used as an indication that there is a fault somewhere in the link. Therefore, the unused codes can be used to detect errors in the data stream.

## Applications

4B5B was popularized by Fiber Distributed Data Interface (FDDI) in the mid-1980s. It was adopted for digital audio transmission by MADI in 1989. and by Fast Ethernet in 1995.
The name 4B5B is generally taken to mean the FDDI version. Other 4-to-5-bit codes have been used for magnetic recording and are known as group coded recording (GCR), but those are (0,2) run-length limited codes, with at most two consecutive zeros. 4B5B allows up to three consecutive zeros (a (0,3) RLL code), providing a greater variety of control codes.
On optical fiber, the 4B5B output is NRZI-encoded. FDDI over copper (CDDI) uses MLT-3 encoding instead, as does 100BASE-TX Fast Ethernet.
The 4B5B encoding is also used for USB Power Delivery (USB-PD) communication, where it is sent over the USB-C CC pin (further encoded using biphase mark code) or the USB-A/B power lines (further encoded using frequency-shift keying).

## Clocking

4B5B codes are designed to produce at least two transitions per 5 bits of output code regardless of input data. The transitions provide necessary transitions for the receiver to perform clock recovery. For example, a run of 4 bits such as 0000$_2$ using NRZI encoding contains no transitions and that may cause clocking problems for the receiver. 4B5B solves this problem by assigning the 4-bit block a 5-bit code, in this case, 11110$_2$.
There are eight 5-bit codes that have 3 consecutive 0s: 00000, 00001, 00010, 01000, 10000, 00011, 10001, 11000. This leaves 24 codes available.

## Encoding table

| Data | Data | 4B5B code |
| (Hex) | (Binary) | 4B5B code |
| 0 | 0000 | 11110 |
| 1 | 0001 | 01001 |
| 2 | 0010 | 10100 |
| 3 | 0011 | 10101 |
| 4 | 0100 | 01010 |
| 5 | 0101 | 01011 |
| 6 | 0110 | 01110 |
| 7 | 0111 | 01111 |
| Data | Data | 4B5B code |
| (Hex) | (Binary) | 4B5B code |
| 8 | 1000 | 10010 |
| 9 | 1001 | 10011 |
| A | 1010 | 10110 |
| B | 1011 | 10111 |
| C | 1100 | 11010 |
| D | 1101 | 11011 |
| E | 1110 | 11100 |
| F | 1111 | 11101 |
| Symbol | 4B5B code | Description | FDDI | Fast Ethernet | USB-PD |
| H | 00100 | Halt | Yes | Yes | No |
| I | 11111 | Idle | Yes | Yes | No |
| J | 11000 | Start #1 | Yes | Yes | Yes |
| K | 10001 | Start #2 | Yes | Yes | Yes |
| L | 00110 | Start #3 | No | No | Yes |
| Q | 00000 | Quiet (loss of signal) | Yes | Yes | No |
| R | 00111 | Reset | Yes | Yes | Yes |
| S | 11001 | Set | Yes | No | Yes |
| T | 01101 | End (terminate) | Yes | Yes | Yes |
Three consecutive zero bits only appear in normal data when a code ending with two 0 bits (2, E) is followed by a code beginning with a 0 bit (1, 4, 5, 6, 7), so will always appear separated by multiples of the 5-bit encoded symbol length (and never separated by a single symbol). Violations of this property are used for special synchronization codes.

## Command characters

The following codes are sometimes referred to as command characters. They are commonly used in pairs, although USB-PD uses 4-symbol sequences to begin its packets.
| Control character | 5b symbols | Purpose |
| JK | 11000 10001 | Sync, Start delimiter |
| I | 11111 | 100BASE-X idle marker |
| T | 01101 | USB-PD end delimiter |
| TT | 01101 01101 | FDDI end delimiter |
| TS | 01101 11001 | Not used |
| IH | 11111 00100 | SAL |
| TR | 01101 00111 | 100BASE-X end delimiter |
| SR | 11001 00111 | Not used |
| SS | 11001 11001 | Not used |
| H | 00100 | 100BASE-X transmit error |
| JJJK | 11000 11000 11000 10001 | USB-PD Start Of Packet (SOP) |
| JJLL | 11000 11000 00110 00110 | USB-PD SOP′ |
| JLJL | 11000 00110 11000 00110 | USB-PD SOP″ |
| JSSL | 11000 11001 11001 00110 | USB-PD SOP′_Debug |
| JSLK | 11000 11001 00110 10001 | USB-PD SOP″_Debug |
| RRRS | 00111 00111 00111 11001 | USB-PD Hard Reset |
| RJRL | 00111 11000 00111 00110 | USB-PD Cable Reset |