对Aurora8b10b的简要理解

Aurora8b10b理解

 

概述

Aurora 8B / 10B内核是xilinx开发的一种轻量级的串行通信协议,适用于千兆位链接。 常用于芯片(FPGA)与芯片(FPGA)之间通信。它用于使用一个或多个收发器在设备之间传输数据。连接可以是全双工(双向数据)或单工。最多可实现16个收发器(GTX,GTP或GTH),吞吐量可从480 Mb / s扩展到84.48 Gb / s。

Aurora核心吞吐量取决于收发器的数量以及所选收发器的线路速率。 通过使用25%的开销来计算吞吐量Aurora 8B / 10B协议编码和以及线速0.5 Gb / s至6.6 Gb / s的线速范围来计算,其传输吞吐量为从单通道设计的0.4 Gb / s到最高16通道的84.48 Gb / s。(注意:更快的底层GTZ,线速可达12G左右,那么信号吞吐量会更大。)

 

 对Aurora8b10b的简要理解_第1张图片

 

Aurora链路连接简图

 

对Aurora8b10b的简要理解_第2张图片 

 

IP核的内部构造

从上图中可以看出,IP核主要由底层的GT接口、内部控制逻辑、控制接口以及数据发送、接收用户接口这几部分组成。

 

详细介绍

本文主要是以PG046为主线,简要介绍一下自己对Aurora8b10b的一些理解,或许有些地方理解的不一定对,欢迎大家指正。

文中主要从IP的端口,主要包括:时钟接口、用户接口流控接口以及IP应用时,初始化和复位上电时序进行介绍。后续会结合板载调试的工程更新部分内容。

端口描述

 

对Aurora8b10b的简要理解_第3张图片

时钟接口clock interface

 

用户接口user interface

该接口包括在Aurora 8B / 10B内核之间收发流数据或帧数据所需的所有端口。数据在传输的时候,有两种格式,一种是Framing interface,另一种是流格式steaming interface。其中如果IP核例化的时候使用framing interface,则使用AXI4-Stream端口。对于流模块,用户接口提供包含一个简单的数据端口和数据有效端口标识。如果配置成全双工模式,那么IP_Core包括用于发送和接收的端口; 单工模式,则IP_Core仅使用它们所需的端口以支持的方向发送数据。

 

Framing Interface Ports

 对Aurora8b10b的简要理解_第4张图片

 对Aurora8b10b的简要理解_第5张图片

 

 

数据发送

为了传输数据,用户通过控制控制信号以使内核实现以下操作:

  1. 通过S_AXI_TX_TDATA总线从用户获取数据
  2. 在Aurora 8B / 10B通道中跨通道封装和分条数据(S_AXI_TX_TVALID,S_AXI_TX_TLAST)
  3. 暂停数据(即插入空闲)(S_AXI_TX_TVALID)

当IPCore接收数据时,它将执行以下操作:

  1. 检测并丢弃控制字节(idle frame,时钟补偿,SCP,ECP)
  2. 产生(M_AXI_RX_TLAST)
  3. 从通道中恢复数据,组装数据以通过M_AXI_RX_TDATA总线呈现给用户

 

AXI4_Steam总线中可以允许数据帧最后一个字的内容部分有效。通过S_AXI_*X_TLAST和S_AXI_*X_TKEEP[0:(n-1)]来指示,S_AXI_*X_TKEEP[0:(n-1)]标明最后一个帧内容中哪个字节是有效的。需要注意的是,该信号只有当S_AXI_*X_TLAST被激活时,才有用

 

TX子模块将通过TX接口接收的每个用户帧转换为Aurora 8B / 10B帧。 将2字节的SCP代码组添加到帧数据的开头以指示帧的开始,并且在帧结束后发送2字节的ECP集以指示帧的结束。 只要没有数据,就会插入空闲代码组(Idle Frame)。 代码组是8B / 10B编码的字节对。 Aurora 8B / 10B中的所有数据都作为代码组发送,因此具有奇数字节的用户帧在帧末尾附加了一个称为PAD的控制字符,以填充最终的代码组。

 

Aurora 8B / 10B内核会自动中断数据传输,用于发送时钟补偿序列。时钟补偿序列每个通道上的开销情况大概是每10,000字节中有12字节用于时钟补偿。

 

 

