本节是对IEEE 802.3定义的PCS层的扩展,以支持在点对多点物理介质中的突发模式操作。本节也描述了一个可选择的前向纠错机制,用于提高光连接可靠性和传输距离。1000BASE-X设备可使用自协商机制进行连接,但在1000BASE-PX的P2MP网络中,禁止使用自协商协议。
C.2.2 突发模式操作
C.2.2.1 概述
为了避免近端ONU的发射噪声造成远端ONU的信号衰减,ONU的激光器在信号发送间隔必须能够关闭。为了控制激光器,PCS必须进行扩展以便能根据信号状态产生PMD_SIGNAL.request(tx_enable)信号,在正确的时刻开/关激光器。图C. 2描述了这一有信号监测器功能的实现原理。

C.2.2.2 操作原则
数据监测器使用一个延迟队列(FIFO缓冲器)来缓存要发送的码组。FIFO缓冲器的长度必须能够使PMA有足够的时间去打开激光器并发送预定数目的idle字符。一定量的idle字符用于接收器调整接收增(Treceiver_settling)、同步接收时钟(Tcdr)并完成同步流程(Tsync)。在初始化时,FIFO缓冲器用/I/填充而且关闭激光器。当第一个非/I/码组到达时,数据监测器置PMD_SIGNAL.request(tx_enable)信号为ON,并通知PMD子层打开激光器,如图C. 2所示。
当缓冲区数据清空时( 例如, 仅包含/I/ 序列) , 数据监测器将置PMD_SIGNAL.request(tx_enable)为OFF,并通知PMD子层把激光器关掉。在数据包发送间隔,/I/或/R/字节序列将送入缓冲区。如果这些/I/或/R/序列不足以填满缓冲区,则激光器不会被关闭。
图C. 3显示了填充缓冲器和产生laser_control之间的关系。因为OLT的激光器一直处于打开状态,所以OLT的数据监测器不需要缓冲数据。

本节主要描述功能实现,包括变量、常数和功能定义。表中的变量没有特别说明的,均为缺省值。
C.2.2.3.1 变量
BEGIN
类型:Boolean
用法:此变量用于初始化,在初始化或复位时置位为true。
DelayBound
类型:16位无符号数
缺省值:00-6A (106个码组= 848 ns)
用法:用于标识激光器的稳定时间,此变量仅在ONU使用。缺省值根据laserOnTime和SyncTime来确定。
dtx_code-group
一个10-bit 向量组构成一个码组, 数据检测器将其作为
PMA_UNITDATA.request(dtx_code-group) 的参量发送到PMA 。数据流发送时dtx_code-group<0>居先dtx_code-group<9>最后。
laser_control
类型:boolean
此变量标识激光器状态,ON表示激光器开,OFF表示关闭。
tx_code-group
此变量表示需要发送的码组,发送时tx_codegroup<0>居先,tx_code-group<9>最后。
C.2.2.3.2 函数
IsIdle(tx_code-group)
该函数用设定发送码组类型,tx_code-group类型可以是/T/、/R/、/K28.5/,或者在/K28.5/后除了/D21.5/或/D2.2/之外的其它码组。
FIFO.RemoveHead()
该函数的功能是将FIFO缓存中的第一个码组清除,剩余的码组均前移一位。返回被清除的码组向量(10bit)。
FIFO.Append(tx_code_group)
该函数的功能是在FIFO缓冲器的最后添加一个新的码组(10bit向量)。
C.2.2.3.3 消息
PMD_SIGNAL.request(tx_enable)
此原语原语用于在PMD子层打开或关闭激光器。OLT始终为ON,ONU则需要由数据监测器的状态确定其值(见图C. 4)。PUDRPMA_UNITDATA.request(tx_code-group<9:0>)的简称。
C.2.2.3.4 计数器
IdleLength
该计数器计算连续插入的idle字符的数目,以最近的tx_code-group结尾。如果最近一个tx_code-group表征的是非填充字符,则IdleLength复位为0。
类型:32-bit的无符号数
C.2.2.4 流程图
ONU的数据解码实现流程见图C. 4,图中状态描述见C.2.2.3 节。

