您的当前位置:首页正文

FPGA - Aurora8B/10B协议理解与IP核使用

2024-11-11 来源:个人技术集锦

一,Aurora8B/10B协议

        Aurora 协议是一个用于在点对点串行链路间移动数据可扩展轻量级链路层协议(由Xilinx开发提供)。这为物理层提供透明接口,让专有协议或业界标准协议上层能方便地使用高速收发器。Aurora协议在Xilinx的FPGA上有两种实现方式:8B/10B 64B/10B。两个协议大部分相同,主要区别在编码方式上:

  • Aurora 8B/10B:将8bit数据编码成10bit数码进行传输,尽量平衡数据中“0”和“1”的个数以实现DC平衡,显然这个编码方式的开销是20%,也就是效率为80%
  • Aurora 64B/10B:将64bit数据编码成66bit块传输,66bit块的前两位表示同步头,主要由于接收端的数据对齐和接收数据位流的同步。同步头有“01”和“10”两种,“01“表示后面的64bit都是数据,“10”表示后面的64bit是数据信息。数据信息0和1不一定是平衡的,因此需要进行加扰,开销较小

        Aurora 8B/10B 常用于芯片(FPGA)芯片(FPGA)之间通信。它用于使用一个或多个收发器在设备之间传输数据。连接可以是全双工(双向数据)单工。最多可实现16个收发器(GTX,GTP或GTH),吞吐量可从480 Mb / s扩展到84.48 Gb / s。Aurora核心吞吐量取决于收发器的数量以及所选收发器的线路速率。 通过使用20%的开销来计算吞吐量Aurora 8B / 10B协议编码和以及线速0.5 Gb / s至6.6 Gb / s的线速范围来计算,其传输吞吐量为从单通道设计的0.4 Gb / s到最高16通道的84.48 Gb / s。

  • 用户使用用户接口Aurora 8B/10B IP核进行数据交互
  • Aurora 8B/10B IP核是全双工模式,其数据通路多条Lane组成
  • 发送的数据通过Aurora IP核进行8B/10B编码后,通过多条Lane发送到另一个Aurora IP核,该IP核通过用户接口接收到的数据发送给用户

二,时钟、复位与状态指示

1,时钟

高速接口的IO都在MGT bank上面
1个bank有4对Lane,2对差分时钟。

  • ref_clk :Aurora IP核是基于GT作为物理层实现的,所以时钟ref_clk就是GT的参考时钟。GT的时钟参考只能使用外部的差分时钟,所以具体的值取决板卡的硬件设计。默认125Mhz。
  • INIT CLK 初始化阶段的时钟 ,在上电初始化阶段,可以使用该时钟来驱动一些逻辑。默认值:50Mhz。
  • DRP CLK : DRP时钟,动态重配置,一般没用,默认值:50Mhz(通常一个内部模块需要进行配置,使用两种方法:端口控制和配置参数控制。一个常见的应用就是线速率切换。这时候就需要利用DRP端口来调整部分参数的值,然后复位GTX,使GTX工作在不同的线速率下。)
  • user_clk_out: 这个时钟,是IP核根据设置的线速率及Lane的位宽计算出来的用户时钟,用户需要传输的数据必须是该时钟域下的数据,否则会存在亚稳态风险。

总结:1、ref_clk 的值根据对应硬件设计的来;

           2,INIT CLK DRP CLK可以用PLL或者MMCM生成;

           3、user_clk_out是用户时钟域,数据收发接口应该工作在此时钟域下。


2,复位

全双工模块下的复位设计:

        复位信号有gt_reset和系统复位reset两种,且都是高复位, gt_reset复位比较底层,可以理解系统复位resetgt_reset的子集。

        gt-reset复位至少在初始化INIT-CLK下持续10个clk.

        系统复位 reset 至少在 user clk(也就是 user clk)稳定的条件下,持续 10个clk.


3、状态指示

Aurora IP还提供了一系列的指示接口出来,方便进行调试:

  • loopback:      回环模式,实际使用一般接到0
  • power down: 高电平有效。当其为高时,GT会进入非工作、低功耗的模式(类似睡眠模式)。使用的时一般直接拉低。
  • lane_up:        当对应的Lane初始化完成后,会断言对应的lane_up
  • channel_up:  当Auroa 8b/10b 初始化完成后,并且当前已经可以进行数据的传输时,会断言该信号
  • hard_err:       错误表征应信号,主要是硬件类错误
  • soft_err:        错误表征应信号,主要是软件类错误
  • frame_err:     错误表征应信号,主要是帧类错误

三,数据发送、接收接口

