FPGA高速接口设计之SpaceWire——总线协议概述

目录

一、SpaceWire总线协议概述

1、物理层

2、信号层

2.1 低电压差分信号(LVDS)技术

2.2 数据-滤波(DS)编码技术

3. 字符层

3.1 控制字符

3.2 数据字符

3.3 时间接口

4 交换层

4.1 概述

4.2 链路初始化

4.3 链路状态

4.4 流量控制

4.5 发送字符的优先级

4.6链路错误及恢复

5 数据包层

6 网络层

6.1 SpaceWire网络结构

6.2 SpaceWire路由机制

7 同步与容错

7.1  SpaceWire时间码

7.2 SpaceWire 接口错误恢复机制


一、SpaceWire总线协议概述

    SpaceWire总线(ECSS-E-ST-50-12C标准)是一种高速、双向、全双工、点对点的串行总线,其传输速率为2Mbps~400Mbps。

    根据协议标准规定,SpaceWire按照功能划分为六层,分别是物理层、信号层、字符层、交换层、数据包层和网络层,对应OSI参考模型中的物理层和数据链路层,与OSI模型各层间的关系如图1所示。

图1 SpaceWire协议与OSI模型对应关系

    随着越来越多的传输层协议加入了SpaceWire协议簇,SpaceWire实现的功能也是越来越完备了。

1、物理层

    ECSS-E-50-12 标准物理层包括电缆,连接,电缆组和 PCB 板:

    SpaceWire 电缆由四对双绞线组成,每对双绞线外部都有屏蔽层,整体外部也设有屏蔽层。为了在十米甚至十米以上的距离得到高信号传输率,其电缆横截面积如图2所示。SpaceWrie 具有以下特点:

  • 特征阻抗与线终点阻抗相匹配;
  • 在差分对信号之间和DS对之间有低信号歪斜;
  • 低信号衰减;
  • 良好的电磁兼容性。

    

图2 SpaceWire电缆内部结构图

    SpaceWire 连接器采用的是 9 针 D 型连接器,其中 8 根信号线,1 根是地线。8根信号线即数据-选通(Data-Strobe)编码中的四对差分信号线。连接器各引脚的信号定义如图 3 所示。

图3 SpaceWire连接器信号定义

2、信号层

2.1 低电压差分信号(LVDS)技术

    ECSS-E-50-12 标准信号层主要包括 LVDS 技术与 DS 编码技术。SpaceWire 的数据传输采用 LVDS 技术,其电气特性在 ANSI/TIA/EIA-644中有详细定义。LVDS 传输有如下优点:

  • 驱动电流不变,采用了恒定3.5mA的电流源,使传输更加稳定;
  • 驱动端和接收端对外表现高阻抗,这样会减少因两端地线电压不同而产生的影响;
  • 两根正负电缆线紧缠在一起,减少了串扰噪声;
  • 电磁产生少,因为小的等量电流会使产生的电磁场相互抵消;
  • 传输功耗低;
  • 时序定位精确,差分信号开关变化位于两信号的交点。

2.2 数据-滤波(DS)编码技术

SpaceWire标准中采用数据-选通(Data-Strobe)编码方案。即将时钟和数据共同编码成选通信号,在接收端对这两个信号进行简单的异或,即可恢复出时钟信号。在数据传输过程中,如果Data信号连续两个bit的值不变,那么Strobe信号的值将在第二个时钟周期内发生反转,否则Strobe信号在这段时间保持不变。

SpaceWire链路包括两对差分信号,一对在一个方向上传输D和S信号,另一对在相反方向传输D和S信号。每个双向链路总共需要八条电线。DS编码的逻辑结构图可由下图表示:

图4 DS编码逻辑图

当Reset信号为1时,Data和Strobe均要复位为0。经过编码输出的Data信号要比其输入延迟3个时钟周期;只有在连续两个时钟周期的时间范围内Data 信号相同的情况下Strobe信号才会在第二个时钟到来时发生翻转,因此在相邻两个时钟内Data和Strobe中只有一个信号会发生变化,图5是NULL字符的DS编码信号。

图5 NULL字符的DS编码形式

 

下面归纳总结了DS编码的性质和逻辑关系:

①当reset信号置位时,Data信号和Strobe信号都需要复位。可表达为:若某时刻reset值为1,那么此时的Dataout和Strobe都为0;

②如果3 个时钟周期内没有有效的复位信号到达,那么Data 信号输出的值等于3个时钟周期之前其输入的值。可表达为:如果 reset 信号的值在 t +1 或者 t +2 或者t+3时值为1,那么dataout在t+3时为0,否则它等于datain在t时刻的值;

③在没有有效复位信号到达的情况下,如果相邻两个时刻的 Data 信号值相同,则此时的 Strobe 信号就要发生改变,否则它的值保持不变。可以表达为: 若 reset 信号的值在 t + 1 时刻为1,那么strobe在t +1时刻为0,否则,如果dataout 在t +1 和 t 时刻的值相同, t +1 时刻的 strobe 就变为它在 t 时刻的相反值,否则它保持t时刻的值不发生变化。

3. 字符层

SpaceWire协议中共定义了两种字符类型:控制字符和数据字符。

3.1 控制字符

控制字符包含两个控制位。每个控制字符分别由奇偶校验位,数据控制标识以及两个控制位构成。数据控制标识置1时代表当前字符为控制字符。控制字符分为四种,其中一个控制字符表示转义码(ESC)。它可以用来形成控制码。有两个控制码已经被确定并且有效,它们是NULL和时间码。ESC和流控制令牌(FCT)共同形成NULL,控制码中间的奇偶校验位(P)设为零。只要链路没有发送数据或控制令牌,就发送NULL使链路保持活动并支持链路断开检测。时间控制码(Time-Code)应由ESC后跟一个数据字符形成,用于分配系统时间信息和时间码分配的同步控制标志。时间码中间的奇偶校验位(P)为1。时间信息的6位应保存在时间码的最低有效位(T0-T5)中,而最高有效位(T6,T7)应包含与时间码等时分布的控制标志。这两个控制标志被保留供将来使用,此时可都设置为零。

图6 控制字符结构

 

3.2 数据字符

每个数据字符由一个奇偶校验位,一个数据控制标识以及八位数据组成。如图7所示,传输数据时应先发送八个数据位中的最低有效位(LSB)。奇偶校验位涵盖的范围包含前一个数据字符的8个数据位或控制字符的后2位,以及当前字符的奇偶校验位和数据控制标志,由图8可以更直观的理解。由于协议中要求做奇校验检测,因此覆盖区中的1的总个数是奇数。数据控制标识此时要设置为0,代表当前为数据字符。

图7 数据字符

 

图8 SpaceWire 字符层奇偶校验范围

当主机的发送和接收数据接口包含8个数据位和一个控制标志时,应使用表1中给出的编码。即,控制标志设置为1且数据的最低有效位设置为0时表示EOP,控制标志设置为1且数据的最低有效位设置为1时表示EEP。这可以防止发送器被要求发送无效的控制代码。

表1 主机系统的发送/接收端接口编码

标志位

数据位

含义

0

xxxxxxxx

8bit数据

1

xxxxxxx0

EOP

1

xxxxxxx1

EEP

EEP可以写入发送器接口时要注意:SpaceWire节点是数据包的来源,通常不会发送错误的数据包(用终止符表示EEP),因此通常不需要将EEP写入发送器接口, 除非在传输分组期间节点中发生了一些异常。 根据协议中的规定,SpaceWire路由器要转发有错误的数据包(即由EEP终止的数据包),因此在路由器情况下,所有EEP都应写入发送器接口。

对于两个控制代码(EOP和EEP),由于只对最低有效位进行解码,因此应做以下设置:①在写入发送接口时,将其余数据位置零。 ②接收时,设置控制位时将7个高有效位的数据位设置为零。

3.3 时间接口

主系统的时间接口应包括两个信号,TICK_IN和TICK_OUT,一个六位时间输出端口,一个六位时间输入端口,一个两位控制标志输入端口和一个两位控制标志输出端口。当主机置位TICK_IN信号并且此时链路处于Run状态时,发送器完成了当前的发送任务后,要立刻发送时间码,若时间码有效,且链路处于运行状态,TICK_OUT就会被置为1。