思考:idle frame,时钟补偿,SCP,ECP这些控制信号是IP_Core自动产生的?比如SCP用户接口只需将S_AXI_TX_TVALID与要发送的数据对齐,然后IPcore检测到后,自行添加SCP到发送的数据帧中。当数据接收时,接收端收到发送端发送过来的SCP,便激活M_AXI_RX_TVALID,指示有效数据接收。

几种常见的数据收发时序

 

对Aurora8b10b的简要理解_第6张图片

对Aurora8b10b的简要理解_第7张图片

 

对Aurora8b10b的简要理解_第8张图片

对Aurora8b10b的简要理解_第9张图片

 

数据接收

RX 子模块没有用于用户数据的内置弹性缓冲区。 因此,RX AXI4-Stream 接口上没有

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 被激活时有效。

图2-12给出了一个3n字节的接收数据被暂停中断的示例。 数据显示在m_axi_rx_tdata总线上。 当将前n个字节放置在总线上时,会激活m_axi_rx_tvalid,以指示已为用户应用程序准备好数据。 内核在第一个数据节拍之后的时钟周期上将m_axi_rx_tvalid置为无效,表示数据流中止。 暂停后,内核将激活m_axi_rx_tvalid并继续将剩余数据组装在m_axi_rx_tdata总线上。 在帧的最后,核心激活m_axi_rx_tlast。 内核还计算m_axi_rx_tkeep总线的值,并根据帧最后一个字中的有效字节总数将其提供给用户应用程序。

 

对Aurora8b10b的简要理解_第10张图片

下图是官网例程仿真结果:

TX端:

 

 

从图上可以看出,发送端发送的数据为5eaf5eaf、af57af57、d7abd7ab、ebd5ebd5以及75ea75ea。注意观察在tlast为高的时候,tkeep为C,表示数据总线[31:0]的[31:16]为发送的有效数据。

Rx端:

 

 

从图上可以看出,接收端收到的数据依次为5eaf5eaf、af57af57、d7abd7ab、ebd5ebd5以及75eabc1c。注意观察在tlast为高的时候,tkeep为C,表示数据总线[31:0]的[31:16]为发送的有效数据。而bc1c为填充的内容。

 

传输效率

有两个因素会影响Aurora 8B / 10B内核的成帧效率:

  1. 数据帧的大小
  2. 数据路径的宽度

CC序列(时钟补偿)在每个通道上每10,000个字节使用12个字节,因此消耗大约

总频道带宽的0.12%

 

 

对Aurora8b10b的简要理解_第11张图片

对Aurora8b10b的简要理解_第12张图片 

 

Streaming Interface Ports

 

 对Aurora8b10b的简要理解_第13张图片

对Aurora8b10b的简要理解_第14张图片

 

从上述的描述中,我们不难发现,Framing Interface Port与 Steaming Interface Port相比,主要是多了两个信号。S_AXI_*X_TLAST和S_AXI_*X_TKEEP[0:(n-1)]。

Framing Interface Port符合AXI4-Stream协议规范。它包括发送和接收成帧的用户数据所需的信号。 Steaming Interface Port允许用户发送数据而无需特殊的帧定界符。与Framing Interface Port相比,它操作简单且使用的资源更少。

流控接口Flow control interface

(在实际应用当中用的相对少,这里暂不展开论述)

Native Flow Control

 

User Flow Control

 

 

收发器接口以及状态控制信号接口

Aurora 8B / 10B内核的状态和控制端口使应用程序可以监视通道并使用收发器的内置功能。 本节提供状态和控制接口,收发器串行I / O接口,边带初始化端口专门用于单工模块。

 

对Aurora8b10b的简要理解_第15张图片

 

对Aurora8b10b的简要理解_第16张图片

初始化

双工IP核初始化

全双工 IPCORE 会在上电,复位或硬件错误后自动初始化,并执行 Aurora 8B / 10B 初始化流程,直到通道准备就绪。 lane_up 总线指示通道中哪条通道已经完成了通道初始化过程。 该信号可用于帮助在多通道通道中调试设备问题。 只有在IPCore完成整个初始化过程之后,才会激活channel_up。

Aurora 8B/10B IPCORE 无法接收 channel_up 之前的数据。 应使用用户界 面 上 的

