一、引言
前几篇文章已经谈到RapidIO的协议,串行物理层与控制符号。
RapidIO协议包括读事务(NREAD),写事务(NWRITE),流写事务(SWRITE),有响应的写事务(NWRITE_R),原子操作(ATOMIC),维护操作(MAINTENANCE),门铃事务(DOORBELL)和消息(MESSAGE)这几种。
RapidIO的串行物理层是基于SERDES的,关于SERDES涉及的一些相关技术请阅读《SERDES关键技术总结》(链接:https://www.cnblogs.com/liujinggang/p/10125727.html)这篇文章。SERDES分为PCS(物理编码子层)和PMA(物理媒介附属子层)两层,其中PCS是由纯数字电路组成,可以用软逻辑来实现,而PMA则既包括了数字电路,也包括了模拟电路,不能用纯逻辑实现。
控制符号是被串行链路端口所使用的消息单元,它用来管理串行链路操作的各个功能,包括链路维护,包界定,包应答,错误报告和错误恢复等。
有了前面的基础以后,接下来就谈一谈RapidIO串行物理层包的传输过程。
二、串行物理层的PCS层与PMA层
物理编码子层(PCS)与物理媒介附属子层(PMA)提供SERDES能够进行高速串行数据传输的基本功能(术语PCS和PMA出自IEEE 802.3 )。主要包括8B/10B编码、字符表示法、数据流的分段、码组(Code Group)、纵列(Column)、链路传输规则、空闲序列(Idle Sequence)和链路初始化。
通道的概念用于描述串行RapidIO端点的宽度。通道定义为每个方向上的单向差分对。目前串行RapidIO规定了两种链路宽度: 1x链路为1通道链路, 4x链路为4通道链路。更宽的链路也是可能的, 但是目前还没有知定。
下图展示了一个典型的RapidIO端点的结构。框图的上部是负责产生大量RapidIO包的逻辑层和传输层。在这些层下面紧接着的是串行协议层,该层负责产生和处理控制符号并通过链路管理协议管理链路。串行协议层下面是PCS层。链路协议管理层和PCS层之间的边界通常也是时钟从器件内部时钟转变为 RapidIO端点本身时钟的转变边界。PCS层负责通道分段(Striping),产生空闲序列并把字符转换为相应的8B/10B编码的K码和D码。PCS层下面是PMA层,该层负责与电气层的衔接。PMA层还负责确保不同通道间彼此正确对齐。电气层代表不同器件、接收器及其之间的电气连接。
2.1 PCS层的功能
物理编码子层(PCS)的功能是负责产生空闲序列、通道分段、发送编码、解码、通道对齐和在接收时将分段合并。PCS使用8B/10B编码在整个链路上发送数据。8B/10B编码方案最初由IBM开发,并在工业界广泛用于将数据和时钟信息合并为一个单独的信号。
PCS层还提供了判定端口的操作模式是4通道还是1通道的机制和检验链路状态的方法。该层容许在发送者和接收者之间存在时钟差异而无需流量控制。
PCS层执行下列发送功能:
1、 将在队列中等待发送的包和定界控制符号提取出来组成字符流。
2、 在可用通道上分段发送字符流。
3、 当没有待发送的包和定界控制符号时,产生空闲序列并将其插入到每个通道发送的字符流中。
4、 将每个通道的字符流独立编码为10位并行码组。
5、 将形成的10位并行码组传递给PMA层。
PCS层执行下列接收功能:
1、 解码10位并行码组的接收流为各通道独立的符号。
2、 将从无效码组解码得到的字符标记为无效。
3、 如果链路使用多于一个的通道,对齐字符流来消除通道间的偏移并将每个通道上的字符流重新组装为一个单独的字符流。
4、 将解码字符流得到的包和定界控制符号递送到更高层。
2.2 PMA层的功能
物理介质附属层(PMA)的功能是逐通道将10位并行码组串行化为串行比特流,或将串行比特流转换为10位并行码组。在接收数据时, PMA层的功能是将接收到的比特流逐通道分别对齐到10位码组边界。接着该层向PCS层的每个通道提供一个连续的码组流。10位码组对PCS层以上的各层是不可见的。
2.3 术语定义
在讨论PCS和PMA层时使用的术语定义如下:
1、字节(Byte): 一个8位信息単元,字节中每位的值为0或1。
2、字符(Character):由信息字节和一个控制位组成的9位实体。控制位指示信息字节包含的是数据还是控制信息。控制位的值为D或K,分别指示信息字节包含数据或控制信息。
3、D字符(D- Character):控制位为D的字符,也称为数据字符。
4、K字符(K- Character):控制位为K的字符,也称为特殊字符。
5、码组(Code-group):对字符进行8B/10B编码得到的10位实体。
6、纵列(Column):同时在4x(4通道)链路上传送的由4个字符组成的组群。
7、Comma:8B/10B特殊码组中唯一的只包含7个比特的字符,接收者用它来判定码组边界。
8、空闲序列(Idle Sequence):当不发送包或者控制符号时发送的字符(编码后的码组) 序列,空闲序列允许收发双方保持同步,并保证在包之间、控制符号之间以及包与控制符号之间的码组对齐。
9、通道对齐(Lane Alignment):消除4通道串行链路通道间偏移的过程。由发送者以纵列(Column)发送的字行由接收者的对齐过程以纵列输出。若无通道对齐,以纵列发送的字符可能会被分散到由接收者输出的若干纵列上。对齐过程使用作为空闲序列的一部分传送的特殊对齐字符。
10、分段(Striping): 4x链路上使用的在4个通道上同时发送数据的方法。它将字符流逐字符分散到多个通道上。第1到第4个字符经分段处理后被分別分配到通道0到通道3上,第5个字符被循环分配到通道0上,以此类推。
2.3 8B/10B传输码
PCS在发送数据时使用8B/10B发送码将9位字符(8位信息和1位控制位)编码为10位码组,接收数据时则进行相反的操作。256个数据字符和12个特殊(控制)字符被定义了编码。
8B/10B码使用的码组中,“0”和“1”的个数相等(平衡)或相差2(不平衡)。如此选择码组保证了在每一码组中至少存在两次跳变,即0到1或1到0,使维持平衡的任务变得简单。字符被编码为一个单独的平衡码组或一对不平衡码组。码组对的成员在逻辑上与对方互补。这允许编码器在选择非平衡码组时,根据维持编码器输出码组流的0/1平衡所需的码组选择一个含“1”较多或含“0”较多的非平衡码组。
8B/10B编码有如下特性:
1、充足的位跳变密度(每个码组有3~8个跳变),以允许接收端进行时钟恢复。
2、使用特殊码组建立接收者对10位码组边界的同步,定界控制符号并维持接收者位和码组的边界同步。
3、直流平衡(“0”和“1”的个数基本相同)。
4、可检测某些单比特或多比特错误。
2.4 字符和码组记号
8B/10B编码和解码使用下列记号描述字符、码组和它们的位。
未编码字符的信息位[0-7]由字母A到H标记,H标记的是最高信息位(RapidIO第0位),A标记的是最低信息位(RapidIO第7位)。如下图所示
每个数据字符都有一个Dx.y格式的表示法,其中x是最低5个信息位EDCBA的十进制值,y是最高3个信息位HGF的十进制值。同时,每个特殊字符也都有一个与之类似的Kx.y格式的表示法。
8B/10B编码过程输出的是10位码组,用字母a到j标记码组的位。码组的位具有相等的重要性,没有最高位或最低位。码组位的次序如下图所示
与数据字符Dx.y(8-bit)对应的码组由/Dx.y/(10-bit)表示,与特殊字符Kx.y(8-bit)对应的码组由/Kx.y/(10-bit)表示。
2.5 运行不一致(Running Disparity)
8B/10B编码和解码功能使用一个称为运行不一致的二进制变量。该变量值可为正(RD+)或负(RD-)。实际上,运行不一致变量表示的就是10-bit码组中“0”的个数和“1”的个数的差值。当“0”的个数大于“1”的个数时,运行不一致变量的值为正,当“0”的个数小于“1”的个数时,运行不一致变量的值为负。其实要保证直流平衡最简单的方式是使10-bit码组中的0和1的个数相同,也就是10-bit码组中“0”和“1”的个数都是5个,但是10-bit码组中既要满足直流平衡,还要有足够的跳变(3~8次跳变)使得接收方能够恢复出时钟信号,那么满足要求的“0”和“1”个数相同的10-bit码组数量是不够的,所以必须增设一些“0”和“1”的个数不相等的码组,编码器可以通过码组的运行不一致变量的值来选择下一个要发送的码组来保证整个链路的直流平衡。
每个通道的编码器和解码器都有一个运行不一致变量。对于4x链路,各通道运行不一致的值相互独立。
在编码过程中运行不一致的主要用途是跟踪解码器是否输出了较多的1或较多的0。当字符编码需要从两个不平衡的码组中选择一个码组时,使用编辑器当前的运行不一致选择采用哪一个不平衡码组。
在上电后和端口可操作前,发送者(编码器)和接收者(解码器)都必须建立运行不一致的当前值。发送者使用负值作为每个通道运行不一致的初始值。接收者可能使用负值或正值作为每个通道的运行不一致变量的初始值。
使用下列算法计算各通道的运行不一致值。在编码器中,该算法对由编码器产生的新码组进行操作。在接收方,该算法对接收到的由解码器解码的新码组进行操作。
每个码组被分为两个子块,如下图所示,前6位(abcdei)形成一个子块(6位子块),其余4位(fghi)形成另一个子块(4位子块)。6位子块头部的运行不一致值是前一个码组尾部的运行不一致值。4位子块头部的运行不一致值是6位子块尾部的运行不一致值。码组末尾的运行不一致值是4位子块尾部的运行不一致值。
子块运行不一致值的计算方法如下:
1、如果子块包含“1”的个数多于“0”的个数,那么任何子块尾部的运行不一致值都是正的。如果4位子块值为0b0011,其尾部的运行不一致值也是正的。如果6位子块值为0b000111,其尾部的运行不一致值也是正的。
2、如果子块包含“0”的个数多于“1”的个数,那么在任何子块尾部的运行不一致值都是负的。如果4位子块值为0b1100。其尾部的运行不一致值也是负的。如果6位子块值为0b111000,其尾部的运行不一致值也是负的。
3、在其他任何情况下,子块尾部的运行不一致值总是与子块头部的运行不一致值相同。
2.6 8B/10B编码
8B/10B编码功能将9位字符编码为10位码组。RapidIO规范包含256个数据字符(Dx.y)和12个特殊字特(Kx.y)的编码。这些编码几乎完全基于IEEE 802.3工作组在10G位以太网(XAUI)适配接口标准中定义的编码。对任意给定的一个9位字符,有两列编码,一列记为RD-(负运行不一致),另一列记为RD+(正运行不一致)。对字符编码时,如果当前编码器的运行不一致值为负,就选择RD-列中的码组作为编码结果;如果当前编码器的运行不一致值为正,就选择RD+列中的码组作为编码结果。在每个字符经编码后,编码器应当跟据运行不一致规则使用编码得到的新码组更新运行不一致值。 .
2.7 发送顺序
编码器输出的10位并行码组经串行化,以“abcdeifghj”的位次序发送,其中“a”位首先发送。如下图所示,该图给出了一个字符经过编码、并串转换、发送、串并转换和解码的完整过程。图的左边显示的发送过程是使用8B/10B编码对字符流编码和10位并串转换过程。右边显示的是接收者对接收到的码组进行串并转换和8B/10B解码的过程。点划线是产生10位码组的PCS层和串行化码组的PMA层的功能分界线。
下图还显示了在接收方接收者使用包含Comma序列的特殊字符来建立10位码组的边界对齐。
2.8 8B/10B解码
8B/10B解码功能将接收到的10位码组解码为9位字符,检测接收到的未定义解码的码组并标记解码输出流中得到的相应字符为无效字符(INVALID)。
解码功能使用与8B/10B编码相反的解码表和解码器当前的运行不一致值。解码器将接收到的码组与两个表选择的列中的码组做比较。如果找到匹配,码组就被解码为相应字符;如果找不到匹配,码组就被解码为一个以某种方式标记为无效的字符。在解码每个码组后,解码器接着应根据运行不一致规则使用解码得到的新码组更新解码器的运行不一致值。
下表是一部分数据字符(Dx.y)的解码表,完整的解码表请查看参考文献1的492页到499页
下表是12个特殊字符(Kx.y)的解码表
Comma是8B/10B编解码中非常重要的一个单元,它只有7个bit,接收链路可以利用Comma实现码组的边界对齐。8B/10B中一共定义了两种Comma,分别为0b0011111(Comma+)和0b1100000(Comma-)。这两组Comma分别对应特殊码组/K28.1/,/K28.5/和/K28.7/的abcdeif位。当码组转化完毕以后,在没有传输错误发生的情况下,Comma不可能出现在码组中的任何位置,也不可能在两个相邻码组的边界产生,但下面一种情况例外:
当特殊码组/K28.7/后面传输的数据码组是/D3.y/,/D11.y/,/D12.y/,/D19.y/,/D20.y/,/D28.y/和/K28.y/(y的取值范围是0~7的整数)中的任意一个时,有可能导致comma在两个码组的边界产生(取决于运行不一致的值)。如果在两个码组的边界产生了comma,那么接收链路就有可能改变10-bit码组的对齐位置。因此,特殊码组/K28.7/仅仅用作测试或者诊断的目的。
2.9 特殊字符与纵列
下表定义了RapidIO串行物理层中的特殊字符与纵列,使用特殊字符可以完成以下功能:
1、 逐通道对齐码组(10位)边界。
2、 对齐通过四个通道的接收数据流
3、 标记IDLE2 Sequence 中CS域的起始位置(CS = Command and Status)
4、 接收者和发送者间的时钟速率补偿
5、 控制符号界定
下面对上表中的各个特殊字符与码组的功能进行分别说明:
包分界控制符号(/PD/):
PD和/PD/分别是K28.3字符和/K28.3/码组的别名,用于定界包含包定界符的控制符号的开始
控制符号的开始(/SC/):
SC和/SC/分别是K28.0字符和/K28.0/码组的别名,用于定界不包含包定界符的控制符号的开始
同步(/K/):
K和/K/分别是K28.5字符和/K28.5/码组的别名,空闲序列使用该字符或码组向接收者提供接收者需要获得并维持的位和10位码组的边界同步信息。选用/K28.5/码组作为同步字符的原因如下:
1、 该码组的“abcdeif”位中包含Comma序列。Comma序列可在码组比特流中轻易找到并标记码组边界
2、 “ghj”位提供了最大数量的位跳变(即101或010)
略过(/R/)
R和/R/分别是K29.7字符和/K29.7/码组的别名。它们在空闲序列和时钟补偿序列中使用
对齐(/A/)
A和/A/分别是K27.7字符和/K27.7/码组的别名。它们在空闲序列中使用并用于对齐4x通道。
标记(/M/)
M和/M/分别是K28.1字符和/K28.1/码组的别名。它们在空闲序列2(Idle Sequence 2)中使用并给接收链路提供保持10位码组边界同步的信息,同时标记空闲帧中CS域的位置。
||K||,||R||,||A||,||M||,||I||
||K||,||R||,||A||,||M||,||I||分别代表四通道情况下的特殊字符,含义与上面对应的字符含义相同。
三、使用串行物理层
了解组成串行物理层包头的位、用于管理端口间通信的控制符号和使用8B/10B编码在同一信号中传送时钟和DC平衡数据的比特流编码技术后,现在我们可以研究链路在两个端点间发送数据的实际工作机制了。
3.1 端口初始化过程
端口初始化是RapidIO用来初始化和同步一对通信端口的过程。这个过程包括检测链路的另一端是否存在一个链路对象、建立位同步并对齐码组边界以及在端口能同时支持1x和4x模式(1x/4x端口)情况下,发现链路对象是否能支持4x操作模式并选择1x或4x操作模式,如果选择1x模式,则选择通道0或者通道2作为链路接收通道。
若干状态机控制了初始化过程。RapidIO规范详细的描述了状态机的结构。状态机的数量和类型取决于端口仅支持1x模式(1x端口)还是同时支持1x和4x模式(1x/4x端口)。在两种情况下都有一个主状态机和一个或多个次状态机。使用多个状态机使整体设计更为简化。正如可以预期的那样,1x端口的初始化过程比1x/4x端口的初始化过程简单;1x端口的初始化过程使1x/4x端口初始化过程的子集。
3.2 包交换协议
一旦端口初始化完成,就可以开始包的交换。已经定义了一个协议用于两个串行RapidIO端点之间的包通信。使用控制符号管理通过链路的包流。包由控制符号定界和确认。错误情况也可以通过控制符号通信。控制符号还用于支持流量控制协议。
控制符号:
控制符号是由串行链路连接的端口所使用的消息部分。控制符号用于链路维护、包定界、包确认,错误报告和错误恢复。
发送时控制符号由一个单独的8B/10B特殊(控制)字符定界。控制字符标记控制符号的开始并紧靠在控制符号的首位之前。为了通道分段(如果可用)和8B/10B编码,在将控制符号传递到PCS子层前将用于定界控制的特殊字符加入控制符号。因为短控制符号的长度是固定的24位,所以控制符号不需要尾部定界符。定界符和控制符号组合在一起,称为定界控制符号。
使用两种特殊字符中的一种定界控制符号。如果控制符号包含一个包定界符,就使用专用字符PD(K28.3 )。如果控制符号不包含包定界符,就使用专用字符SC(K28.0)。如此使用特殊字符向接收者提供了一个控制符号内容的“预警(Early Warning)”信号。
任何不包含包定界符的控制符号都可被嵌入到包中。嵌入的控制符号可能包含任何已定义的stype0编码和“多播事件”或“NOP”之类的stype1编码。不能将stype1作为包开始、包结束、消除、从重传处重启或链路请求控制符号嵌入到包中,因为它们会终止包。
在链路嵌入控制符号的方式和程度会影响链路和系统的性能。例如,嵌入多播事件控制符号允许它们的传播延时和通过交换机处理部件的时延变化最小(某些多播事件应用迫切需要嵌入多播事件控制符号)。另一方面,嵌入所有的包确认控制符号而不是把它们尽可能多地与包定界控制符号组合的做法减少了可用于包传送的链路带宽,可能是我们所不希望的。
包:
串行 RapidIO包在发送时由控制符号进行定界。由于包长度是变化的,所以同时需要包开始和包结束定界符。标记包的结束(包终止)的控制符号跟在包尾或嵌入的控制符号的后面。
用来进行包定界的控制符号如下:
1、 包开始
2、 包结束
3、 消除
4、 从重传处重启
5、 任意链路请求
由包开始控制符号标记包的开始。
包以下列三种方式之一终止:
1、 用包结束控制符号标记包尾。
2、 用包开始控制符号标记包尾,包开始控制符号标记新包的开始。
3、 用从重传处重启、消除或链路请求控制符号取消包。
每个包都需要一个标识符来唯一的标识它的确认控制符号。该标识符就是RapidIO包格式中的ackID字段,对RapidIO串行物理层的包来说,ackID字段的长度是5位,它允许在相邻处理部件间存在1到32个未完成的待确认的请求或响应包,但只允许同时存在最多31个未完成的待确认包。
复位后分配给ackID 的初始值是 0b00000。ackID的后续值是连续分配的(按数字顺序增加,达到最大数时返回到0),用来指示包的发送次序。确认本身由控制符号组成。
串行RapidIO链路协议使用重传从包发送错误中恢复。为支持包重传,发送端口保存每个通过串行链路传输的包的一个副本,直到收到接收端口发出的接收包的包确认控制符号或者直到端口判定该包已经遇到了不可恢复的错误情况。包确认控制符号指示接收端口已收到包并且没有检测到错误,同时已经接收对该包进行处理的责任。除了可能的错误,如果端口在接收到的包的优先级上没有足够的可用输入缓冲区空间,则端口也可能拒绝包。
产生包的端点处理部件为每个包分配一个优先级。该优先级包含在包的物理层字段优先级(PRIO)中并有四个可能的值: 0、1、2和3。包的优先级随优先级值的增加而提高;最低优先级为 0; 最高优先级为3。使用包优先级的目的有多个, 包括事务排序和死锁预防。
3.3 空闲序列
空闲序列是一个码组序列。当链路无需发送包或控制符号时,在每个串行链路协议(LP- Serial)链路通道上连续地发送空闲序列。空闲序列不能插入到包中。作为端口初始化过程的一部分, 在每个通道上传送空闲序列。这是端口初始化协议所需要的。
1x空闲序列由码组/K/、/A/、/R/ (空闲码组)构成的伪随机序列组成,由操作模式为1x的端口使用。4x空闲序列由纵列llKll、llAll、llRll(空闲纵列)构成的伪随机序列组成,由操作模式为4x的端口使用。协议对空闲序列长度没有要求。空闲序列可以是任意长度。
空闲序列中对码组的伪随机选择导致空闲序列的频谱中没有离散谱线。这可以最小化长空闲序列产生的电磁干扰(EMI)。
空闲序列分为空闲序列1(Idle1 Sequence)和空闲序列2(Idle2 Sequence)。
空闲序列1(Idle1 Sequence):
空闲序列1是一组由A,K,R特殊字符组成的序列,这组序列在串行链路上发送之前必须先经过8B/10B编码器进行编码产生对应的10-bit特殊码组/A/,/K/,/R/之后才能在链路上发送。
产生空闲序列1推荐使用至少7阶的本原多项式来产生相应的伪随机序列,例如:
X7+X6+1 和 X7+X3+1
就是两个7阶本原多项式的例子,可以利用这两个多项式的任意一个作为空闲序列1的伪随机序列生成多项式。下图是一个产生空闲序列1伪随机序列的框图
空闲序列2(Idle2 Sequence):
空闲序列2是一组由数据字符和特殊字符A,K,M,R组成的序列。这组序列在串行链路上发送之前必须先经过8B/10B编码器进行编码产生对应的10-bit特殊码组/A/,/K/,/M/和/R/之后才能在链路上发送。
空闲序列2的空闲帧的结构如下所示
它包括509-515个字符的随机数据域,8个字符的CS域标记以及32个字符的编码CS域。其中随机数据域包含伪随机数据字符和A、M特殊字符。CS域标记字段指明了命令和状态(CS = Command and Status)域的起始位置,并且提供了链路极性,链路宽度和链路号等信息。CS域给端口提供了一些状态信息和控制发送端口的预加重设置。
空闲序列的选择:
当串行链路每个通道的线速率在5.5Gbps以上时只能选择空闲序列2(IDLE2 Sequence),当每通道的线速率低于5.5Gbps时既可以选择空闲序列1(IDLE1 Sequence),也可以选择空闲序列2(IDLE2 Sequence)。至于在端口初始化的过程中选择空闲序列的算法请查看参考文献1的516页。
关于空闲序列的产生以及更加详细的介绍请查看参考文献1的503页到517页。
3.4 1x串行RapidIO链路上的数据流
1x串行RapidIO端口通过8B/10B编码器编码从上层(逻辑层和传输层)依次传送过来的分界控制符号与包的字符流,当控制符号与包不可获得时,空闲序列将被送入8B/10B编码器进行编码并发送,以保证整个收发链路处于同步状态。
对于接收链路来说,10-bit的码组流将送入8B/10B解码器进行解码,然后把解码得到的控制符号与包按照接收的顺序依次传入上层(逻辑层与传输层)。
如果链路的空闲序列为空闲序列2,控制符号和包数据字符在发送之前需要扰码,接收之前需要解扰。
下图显示了短控制符号在1x串行RapidIO链路上的编码和发送顺序示意图
下图显示了RapidIO包在1x串行RapidIO链路上的编码和发送顺序示意图
下图显示了一个在1x串行链路上传送控制符号、包和空闲序列的实例。发送的第一个码组是代表控制符号开始的/SC/, 随后是三个包含24位控制符号信息的数据码组。该控制符号的功能没有显示。控制符号后面跟着四个空闲字符。这四个空闲字符之后是一个定界包开始的/PD/码组。后面三个码组包含的控制符号信息代表包定界符号信息。码组表示RapidIO包紧跟在该符号信息之后。包长度为28字节。包之后是一个包结束控制符号,这个包结束控制符号之后是另一个包开始控制符号和另一个数据包。在从重传处重启控制符号终止包前,该包能够传输16字节信息。该包还插入了另外两个控制符号, 这两个控制符号分别插在数据流中的第8个数据字节和第12个数据字节之后。在RapidIO协议中,几乎可在任意时刻将控制符号插入到通信信道中, 无需等到包发送完全完成即可插入控制符号。在发送从重传处重启控制符号之后, 另一个包被发送到链路上。该包正确地完成后链路成为空闲状态。
3.5 4x串行RapidIO链路上的数据流
在4x操作模式下的串行端口在8B/10B编码之前按如下方式将定界控制符号和组成包的字符流分段到四个通道上。
包和定界控制待号将被从通道0开始分段到四个通道上。每个包的第一个字符或定界控制符号被放到通道0,第二个字符被放到通道1 ,第三个字符被放到通道2,第四个字符被放到通道3。第五个字符又被放到通道0,如此循环。
由于控制符号的长度是固定的24位并且要求包的长度必须是32位的整数倍, 分段后定界控制符号的码组总被放到通道0。所有包将形成整数个连续的纵列。在分段后, 4个字符流的每一个流都被独立地进行8B/10B编码和发送。
在接收方对每个通道进行解码。解码后, 字符流对齐这4个通道。作为4x空闲序列的一部分发送的llAll纵列提供执行对齐所需的信息。在对齐之后,纵列被合并为单独的字符流, 然后被传递到上层 。
通道对齐过程消除了通道间的偏移,这样在合并(destriping)后接收到的字符流中字符的顺序与在分段和发送前字符的顺序相同。 由于||A||纵列之间最小的非llAll纵列数量为16, 所以可以明确修正的最大通道偏移是在一个通道上传送7个码组的时间 。下图显示了一个在4x链路上传送空闲序列、包和定界控制符号的实例。 该实例使用的包序列与1x链路的实例相同。
四、总结
RapidIO串行物理层的8B/10B编解码原理与包传输流程相关的内容到此介绍完毕,更多详细的内容请阅读参考文献1的第485页到560页。为了便于大家以后的查阅,下面把控制符号与K码相关的定义全部列到一起。
注意:上图列出的是短控制符号的定义。长控制符号总长度为48位而短控制符号的总长度为24位。
至此,整个RapidIO理论部分全部介绍完毕,后面会继续写Xilinx RapidIO核的相关内容。
五、参考资料
1、RapidIO™ Interconnect Specification,下载链接 https://pan.baidu.com/s/1ek-3AAhetLAcxTuOE2IyMg
2、RapidIO嵌入式系统互连,电子工业出版社
3、Xilinx的pg007_srio_gen2,下载地址 https://china.xilinx.com/support/documentation/ip_documentation/srio_gen2/v4_0/pg007_srio_gen2.pdf