为了防止重复的时间码在链路上循环传输,SpaceWire网络里要设置一个主时间参考,也就是说只能有一个节点的TICK_IN是活动的。

4 交换层

4.1 概述

在交换层里,数据字符和控制字符又被分成了连接字符(L-Char)和正常字符(N-Char)。连接字符包括流量控制令牌(FCT)和转义字符(ESC),它们不能被传递到数据包层仅在交换层中使用。转义字符包括空字符NULL(ESC+FCT)和时间码(ESC+数据字符)。正常字符包括数据字符和数据包结束标志(EOP和EEP),它们能够被传递到数据包层。也就是说说只有N-Char才能从主机接口传递到链路再进行后续的传输。由此我们可以看出链路上在传输过程中交织着连接字符(L-Char)和正常字符(N-Char),但只能将正常字符传送到接收端的主机接口。

在上述过程中接收到的字符应先进行奇偶校验检查,待确认后然后才能进行其他活动。

4.2 链路初始化

一般情况下,链路在复位后,会始终处在复位状态,这一过程会一直持续,直到主机系统发出命令,使链路重新启动然后尝试与另一端的链路接口建立连接。链路的双方要首先经过握手机制之后才能建立起连接,确保了链路的两端都能够正常地发送、接收。首先链路的两端均要发送一个NULL,在接收到NULL之后,接口会发送一个流量控制令牌FCT并等待接收对方回复的FCT。接口在接收到一个NULL字符以前不能发送FCT,因此在接收到了NULL后若又收到了FCT则表示该链路的另一端已成功接收到了本端口之前发送过去的NULL并完成连接。图9描述了链路建立初始化的过程:

图9 链路初始化过程

 

4.3 链路状态

链路可以处于有Reset、ErrorWait、Ready、Started、Connecting 和 Run 状态,各状态可按照图10的关系进行相互转移:

图10 链路状态转移图

1、Reset(ErrorReset)状态:

在系统复位或链接初始化期间出现错误时链路进入该状态。此时所有模块均要恢复成复位状态。只有当复位信号归零后,链路才会启动计时器,6.4μs过后即可进入ErrorWait状态。

2、ErrorWait状态

只能从复位状态转移而来,在此状态下,启用接收器并重置发射器,此状态接口开始等待接收NULL字符,并时刻检测链路是否断开。若接收到了NULL字符,则计时器归零重新开始计时,待计时到12.8μs后,那么链路就会进入Ready状态,若在此期间接口接收到除NULL以外的其他字符,则转移到复位状态。

3、Ready状态

只能从ErrorWait状态转移到达Ready状态,此时只有等待链路使能后,才能继续转移到Started状态。如果在该状态下出现断开连接错误,或者当接收器接收到了NULL字符以外的字符时,链路复位。

4、Started状态

链路在进入到Started状态后发送器开始发送NULL以试图与另一端建立连接。若接口接收到了一个NULL,链路转移到Connecting状态。

5、Connecting状态

此状态下发送器会发送FCT和NULL并启动接收器,如果收到了FCT,那么链路会进入Run状态。若链路出错,或接收到了除了空字符和FCT以外的其他字符,那么状态机将会返回到初始状态。

6、Run状态

Run状态应该从Connecting状态进入。在该状态下,接收器被启动并且发射器开始发送时间码,FCT,N-Char和NULL。如果在该状态下检测到错误,则链路转移到ErrorReset状态。

4.4 流量控制

为了避免主机接收缓冲区溢出和后面的数据丢失,应该使用从链路的一端(端点A)到另一端(端点B)发送的流控制令牌(FCT)来控制链路上的数据流,来表示端点A已准备好接收更多的数据。通过链路接口发出的FCT字符表示在接收缓冲区内此时有八个N-Char的空间可以用来存放数据。此时如果对方接口表示接收缓冲区有空间,则本节点接口就能够开始发送N-Char(数据字符、EOP或EEP)。如果B端接收到了一个FCT,那么其节点接口内的发送器可以发送8个N-Char。如果接收缓冲区中空间充足,则可以发送多个FCT(接收缓冲区中的每8个空间对应一个FCT)。同理,如果接收到了多个FCT,就表示在接收缓冲器中存在相应数量的空间用来存放数据,比如若有四个FCT则表示有32个N-Char的空间。

