点击进入高速收发器系列文章导航界面
前文讲解了Aurora 8B/10B协议的一些基础知识,本文对Xilinx的Aurora 8B/10B IP进行讲解,该IP在Aurora 8B/10B的基础之上还完成了字对齐等等操作,开放给用户的端口有axi_full或axi_stream两种格式。
相应的通道如下所示,与前文Aurora 8B/10B协议基本一致。
Aurora 8B/10B内核的构成如下图所示,包含全局逻辑、通道逻辑、发送用户端口、接收用户端口几部分。
通道逻辑(Lane Logic):每个GTX收发器由通道逻辑模块的一个实例驱动,该模块初始化每个单独的收发器并处理控制字符的编码和解码以及错误检测。
全局逻辑(Global Logic):执行通道初始化的绑定和验证阶段;在操作期间,该模块生成Aurora协议所需的随机空闲字符,并监控所有通道逻辑模块的错误。
RX用户接口(RX User Interface):将高速收发器接收通道接收的数据以axi接口形式输出给用户,并执行流量控制功能。
TX用户界面(TX User Interface):将用户待发送数据传输到高速收发器发送通道,并执行流量控制功能,该模块还控制时钟补偿(CC)字符的定期传输。
1、用户传输数据端口
下图是该IP支持的所有端口,大致可以分为6组。总线格式为[0:n]表示小端模式,格式为[n:0]表示大端模式。
Aurora 8B/10B顶层架构如下图所示,包括收发器以及控制逻辑和用户接口。该IP提供给用户两种接口,即帧接口和流接口。其中帧接口为axi4_Stream接口,而流接口只有数据和有效指示信号,没有掩码信号和最后字节指示信号。
下图表示开放给用户的数据接口默认以大端模式传输数据,首先发送高字节数据,最后发送低字节数据。
1.1、帧接口(Framing Interface)
帧接口的相关信号流向如下图所示,与AXI4-Stream接口信号基本一致,该接口可以传输任意字节数据。
上图相关信号的含义如下表所示,熟悉AXI4-Stream接口信号的可以忽略,只是注意输出端口不需要应答信号。
信号 | I/O | 含义 |
---|---|---|
s_axi_tx_tdata[0:(8n–1)]/s_axi_tx_tdata[(8n–1):0] | I | 待发送数据,根据IP设置不同,有大端和小端两种数据接口。 |
s_axi_tx_tready | O | 数据应答信号。 |
s_axi_tx_tlast | I | 高电平表示帧结束。 |
s_axi_tx_tkeep[0:(n–1)]/s_axi_tx_tkeep[(n–1):0] | I | 待发送数据掩码指示信号,低电平有效。 |
s_axi_tx_tvalid | I | 待发送数据有效指示信号。 |
m_axi_rx_tdata[0:8(n–1)]/m_axi_rx_tdata[8(n–1):0] | O | 接收数据。 |
m_axi_rx_tlast | O | 高电平表示接收数据帧结束。 |
m_axi_rx_tkeep[0:(n–1)]/m_axi_rx_tkeep[(n–1):0] | O | 接收数据掩码指示信号,低电平有效。 |
m_axi_rx_tvalid | O | 接收数据有效指示信号。 |
注意下图是Aurora 8B/10B协议的高速收发器传输数据的帧格式,在前文讲解Aurora 8B/10B协议时详细讲解过,注意SCP和ECP以字节为单位。因此接收用户数据之后,可能会像之前自定义PHY那样去对数据进行拼接,但是这些事情都是在Aurora 8B/10B IP内部完成的,用户不需要关心,只需要了解即可。
用户发送端口的时序如下图所示,待发送数据位宽为n字节,发送的数据量为3n字节,需要三个时钟传输。s_axi_tx_tready拉高表示AXI4_Steram接口已准备好接收数据。
起始位/SCP/放置在通道的前两个字节上,以指示帧的开始,然后前n–2个用户数据字节放在通道上。由于/SCP/需要偏移,每个用户数据的最后两个字节总是延迟一个周期,并在下一时钟的前两个字节发送。
s_axi_tx_tlast拉高表示结束用户数据传输,通过s_axi_tx_tkeep总线上的相应值,实现任意字节的传输。下图中的s_axi_tx_tkeep设置为N,表示最后一个数据拍中的所有字节都有效。
当s_axi_tx_tlast拉高时,s_axi_tx_tready在下一个时钟周期拉低,内核利用数据流中的间隙发送最终偏移数据字节和停止位/ECP/,指示帧结束。s_axi_tx_tready在下一个周期重新拉高,以允许数据传输继续进行。
从前文可知,Aurora 8B/10B每次传输的数据必须是偶数字节,如果用户数据为奇数字节,则会在数据末尾添加一个Pad字符变为偶数字节。如下图所示,用户最后一个数据宽度为n-1字节,IP内部在组帧时,会在有效数据末尾添加一个Pad字符。
用户接口使用帧格式传输数据,支持暂停数据传输功能,如下图所示。通过拉低s_axi_tx_tvalid并发送空闲序列来暂停前n个字节后的数据流,直到s_axi_tx_tvalid拉高为止。
从前文可知,时钟补偿的优先级是最高的,所以数据传输可能会被时钟补偿序列打断,对应时序图如下所示。时钟补偿序列会在每10000字节的通道上产生12字节的开销。
接收端口内部没有用于存储用户数据的缓冲器,因此在接收端口信号中没有m_axi_rx_tready信号。
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为高电平时表示m_axi_rx_tdata对应数据有效,其余时间无效。
手册中还对该接口传输的效率做了计算,通过一个公式可以计算,也就是计算起始位、停止位、空闲数据、时钟补偿序列所带来的开销,从而得到数据传输速率,最终通道越多,数据位宽越大、帧越长,效率越高。用户数据位宽采用8字节、4通道传输一帧数据长度为1000,则效率可以达到99.14%。有兴趣的可以查看手册,获取具体计算方式。
1.2、流接口(Streaming Interface)
初始化后,除了发送时钟补偿序列时,通道始终可用于写入。该接口特别简单,但是输入和输出数据位宽必须与数据信号位宽保持一致,不能传输任意字节数据。
Aurora 8B/10B内核通过拉高s_axi_tx_tready来表示已准备好传输数据。一个周期后,用户逻辑拉高s_axi_tx_tvalid信号并将数据置于s_axi_tx_tdata,开始传输数据,如下图所示。
在下图中,发送数据D0和D1之后,Aurora 8B/10B内核拉低就绪信号s_axi_tx_tready,直到下一个时钟周期s_axi_tx_tready信号再次拉高时才会传输数据D2。
然后,用户逻辑在下一个时钟周期拉低s_axi_tx_tvalid,在s_axi_tx_tvalid和s_axi_tx_tready都拉高之前不传输数据。
下图是接收端流接口传输的时序图,过于简单,不再赘述。
2、流控端口
前文在Aurora 8B/10B协议中讲解了两种流量控制(UFC和NFC)的基本原理,本节介绍xilinx的Aurora 8B/10B IP如何使用这两种流量控制。注意只有使用成帧接口的内核才有两个可选的流量控制接口。
本地流量控制(NFC)控制全双工通道接收端的数据传输速率,用户流控制(UFC)为控制操作提供高优先级消息。
2.1、UFC界面
只有在配置IP时开启UFC功能,后续生成的IP才会有相应的功能,IP配置界面如下所示,当选定帧格式传输数据时,可以单独启用UFC功能,也可以同时启用UFC和NFC功能。
UFC对应的端口信号如下图所示,先看接收端的数据信号,就是axi_stream接口,与接收数据端口一致,因为UFC数据也是通过用户数据端口发送的。
注意axi_ufc_tx_tdata并不是需要传输的UFC数据,而是UFC数据个数。下图是UFC传输数据格式,第一字节是UFC传输的开始字符,SIZE表示其后面UFC字符长度,axi_ufc_tx_tdata的值就是SIZE对应数值,位宽也是一致的。
UFC数据是通过s_axi_tx_tdata信号传输的,s_axi_ufc_tx_tready拉高后的第一个时钟开始。当s_axi_tx_tdata端口用于UFC数据时,内核会解拉低s_axi_tx_tready。
手册给出用户发送数据和UFC消息的机制如下,当s_axi_tx_tready有效时发送用户数据,否则发送UFC数据。
注意:只有在完成当前UFC请求后才能提出新的UFC请求且IP可能不支持背靠背UFC请求。
下图显示了传输单周期UFC消息的程序,在这种情况下,4字节的UFC消息通过4字节的发送数据接口发送。
注意:s_axi _tx_tready信号在两个周期内无效,Aurora 8B/10B内核利用数据流中的这一间隙来传输UFC报头和消息数据。
如下图所示,位宽为2字节的用户发送数据接口传输4字节的UFC消息。
s_axi_tx_tready被拉低三个周期,一个周期用于在s_axi_ufc_tx_tready周期内发送的ufc报头,两个周期用于UFC数据。
当Aurora 8B/10B内核收到UFC消息时,通过专用的UFC AXI4-Stream接口将数据输出给用户。
接收的UFC消息位于m_axi_ufc_rx_tdata端口,m_axi_ufc_rx_tvalid表示消息数据的开始,m_axi_ufc_rx_tlast表示结束,m_axi_ufc_rx_tkeep用于显示消息最后一个周期内m_axi_ufc_rx_tdata上的有效字节数。
下图显示了一个具有4字节数据接口的Aurora 8B/10B内核接收4字节UFC消息。m_axi_ufc_rx_tkeep设置为4‘hF,表示接口只有四个最高有效字节有效。
下图显示了一个具有4字节接口的Aurora 8B/10B内核接收8字节消息,输出数据帧有两个周期长,m_axi_ufc_rx_tkeep在第二个周期设为4‘hF,表示所有四个字节的数据都有效。
2.2、NFC界面
Aurora 8B/10B协议包括本地流量控制(NFC)接口如下图所示,通常用于防止接收端的FIFO溢出。
该接口允许接收器通过指定必须放入数据流的空闲数据个数来控制数据接收速率,甚至可以通过请求发送器暂时只发送空闲信号(XOFF)来完全关闭数据流。
NFC接口包括一个用于发送nfc消息的请求(s_axi_nfc_tx_tvalid)和一个确认(s_axi_nfc_tx_tready)端口,以及一个用于指定所请求的空闲周期数的4位s_axi_nfc_tx_tdata端口。
如果需要使用NFC接口,则在配置IP时需要勾选下图的四个NFC选项之一,NFC有完成模式和立即模式两种,前文也讲述过两者区别,一般使用立即模式比较好。
前文详细讲解过NFC实现的机制和原理,本质就是接收端FIFO快要溢出时,像发送端传输一个NFC消息,让发送端在指定周期内发送空闲字符,停止发送数据,从而防止接收端FIFO溢出。
如下图所示,当数据端口s_axi_tx_tdata发送NFC空闲字符时,s_axi_tx_tready为低电平,此时不能传输用户数据。
下图显示收到NFC消息时用户发送数据的端口时序。在这种情况下,NFC数据为0001,请求发送端口发送两个空闲数据拍。
IP拉低用户接口的数据应答信号s_axi_tx_tready,直到发送足够的空闲数据来满足请求。下图中内核在即时NFC模式下运行,NFC空闲被立即插入。Aurora 8B/10B内核也可以在完成模式下运行,在完成模式下,NFC空闲仅插入帧之间。
由上述叙述可知,UFC是需要用户去控制s_axi_tx_tdata来传输数据的,而NFC由于是发送的空闲数据,因此用于其实不需要干预其数据信号。
3、状态和控制接口
Aurora 8B/10B内核的状态和控制端口允许应用程序监控信道并使用收发器的内置功能。本节提供了状态和控制接口、收发器串行I/O接口以及专用于单工模块的初始化端口的图表和端口描述。
如下图所示,在配置IP时,需要选择使用全双工还是单工模式,默认使用全双工模式传输数据。
下图表示不同模式下,状态信号和控制信号类型的区别。
下表列出了一些比较常用的控制信号和状态信号,一些不常用的可以自行参考手册,这里列多了就没有看下去的耐心了,所以列的都是重要的。
信号 | I/O | 含义 |
---|---|---|
channel_up | O | Aurora 8B/10B通道初始化完成且通道准备好数据传输时置位。 |
lane_up[0:m–1] | O | 每位代表一个通道,该通道初始化成功时对应位置位。 |
frame_err | O | 检测到通道帧或协议错误,将该信号拉高一个时钟。 |
hard_err | O | 检测到硬错误时拉高,直到Aurora 8B/10B内核复位。 |
soft_err | O | 在传入的串行流中检测到软错误时拉高。 |
Reset | I | 复位Aurora 8B/10B内核,高电平有效,必须保持至少六个user_clk周期。 |
gt_reset | I | 当模块首次上电时拉高,复位收发器的PCS和PMA。该信号使用init_clk_in消抖,且必须拉高六个init_clk_in周期。 |
link_reset_out | O | 热插拔计数到期时变为高电平。 |
init_clk_in | I | 当gt_reset有效时user_clk停止,建议init_clk_in的频率低于GT参考时钟输入频率。 |
1、软件错误:在高速收发器的运行过程中,由于通道噪声等因素的影响,数据传输可能会遇到错误。8B/10B编码技术能够检测出所有单比特数据错误以及大多数多比特数据错误。当检测到这些错误时,会拉高软错误(soft_err)信号。如果在短时间内检测到大量软错误,系统将执行复位操作。
2、硬件错误:Aurora 8B/10B可以监控每个收发器的硬件错误。硬件错误可能包括接收端或发送端buffer溢出、发送端和接收端时钟源频率差异超过100ppm等。当检测到过多的软错误时,这可能触发硬件错误,会拉高硬件错误(hard_err)信号。
一旦检测到硬件错误,Aurora 8B/10B IP会自动进行复位并尝试重新初始化。如果该问题得到解决,通道可以重新初始化,并建立新的连接。
3、帧错误:Aurora 8B/10B IP可以检测axi_stream的帧错误,帧错误可能包括空帧、连续的帧开始符号或连续的帧结束符号。检测到帧错误后,拉高帧错误(frame_err)信号。
Aurora 8B/10B在上电、复位或硬错误后自动初始化,直到通道准备就绪。lane_up总线指示通道中的哪些通道已完成通道初始化程序。
只有在内核完成整个初始化程序后,channel_up才会置位。在channel_up有效之前,Aurora 8B/10B内核无法接收数据。
Aurora 8B/10B IP包含reset和gt_reset两个复位信号,前者用于复位除高速收发器以外的逻辑功能,后者用于复位高速收发器,本文以全双工模式讲解复位。
Aurora 8B/10B内核的复位至少拉高六个user_clk时间周期,channel_up会在三个user_clk周期后拉低,如下图所示。
下图显示了复位高速收发器的时序,gt_reset至少拉高六个init_clk_in时间周期。由于user_clk是由txoutclk生成的,当高速收发器复位时,txoutclk会停止产生,因此经过几个时钟之后user_clk也会停止产生,之后channel_up拉低。
两个复位信号的上电时序应该如下所示,开始均处于高电平,当首先拉低gt_reset,当高速收发器复位完成,稳定产生user_clk之后,reset才拉低,然后对逻辑部分完成复位。
当内核工作过程中,如果要进入复位状态,应该遵循以下时序。首先应该拉高reset,让内核逻辑进入复位,之后拉高gt_reset,防止停止产生user_clk后内核逻辑卡死。
除了上述这些内容,该IP还有CRC、热插拔、时钟补偿、掉电模式等等,但是这些内容要么平时不会使用,要么前文已经讲解过,需要了解的可以从手册中获取,本文不再赘述。
注意该IP的用户数据的大端模式可以更改为小端模式,更改方式如下图所示,在配置IP时勾选“Little Endian Support”即可。
其实该IP除了控制和状态接口外,还有收发器接口,由于前文已经讲解过收发器相关知识,对于这些信号应该比较了解,因此对于这部分内容不再赘述。
4、延迟时间
通过Aurora 8B/10B内核的延迟是由通过协议引擎(PE,FPGA可编程逻辑实现)和收发器的管道延迟引起的。PE流水线延迟随着AXI4流接口宽度的增加而增加,收发器延迟取决于所选收发器的特性和属性。
注意:这些延迟不包括因Aurora 8B/10B通道两端之间的串行连接长度(PCB走线等)而产生的延迟。
下图显示了默认配置下数据路径的延迟,延迟可能因设计中使用的收发器和IP配置而异。
在默认内核配置的功能仿真中,从s_axi_tx_tvalid到m_axi_rx_tvalid的双字节帧设计的最小延迟约为37个user_clk周期,如下图所示。
在功能仿真中,从s_axi_tx_tvalid到m_axi_rx_tvalid的默认四字节帧设计的最小延迟约为41个user_clk周期。
Aurora 8B/10B内核吞吐量取决于收发器数量和目标线路速率。使用20%的Aurora 8B/10B协议编码开销和0.5 Gb/s至6.6 Gb/s的线路速率范围计算单通道设计和16通道设计的吞吐量,得到吞吐量范围[0.4,84.48]Gb/s。
本文的重点在于前两部分,用户需要着重了解用户接口以及流控原理和实现方式,才能够正常使用该IP。通过本文的分析可知,该IP就是对GTX收发器的上层封装、内部完成组帧和接收端字节对齐、流控、时钟补偿、CRC校验等等功能。
相比自定义PHY,该IP更加简单,增加流控功能后接收端接收数据会更加准确,防止数据溢出,缺点在于用户不能操作GTX,GTX的发送通道和接收通道必须使用buffer同步数据,不能使用相位对齐电路,导致数据延迟会比较大。
如果设计对延时比较敏感,可能该IP将不再适用。
本文是对Pg046手册的一个解读,部分内容前文已经讲解过,本文就只是简单的过一遍。后半部分大多直接来源于手册,因为复位这些其实平时用的并不多,只需要将复位电平保持规定要求即可。需要注意几个初始化信号和错误指示信号,在实际工程的调试中可能会遇到。
该手册可以在xilinx官网获取,也可以在公众号后台回复“xilinx手册”(不包括引号)获取。
如果对文章内容理解有疑惑或者对代码不理解,可以在评论区或者后台留言,看到后均会回复!
如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!您的支持是我更新的最大动力!将持续更新工程!