m_axi_rx_tvalid 信号来限定传入数据。 channel_up 可以被反转并用于重置驱动全双工通道 TX 侧的模块,因为在channel_up 之前不会发生任何传输。 如果在数据接收之前需要复位用户应用模块,则可以将 lane_up 信号之一反转并使用。 在所有的 lane_up 信号被置位之后才能接收数据。

注:channel_init_sm 模块中可以使用 WATCHDOG_TIMEOUT 参数来控制通道初始化过程中出现的看门狗定时器。

单工IP核初始化

单工 IPCORE 不依赖于 Aurora 8B/10B 通道的信号进行初始化。相反,单工通道的 TX 和 RX 侧通过一组边带初始化信号传送其初始化状态:对齐,绑定,验证和复位; 一个为 TX 侧设置 TX_前缀,一个为 RX 侧设置一个 RX_前缀。 绑定端口仅用于多通道内核。

有两种方式可以使用边带初始化信号初始化单工模块:

•将 RX 边带初始化端口的信息发送到 TX 边带初始化端口

•使用定时初始化间隔,独立于 RX 边带初始化端口驱动 TX 边带初始化端口

以下部分将介绍两种初始化方法:

使用返回通道

在 RX 和 TX 之间没有通道的情况下,返回通道是初始化和维护单工通道的最安全的方式。 返回通道只需向 TX 侧传送消息,以指示在信号变化时哪些边带初始化信号被激活。

包含在简单的 Aurora 8B/10B 内核的 example_design 目录中的示例设计显示了一个简单的侧面通道,在设备上使用三个或四个 I / O 引脚。

使定时器

如果不能使用返回通道,可以使用一组定时器驱动 TX 单工初始化来初始化串行通道。 定时器必须仔细设计,以满足系统的需要,因为初始化的平均时间取决于许多通道特定条件,例如时钟速率,通道延迟,通道之间的偏移和噪声。C_ALIGNED_TIMER,C_BONDED_TIMER 和 C_VERIFY_TIMER 分别用于激活 tx_aligned,tx_bonded 和 tx_verify 信号的定时器。 这些定时器使用从角箱功能模拟获得的最坏情况值,并在 _core 模块中实现。

注意:(以下主要是涉及初始化建链的注意事项。单工通信中Tx端是无论如何都可以channel_up的,但是Rx端的channel_up需要接收到特定的初始化序列。如果Tx端起来后,发送初始化序列,Rx端还没有准备好,那很可能会错过初始化序列,导致建链失败。)这些信号不会在通道的实际状态上更新,但在定时器到期后。Aurora 8B/10B 模块中的一些初始化逻辑使用看门狗定时器来防止死锁。这些看门狗定时器用于通道的 RX 侧,并可能干扰 TX 初始化定时器的正确操作。如果 RX 单工模块从对齐,绑定或验证复

位,请确保不是因为 TX 逻辑在其中一个状态下花费太多时间。如果需要特别长的定时器来满足系统的需要,则可以通过编辑模块来调整看门狗定时器。在大多数情况下,这是不必要的,不推荐。Aurora 8B/10B 通道通常只有在故障的情况下才能重新初始化。当没有反向通道可用时,对于大多数错误,事件触发的重新初始化是不可能的,因为通常,RX 侧在 TX 侧必须处理该条件时检测到故障。解决方案是定时驱动的 TX 单工模块定期重新初始化。如果发生灾难性错误,则在下一个重新初始化时间到达后,通道将重新设置并再次运行。系统设计人员应平衡重新初始化所需的平均时间与其系统可以容忍不工作通道的最大时间,以确定其系统的最佳重新初始化时间。

注意:在 tx_channel_init_sm / rx_channel_init_sm 模块中可以使用 WATCHDOG_TIMEOUT 参数来控制通道初始化过程中出现的看门狗定时器。

复位以及上电时序

时钟端口

•7 系列 FPGA 中由外部时钟引脚对(mgtrefclkn / mgtrefclkp)采集的 GTX 或 GTH 收发器Quad的总数不能超过三个Quad或 12 个 GTXE2_CHANNEL /GTHE2_CHANNEL 收发器。

•UltraScale 架构 FPGA 中由外部时钟引脚对(mgtrefclkn / mgtrefclkp)采集的收发器Quad的总数不得超过五个Quad(下面两个Quad和两个Quad)或 20 个 GTHE3_CHANNEL 收发器。

复位

复位信号用于将 Aurora 8B / 10B IPCORE 设置为已知的启动状态。 在复位时,内核停止任何当前操作并重新初始化新通道。