发送器应按照以下的信用计数方式来保持发送的N-Chars的数量:① 每当链路接口接收到一个FCT时,其发射机将信用计数增加8。② 每当发送器发送一个N-Char,它就将信用计数减1。发射器在接收到FCT之前不能传输任何N-Char。

如果信用计数降到0,那么发送器停止发送N-Char,只有在收到新的FCT之后将信用计数增加到八时才能恢复发送。如果在信用计数达到或接近最大值(与最大值相差小于8)时收到一个FCT,则信用计数不会再增加。信用计数最多可以设置为56(即7个FCT对应的空间大小)。

同时,发送器内设置另外一个计数器来记录本节点可以接收的N-Char数量。节点每发送一个FCT,该计数器数值就加8,而在节点接收到了一个N-Char后其值要相应的减少1。同样的,该计数器的上限为56,超过48时节点则不能再向其它节点发送FCT。

4.5 发送字符的优先级

字符发送的优先级,按下序递减:①时间码;②FCT; ③N‐Char;④NULL。若主机命令此时发送时间码或FCT,那么发送器在完成当前发送任务后应立刻发送时间码或FCT;若主机未要求发送时间码或FCT,此时又有数据需要进行传输且信用计数不为零,那么发送器便开始发送N-Char;若主机没有要求发送时间码或FCT,发送器便会通过接连不断地发送NULL,使链路保持活跃。

4.6链路错误及恢复

1、检测断开连接错误:若接收到一个数据位后850ns内未收到新的数据位时即判断为断开连接。

2、检测奇偶校验错误:由于数据或控制字符的奇偶校验位包含在下一个字符中,因此在发送下一个字符时会检测数据或控制字符中是否出现的奇偶校验错误。

3、链路错误恢复:发生错误或重置后,链路则使用“静默交换”协议重新同步并重新启动。链接的结束、重置或发生错误时,停止传输。这时链路的另一端会被检测到断开,并且该端也停止传输。第一条链路将其输入和输出重置为6.4μs,来确保另一端检测到断开。另一端在停止传输后也要等待6.4μs。然后,将每个链路开始发送之前要继续等待12.8μs。这段时间足够保证链路两端的接收器都准备好接收字符。链路两端经过握手机制重新建立连接并保证正确的字符同步。

链路恢复过程可由下图11表示:

图11 链路重启

 

5 数据包层

数据包层定义了如何将数据封装在数据包中并从数据源传输到目的地。SpaceWire数据包有目的地址、载荷和包结束标志(EOP 或 EEP)三个组成部分。它的目的地址是由目的地标识符(dest_id)组成的,其数量可以为0或大于等于1,即:<目的地址> = <dest_id1> <dest_id2>0<dest_idN>。目的地清单中目的地标识符为零的情况(即目的地清单为空)时支持只是从源到目的地的单一点到点链路的网络。目的地列表中的一个或多个目的地标识符的情况目的是在支持通过网络路由分组。数据包标记的两端被定义为:①EOP:正常包结束标记;②EEP:数据包错误结束标记,表示由于链路出错误而提早结束的数据包。SpaceWire数据包结构可由下图2-10表示:

 

表2 SpaceWire数据包结构

Destination Address

 

Cargo

 

End of Packet

由于没有start_of_packet标记,因此在end_of_packet标记(EOP或EEP)之后的第一个数据字符被视为下一个数据包的开始。数据包层协议通过虫洞路由交换机提供对数据包路由的支持。

6 网络层

6.1 SpaceWire网络结构

网络层定义了什么是SpaceWire网络,描述了其组成部分,解释了数据包如何传输,并且详细说明了错误恢复的方式。SpaceWire网络由许多由SpaceWire路由交换机互连的SpaceWire节点组成。SpaceWire节点是数据包的源头和目的地,为应用提供了接口。SpaceWire各个节点可以通过SpaceWire链路直接相连,也可以通使用SpaceWire路由交换机互连,以此实现节点和路由交换机之间的连接。SpaceWire网络采用了是动态路由方式,路由器要根据数据包头的地址信息来进行寻址。

6.2 SpaceWire路由机制

1、虫洞路由

