1)FEC
https://www.zybuluo.com/zhongdao/note/1287095
2)IEEE 汉化
https://blog.csdn.net/Apollon_krj/article/details/88903648
1)fec
FEC & LDPC
未分类
Error detection and correction
https://en.wikipedia.org/wiki/Error_detection_and_correction
Redundant data, sent by transmitter is also called error correction code
Forward Error Correction Codes
前向纠错(FEC)是一种用于增强数据可靠性的数字信号处理技术。它通过在数据传输或存储之前引入称为纠错码的冗余数据来实现这一点。FEC为接收器提供纠正错误的能力,而无需反向信道来请求重传数据。
第一个FEC代码,称为汉明码,是在20世纪50年代初引入的。这是一种在数据传输中获得差错控制的方法,其中发送器发送冗余数据。接收器仅识别没有明显错误的一部分数据。这允许广播数据从单个源发送到多个目的地。
前向错误编码也称为信道编码。
In telecommunication, information theory, and coding theory, forward error correction (FEC) or channel coding1 is a technique used for controlling errors in data transmission over unreliable or noisy communication channels. The central idea is the sender encodes the message in a redundant way by using an error-correcting code (ECC).
在电信,信息理论和编码理论,前向纠错 (FEC)或信道编码1是一种用于技术控制误差在数据传输在不可靠的或有噪声的通信信道。中心思想是发送者通过使用纠错码(ECC)以冗余方式对消息进行编码。
https://en.wikipedia.org/wiki/Forward_error_correction
https://en.wikipedia.org/wiki/Error_correction_code
Common Forward Error Correction Codes:
* Convolutional Codes
* Block Codes (e.g. Reed-Solomon Code)
* Trellis-Coded-Modulation (TCM)
* Concatenated Codes
纠错码
纠错码
一个纠错码(ECC)或前向纠错(FEC)码是添加的方法的冗余数据,或奇偶校验数据,对一个消息,例如,它可以由接收器中回收甚至当错误的数目(最多在传输过程中或在存储过程中引入了所使用代码的能力。由于接收器不必要求发送器重传数据,因此在前向纠错中不需要反向信道,因此它适用于诸如广播的单工通信。纠错码经常用于较低层通信,以及CD,DVD,硬盘和RAM等媒体中的可靠存储。
通常在卷积码和块码之间区分纠错码:
- 卷积码是逐位处理的。它们特别适合在硬件中实现,维特比解码器允许最佳解码。
- 块代码在逐块的基础上处理。块代码的早期示例是重复代码,汉明码和多维奇偶校验码。它们之后是许多有效的代码,由于目前广泛使用,Reed-Solomon代码是最值得注意的。Turbo码和低密度奇偶校验码(LDPC)是相对较新的结构,可以提供几乎最佳的效率。
Shannon定理是前向纠错中的一个重要定理,描述了在具有一定误差概率或信噪比(SNR)的信道上可能进行可靠通信的最大信息速率。该严格的上限以信道容量表示。更具体地说,该定理说存在这样的代码,使得随着编码长度的增加,只要码率小于信道容量,就可以使离散无记忆信道上的误差概率任意小。码率定义为分数K / N的ķ源符号和Ñ 编码符号。
允许的实际最大码率取决于所使用的纠错码,并且可能更低。这是因为Shannon的证明只是存在性的,并没有说明如何构造既优化又具有有效编码和解码算法的代码。
Example
Transmission without interleaving:
Error-free message: aaaabbbbccccddddeeeeffffgggg
Transmission with a burst error: aaaabbbbccc____deeeeffffgggg
Here, each group of the same letter represents a 4-bit one-bit error-correcting codeword. The codeword cccc is altered in one bit and can be corrected, but the codeword dddd is altered in three bits, so either it cannot be decoded at all or it might be decoded incorrectly.
With interleaving:
Error-free code words: aaaabbbbccccddddeeeeffffgggg
Interleaved: abcdefgabcdefgabcdefgabcdefg
Transmission with a burst error: abcdefgabcd____bcdefgabcdefg
Received code words after deinterleaving: aa_abbbbccccdddde_eef_ffg_gg
In each of the codewords aaaa, eeee, ffff, gggg, only one bit is altered, so one-bit error-correcting code will decode everything correctly.
Transmission without interleaving:
Original transmitted sentence: ThisIsAnExampleOfInterleaving
Received sentence with a burst error: ThisIs______pleOfInterleaving
The term "AnExample" ends up mostly unintelligible and difficult to correct.
With interleaving:
Transmitted sentence: ThisIsAnExampleOfInterleaving...
Error-free transmission: TIEpfeaghsxlIrv.iAaenli.snmOten.
Received sentence with a burst error: TIEpfe______Irv.iAaenli.snmOten.
Received sentence after deinterleaving: T_isI_AnE_amp_eOfInterle_vin_...
No word is completely lost and the missing letters can be recovered with minimal guesswork.
教程:前向纠错
前向纠错(FEC)编码模块来演示字节级计算
http://liquidsdr.org/doc/tutorial-fec/
Error Detection and Correction
https://www.slideshare.net/TechiNerd/error-detection-and-correction-36618963
A Tutorial on Reed-Solomon Coding for Fault-Tolerance in RAID-like Systems''
http://web.eecs.utk.edu/~plank/plank/papers/CS-96-332.html
Reed–Solomon_error_correction
https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction
Reed-Solomon Codes
An introduction to Reed-Solomon codes: principles, architecture and implementation
http://www.cs.cmu.edu/~guyb/realworld/reedsolomon/reed_solomon_codes.html
介绍fec的不错文章
使用前向纠错来改善数据通信
https://www.electronicdesign.com/communications/use-forward-error-correction-improve-data-communications
介绍视频:
https://www.youtube.com/watch?v=CtrlGsD9Xow
开源 前向纠错
ldpc
http://radfordneal.github.io/LDPC-codes/
turbo, reed-solomon,
http://itpp.sourceforge.net/4.3.1/tutorial.html
文件级
https://en.wikipedia.org/wiki/Parchive
par2cmdline 0.4 with Intel Threading Building Blocks 2.2
https://web.archive.org/web/20110309072849/http://www.chuchusoft.com:80/par2_tbb/download.html
par2cmdline
https://github.com/Parchive/par2cmdline
code级别
fcast / flute
http://planete-bcast.inrialpes.fr/articled77b.html?id_article=1#flute_tool_anchor
Software for error-correcting codes
AFF3CT(A Fast Forward Error Correction Toolbox): a full communication chain in C++ (many supported codes like Turbo, LDPC, Polar codes, etc.), very fast and specialized on channel coding (can be used as a program for simulations or as a library for the SDR).
IT++: a C++ library of classes and functions for linear algebra, numerical optimization, signal processing, communications, and statistics.
OpenAir: implementation (in C) of the 3GPP specifications concerning the Evolved Packet Core Networks.
openfec
http://openfec.org/
http://openfec.org: because open, free AL-FEC codes and codecs matter
You'll find there codecs for Application-Level Forward Erasure (AL-FEC) Codes.
ldpc
https://en.wikipedia.org/wiki/Low-density_parity-check_code
https://www.slideshare.net/s4h4rr/ldpc-codes-34889266
new article outlines
错误检测与纠正
https://zh.wikipedia.org/wiki/%E9%94%99%E8%AF%AF%E6%A3%80%E6%B5%8B%E4%B8%8E%E7%BA%A0%E6%AD%A3
https://en.wikipedia.org/wiki/Error_detection_and_correction
定义:
https://www.techopedia.com/definition/821/error-correction
采用什么code的确认。
基本原理,示意
https://www.jianshu.com/p/93d2935ab7ed
摘录,然后重点实现验证一个代码示例。
翻译,运行:
前向纠错(FEC)编码模块来演示字节级计算
http://liquidsdr.org/doc/tutorial-fec/
文件级, 写信问作者:
https://en.wikipedia.org/wiki/Parchive
传输及文件级别 写信问作者,应用可行性, license.
http://planete-bcast.inrialpes.fr/articled77b.html?id_article=1#flute_tool_anchor
查看现有专利情况 google patents
查看自己原来写的卫星多播专利
FEC教程翻译(含程序示例)
Tutorial: Forward Error Correction
前言
This tutorial will demonstrate computation at the byte level (raw message data) by introducing the forward error-correction (FEC) coding module. Please note that liquid only provides some very basic FEC capabilities including some Hamming block codes and repeat codes. While these codes are very fast and enough to get started, they are not very efficient and add a lot of redundancy without providing a strong level of correcting capabilities. liquid will use the convolutional and Reed-Solomon codes described in libfec , if installed on your machine.
本教程将通过引入前向纠错(FEC)编码模块来演示字节级计算(原始消息数据)。请注意,液体liquid(一个开源的数字信号处理库,特别为基于嵌入式平台的软件无线电设计) 仅提供一些非常基本的FEC功能,包括一些汉明块码和重复码。虽然这些代码非常快且足以开始使用,但它们效率不高并且在不提供强大级别的校正功能的情况下增加了大量冗余。 如果安装在您的机器上,liquid 将使用libfec中描述的卷积和Reed-Solomon代码。
Problem Statement
Digital communications over a noisy channel can be unreliable, resulting in errors at the receiver. Forward error-correction (FEC) coding adds redundancy to the original data message that allows for some errors to be corrected at the receiver. The error-correction capability of the code is dependent upon many factors, but is usually improved by increasing the amount of redundancy added to the message. The drawback to adding a lot of redundancy is that the communications rate is decreased as the link must be shared among the important data information as well as the redundant bits. The benefit, however, is that the receiver has a better chance of correcting the errors without having to request a retransmission of the message. Volumes of research papers and books have been written about the error-correction capabilities of certain FEC encoder/decoder pairs (codecs) and their performance in a variety of environments. While there is far too much information on the subject to discuss here, it is important to note that liquid implements a very small subset of simple FEC codecs, including several Hamming and repeat codes. If the libfec library is installed when liquid is configured this list extends to convolutional and Reed-Solomon codes.
噪声信道上的数字通信可能不可靠,导致接收器出错。前向纠错(FEC)编码为原始数据消息增加了冗余,允许在接收器处纠正一些错误。代码的纠错能力取决于许多因素,但通常通过增加添加到消息的冗余量来改进。增加大量冗余的缺点是通信速率降低,因为必须在重要数据信息和冗余比特之间共享链路。然而,好处是接收器更有可能在不必请求重传消息的情况下纠正错误。已经编写了大量关于某些FEC编码器/解码器对(编解码器)的纠错能力及其在各种环境中的性能的研究论文和书籍。虽然这里要讨论的主题信息太多,但重要的是要注意这一点 liquid 实现了一小部分简单的FEC编解码器,包括几个汉明和重复码。如果在 配置 liquid 时安装了 libfec库,则 此列表将扩展为卷积和Reed-Solomon代码。
In this tutorial you will create a simple program that will generate a message, encode it using a simple Hamming(7,4) code, corrupt the encoded message by adding an error, and then try to correct the error with the decoder.
在本教程中,您将创建一个简单的程序,它将生成一条消息,使用简单的汉明(7,4)代码对其进行编码,通过添加错误来破坏编码消息,然后尝试使用解码器纠正错误。
搭建环境 Setting up the Environment
Create a new file fec.c and open it with your favorite editor. Include the headers stdio.h and liquid/liquid.h and add the int main() definition so that your program looks like this:
创建一个新文件 fec.c 并使用您喜欢的编辑器打开它。包括标题 stdio.h 和 liquid / liquid.h 并添加 int main() 定义,以便您的程序如下所示:
#include <stdio.h>
#include <liquid/liquid.h>
int main() {
printf("done.\n");
return 0;
}
Compile and link the program using gcc :
使用gcc编译和链接程序 :
$ gcc -Wall -o fec fec.c -lm -lc -lliquid
The flag " -Wall " tells the compiler to print all warnings (unused and uninitialized variables, etc.), " -o fec " specifies the name of the output program is " fec ", and " -lm -lc -lliquid " tells the linker to link the binary against the math, standard C, and liquid DSP libraries, respectively. Notice that the above command invokes both the compiler and the linker collectively. If the compiler did not give any errors, the output executable fec is created which can be run as
标志“ -Wall ”告诉编译器打印所有警告(未使用和未初始化的变量等),“ - o fec ”指定输出程序的名称为“ fec ”,“ - lm -lc -lliquid ”告诉链接器分别将二进制数据与数学,标准C和 liquid DSP库相链接。请注意,上面的命令共同调用编译器和链接器。如果编译器没有给出任何错误, 则创建可以作为运行 的输出可执行文件 fec
$ ./fec
and should simply print " done. " to the screen. You are now ready to add functionality to your program.
并应简单地将“ 完成 ” 打印 到屏幕上。您现在可以为程序添加功能了。
We will now edit the file to set up the basic simulation by generating a message signal and counting errors as a result of channel effects. The error-correction capabilities will be added in the next section.
我们现在将编辑文件以通过生成消息信号并通过通道效应计算错误来设置基本模拟。纠错功能将在下一节中添加。
First set up the simulation parameters: for now the only parameter will be the length of the input message, denoted by the variable n ( unsigned int ) representing the number of bytes. Initialize n to 8 to reflect an original message of 8 bytes. Create another unsigned int variable k which will represent the length of the encoded message. This length is equal to the original ( n ) with the additional redundancy. For now set k equal to n as we are not adding FEC coding until the next section. This implies that without any redundancy, the receiver cannot correct for any errors.
首先设置模拟参数:现在唯一的参数是输入消息的长度,由 表示字节数的变量 n ( unsigned int 类型)表示。将 n 初始化 为8,以表示8字节的原始消息。创建另一个unsiged int 类型变量 k ,它将表示编码后消息的长度。该长度等于原始的n加上附加冗余的长度 。现在,当我们没有加入FEC编码,设置 k 等于 n,这意味着没有任何冗余,接收器无法纠正任何错误, 下一节我们会调整k.
Message data in liquid are represented as arrays of type unsigned char . Allocate space for the original, encoded, and decoded messages as msg_org[n] , msg_enc[k] , and msg_dec[n] , respectively. Initialize the original data message as desired. For example, the elements in msg_org can contain 0,1,2,...,n-1 . Copy the contents of msg_org to msg_enc . This effectively is a placeholder for forward error-correction which will be discussed in the next section. Corrupt one of the bits in msg_en c (e.g. msg_enc[0] \verb|$|= 0x01; will flip the least-significant bit in the first byte of the msg_enc array), and copy the results to msg_dec . Print the encoded and decoded messages to the screen to verify that they are not equal. Without any error-correction capabilities, the receiver should see a message different than the original because of the corrupted bit. Count the number of bit differences between the original and decoded messages. liquid provides a convenient interface for doing this and can be invoked as
liquid 中的 消息数据 表示为unsigned char类型的数组。分配原始,编码和解码消息的空间,分别为msg_org [n] , msg_enc [k] 和 msg_dec [n]。根据需要初始化原始数据消息。例如,msg_org中的元素 可以包含 0,1,2,...,n-1 。将msg_org的内容复制 到 msg_enc 。这实际上是前向纠错的占位符,将在下一节中讨论。损坏msg_en c中的一个位 (例如 msg_enc [0] \ verb | $ | = 0x01; 将翻转msg_enc 数组的第一个字节中的最低有效位 ,并将结果复制到 msg_dec 。将编码和解码的消息打印到屏幕以验证它们不相等。如果没有任何纠错功能,因为损坏的位,接收器receiver应该会看到与原始消息不同的消息。计算原始消息和已解码消息之间的位差数。 liquid 为此提供了方便的界面,可以调用,如下:
unsigned int num_bit_errors = count_bit_errors_array(msg_org,
msg_dec,
n);
Print this number to the screen. Your program should look similar to this:
将此编号打印到屏幕上。您的程序看起来应该类似于:
#include <stdio.h>
#include <liquid/liquid.h>
int main() {
// simulation parameters
unsigned int n = 8; // original data length (bytes)
// compute size of encoded message
unsigned int k = n; // (no encoding yet)
// create arrays
unsigned char msg_org[n]; // original data message
unsigned char msg_enc[k]; // encoded/received data message
unsigned char msg_dec[n]; // decoded data message
unsigned int i;
// create message
for (i=0; i<n; i++) msg_org[i] = i & 0xff;
// "encode" message (copy to msg_enc)
for (i=0; i<n; i++) msg_enc[i] = msg_org[i];
// corrupt encoded message (flip bit)
msg_enc[0] ^= 0x01;
// "decode" message (copy to msg_dec)
for (i=0; i<n; i++) msg_dec[i] = msg_enc[i];
printf("original message: [%3u] ",n);
for (i=0; i<n; i++)
printf(" %.2X", msg_org[i]);
printf("\n");
printf("decoded message: [%3u] ",n);
for (i=0; i<n; i++)
printf(" %.2X", msg_dec[i]);
printf("\n");
// count bit errors
unsigned int num_bit_errors = count_bit_errors_array(msg_org, msg_dec, n);
printf("number of bit errors received: %3u / %3u\n", num_bit_errors, n*8);
return 0;
}
Compile the program as before, creating the executable " fec ." Running the program should produce an output similar to this:
像以前一样编译程序,创建可执行文件“ fec” 。运行程序应该产生类似于这样的输出:
original message: [ 8] 00 01 02 03 04 05 06 07
decoded message: [ 8] 01 01 02 03 04 05 06 07
number of bit errors received: 1 / 64
Notice that the decoded message differs from the original and that the number of received errors is nonzero.
请注意,已解码的消息与原始消息不同,并且接收的错误数量不为零。
创建编码器/解码器 Creating the Encoder/Decoder
So far our program doesn't use any liquid interfaces (except for the function used to count bit errors). The FEC module in liquid provides a simple interface for adding forward error-correction capabilities to your project. The fec object abstracts from the gritty details behind the bit manipulation (packing/unpacking of bytes, appending tail bits, etc.) of error-correction structures. As an example, convolutional codes observe bits one at a time while Reed-Solomon codes operate on entire blocks of bits. The fec object in liquid conveniently abstracts from the organization of the codec and takes care of this overhead internally. This allows seamless integration of different codecs with one simple interface. As with the iirfilt_rrrf object in the phase-locked loop tutorial ( [section-tutorial-pll] ) the fec object has methods create() , print() , and destroy() . Nearly every object in liquid has these methods; however the fec object replaces execute() with encode() and decode() as the same object instance can be used for both encoding and decoding. The fec_create() method accepts two arguments, although the second one is basically ignored. The first argument is an enumeration of the type of codec that you wish to use.
到目前为止,我们的程序不使用任何 液体 接口(用于计算位错误的函数除外)。液体中的FEC模块 提供了一个简单的界面,用于为项目添加前向纠错功能。所述 FEC 从位操作背后的粗砂细节对象摘要(包装/字节的拆包,附加尾部比特,等)纠错结构。例如,卷积码一次观察一个比特,而里德 - 所罗门码对整个比特块进行操作。液体中的 fec 对象 方便地从编解码器的组织中抽象出来并在内部处理这种开销。这允许通过一个简单的界面无缝集成不同的编解码器。如同 iirfilt_rrrf 在锁相环教程对象([ 段教程-PLL ])的 FEC 对象具有方法 创建() , 打印(), 和 破坏() 。几乎液体中的每一个物体 都有这些方法; 但是 fec 对象 用encode() 和 decode()替换 execute(), 因为相同的对象实例可以用于编码和解码。该 fec_create() 方法接受两个参数,尽管第二个参数基本上被忽略。第一个参数是您希望使用的编解码器类型的枚举。
To begin, create a new fec object of type LIQUID_FEC_HAMMING7 4 (the second argument can simply be NULL ) which creates a Hamming(7,4) code:
首先,创建一个LIQUID_FEC_HAMMING7 类型的新 fec对象 (第二个参数可以简单地为 NULL ),它创建一个汉明(7,4)代码
fec q = fec_create(LIQUID_FEC_HAMMING74, NULL);
Details of the available codes in liquid can be found in [section-fec] . This codec nominally accepts 4 bits, appends 3 parity bits, and can detect and correct up to one of these seven transmitted bits. The Hamming(7,4) code is not particularly strong for its rate; however it is computationally efficient and has been studied extensively in coding theory. The interface provided by liquid conveniently abstracts from the process of managing 8-bit data symbols (bytes), converting to 4-bit input symbols, encoding to 7-bit output symbols, and then re-packing into 8-bit output bytes. This is consistent with any forward error-correction code in liquid ; as the user, you simply see data bytes in and data bytes out. The length of the output sequence can be computed using the method
unsigned int k = fec_get_enc_msg_length(LIQUID_FEC_HAMMING74, n);
where n represents the number of uncoded input bytes and k represents the number of encoded output bytes. This value should be used to appropriately allocate enough memory for the encoded message. Encoding the data message is as simple as invoking
fec_encode(q, n, msg_org, msg_enc);
which uses our newly-created fec object q to encode n input bytes in the array msg_org and store the result in the output array msg_enc . The interface for decoding is nearly identical:
fec_decode(q, n, msg_enc, msg_dec);
Notice that the second argument again represents the number of uncoded data bytes ( n ). Don't forget to destroy the object once you are finished:
fec_destroy(q);
Final Program
The final program is listed below, and a copy of the source is located in the doc/tutorials/ subdirectory.
include
include
int main() {
// simulation parameters
unsigned int n = 8; // original data length (bytes)
fec_scheme fs = LIQUID_FEC_HAMMING74; // error-correcting scheme
// compute size of encoded message
unsigned int k = fec_get_enc_msg_length(fs,n);
// create arrays
unsigned char msg_org[n]; // original data message
unsigned char msg_enc[k]; // encoded/received data message
unsigned char msg_dec[n]; // decoded data message
// CREATE the fec object
fec q = fec_create(fs,NULL);
fec_print(q);
unsigned int i;
// generate message
for (i=0; i<n; i++)
msg_org[i] = i & 0xff;
// encode message
fec_encode(q, n, msg_org, msg_enc);
// corrupt encoded message (flip bit)
msg_enc[0] ^= 0x01;
// decode message
fec_decode(q, n, msg_enc, msg_dec);
// DESTROY the fec object
fec_destroy(q);
printf("original message: [%3u] ",n);
for (i=0; i<n; i++)
printf(" %.2X", msg_org[i]);
printf("\n");
printf("decoded message: [%3u] ",n);
for (i=0; i<n; i++)
printf(" %.2X", msg_dec[i]);
printf("\n");
// count bit errors
unsigned int num_bit_errors = count_bit_errors_array(msg_org, msg_dec, n);
printf("number of bit errors received: %3u / %3u\n", num_bit_errors, n*8);
printf("done.\n");
return 0;
}
The output should look like this:
fec: Hamming(7,4) [rate: 0.571]
original message: [ 8] 00 01 02 03 04 05 06 07
decoded message: [ 8] 00 01 02 03 04 05 06 07
number of bit errors received: 0 / 64
done.
Notice that the decoded message matches that of the original message, even though an error was introduced at the receiver. As discussed above, the Hamming(7,4) code is not particularly strong; if too many bits in the encoded message are corrupted then the decoder will be unable to correct them. Play around with changing the length of the original data message, the encoding scheme, and the number of errors introduced.
For a more detailed program, see examples/fec_example.c in the main liquid directory. [section-fec] describes liquid 's FEC module in detail. Additionally, the packetizer object extends the simplicity of the fec object by adding a cyclic redundancy check and two layers of forward error-correction and interleaving, all of which can be reconfigured as desired. See [section-framing-packetizer] and examples/packetizer_example.c for a detailed example program on how to use the packetizer object.
IEEE802.3-2015 Cl74 BASE-R PHY的前向纠错(FEC)子层 等部分相关点翻译
目录
74.5.2 40GBASE-R和100GBASE-R服务原语
72. PMD子层和10GBase-KR型基带介质
本条规定了10GBASE-KR PMD和基带介质。当形成一个完整的物理层时,PMD应连接到适当的子层(见表72-1),并具有可通过第45条中定义的管理接口或等效接口访问的管理功能。
72.6.11 PMD LPI功能
具有可选节能以太网(EEE)功能的10GBASE-KR PHY可选择进入低功耗空闲(Low power idle,LPI)模式,以在链路利用率较低时节省能源。PMD LPI功能通过PMD_TX_MODE和PMD_RX_MODE请求响应活动(Active),睡眠(Sleep),安静(Quiet),刷新(Refresh)和唤醒(Wake)状态之间的转换。 该功能的实现是可选的。 在背板自动协商期间将公布EEE功能和参数,如45.2.7.13中所述。标准定义的主要能力和选项如下所示:
PCS、PMA、AN三层必须实现,LPI(Lower Power Idle)就属于可选的功能。
73.背板和铜缆组件的AN
本节中所定义的,自动协商被指定用于在背板上操作的以太网PHY,以及与在铜缆组件上操作的某些以太网PHY一起使用。虽然背板以太网PHY必须实现自动协商,但自动协商的使用是可选的。 应为不支持自动协商的传统设备提供并行检测,并应可以与不支持第Cl73自动协商的传统设备互操作。使用差分曼彻斯特编码(DME)页面执行自动协商。DME提供DC平衡信号。DME不会向网络设备添加数据包或上层开销。
73.3功能规范
自动协商功能提供了一种机制来控制单个MDI与单个PHY类型的连接,其中可能存在多种PHY类型。管理界面提供自动协商的控制和状态,但不需要存在管理代理。
自动协商功能应提供以下内容:
a)自动协商传输
b)自动协商接收
c)自动谈判仲裁
这些功能应符合图73-9至图73-11的状态图。自动协商功能应通过依赖于技术的接口与技术相关的PHYs进行交互(见73.9)。依赖技术的PHYs包括1000BASE-KX,10GBASE-KX4, 10GBASE-KR,40GBASE-KR4, 40GBASE-CR4, 100GBASE-CR10, 100GBASE-KP4, 100GBASE-KR4和100GBASE-CR4。当MDI支持多个通道(lane)时,MDI的lane0应用于自动协商和任何其它单通道PHY(例如,1000BASE-KX或10GBASE-KR)的连接。
73.5.2 DME页面编码
DME页面带有48位自动协商数据。它由106个均匀间隔的转换位置组成,包含曼彻斯特违规分隔符,48位数据和单个伪随机位。奇数转变位置表示时钟信息。偶数转换位置表示数据信息。DME页面连续传输,没有任何空闲或间隙。
前八个过渡位置包含曼彻斯特违规分隔符,标记页面的开头。曼彻斯特违规包含位置1和位置5的转换,其余位置没有转换。曼彻斯特违规定界符是转换之间唯一出现四个间隔的地方。以支持接收器获得页面同步。如下为基页格式(支持NP):
D[4:0]包含选择器字段(IEEE802.3当为00001)。
D[9:5]包含Echoed Nonce字段。ACK=0时为0,ACK为1时为对端发送的nonce随机数。
D[12:10]包含用于通告与PHY无关的功能的能力位。即C[1:0],用于通告PAUSE功能。剩余的能力位C[2]被保留。
D[15:13]包含RF,Ack和NP位。这些位的功能应符合28.2.1.2的规定。
D[20:16]包含Transmitted Nonce字段。即发送给对端的随机数。
D[45:21]包含能力集字段。如下所示(CR4、CR10为面板口,其它均为背板口):
D[47:46]包含FEC能力(具体参看cl74)。
a) F0 is FEC ability [能力位]
b) F1 is FEC requested [请求启用位]
73.7.5重新协商功能
来自任何实体(例如管理代理)的重新协商请求,应使仲裁功能可以解决所有依赖于技术的PHY,并停止任何传输数据和链路转换活动,直到break_link_timer到期为止。 因此,链接伙伴将进入链接失败并恢复正常的自动协商。 在break_link_timer到期后,本地设备将通过发出DME页面来恢复自动协商,其中基页在tx_link_code_word [48:1]中有效。 一旦自动协商完成,如果接收link_control = ENABLE,HCD返回link_status = FAIL,则将进行重新协商。为了允许PHY有机会使用其自己的链路完整性测试功能来确定链路完整性,link_fail_inhibit_timer限定link_status = FAIL指示,使得如果link_fail_inhibit_timer已经到期并且PHY仍指示link_status = FAIL则发生重新协商。
73.7.7下一页功能
Next Page功能使用Auto-Negotiation仲裁机制允许交换Next Pages信息,这可能遵循用于基本链接码字的传输和确认程序。下一页包含消息代码字段和未格式化的代码字段两个字段。使用双重确认系统。Ack用于确认收到信息;Ack2用于指示接收方能够对消息中定义的信息(或执行任务)进行操作。Toggle位用于确保本地设备和链接对端之间的正确同步。
如果链接的任何一端将Next Page位设置为逻辑1,表示它至少有一个要发送的Next Page,则在交换基本链接代码字之后进行下一页交换。下一页交换包括使用正常的自动协商仲裁过程来发送下一页消息。
消息代码包含预定义的11位代码,未格式化的代码包含32位代码。可以传输具有适当消息代码和未格式化代码的多个下一页以发送扩展消息。每个Next Pages系列都有一个Message代码,用于定义如何解释为格式化的代码。可以按任何顺序发送任意数量的下一页;但是,建议将发送的下一页的总数保持为较小,以最大限度地缩短链接启动时间。
当链接的两端将其下一页位设置为逻辑0时,下一页传输结束,表示两者都没有任何额外的传输。一台设备可能比另一台设备有更多的页面要传输。一旦设备完成其下一页信息的传输,它将发送具有空消息代码的下一页并且NP位设置为逻辑0,同时其链接对端继续发送有效的下一页。自动协商设备应识别消息页面的接收,其中包含空消息代码作为其链接对端的下一页信息的结尾。
73.7.7.1下一页编码
对于NP,Ack,MP,Ack2和T位,下一页应使用图73-7和图73-8中所示的编码。 这些位应按照28.2.3.4的规定运行。下一页编码有两种类型 - 消息和未格式化。 对于消息下一页,MP位应设置为逻辑1,11位字段D [10:0]应编码为消息代码字段,D [47:16]应编码为无格式代码字段。 对于未格式化的下一页,MP位应设置为逻辑0; D [10:0]和D [47:16]应编码为无格式代码字段。
73.8管理寄存器要求
管理接口用于向管理实体传递自动协商信息。Cl45管理数据输入/输出(MDIO)接口的MMD7(MDIO管理设备7,MMD name:Auto-Negotiation)应作为逻辑接口提供,用于访问AN和其他管理目的的设备寄存器。CL45的MIDO电气接口是可选的。在没有MDIO的物理实例的情况下,建议提供等效机制来访问寄存器。表73-6提供了底板以太网自动协商变量到管理寄存器的映射。
74. BASE-R PHY的前向纠错(FEC)子层
74.1概述
本节规定了10GBASE-R和其他BASE-R PHY的可选前向纠错(FEC)子层。 FEC子层可以放置在10GBASE-R和其他BASE-R物理层实现的PCS和PMA子层之间,如图74-2,图74-3和图74-4所示。对于具有多通道BASE-R PCS的PHY,FEC子层针对每个PCS通道进行实例化,并基于每个PCS通道自主运行。FEC提供编码增益以增加链路预算和BER性能。Cl72和Cl84中描述的10GBASE-KR和40GBASE-KR4 PHY可选择使用FEC子层来增加比第Cl69中定义的更广泛的背板通道集的性能。Cl85中描述的40GBASE-CR4和100GBASE-CR10 PHY可选择使用FEC子层将BER性能提高到10-12以上。
74.2目标:该一节在IEEE802.3-2015中已经失效。
74.3与其他子层的关系:图74-1描述了MAC和协调子层(RS),BASE-R PCS,BASE-R FEC(显示为阴影),BASE-R PMA和BASE-R PMD,ISO / IEC 8802-2 LLC和ISO / IEC以及ISO/IEC开放系统互连(OSI)参考模型之间的关系。
74.4子层间接口
提供FEC服务接口以允许FEC子层将信息传送到PCS和从PCS传送信息。抽象服务模型用于定义此接口的操作。对于10GBASE-R,FEC服务接口直接映射到第49章中定义的PCS的PMA服务接口,下层FEC子层接口映射到第51章中定义的串行PMA子层提供的服务接口。对于40GBASE-R和100GBASE-R,FEC服务接口是80.3中定义的子层间服务接口的实例,83.2中定义的PMA服务接口也是如此。
对于40GBASE-R和100GBASE-R,FEC服务接口可以连接到PCS,如图74-1所示,也可以连接到PMA,如图83-2所示,其中FEC和PCS位于由XLAUI / CAUI-n连接的独立设备中。
该标准根据位,八位位组,数据组,数据单元和信号定义了这些接口; 但是,如果实现遵循服务接口的逻辑模型,则实现者可以选择其他数据路径宽度和其他便于实现的控制机制。
74.4.1 10GBASE-R PHY的功能框图
图74-2显示了10GBASE-R PHY的FEC功能框图以及PCS和PMA子层之间的关系。
74.4.2 40GBASE-R PHY的功能框图
图74-3给出了40GBASE-R PHY的FEC功能框图以及PCS和PMA子层之间的关系。
74.4.3 100GBASE-R PHY的功能框图
图74-4给出了100GBASE-R PHY的FEC功能框图以及PCS和PMA子层之间的关系。
74.5 FEC服务接口
提供FEC服务接口以允许PCS将信息传送到FEC和从FEC传送信息。FEC服务接口相当于10GBASE-R的PMA服务接口和80.3中为40GBASE-R和100GBASE-R定义的子层间服务接口的实例。这些服务以抽象方式定义,并不意味着任何特定实现。FEC服务接口支持使用请求和指示原语在链路任一侧的PCS实体之间交换数据单元。数据单元由FEC映射到FEC块并传递给PMA,反之亦然。
对于10GBASE-R以及40GBASE-R和100GBASE-R,服务原语的定义不同。
已经定义了PMA服务接口的可选PHY实例(见第51章,附件83A,附件83B,附件83D和附件83E)。 10GBASE-R有XSBI(10 Gigabit Sixteen-Bit Interface),40GBASE-R有XLAUI,100GBASE-R有CAUI-n。如果需要,具有PMA的这些PJHY实例也可以用于FEC服务接口。
74.5.1 10GBASE-R服务原语
在FEC服务接口中定义了以下原语:
a)FEC_UNITDATA.request(tx_data-group <15:0>)
b)FEC_UNITDATA.indication(rx_data-group <15:0>)
c)FEC_SIGNAL.indication(SIGNAL_OK)
d)FEC_TX_MODE.request(tx_mode)
e)FEC_RX_MODE.request(rx_mode)
f)FEC_ENERGY.indication(energy_detect)
g)FEC_LPI_ACTIVE.request(rx_lpi_active)
d),e),f)和g)仅用于可选的EEE能力。
FEC服务接口直接映射到第49章中定义的10GBASE-R PCS提供给PMA的服务接口。FEC_UNITDATA.request映射到PMA_UNITDATA.request原语;FEC_UNITDATA.indication映射到PMA_UNITDATA.indication原语;PMA_SIGNAL.indication映射到10GBASE-R PCS的PMA_SIGNAL.indication原语(即在10GBASE-R中不实现FEC子层,或者说非完整FEC子层)。
如果支持可选的节能以太网(EEE)功能(参见条款78),则具有PMA子层(或FEC子层)的接口包括rx_mode和tx_mode以控制较低子层中的power状态和energy_detect,指示PMD子层是否在接收器处检测到信号。
74.5.2 40GBASE-R和100GBASE-R服务原语
40GBASE-R和100GBASE-R的FEC服务接口是在80.3中定义的子层间服务接口的实例。 FEC服务接口原语总结如下:
a)FEC : IS_UNITDATA_i.request
b)FEC : IS_UNITDATA_i.indication
c)FEC : IS_SIGNAL.indication
d)FEC_TX_MODE.request(tx_mode)
e)FEC_RX_MODE.request(rx_mode)
f)FEC_RX_TX_MODE.indication(rx_tx_mode)
g)FEC_LPI_ACTIVE.request(rx_lpi_active)
h)FEC_ENERGY.indication(energy_detect)
d),e),f),g)和h)项仅用于可选的EEE能力。
40GBASE-R FEC具有四个并行比特流,因此对于40GBASE-R,i = 0到3; 100GBASE-R FEC具有二十个并行比特流,因此对于100GBASE-R,i = 0到19。PCS(或PMA)连续向FEC发送四个或二十个并行比特流,每个PCS通道一个,每个标称信令速率为10.3125 GBd(40GBASE-R)和5.15625 GBd(100GBASE-R)。
FEC:IS_SIGNAL.indication原语由FEC发送到PCS(或PMA)以指示接收过程的状态。 FEC:IS_SIGNAL.indication由FEC接收过程生成,以便将严重错误条件的检测(例如,没有从PMA子层接收到有效信号)传播到PCS(或PMA)。
FEC:IS_SIGNAL.indication中的SIGNAL_OK参数可以采用以下两个值之一:OK或FAIL。值OK等于true,表示FEC接收过程成功,描述了从由FEC_SIGNAL_OK变量指示的PMA子层接收的所有输入数据流,均为有效有效载荷信息,对于所有数据流,该有效载荷信息通过FEC:IS_UNITDATA_i.indication原语呈现给PCS(或PMA)。值FAIL等于false,表示由FEC_SIGNAL_OK变量指示的接收过程检测到了错误,这阻止了有效数据被呈现给PCS(或PMA),在这种情况下,FEC:IS_UNITDATA_i.indication原语是来自PMA的PMA:IS_UNITDATA_i.indication原语的直接传递。
FEC_TX_MODE.request中的tx_mode参数从PCS发送。 当发送器处于TX_QUIET状态时,它被设置为QUIET,当发送器处于TX_ALERT状态时,它被设置为ALERT,否则被设置为DATA。
FEC_RX_MODE.request中的rx_mode参数从PCS发送。 当接收器处于RX_QUIET状态时,它被设置为QUIET,否则设置为DATA。
FEC_RX_TX_MODE.indication原语传递rx_tx_mode参数。 该参数指示PMA子层从接收信号推断出的tx_mode的值。如果没有EEE深度睡眠功能,则永远不会生成该原语,并且子层的行为就像rx_tx_mode = DATA一样。 参数rx_tx_mode被分配以下值之一:DATA,QUIET或ALERT。
FEC_LPI_ACTIVE.request中的rx_lpi_active参数是从PCS发送的布尔变量,当LPI模式在接收器处于活动状态时设置为TRUE,否则设置为FALSE。
FEC_ENERGY.indication中的energy_detect参数是一个布尔变量,它向PCS指示在PMD处检测到能量。
74.8 FEC MDIO功能映射
第45章中描述的可选MDIO功能定义了几个变量,这些变量为PHY提供控制,状态,能力/能力,错误指示信息。 如果实现了MDIO,它应将MDIO变量映射到FEC变量,如表74-1所示(74.7为FEC层结构与编码细节,74.8为FEC宏观性的信息,重点关注74.8即可)。
74.8.1 FEC能力
由于FEC是可选的子层,因此每个BASE-R PHY类型的变量FEC_ability指示FEC能力。 应提供MDIO接口或等效管理接口以访问BASE-R PHY类型的变量FEC_ability。 FEC_ability变量位设置为1以指示PHY支持FEC子层,否则默认为零。
BASE-R PHY的FEC_ability变量映射到寄存器位1.170.0(参见45.2.1.92.1)。
链路伙伴之间的FEC能力可以使用73.6.5中定义的第73条自动协商进行协商。 仅当链路伙伴都通告他们具有FEC能力并且其中一个请求通过自动协商功能启用FEC时,才在链路上启用FEC功能。
74.8.2 FEC Enable
FEC子层应具有启用或禁用FEC功能的能力。应提供MDIO接口或等效管理接口以访问BASE-R PHY的FEC_Enable变量(参见45.2.1.93寄存器位1.171.0)。当FEC_Enable变量位设置为1时,将启用BASE-R PHY的FEC。当变量设置为零时,在BASE-R PHY中禁用FEC。执行PHY复位时,此变量应设置为零。当禁用FEC功能时,PHY应具有绕过FEC编码和解码功能的机制,以免引起与编码或解码功能相关的额外延迟。
74.8.3 FEC Enable错误指示
如果支持此能力,则FEC子层可以具有使BASE-R FEC解码器能够通过如74.7.4.5中定义的BASE-R PHY的同步位,向上层(PCS)指示解码错误的选项。应提供MDIO接口或等效管理接口以访问变量FEC_Enable_Error_to_PCS(错误指示使能位)。当变量设置为1时,这使得能够通过同步位到PCS层指示解码错误。设置为零时,将禁用错误指示功能。
74.8.3.1 FEC错误指示能力
FEC错误指示能力应由变量FEC_Error_Indication_ability(错误指示能力位)指示。该变量设置为1表示BASE-R FEC能够指示PCS层的解码错误。如果BASE-R FEC不支持此功能,则变量设置为零。应提供MDIO接口或等效管理接口以访问变量FEC_Error_Indication_ability。
74.8.4 FEC错误监控功能
以下计数器适用于FEC子层管理和错误监视。 如果提供了MDIO接口(参见第45条),则可通过该接口访问它。 如果不是,建议提供等效访问。 在读取或复位FEC子层时,这些计数器复位为零。当计数器到达计数上限时(全为1),它会停止计数。计数器的目的是帮助监控链接的质量。如果EC_LPI_ACTIVE.request(rx_lpi_active)为TRUE,则应禁用这些计数器。
74.8.4.1 FEC_corrected_blocks_counter
校正的块是具有无效奇偶校验的FEC块,并且已经由FEC解码器校正。
FEC_corrected_blocks_counter(对于单通道PHY)或FEC_corrected_blocks_counter_i(对于多PCS lane PHY,其中i = 0到3表示40 Gb / s,i = 0到19表示100 Gb / s),当FEC_SIGNAL.indication或FEC:IS_SIGNAL.indication为OK,对于每个校正的FEC块计数一次。这些是32位计数器。这些变量通过管理接口访问,该接口可映射到45.2.1.94(1.172,1.173)中针对单通道PHY定义的寄存器,和45.2.1.116(1.300至1.339)针对多通道PHY的定义。
74.8.4.2 FEC_uncorrected_blocks_counter
未校正的块是具有无效奇偶校验的FEC块,并且未被FEC解码器校正。
对于FEC_uncorrected_blocks_counter或FEC_uncorrected_blocks_counter_i来说,当FEC_SIGNAL.indication或FEC:IS_SIGNAL.indication为OK时,对于每个未校正的FEC块计数一次。这些是32位计数器。这些变量可通过管理接口访问,该接口可映射到45.2.1.95(1.174,1.175)中针对单通道PHY定义的寄存器和45.2.1.117(1.700至1.739)针对多通道PHY的定义。
74.9 BASE-R PHY测试模式
10GBASE-R PCS提供测试模式功能,PCS发送通道和接收通道均可在正常模式或测试模式模式下运行(见49.2.2)。 当10GBASE-R PHY配置为测试模式模式时,可以通过将FEC Enable变量设置为零来禁用FEC功能,因此可以将10GBASE-R PCS的测试模式发送到PMA服务接口,绕过 FEC编码和解码功能。
第82章PCS也可以在测试模式模式下运行(见82.2.11); 但是,加扰的空闲测试模式不需要绕过FEC编码和解码。
本文来自博客园,作者:{e_shannon},转载请注明原文链接:https://www.cnblogs.com/e-shannon/p/16953446.html