C.2.3 前向纠错(可选)
C.2.3.1 概述
前向纠错码(FEC)是经过二进制运算后(例如用Galois算法)附加在以太网数据包后面的一组数据,附加的纠错码(如FEC奇偶码)用于在接收侧进行数据校验和纠错。FEC包括三部分功能:FEC编码,FEC解码,FEC同步,如图C. 2所示。如果不需要FEC,图C. 2中的TBI之间模块可以省略。虽然FEC功能是可选的,但在多点光链路中的实现还是要遵循C.2.3 节的规定。
FEC具有以下基本特性:
a) 保证帧格式符合1000BASE-X PCS;
b) 支持功能可选;
c) 向后兼容1000BASE-X设备;
d) 支持PCS子层10-12误码特性;
e) 支持FEC子层10-4误码特性。


C.2.3.3 FEC帧格式
本节描述具有FEC编码的以太网帧格式。
C.2.3.3.1 奇偶码
从PCS子层接收到以太网帧后,数据被分成长度为239个码元的数据块,第一个数据块以/S/码组后第一个码元开始,最后一个数据块以/T/码组前的最后一个码元结束。每个数据块使用RS(255,239,8)编码器进行编码,同时产生16个奇偶校验码,因此每个RS码字有255个码元。生成的16个奇偶码附加在数据包的末尾。
C.2.3.3.2 末尾短数据块处理
在对数据进行块分割的时候,最后一块数据经常会少于239个码元,这种数据块成为短数据块。处理如下:
在长度为x的短数据块中,D238到Dr之间的数据填充为0,Dr-1到D0之间为有效数据,其中Dr-1是短块中第一个数据字节,D0是最后一个字节,填充后的数据块编码后产生16个奇偶码,数据在发送时将去掉值为0的填充码元,在接收端,解码器将恢复完整长度的块(填充0码元)后进行解码。
C.2.3.3.3 特殊帧标识
以太网帧包括起始标志和数据帧,在接收器进行FEC解码前,要先进行帧同步,FEC不会对以太网帧标识进行校验保护,因此为了提高抗干扰性,在FEC编码中增加了特殊的起止帧标识,另外通过简单的运算保证特殊标识的可靠性,标识长度至少5字节,以保证可靠检测,起始的FEC帧序列为/S_FEC/,结束序列为/T_FEC/。
为监测FEC编码的起始帧,对输入的码流进行/S_FEC/序列匹配扫描,在小于d/2错误时,确认起始,结束判断扫描序列为/T_FEC_0/或/T_FEC_E/,匹配小于d/2错误时,确认结束。上述d值选为10,编码序列在不采用FEC的PCS子层可以透传(在虚装载模式下)。起始和终止的符号码采用8B/10B码组:
/S_FEC/:FEC起始码,码序列为:/K28.5/D6.4/K28.5/D6.4/S/
/T_FEC_E/:FEC结束码,偶对齐方式码序列为:/T/R/I/T/R/
/T_FEC_O/:FEC结束码,奇对齐方式码序列为:/T/R/R/I/T/R/
/S/, /T/, /R/ 和 /I/序列定义见IEEE 802.3 36章规定。/I/序列可分为/T_FEC_E/和
/T_FEC_O/两种序列,记为/I1/和/I2/。
图C. 5描述了FEC码的以太网帧格式,在FCS和PARITY域之间,T_FEC可以采用
/T_FEC_E/或/T_FEC_O/序列,PARITY域之后,T_FEC只能用/T_FEC_E/序列。