在全双工模块下,reset信号复位 TX_channel 和 RX_channel 。在单工模块中,tx_system_reset 复位 TX通道,rx_system_reset 复位 RX 通道。 gt_reset 信号复位最终复位内核的收发器。

示例一:

双工模式下,reset置位应至少为 6 个 user_clk 时间段。 结果,如图3-1 所示,channel_up 在三个 user_clk 周期后被置为无效。

 

 

示例二:

显示了双工 IPCORE 中的 gt_reset 激活并且应至少为六个 init_clk_in 时钟周期。由于收发器中没有了 txoutclk,所以在几个时钟周期之后,user_clk 停止,并且随后将 channel_up 置为无效。

 

 

示例三:

       在单工Core模式下,tx_system_reset and rx_system_reset assertion 。

对Aurora8b10b的简要理解_第17张图片 

 

Figure3-4显示了 simplex 内核中 tx_system_reset 和 rx_system_reset 激活的推荐过程。

1. tx_system_reset 和 rx_system_reset 被激活至少保持六个user_clk 时钟周期。

2.在三个 user_clk 周期后,tx_channel_up 和 rx_channel_up 被置为无效。

3.在 tx_system_reset 被取消置位之后,rx_system_reset 被取消置位(或)释放。 这确保了

simplex-TX 内核中的收发器能够更早地开始传输初始化数据(我猜测这序列用于RX端初始化,TX端是通过定时模式,当发送完成初始化序列后,认为初始化成功,而Rx端必须接收到相应的数据(参考sp002),才认为是初始化成功),并增强了单工 RX 核心对准正确数据序列的可能性。

4.在 tx_channel_up 被激活之前,rx_channel_up 被激活。必须通过 simplex-RX 核心Simplex-TX 内核中的单工定时器参数(C_ALIGNED_TIMER,C_BONDED_TIMER 和 C_VERIFY_TIMER)来满足此条件。

5.当单工 TX 核心在配置的时间内完成 Aurora 8B / 10B 协议信道初始化序列传输时,tx_channel_up被置位。 最后激活tx_channel_up 是为了确保 simplex-TX 内核在 Simplex-RX 核心准备就绪后发送 Aurora初始化序列。

 

 

 

上电时序

Aurora 8B / 10B  双工上电顺序

在电路板上电顺序期间,gt_reset 和reset信号都必须为高电平。收发器参考时钟(GT_REFCLK)和初始化时钟(INIT_CLK)在上电时保持稳定,以使 Aurora8B / 10B IPCORE 正常工作。

对Aurora8b10b的简要理解_第18张图片 

 

Aurora 8B/10B  双工正常工作复位顺序

在正常操作期间,在gt_reset信号有效之前, 复位信号reset将至少提前128个user_clk时间周期被激活,以确保在user_clk信号由于gt_reset激活而丢失前,可编程逻辑中的内核部分达到了已知的复位状态。

 

 

Aurora 8B/10B  单工上电顺序

在上电期间,TX 单工和 RX 单工内核的 gt_reset 和复位信号reset保持为高电平。 INIT_CLK和 GT_REFCLK 在上电期间是稳定的。 TX 板上的 gt_reset 信号必须先被取消置位,然后再在 RX 侧消除 gt_reset; 这样可确保 RX 端的 CDR 锁定正确。

对Aurora8b10b的简要理解_第19张图片

 

Aurora 8B/10B  单工正常工作复位顺序

对于单工配置,建议将TX侧复位序列与RX侧复位序列紧密耦合,因为TX和RX链路没有通信反馈路径。 需要注意的是,如果重置了RX端,则没有直接机制将重置通知TX端。 因此,对于Aurora 8B / 10B单工内核,需要在系统级别处理复位耦合。 每个TX侧复位必须紧随RX侧,如图3-8所示,必须使RX侧复位无效和TX侧复位无效之间的时间保持尽可能短。 在gt_reset信号有效之前, 复位信号reset将至少提前128个user_clk时间周期被激活,以确保在user_clk信号由于gt_reset激活而丢失前,可编程逻辑中的内核部分达到了已知的复位状态。 同时gt_reset的声明时间必须至少为六个init_clk时间周期。

对Aurora8b10b的简要理解_第20张图片

 

参考资料

《PG046》

 

 

你可能感兴趣的:(高速串行接口)