Aurora 8B/10B IP核支持AXI4-Stream协议,并依据是否对AXI4-Stream协议进行再封装来提供两种数据传输接口:Framing 接口(帧传输接口)Streaming接口(流传输接口)

  • Framing接口(帧传输接口):在AXI4-Stream的基础上添加了帧头、帧尾等控制信号,使得传输更准确,但是会降低传输效率和使用较多资源
  • Streaming接口(流传输接口):基本上就是一个非常简化的AXI4-Stream接口,只有数据有效、握手和数据信号,此种方式传输效率高,但无法保证传输的准确性

(1)AXI4-Stream位排序

Aurora 8B / 10B IP核采用升序排列。 首先发送和接收最高有效字节的最高有效位。 下图显示了n字节的Aurora 8B / 10B IP核的AXI4-Stream数据接口示例。


(2)Framing接口(帧传输接口)

Framing接口示意图如下:

        Framing接口由于存在frame(帧)的概念,所以接口信号较之Streaming接口要复杂一点,主要接口如下:        

1)发送端(相对于用户来说):
名称方向时钟域 说明
s_axi_tx_tdata[(8n–1):0]输入user_clk用户要发送的数据,位宽由链路位宽和链路数量决定
s_axi_tx_tready输出user_clk为高表明当前IP核准备接收数据
s_axi_tx_tlast输入user_clk发送的最后一个数据,高电平有效
s_axi_tx_tkeep[(n–1):0]输入user_clk用来指示发送的最后一个数据的有效字节
s_axi_tx_tvalid输入user_clk为高表明当前用户发送的数据有效
2)接收端(相对于用户来说):
名称方向时钟域说明
m_axi_rx_tdata[8(n–1):0]输出user_clk接收到的数据,位宽由链路位宽和链路数量决定
m_axi_rx_tlast输出user_clk接收的最后一个数据,高电平有效
m_axi_rx_tkeep[(n–1):0]输出user_clk用来指示接收的最后一个数据的有效字节
m_axi_rx_tvalid输出user_clk为高表明当前接收的数据有效
3)发送数据
  • 从发送端的几个信号就可以判断,当s_axi_tx_tready与s_axi_tx_tvalid握手成功后,即可发送数据
  • 使用s_axi_tx_tlast来表示当前发送最后一个数据
  • s_axi_tx_tkeep来表示最后一个数据的有效字节(应用场景在发送奇数个字节时,IP核会自动添加一个pad到数据中,所以存在一个无效字节需要指出),这一点倒是与AXI4-Stream协议不太一样
4)接收数据
  • 接收数据不需要握手过程
  • 当m_axi_rx_tvalid为高时,即说明此时的数据是有效数据,可以拿来用了
  • m_axi_rx_tkeep与m_axi_rx_tlast的用法与发送端对应的信号一致
5)帧结构

        TX子模块将每个接收的用户帧通过TX接口转换为Aurora 8B / 10B帧帧开始(SOF)通过在帧开始处添加2字节的SCP代码组来指示。 帧结束(EOF)是通过在帧的末尾添加一个2字节的信道结束通道协议(ECP)码组来确定。 数据不可用时插入空闲代码组代码组是8B / 10B编码字节对,所有数据都作为代码对发送,因此具有奇数个字节的用户帧具有称为PAD的控制字符,附加到帧的末尾以填写最终的代码组。 下图显示了具有偶数数据字节的典型Aurora 8B / 10B帧

6)4种发送案例

手册(PG046)里举了4种传输案例:

Example A: Simple Data Transfer(简单数据传输)

        在valid信号ready信号握手成功期间传输数据,传输到最后一个数据DATA2时,拉高tlast信号,表明此时传输的是最后一个数据。tkeep信号表示最后一个数据的那些字节是有效的

Example B: Data Transfer with Pad(奇数字节数据传输)、

        在valid信号ready信号握手成功期间传输数据,传输到最后一个数据DATA2时,拉高tlast信号,表明此时传输的是最后一个数据。tkeep信号表示最后一个数据的那些字节是有效的根据协议要求,Aurora 8B/10B 内核会为字节数为奇数的帧添加一个填充字符。由于此时传输的是奇数个字节,所以最后一个数据中存在无效字节,故tkeep信号的值为N-1。

Example C: Data Transfer with Pause(带有暂停的数据传输)

        在valid信号ready信号握手成功期间传输数据,传输到最后一个数据DATA2时,拉高tlast信号,表明此时传输的是最后一个数据。tkeep信号表示最后一个数据的那些字节是有效的。

        在握手期间,用户通过拉低valid信号中断了握手,实现了数据发送的暂停(流控)。用户应用程序在传输完前 n 个字节后,会通过断开 s_axi_tx_tvalid 暂停数据流,转而传输空闲数据。暂停将一直持续到 s_axi_tx_tvalid 失效。

Example D: Data Transfer with Clock Compensation(带时钟补偿的数据传输)

        Aurora 8B/10B 内核在发送时钟补偿序列时会自动中断数据传输时钟补偿序列10,000 字节每个通道造成 12 字节的开销。下图显示 Aurora 8B/10B 内核如何在时钟补偿序列期间暂停数据传输。