C.2.3.4 FEC操作
C.2.3.4.1 工作原理
在发送端,FEC子层从PCS子层接收到数据包,进行FEC编码,添加校验码之后将数据传送到PMA层。
在接收端,FEC子层从PMA子层接收到数据,完成字节对齐,监测FEC起始序列,解码FEC编码,纠正编码错误(如果有错误码)后,将奇偶码替换为IDLE后传送到PCS。注:为完成正确的MPCP操作,FEC必须保证所有码流信号连续并且等延迟的通过PM进入PCS层。FEC的功能实现不得增加数据延迟。
C.2.3.4.2 功能框图
如图C. 2所示,FEC子层包含发送侧和接收侧。
C.2.3.4.3 发送
图C. 6描述了FEC子层数据传输通道的框图,首先监测从PCS层来的数据包定界符。将/I/I/S/替换成/S_FEC/序列。将8B/10B数据解码以便进行FEC编码和并产生校验码,相应地,将检测到的/T/R/I/I/或/T/R/R/I/I/序列替换成/T_FEC_E/或/T_FEC_O/。然后加入奇偶码和另外一个/T_FEC_E/来替换扩展帧间间隔。
FEC的发送过程是根据PMA_UNITDATA.request和tx_code-group<9:0>的数据状态,生成连续的码组,并随即将之通过ftx_code-group<9:0>发送到PMA层接口。
C.2.3.4.4 接收
图C. 7描述了FEC子层接收数据通道的接收同步处理过程。FEC同步处理模块根据通过PMA_UNITDATA.indicate 服务原语连续进行码组接收, 并根据通过SYNC_UNITDATA.indicate服务原语将码组转送到FEC接收处理模块。FEC同步处理通过设置同步状态标识来指示来自PMA数据是否已经可以无误接收。
图C. 8 描述了FEC 子层接收数据处理的过程, FEC 的接收处理根据SYNC_UNITDATA.indicate连续接收码组,将码组加入缓冲区,同时将误码小于d/2的/S_FEC/转换为/I/I/S/序列,并将所有误码少于d/2的/T_FEC/转换为完全的/T_FEC/。缓存在接收到足够的数据并且奇偶码能完成数据纠错之前一直有效,数据纠错在缓存中完成。当缓存清空时,奇偶码连同第一个/T_FEC/之后的/T/R/序列以及整个第二个/T_FEC/序列全部转换为/I/。

注:在特殊情况下,PCS可能会产生大量的FALSE_CARRIER事件。因为FEC编码仅仅保护以太网数据,不保证IDLES数据。因此,在空闲(idle)期间,过多的比特错误将导致FALSE_CARRIER事件,另外,当具有FEC功能和不具有FEC功能的设备在同一EPON系统中使用时,不具有FEC功能的设备将对FEC的奇偶数据产生FALSE_CARRIER事件。


