[FPGA22]IP核_Aurora 8B/10B

Aurora 8B/10B IP core

Aurora IP核简介

  • Aurora总线协议由Xilinx公司于2002年首次提出,是针对FPGA间的高速串行数据传输总线,主要应用于芯片之间的连接以及板对板或背板链路的连接。使用高速串行8B/10B协议,吞吐速度范围从480Mb/s至84.48Gb/s可选。可支持全双工或单工工作,可配置DRP/INIT时钟,
  • Aurora 帧可以是任何大小,并且可以随时中断。有效数据之间的差距字节自动用空闲填充,以保持锁定并防止过多电磁干扰。流量控制可用于降低传入数据的速率或通过该渠道发送简短的高优先级消息。流是单个无休止的帧。在没有数据的情况下,传输空闲以保持链接仍然有效。
  • FPGA之间通过Aurora 8B/10B IP核进行通信的示意图如下,通信的双方经过各自例化IP核,通过通道传输数据。

配置IP核

  1. 在Vivado的"IP Catalog"中搜索"Aurora",会出现"Aurora 8B10B"和"Aurora 64B66B",我们选择我们所需的 "Aurora 8B/10B"IP核
  2. 双击打开该IP,在"Component Name"中可以设置例化IP的名字,默认为"aurora_8b10b_0"
  3. 在"Lane Width"选项中,我们可以设置收发链路的位宽,可选择2Byte或者4Byte,即16位或32位
  4. 在"Line Rate"选项中,我们可以设置线传输速度,速度范围可配置为0.5-6.6(Gb/s),需要注意的是,该速度为串行链路的传输速度,由于采用了8B/10B编码,故实际数据传输速率因为线速度的0.8倍
  5. 在"Lanes"选项中,我们可以设置该IP核需要使用到的Lane数量,具体数量需根据实际的传输速率要求进行选择
  6. 在"Starting GT Quad"和"Starting GT Lane"选项中,可选择起始的"MGT Bank"以及每个"Bank"中的起始"Lane"
  7. 在"GT Refclk Selection"和"GT REFCLK(MHz)"选项中,可选择高速串行总线需要使用的时钟源以及时钟频率
  8. 在"INIT clk (MHz)"和"GT REFCLK"选项中,可设置初始化时钟频率。
  9. 在"Dataflow Mode"选项中,可配置该Aurora是使用单工发,单工收,还是全双工模式
  10. 在"Interface"选项中,可配置用户接口为Framing或Streaming模式,Framing接口采用AXI4协议,并包括发送接收用户帧所需要的信号,且__可进行流量控制__;Streaming模式允许在没有分隔符的情况下发送数据,操作更简单,且比Framing模式使用更少的资源,但__不可进行流量控制__。详细差异见后文。
  11. 在"Flow Control"选项中,可选择需要添加的流量控制接口类型。UFC(User flow control)用户流控制允许发送简短的高优先级消息;NFC(Native flow control)本地流量控制允许全双工收发器条件数据发送速率,立即模式(Immediate mode)允许将NFC控制代码插入到数据帧中,完成模式(completion mode)只允许在完整的数据帧之间插入NFC控制代码
  12. 在"Use Scrambler/Descrambler"选项可选择是否使用加/解扰器,加解扰公式为G(x)=X16+X5+X4+X3+1G(x)=X_16+X_5+X_4+X_3+1
  13. 在"Little Endian Support"选项可进行大小端的选择。所谓的小端,就是我们最常见的多位数据定义方式:[n:0] 左边是高位,右边是低位,符合Verilog编写习惯;大端反之,[n:0] 左边是低位,右边是高位。
  14. 在"Use CRC"选项可选择是否开启CRC校验,根据数据位宽为2Byte或4Byte,自动使用对应的CRC16或CRC32
  15. 在"Advanced"选项中,可选择与高速传输信道相关的一些参数设置
  16. 在"Shared Logic"选项卡中,可选择是将"Shared Logic"包含在IP核内,还是包含在Design中,如需要在一个工程中调用毒狗Aurora核时,可考虑选择分离Shared Logic

Framing