SpaceWire 网络层中采用了虫洞路由的机制。虫洞路由是数据包进行路由的一种特殊方式,它可以节约路由器的存储空间。每个数据包都包含一个包头,该包头将目的节点地址保存为网络的路由或目标节点的标识。只要接收到数据包的包头,交换机就会通过查找目的地址来选择传输端口。如果此时该输出端口空闲,那么会在将数据包传送到该端口后将其被标记为繁忙,交换机在检测到数据包结束标志时代表数据包的最后一个字符传输完成。与传统的存储转发技术相比,虫洞路由减少了每个交换机所需使用的缓存量,而存储转发技术要在将数据包发送出交换机之前先接收并存储整个数据包。

虫洞路由原理可由下图12表示:

图12 虫洞路由机制

2、虚通道技术

    不同来源和不同目的地的数据包可通过单个数据链路进行路由。每个源 - 目的地对形成了由链路和路由交换机组成的的物理网络虚通道。这个概念可以在源节点和目的地节点内扩展。例如:处理器上可能有多个任务正在运行。这些任务可以向网络中其他处理器上运行的其他任务发送信息或从其他任务接收信息。当数据包到达目标节点时,可以检查它的包头(第一个数据字符)来查看它将用于哪项任务。剥离包头并将数据包放入目标任务可以访问的缓冲区中。

7 同步与容错

7.1  SpaceWire时间码

    SpaceWire的作用是为SpaceWire网络分配系统时间,它由一个ESC字符后面加上一个数据字符构成,其中六位用来保存系统时间并且还包含两个保留位。主机的时间接口包含两个信号,TICK_IN和TICK_OUT,一个六位时间输出端口,一个六位时间输入端口,一个两位的控制标志输入端口和一个两位的控制标志输出端口。当链路另一端的链路接口接收到时间码时,它应该用新的时间更新其关联的时间计数器并置位TICK_OUT输出信号,然后将时间码中的两个控制标志的值复制到在控制标志输出端口。新的时间应该比时间计数器当前的时间值多1。收到的时间码只有在不小于当前时间值时才会判断为有效。如果一个链路接口接收到不是比当前时间多1 的时间码时,时间计数器也会更新其时间,但是不会置位TICK_OUT输出信号。直到收到一个有效的时间码之后,才会恢复正常传播。这样可以防止在网络中循环传播重复的时间码。

7.2 SpaceWire 接口错误恢复机制

1、交换层的错误检测

SpaceWire接口的中央控制元件是一台状态机。它是外部配置的,并可根据需要启用发送器和接收器。其主要任务是在接收方报告错误后建立连接并重新建立连接[16]。其中交换层会出现的错误如下:

①断开错误:当D或S线上的一次转换时间长度超过850 ns时判断为断开错误。链路的一端被禁用或链路物理断开都可能会导致该错误。

②奇偶校验错误:由接收器根据奇偶校验位进行判断。

③转义错误:接收器在接收到第一个NULL后启用转义错误检测。若接收到一个ESC后跟一个EOP或EEP则表示一个无效序列,应作为转义错误记录。

④字符顺序错误:由接口中的链路状态机进行检测,当接口发送一个NULL前收到了一个FCT,则发生错误,而N-Char只能在收到FCT之后进行发送,否则会标记出错。

⑤信用错误:由接收端进行检测。当主机不期望更多数据(即要求发送的八个N-Char和随后的FCT要求的N-Char均已收到)时又接收到数据, 则发生信用错误。

2、错误恢复

SpaceWire协议已经定义了检测临时故障并从中恢复的机制。如果在链路接口内检测到错误,则按以下流程进行恢复:

(1)检测错误(信用错误,奇偶校验错误,断开连接错误,转义错误,字符顺序错误)。

(2)断开链路链接。

(3)如果接收的前一个字符不是EOP,链路会在接收缓冲区内自动加上一个EEP(数据包的错误结束标志)。

(4)删除发送缓冲区中该数据包内的所有数据,直到检测到数据包结束标志EOP。

(5)重新建立连接。

(6)发送下一个数据包。

该过程可用图13来直观的表示:

图13 链路错误检测与恢复机制

 

猜你喜欢

转载自blog.csdn.net/d179212934/article/details/80287336