C.2.3.5 详细功能和实现流程图
C.2.3.5.1 状态变量
C.2.3.5.2 符号约定
/x/
表示36.2.5.1.2中定义的常量码组(有效码组必须符合IEEE 802.3 36章的规定)
表示缓存的接收到的码组。此码组可以是码组数据( /x/ ) , 或是由SYNC_UNITDATA.indicate 消息转送的数据,见IEEE 802.3 36章定义。C.2.3.5.3 常量定义
/COMMA/
是一种包含逗点的码组集合,具体见IEEE 802.3 36章定义。
/D/
是一个包含256个有效数据的码组集合,见IEEE 802.3 36章定义。
/Dx.y/
是一个包含256个有效数据的码组集合的一个子集,见IEEE 802.3 36章定义。
/I/
IDLE序列组,包含 /I1/ 或 /I2/ 序列集合, 见IEEE 802.3 36章定义。
/INVALID/
无效数据或特殊码组的集合,见IEEE 802.3 36章定义。
/Kx.y/
含有效特殊编码的12个码组集之一。见IEEE 802.3 36章定义。
/R/
用于以下用途:包结束第二定界符;包结束第三定界符;载荷扩展;与/I/对应。
/S/
包起始定界符(SPD) 见IEEE 802.3 36章定义。
/T/
用于包结束第一定界符。
/V/
差错传播码组,定义见IEEE 802.3 36章定义。
C.2.3.5.4 变量
Buffer
接收处理时接收码组的缓存。
buffer_head
接收缓存的头指针。
Cgbad
下面算式的简称:
((rx_code-group ∈ /INVALID/) + (rx_code-group=/COMMA/*rx_even=TRUE)) *
PMA_UNITDATA.indicate
Cggood
下面算式的简称:
!((rx_code-group ∈ /INVALID/) + (rx_code-group=/COMMA/*rx_even=TRUE)) *
PMA_UNITDATA.indicate
fec_encode
在FEC发送处理中用于指示函数RS_Encode(Data)返回状态。
取值:TRUE,表示数据已经被RS_Encode(Data)函数确定有效,即FEC编码结束。
FALSE,表示数据无效,即FEC编码未完成。
ftx_bit
是一个二进制参数,表示根据PMD_UNITDATA.request服务原语,从PMA发送到PMD的数据位。
取值:ZERO,数据位为逻辑0;
ONE,数据为是逻辑1。
ftx_code-group<9:0>
FEC将要发送的码组向量,定义见表 36–1a 到36–2,作为PMA_UNITDATA.request(ftx_code-group) 函数的参量传送到PMA. 发送顺序是ftx_code-group<0> 最先发送,ftx_code-group<9> 最后发送。
parity<D7:D0>
是一个8比特向量,存放FEC发送处理过程中生成的当前奇偶码;在进入XMIT_PARITY状态后,将会被下一个8比特奇偶码覆盖。
parity_buffer_empty
布尔变量,由FEC发送处理赋值,指示是否有奇偶字节需要编码。
取值:TRUE,表示没有奇偶字节需要编码;
FALSE,有奇偶字节需要编码。
rx_disparity
布尔变量,由FEC接收处理赋值,以二进制位标识接收到的0、1数目比较。
取值:POSITIVE;
NEGATIVE。
rx_even
布尔变量,在FEC同步过程中标识接收的码组数目是奇数还是偶数。
取值:TRUE,偶数个码组被接收;
FALSE,奇数个码组被接收。
rx_code-group<9:0>
10 比特向量, 标识刚从PMA接收到的码组。rx_code-group<0> 是最后接收位,rx_code-group<9>是最先接收位,所有位收齐后,刚好构成一个码组。
signal_detect
布尔变量,由PMD根据PMD_SIGNAL.indicate(signal_detect)消息进行置位,标识信号连接状态。
取值:FAIL,链路无信号;
OK,链路有信号。
sync_status
FEC同步过程的返回,指示接收同步状态。
取值:FAIL,接收器没有同步好码组数据边界;
OK,接收器已经同步好码组数据边界。
tx_bit
二进制参数,标识依据PMD_UNITDATA.request服务原语从PMA向PMD发送的数据位。
取值:ZERO,数据位为逻辑0;
ONE,数据位为逻辑1。
tx_code-group<9:0>
PCS 将要发送的码组向量, 属性定义见IEEE 802.3 36 章。作为PMD_UNITDATA.request(tx_bit)服务原语的参数发送到PMA。tx_code-group<0>首先发送,tx_code-group<9> 最后发送。
tx_disparity
布尔变量,标识FEC发送过程完成后,所发送的0/1数目比较值。算法见IEEE 802.3 36章定义。
取值:POSITIVE;
NEGATIVE。
C.2.3.5.5 功能函数
check_ahead_tx
检测函数,用于FEC发送处理时识别包起始符,以便将包起始符及其两个IDLE前导码替换为/S_FEC/。
check_ahead_rx
检测函数,用于FEC接收处理时检测少于d/2个错误的/S_FEC/ 和/T_FEC/。
DECODE ([/x/])
在PCS接收处理过程中,用于锁存rx_code-group<9:0>([/x/])的值,以进行解码,返回值为GMII RXD<7:0> 、rx_Config_Reg<D7:D0> 或rx_Config_Reg<D15:D8>, 见表36-1a–e.DECODE同时更新0/1比较(running disparity)计算结果。算法见IEEE 802.3 36章。
ENCODE(x)
在PCS 发送时, 对发送数据进行编码, 发送数据包括GMII TXD<7:0> 、tx_Config_Reg<D7:D0>或tx_Config_Reg<D15:D8>,返回值为10比特码组。ENCODE还完成0/1比计算更新。
POP_BUFFER
移出接收缓冲区的第一个字节,使下一个字节成为可用。
RS_Encode(Data)
完成对数据的RS(255,239,8)编码。
RS_Decode(Data)
用于对RS(255,239,8)编码数据进行解码。
signal_detectCHANGE
用于PCS信号同步处理,标识链路信号监测值(signal_detect)是否发生变化。取值:TRUE,链路信号连接状态发生了变化;
FALSE,链路状态没有变化。
C.2.3.5.6 计数器
good_cgs
用于计数连续收到的有效码组。
loop_count
3bit计数器,用于计算接收同步过程中的锁定(loop)次数。
C.2.3.5.7 消息定义
FEC_UNITDATA.indicate(frx_code-group<9:0>)
FEC接收过程中的信号标志,表示已经有数据要发送。
FUDI
FEC_UNITDATA.indicate(frx_code-group<9:0>)的简写。
PMA_UNITDATA.indicate(rx_code-group<9:0>)
PMA接收处理过程中的标识,表示有数据已经可以接收。
PMA_UNITDATA.request(tx_code-group<9:0>)
发送给PMA或FEC发送处理模块的信号标识,标识数据准备好,等待发送。
PUDI
PMA_UNITDATA.indicate(rx_code-group<9:0>)的简写。
PUDR
PMA_UNITDATA.request(tx_code-group<9:0>)的简写。
SUDI
SYNC_UNITDATA.indicate(parameters)的简写。
SYNC_UNITDATA.indicate(parameters)
在传送以下参数时,由FEC同步处理过程向FEC接收处理过程发送的信号标识。
参数:[/x/],标志码组(/x/)的锁存值;
EVEN/ODD,接收奇偶状态变量(rx_even)的锁存值。
当为EVEN时,rx_even=TRUE;为ODD时,rx_even=FALSE。
C.2.3.6 状态图
C.2.3.6.1 发送流程状态图
FEC发送功能实现流程图见图C. 9。
C.2.3.6.2 接收同步处理流程图
FEC同步处理实现流程见图C. 10。
C.2.3.6.3 接收功能流程图
FEC接收功能流程见图C. 11和图C. 12。
只有接收到缓冲器中的数据才能进行FEC解码。





C.2.3.7 误码监测能力
以下计数器用于FEC子层的管理和误码监测。如果提供MDIO接口(见IEEE 802.3 22章),则通过该接口完成。如果不提供,建议采用类似方式实现。计数器在FEC子层复位或被读出后清零,在计数器溢出后,停止计数。这些计数器用于帮助检测链路质量。
C.2.3.7.1 buffer_head_coding_violation_counter
32位计数器,在链路中每收到一个无效码组时计数器加一,计数值可以通过管理接口映射到寄存器中。
C.2.3.7.2 FEC_corrected_blocks_counter
32位计数器,在FEC解码时,每校正一个错码块时计数器加一,计数值可以通过管理接口映射到寄存器中。
C.2.3.7.3 FEC_uncorrected_Blocks_counter
32位计数器,在FEC解码过程中,每出现一个不能校正的FEC块计数器加一,其值可以通过管理接口映射到寄存器中。