7)接收数据案例

        不同于发送数据的握手过程,接收数据过程简单的很,只需要数据有效信号m_axi_rx_tvalid为高时,则表示此时接收的数据有效,也用m_axi_rx_tkeep、m_axi_rx_tlast来修饰接收的最后一个数据。典型过程如下:

Framing接口总结:

  • Framing接口类似被再封装的AXI4-Streaming接口,IP核自动加入帧头、帧尾,并在固定时间内完成时钟补偿
  • 发送端用户只需要在发送、接收双方完成握手后,即可发送数据,通信双方均可通过握手信号来反压对方;接收端用户仅需要在valid信号有效时从总线上拿数据即可
  • 由于是帧结构,所以需要有信号来约束帧长度--tlast;由于数据的发送是成对发送,所以最后一个数据可能存在无效字节的情况,故需要对最后一个数据的有效字节数进行约束--tkeep

(3)Streaming接口

Streaming接口示意图如下:

        看起来比 Framing接口简化了很多,因为发送端和接收端都少了keep和last这两个信号(共4个)。之前说过,Framing接口的帧框架使得需要使用keep和last这两个信号来控制帧的长度,所以信号较多。而Streaming接口则没有帧框架,相当于一条不停流动的管道,所以不需要使用keep和last这两个信号来控制长度。

        用起来也很简单,发送数据只要在tvalid信号和tready信号握手成功时就可以发送接收数据就更简单了,只要tvalid为高则说明此时接收的数据是有效的。

Example A: TX Streaming Data Transfer(数据发送) 

        只有当s_axi_tx_tready、s_axi_tx_tvalid均为高(成功握手)时,才可以发送数据

Example B: RX Streaming Data Transfer(接收数据)

        只有当m_axi_rx_tvalid为高时才说明接收到的数据为有效数据。

Streaming接口总结:

  • Streaming接口就是经典的AXI4-Streaming接口,没有帧的概念,数据总线上数据长度是不受限制的
  • 发送端用户只需要在发送、接收双方完成握手后,即可发送数据,通信双方均可通过握手信号来反压对方;接收端用户仅需要在valid信号有效时从总线上拿数据即可

四,IP核配置

(1)创建工程

打开vivado,新建工程后从IP Catalog找到aurora并双击打开;

(2)第一页配置

(3)第二页配置

(4)第三页配置

配置完成,生成IP核。


(5)官方例程

1)生成例程

右击生成IP Example Design...

2)官方例程的组成

首先看下生成例程资源的逻辑层级排列

  • support模块(aurora_8b10b_0_support.v):核心,包含了对IP、GT等的例化处理等一系列操作;后续在应用中此部分不需要修改
  • frame_gen( aurora_8b10b_0_FRAME_GEN.v):数据生成模块,采用LFSR的方式生成伪随机序列;后续在我们的应用中此部分可替换成我们的数据输入模块(建议加入FIFO,这样代码的复用性更佳)
  • frame_check(aurora_8b10b_0_FRAME_CHECK.v):数据检验模块,对接受的数据进行检验以验证传输的正确性;后续在应用中此部分可替换成数据检查模块或者删除
  • LL_AXI(aurora_8b10b_0_LL_TO_AXI_EXDES.v):LL总线转AXI总线(据说该例程原本的接口是LL接口,后面Xilinx为了推广AXI总线,所以本例程直接在原来代码的基础上增加了总线转换模块)
  • AXI_LL(aurora_8b10b_0_AXI_TO_LL_EXDES.v):AXI总线转LL总线,原因同上

仿真部分的内容根据层级就很容易理解--调用了两次例程。看代码可知进行了回环测试

例程框图

support模块(aurora_8b10b_0_support.v)(IP核例化核心模块)

        Support模块最主要的功能是例化aurora IP核并将时钟复位等信号统统一起打包。所以我们不需要对Support模块的内部构造进行详细了解,直接看看其对外接口就差不多可以拿来用。

Support模块下的子模块:

  • clock_module:                时钟处理生成模块
  • support_reset_logic_i:    复位逻辑生成模块
  • gt_common_support:     与GT收发器相关的时钟生成其其他
3)波形仿真

注意:由于FPGA器件型号会影响仿真模型,建议在仿真时选择K7器件或V7器件对IP核重新生成并仿真

其中channel_up信号置位1,标志着Aurora 8b/10b IP核成功建立链路通道。

例化的两个模块的通道都已经建立了正常的连接(红框),然后一段时间后仿真结束。其他各种时钟信号也都正常,复位也都是正常的。 

五,总结


可以看到Aurora 8B/10B IP核 比较容易上手。在官方例程的基础上,写用户端的发送和接收模块就可以使用在我们自己的应用需求中。

参考资料《pg046-aurora-8b10b-en-us-11.1.pdf》

Top