8b/10b encoding
From Wikipedia, the free encyclopedia
It has been suggested that Fibre Channel 8B/10B encoding be merged into this article or section. (Discuss) |
In telecommunications, 8b/10b is a line code that maps 8-bit symbols to 10-bit symbols to achieve DC-balance (see DC coefficient) and bounded disparity, and yet provide enough state changes to allow reasonable clock recovery. This means that the difference between the count of 1s and 0s in a string of at least 20 bits is no more than 2, and that there are not more than five 1s or 0s in a row. This helps to reduce the demand for the lower bandwidth limit of the channel necessary to transfer the signal.
Contents |
[edit] History
The code was described in 1983 by Al Widmer and Peter Franaszek in the IBM Journal of Research and Development. IBM was issued a patent for the scheme the following year. IBM's patent notwithstanding, the method, implementation and goals are very similar to Group Code Recording (GCR), used by IBM in its 3400 Series 6250 cpi 9-track tape drives introduced with its System/370 in 1970, by Apple in the floppy disk controller of its Apple II series introduced in 1978, and by Commodore in the floppy disk controller of the Commodore 2040 introduced in 1979.
[edit] Technologies that use 8b/10b
Now that the IBM patent has expired, the scheme has become even more popular and is the default DC-free line code for new standards.
Among the areas in which 8B/10B encoding finds application are
- PCI Express
- IEEE 1394b
- Serial ATA
- SAS
- Fibre Channel
- SSA
- Gigabit Ethernet (except for the twisted pair based 1000Base-T)
- InfiniBand
- XAUI
- Serial RapidIO
- DVI and HDMI (Transition Minimized Differential Signaling)
- DVB Asynchronous Serial Interface (ASI)
- HyperTransport
[edit] Digital audio
The encoding has found a heavy use in digital audio applications which use this modulation scheme:
A differing but related scheme is used for audio and data CDs:
[edit] Exceptions
For 10 Gigabit Ethernet's 10GBASE-R Physical Medium Dependent (PMD) interfaces, 64b/66b encoding is used. This scheme is considerably different in design to 8b/10b encoding, but was created with similar considerations of DC balance, maximum run length, transition density and electromagnetic emission minimisation.
Note that 8b/10b is the encoding scheme, not a specific code. While many applications do use the same code, there exist some incompatible implementations; for example, Transition Minimized Differential Signaling, which also expands 8 bits to 10 bits, has some subtle differences.
[edit] How it works
As the scheme name suggests, 8 bits of data are transmitted as a 10-bit entity called a symbol, or character. The low 5 bits of data are encoded into a 6-bit group and the top 3 bits are encoded into a 4-bit group. These code groups are concatenated together to form the 10-bit symbol that is transmitted on the wire. The data symbols are often referred to as D.x.y where x ranges from 0-31 and y from 0-7. Standards using the 8b/10b encoding also define up to 12 special symbols (or control characters) that can be sent in place of a data symbol. They are often used to indicate start-of-frame, end-of-frame, link idle, skip and similar link-level conditions. At least one of them (i.e. a "comma" symbol) needs to be used to define the alignment of the 10 bit symbols. They are referred to as K.x.y and have different encodings from any of the D.x.y symbols.
Because 8b/10b encoding uses 10-bit symbols to encode 8-bit words, some of the possible 1024 codes can be excluded to grant a run-length limit of 5 consecutive equal bits and grant that the difference of the count of 0s and 1s is no more than 2. Some of the 256 possible 8-bit words can be encoded in two different ways. Using these alternative encodings, the scheme is able to effect long-term DC-balance in the serial data stream. This permits the data stream to be transmitted through a channel with a high-pass characteristic, for example Ethernet's transformer-coupled unshielded twisted pair or optical receivers using automatic gain control.
The encoding is normally done entirely in hardware. Upper layers of the software stack should be "unaware" that this encoding is being used.
[edit] Encoding tables
Note that in the following tables, "A" and "a" are the least significant bit. The bits are sent low to high: a → b → c → d → e → i → f → g → h → j (i.e. the 5b/6b code followed by the 3b/4b code). With that the uniqueness of the special bit sequence in the comma codes is granted.
The residual effect on the stream to the number of zero and one bits transmitted is maintained as the Running Disparity (RD) and the effect of slew is balanced by the choice of encoding for following symbols.
When a 6 or 4 bit code is used that has a non-zero disparity (count of 1-bits minus count of 0-bits, i.e. -2 or +2), the choice of positive or negative disparity encodings must be the one that toggles the running disparity. I.e. the non zero disparity codes alternate (disregarding if 5b/6b or 3b/4b codes).
[edit] Running Disparity
Running Disparity is a concept used in the 8b/10b encoding to keep the number of 1s and 0s that are transmitted "down the wire" roughly equal.
For each 5b/6b and 3b/4b code with an unequal number of 1s and 0s, there are two bit patterns that can be used to transmit it: One with one more 1 bit and one with all bits inverted and thus one more 0. Depending on the current running disparity of the signal, the encoding engine selects which of the two possible 6 or 4 bit sequences to send for the given data. (Obviously, if the 6 or 4 bit code has equal numbers of 1s and 0s, there is no choice to make, as the disparity would be unchanged.)
Previous RD | Disparity of 6 or 4 Bit Code | Next RD |
---|---|---|
-1 | -2 | not used |
-1 | 0 | -1 |
-1 | +2 | +1 |
+1 | -2 | -1 |
+1 | 0 | +1 |
+1 | +2 | not used |
[edit] 5b/6b
input | RD = −1 | RD = +1 | input | RD = −1 | RD = +1 | ||
---|---|---|---|---|---|---|---|
EDCBA | abcdei | EDCBA | abcdei | ||||
D.00 | 00000 | 100111 | 011000 | D.16 | 10000 | 011011 | 100100 |
D.01 | 00001 | 011101 | 100010 | D.17 | 10001 | 100011 | |
D.02 | 00010 | 101101 | 010010 | D.18 | 10010 | 010011 | |
D.03 | 00011 | 110001 | D.19 | 10011 | 110010 | ||
D.04 | 00100 | 110101 | 001010 | D.20 | 10100 | 001011 | |
D.05 | 00101 | 101001 | D.21 | 10101 | 101010 | ||
D.06 | 00110 | 011001 | D.22 | 10110 | 011010 | ||
D.07 | 00111 | 111000 | 000111 | D.23 † | 10111 | 111010 | 000101 |
D.08 | 01000 | 111001 | 000110 | D.24 | 11000 | 110011 | 001100 |
D.09 | 01001 | 100101 | D.25 | 11001 | 100110 | ||
D.10 | 01010 | 010101 | D.26 | 11010 | 010110 | ||
D.11 | 01011 | 110100 | D.27 † | 11011 | 110110 | 001001 | |
D.12 | 01100 | 001101 | D.28 | 11100 | 001110 | ||
D.13 | 01101 | 101100 | D.29 † | 11101 | 101110 | 010001 | |
D.14 | 01110 | 011100 | D.30 † | 11110 | 011110 | 100001 | |
D.15 | 01111 | 010111 | 101000 | D.31 | 11111 | 101011 | 010100 |
K.28 | 11100 | 001111 | 110000 |
† Same code is used for K.x.7
[edit] 3b/4b
input | RD = −1 | RD = +1 | input | RD = −1 | RD = +1 | ||
---|---|---|---|---|---|---|---|
HGF | fghj | HGF | fghj | ||||
D.x.0 | 000 | 1011 | 0100 | K.x.0 | 000 | 1011 | 0100 |
D.x.1 | 001 | 1001 | K.x.1 ‡ | 001 | 0110 | 1001 | |
D.x.2 | 010 | 0101 | K.x.2 ‡ | 001 | 1010 | 0101 | |
D.x.3 | 011 | 1100 | 0011 | K.x.3 | 011 | 1100 | 0011 |
D.x.4 | 100 | 1101 | 0010 | K.x.4 | 100 | 1101 | 0010 |
D.x.5 | 101 | 1010 | K.x.5 ‡ | 001 | 0101 | 1010 | |
D.x.6 | 110 | 0110 | K.x.6 ‡ | 001 | 1001 | 0110 | |
D.x.P7 † | 111 | 1110 | 0001 | ||||
D.x.A7 † | 111 | 0111 | 1000 | K.x.7 † ‡ | 111 | 0111 | 1000 |
† For D.x.7, the Primary (D.x.P7) or Alternate (D.x.A7) encoding must be selected in order to avoid a run of five consecutive 0s or 1s when combined with the preceding 5b/6b code. Sequences of five identical bits are used in comma codes for synchronization issues. D.x.A7 is only used for x=17, x=18, and x=20 when RD=-1 and for x=11, x=13, and x=14 when RD=+1. With x=23, x=27, x=29, and x=30, the same code forms the control codes K.x.7. Any other x.A7 code can't be used as it would result in chances for misaligned comma sequences.
‡ The alternate encoding for the K.x.y codes with disparity 0 allow for K.28.1, K.28.5, and K.28.7 to be "comma" codes that contain a bit sequence that can't be found elsewhere in the data stream.
[edit] Control symbols
The control symbols within 8b/10b are 10b bytes that are valid sequences of bits (no more than six 1s or 0s) but do not have a corresponding 8b data byte. They are used for low-level control functions. For instance, in Fibre Channel, K28.5 is used at the beginning of four-byte sequences (called "Ordered Sets") that perform functions such as Loop Arbitration, Fill Words, Link Resets, etc.
Resulting from the 5b/6b and 3b/4b tables the following 12 control symbols are allowed to be sent:
input | RD = −1 | RD = +1 | |
---|---|---|---|
HGF EDCBA | abcdei fghj | abcdei fghj | |
K.28.0 | 000 11100 | 001111 0100 | 110000 1011 |
K.28.1 † | 001 11100 | 001111 1001 | 110000 0110 |
K.28.2 | 010 11100 | 001111 0101 | 110000 1010 |
K.28.3 | 011 11100 | 001111 0011 | 110000 1100 |
K.28.4 | 100 11100 | 001111 0010 | 110000 1101 |
K.28.5 † | 101 11100 | 001111 1010 | 110000 0101 |
K.28.6 | 110 11100 | 001111 0110 | 110000 1001 |
K.28.7 ‡ | 111 11100 | 001111 1000 | 110000 0111 |
K.23.7 | 111 10111 | 111010 1000 | 000101 0111 |
K.27.7 | 111 11011 | 110110 1000 | 001001 0111 |
K.29.7 | 111 11101 | 101110 1000 | 010001 0111 |
K.30.7 | 111 11110 | 011110 1000 | 100001 0111 |
† Within the control symbols, K.28.1, K.28.5, and K.28.7 are "comma symbols". Comma symbols are used for synchronization (finding the alignment of the 8b/10b codes within a bit-stream). If K.28.7 is not used, the unique comma sequences 0011111 or 1100000 cannot be found at any bit position within any combination of normal codes.
‡ If K.28.7 is allowed in the actual coding, a more complex definition of the synchronization pattern than suggested by † needs to be used, as a combination of K.28.7 with several other codes forms a false misaligned comma symbol overlapping the two codes. A sequence of multiple K.28.7 codes is not allowable in any case, as this would result in undetectable misaligned comma symbols.
K.28.7 is the only comma symbol that cannot be the result of a single bit error in the data stream.