Framing接口模式

  • 发送数据时:
  1. 当s_axi_tx_tvalid和s_axi_tx_tready信号有效时,从s_axi_tx_tdata总线上的用户接口获取数据。
  2. 在Aurora 8B / 10B通道中的通道之间划分数据。
  3. 使用s_axi_tx_tvalid信号传输数据。 用户应用程序可以将s_axi_tx_tvalid置为无效以在该行上插入空闲字符(导致停顿或暂停)。
  4. 暂停数据(即插入空闲)(s_axi_tx_tvalid置为无效)。
  • 接受数据时:
  1. 检测并丢弃控制字节(空闲,时钟补偿,通道PDU(SCP)的开始,通道协议数据单元(ECPDU)的结束和PAD。
  2. 置位成帧信号(m_axi_rx_tlast),并指定最后一个数据拍子(m_axi_rx_tkeep)中的有效字节数。
  3. 从通道中恢复数据
  4. 通过置位m_axi_rx_tvalid信号来组装数据,以呈现给m_axi_rx_tdata总线上的用户接口。
  5. 注意:仅当同时声明s_axi_tx_tready和s_axi_tx_tvalid时,Aurora 8B / 10B内核才对数据采样(高)。

Framing帧格式

  • 典型的Framing帧格式如下图所示:
  • TX子模块通过TX接口将每个接收到的用户帧转换为Aurora 8B / 10B帧。 通过在帧的开头添加一个2字节的通道开始协议(SCP)代码组来指示帧的开始(SOF)。 帧的结尾(EOF)通过在帧的末尾添加2字节的通道结束协议(ECP)代码组来表示。 只要没有数据,就会插入空闲代码组。 代码组是8B / 10B编码的字节对,所有数据都作为代码组发送,因此具有奇数字节的用户帧在帧末尾附加了一个称为PAD的控制字符,以填充最终的代码组。
  • 用户应用程序通过操纵s_axi_tx_tvalid和s_axi_tx_tlast信号来控制通道帧长度。 Aurora 8B/10B核分别响应帧开始和帧结束有序集/ SCP /和/ ECP /。

Framing发送示例

无中断传输偶数个字节数据

  • 下图显示了在AXI4-Stream接口上进行简单数据传输的示例,该接口是n字节宽。在这种情况下,要发送的数据量为3n字节,因此需要三个数据节拍。拉高s_axi_tx_tready,表明AXI4-Stream接口是准备传输数据。用户应用程序在前n个字节期间拉高s_axi_tx_tvalid 以开始数据传输。
  • 由于/ SCP /放置在通道的前两个字节上,以指示帧的开始,然后,再在通道上传输数据字节。所以每个数据中的字节总是延迟两个字节的时钟才进行传输。
  • 为了结束数据传输,用户应拉高s_axi_tx_tlast,即表示最后一个数据字节,以及s_axi_tx_tkeep总线上的值。在这个例子中s_axi_tx_tkeep在波形中设置为N,用于表明在最后一个数据拍中直到第n个字节都是有效的。拉高s_axi_tx_tlast时,s_axi_tx_tready在下一个时钟周期无效,内核会使用数据流发送最终数据字节量和/ ECP /,指示结束的帧。s_axi_tx_tready在下一个周期重新置位,再次继续数据的传输。

无中断传输奇数个字节数据(填充字节PAD)

  • 下图显示了一个需要使用填充的(3n –1)字节数据传输的示例。根据协议要求,Aurora 8B/10B内核为具有奇数字节的帧添加了填充字符(PAD)。3n –1数据字节的传输需要两个完整的n字节数据字和一个长度小于n的数据字节。在此示例中,s_axi_tx_tkeep设置为N–1指示在最后一个数据字中n –1个为有效字节

有中断传输数据

  • 下图显示了如何在一帧中暂停数据传输。在此示例中,用户通过s_axi_tx_tvalid信号在前n个字节之后暂停数据流,使得传输暂停,暂停持续到s_axi_tx_tvalid再次被拉高。

传输具有时钟补偿的数据

  • Aurora 8B/10B内核在发送时会自动中断数据传输插入补偿序列。时钟补偿序列每通道每10000个字节会会产生额外12个字节的开销。
  • 由于需要每通道每10,000个字节进行时钟补偿(对于5,000个时钟,每通道2字节设计;2500个时钟(每通道4字节设计),您无法连续传输数据,也无法连续接收数据。在时钟补偿期间,数据传输暂停六个或三个时钟周期。

Framing接收示例

  • RX子模块没有用于用户数据的内置弹性缓冲区。故在RX的AXI4-Stream接口上,没有m_axi_rx_tready信号。用户无法通过AXI4-Stream水域上级数据进行流量控制,只可以通过Aurora可选的流量控制功能进行流量控制。
  • m_axi_rx_tvalid信号与每个帧的第一个字同时置位来自Aurora 8B / 10B内核。和发送端口类似,m_axi_rx_tlast在最后一个数据位时拉高,m_axi_rx_tkeep端口指示最后一位中的有效字节,m_axi_rx_tkeep信号仅在m_axi_rx_tlast拉高时有效。在帧期间,也可以随时将m_axi_rx_tvalid置为无效,暂停数据传输。

Streaming

Streaming接口模式

  • 相比于framing用户接口,Streaming用户接口简洁很多,发送端仅有三个信号,接收端两个。Streaming接口模式允许将Aurora 8B/10B通道用作管道。初始化之后,该通道始终可用于写入,但发送时钟补偿序列时除外。 核心数据传输符合AXI4-Stream协议。
  • 当s_axi_tx_tvalid置为无效时,字之间会创建间隙并保留间隙,除非正在发送时钟补偿序列。当数据到达Aurora 8B/10B通道的RX端时,它会显示在m_axi_rx_tdata总线上,并且会使m_axi_rx_tvalid有效。 数据必须立即读取或丢失。如果不可接受,则必须在RX接口上连接一个缓冲区以保存数据,直到可以使用为止。

Streaming发送示例

  • Aurora 8B/10B核通过置位s_axi_tx_tready表示已准备好传输数据。 一个周期之后,用户逻辑通过置位s_axi_tx_tdata总线和s_axi_tx_tvalid信号来表明已准备好传输数据。因为两个就绪信号都被拉高,所以数据D0从用户逻辑传输到Aurora 8B/10B核。 数据D1在下一个时钟周期传输。

Streaming接收示例

  • 对与Streaming接口的接收逻辑就更为的简单,只要m_axi_rx_tvalid有效,则m_axi_rx_tdata[0:(8n-1)]上的数据即为有效数据

用户流控制模式(UFC)

  • 当在使用Framing接口时,可使用两种流量控制接口,分别为用户流量控制(UFC)和本机流量控制(NFC)。用户流控制(UFC)容纳用于控制操作的高优先级消息。

UFC模式接口

  • 当在启用了UFC的情况下生成内核时,将创建UFC接口。TX端的UFC s_axi_ufc_tx_tvalid和s_axi_ufc_tx_tready端口启动UFC消息和3位s_axi_ufc_tx_tdata端口指定消息的长度。拉高s_axi_ufc_tx_tready时,s_axi_tx_tdata端口上的数据为视为UFC数据。
  • UFC接口的RX端由一组AXI4-Stream端口组成,这些端口允许UFC消息将被读取为框架。
  • UFC消息可以承载2到16之间的偶数个数据字节。用户应用程序通过设置s_axi_ufc_tx_tdata上的SIZE代码来指定消息的长度。
SIZE Field Contents UFC Message Size
000 2Byte
001 4Byte
010 6Byte
011 8Byte
100 10Byte
101 12Byte
110 14Byte
111 16Byte

UFC发送示例

传输单周期UFC消息

  • 单周期UFC消息的传输过程如图所示,在这在这种情况下,将在4字节接口上发送4字节消息。

传输多周期UFC消息

  • 多周期UFC消息的传输过程如图所示。

UFC接收示例

  • 当Aurora 8B/10B内核收到UFC消息时,它将数据传递给用户通过专用的UFC AXI4-Stream接口。数据显示在m_axi_ufc_rx_t数据端口;m_axi_ufc_rx_tvalid指示消息的开始data和m_axi_ufc_rx_tlast表示结束。m_axi_ufc_rx_tkeep用于显示在最后一个周期内m_axi_ufc_rx_tdata上有效字节的数量信息。

接收单周期UFC消息

  • 下图显示了具有4字节数据接口的Aurora 8B / 10B内核接收4字节UFC消息。通过m_axi_ufc_rx_tvalid和m_axi_ufc_rx_tlast的置高表示目前传输的UFC消息为单个周期帧。m_axi_ufc_rx_tkeep设置为4'hF,表示该帧的内容均为有效信息。

接收多周期UFC消息

  • 下图显示了具有4字节接口的Aurora 8B/10B核接收8字节信息。

本机流量控制模式(NFC)

  • 当在使用Framing接口时,可使用两种流量控制接口,分别为用户流量控制(UFC)和本机流量控制(NFC)。本机流量控制(NFC)调节全双工通道接收端的数据传输速率。

NFC模式接口

  • NFC模式允许接收者通过指定放置在数据流中的空字节的数量来控制接收数据的速率,甚至可以是通过要求发送器仅临时发送空闲(XOFF)来完全关闭。NFC通常用于防止FIFO溢出情况。
  • NFC接口包括一个请求端口(s_axi_nfc_tx_tvalid),一个确认端口(s_axi_nfc_tx_tready),和一个用于发送4位数据指定请求的空闲周期数的端口(s_axi_nfc_tx_tdata)。
s_axi_nfc_tx_tdata Idle Cycles Requested
0000 0 (XON)
0001 2
0010 4
0011 8
0100 16
0101 32
0110 64
0111 128
1000 256
1001 to 1110 Reserved
1111 Infinite (XOFF)
  • 拉高s_axi_nfc_tx_tvalid并将NFC代码写入s_axi_nfc_tx_tdata。NFC数值指示最小的空闲周期数。发送端会在其TX数据流中插入空闲信息。应保持s_axi_nfc_tx_tvalid和s_axi_nfc_tx_tdata的数值直到s_axi_nfc_tx_tready拉高。在发送NFC消息时无法同时传输数据。s_axi_tx_tready总是在一个周期后取消拉高。

NFC发送示例

  • 下图显示了向发送方发送了一次NFC消息

NFC接收示例

  • 下图显示了发送放接收到了NFC消息后,NFC消息的代码为0001,请求两个数据节拍空闲,发送方将s_axi_tx_tready置为无效,直到空闲时间满足接收方的NFC请求周期个数为止。如果选择的NFC模式为立即模式,则空闲数据会立刻插入;反之如果选择的NFC模式为完成模式,则会在帧与帧之间,插入空闲数据。

参考:
PG046-Aurora 8B/10B v11.1