FPGA 高速接口Aurora8B/10B 协议详解与仿真

FPGA 高速接口Aurora8B/10B 协议详解与IP仿真

1 摘要

Aurora 8B/10B 是一种用于高速串行通信的协议,通常用于 FPGA 设计和其他数字通信应用。即一种编码方案,旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可扩展轻量级链路层协议,为板对板、芯片对芯片以及一些单向链接提供低成本低资源的解决方案。

2 Aurora8B/10B协议IP原理及适用场景及

2.1 IP核的结构原理

Aurora 8B/10B IP 核心框如图
在这里插入图片描述
①Lane Logic :每一个驱动一个GT(GTP,GTX,GTH)收发器,并且初始化对应的GT收发器和处理控制字符的编码和解码以及错误检测。
②Global Logic:执行通道初始化的绑定和验证阶段。在运行过程中,该模块生成 Aurora 协议所需的随机空闲字符,并监控所有通道逻辑模块是否存在错误。
③RX User Interface:AXI4-Stream RX 用户接口将数据从通道移动到应用程序并执行流控制功能。
④TX User Interface:AXI4-Stream TX 用户界面将数据从应用程序移动到通道并执行流控制 TX 功能。标准时钟补偿模块嵌入在内核中。该模块控制时钟补偿 (CC) 字符的定期传输

2.2 适用场景

Aurora 8B/10B协议常用于芯片与芯片之间的通信,特别是在FPGA与FPGA之间的通信中。它可以通过一个或多个收发器在设备之间传输数据,支持全双工和单工模式。最多可实现16个收发器,吞吐量可从480 Mb/s扩展到84.48 Gb/s。Aurora 8B/10B IP核是全双工模式,数据通过多条Lane发送到另一个Aurora IP核,并通过用户接口将接收到的数据发送给用户‌。
在这里插入图片描述

1)、芯片到芯片的链路:
替换高速串行连接的芯片之间的并联连接可以显着减少 PCB 上所需的迹线和层数。 核心提供了使用 GTP,GTX 和 GTH 收发器所需的逻辑,FPGA 资源成本最低。
2)、板对板和背板连接:
IP CORE 使用标准的 8B / 10B 编码,使其与现有的电缆和背板硬件标准兼容。 Aurora 8B / 10B内核可以在线速率和通道宽度上进行缩放,以便在新的高性能系统中使用便宜的传统硬件。
3)、单向连接(单向):
Aurora 协议提供了替代方法执行单向通道初始化,使 GTP,GTX 和 GTH 收发器在没有反向通道的情况下使用,并降低由于未使用的全双工资源而造成的成本。

3 信号定义

3.1 时钟

信号信号描述
ref_clk时钟源GT的外部时钟
INIT CLK 时钟源全局复位,低电平有效
DRP CLK时钟源DRP时钟,动态重配置时钟
user_clk_out时钟源用户传输的数据钟及逻辑时钟域

3.2 状态信号

Aurora IP还提供了一系列的指示接口信号
在这里插入图片描述

信号方向信号描述
loopback输入 回环模式,实际使用一般接到低
power down 输入掉电信号,GT会进入非工作、低功耗的模式
lane_up输出当对应的Lane初始化完成指示信号
hard_err输出硬件类错误指示
soft_er输出软件类错误指示
frame_err输出帧类错误指示

3.3 用户信号

用户接口完全兼容使用 axi-stream协议,我们最关注的信号主要是:TVALID、TREADY、TLAST、TDATA。
在这里插入图片描述
发送端接口主要使用的信号

信号方向信号描述
s_axi_tx_tdata[(8n–1):0]输入 用户要发送的数据
s_axi_tx_tready 输出准备接收数据指示信号
s_axi_tx_tlast输入发送的最后一个数据指示信号
s_axi_tx_tkeep[(n–1):0]输入指示发送的最后一个数据的有效字节
s_axi_tx_tvalid输入用户发送的数据有效信号

接收端接口主要使用的信号

信号方向信号描述
m_axi_rx_tdata[8(n–1):0]输出 接收到的数据
m_axi_rx_tlast 输出接收的最后一个数据指示信号
m_axi_rx_tkeep[(n–1):0]输出指示接收的最后一个数据的有效字节
m_axi_rx_tvalid输入指示当前接收的数据有效

4 用户数据接口

用户接口主要分为两种
(1)Framing接口(帧传输接口)。在AXI4-Stream的基础上添加了帧头、帧尾等控制信号,使得传输更准确,但是会降低传输效率和使用较多资源
在这里插入图片描述

(2)Streaming接口(流传输接口)。基本上就是一个非常简化的AXI4-Stream接口,只有数据有效、握手和数据信号,此种方式传输效率高,但无法保证传输的准确性
在这里插入图片描述

4.1 Framing接口

1)帧组成结构
发送子模块将每个接收的用户帧通过TX接口转换为Aurora 8B / 10B帧。 帧开始(SOF)通过在帧开始处添加2字节的SCP代码组来指示。 帧结束(EOF)是通过在帧的末尾添加一个2字节的信道结束通道协议(ECP)码组来确定。 数据不可用时插入空闲代码组。 代码组是8B / 10B编码字节对,所有数据都作为代码对发送,因此具有奇数个字节的用户帧具有称为PAD的控制字符,附加到帧的末尾以填写最终的代码组。 下图显示了具有偶数数据字节的典型Aurora 8B / 10B帧。
在这里插入图片描述
2)发送案例
①Simple Data Transfer(简单数据传输)
在这里插入图片描述
时序图可知,当valid信号与ready信号握手成功期间传输数据,传输到最后一个数据DATA2时,拉高tlast信号,表明此时传输的是最后一个数据。tkeep信号表示最后一个数据的那些字节是有效的。

②Data Transfer with Pad(奇数字节数据传输)
在这里插入图片描述
时序图可知,当valid信号与ready信号握手成功期间传输数据,传输到最后一个数据DATA2时,拉高tlast信号,表明此时传输的是最后一个数据。tkeep信号表示最后一个数据的那些字节是有效的。根据协议要求,Aurora 8B/10B 内核会为字节数为奇数的帧添加一个填充字符。由于此时传输的是奇数个字节,所以最后一个数据中存在无效字节,故tkeep信号的值为N-1。

③Data Transfer with Pause(带有暂停的数据传输)
在这里插入图片描述
时序图可知,当valid信号与ready信号握手成功期间传输数据,传输到最后一个数据DATA2时,拉高tlast信号,表明此时传输的是最后一个数据。tkeep信号表示最后一个数据的那些字节是有效的。在握手期间,用户通过拉低valid信号中断了握手,实现了数据发送的暂停(流控)。用户应用程序在传输完前 n 个字节后,会通过断开 s_axi_tx_tvalid 来暂停数据流,转而传输空闲数据。暂停将一直持续到 s_axi_tx_tvalid 失效。

④Data Transfer with Clock Compensation(带时钟补偿的数据传输)
在这里插入图片描述
在Aurora 8B/10B 内核发送时钟补偿序列时会自动中断数据传输。时钟补偿序列每 10,000 字节对每个通道会造成 12 字节的开销。

4.2 Streaming接口

相比于 Framing接口Streaming接口用法比较简,使用Framing接口的帧框架使得需要使用keep和last这两个信号来控制帧的长度,而Streaming接口则没有帧框架,使用数据流模式通道,不再关注keep和last这两个信号。在发送端发送数据只要在tvalid信号和tready信号握手成功时就可以发送;而接收端接收数据就只要关注tvalid信号,当tvalid为高时接收的数据有效。
典型的数据发送
在这里插入图片描述
典型的数据接收

在这里插入图片描述

5 仿真实践

5.1 工程搭建及IP使用

1)使用官方IP生成例程
在这里插入图片描述

2)选择共享逻辑
在这里插入图片描述

3)生成工程
在这里插入图片描述)

5.2 仿真测试

TestBench代码

`timescale 1 ns / 1 psmodule aurora_8b10b_0_TB;//*************************Parameter Declarations**************************parameter       SIM_MAX_TIME  = 9500000; //To quit the simulation//125.0MHz GT Reference clock
parameter       CLOCKPERIOD_1 = 8.0	;
parameter       CLOCKPERIOD_2 = 8.0	;
//parameter       CLOCKPERIOD_1 = 8.0;
//parameter       CLOCKPERIOD_2 = 8.0;
parameter       DRP_CLOCKPERIOD = 20.000	 ; //GT DRP Clock
parameter       INIT_CLOCKPERIOD = 20.0 ; // Board/System Clock//************************Internal Register Declarations*****************************//Freerunning Clock
reg                reference_clk_1_n_r;
reg                reference_clk_2_n_r;
reg     drp_clk_r;
reg     init_clk_p;//Global signals
reg                gt_reset_in;
reg                gsr_r;
reg                gts_r;
reg                reset_i;//********************************Wire Declarations**********************************//Freerunning Clock        
wire               reference_clk_1_p_r;
wire               reference_clk_2_p_r;         wire    init_clk_n;
//Dut1//Error Detection Interface
wire               hard_err_1_i;        
wire               soft_err_1_i;        //Status
wire               channel_up_1_i;        
wire               lane_up_1_i;//GT Serial I/O
wire               rxp_1_i; 
wire               rxn_1_i; wire               txp_1_i; 
wire               txn_1_i; // Error signals from the Local Link packet checker
wire    [0:7]      err_count_1_i; //Dut2//Error Detection Interface
wire               hard_err_2_i;        
wire               soft_err_2_i;        //Status
wire               channel_up_2_i;        
wire               lane_up_2_i;//GT Serial I/O
wire               rxp_2_i; 
wire               rxn_2_i; wire               txp_2_i; 
wire               txn_2_i; // Error signals from the Local Link packet checker
wire    [0:7]      err_count_2_i; //*********************************Main Body of Code**********************************//_________________________Serial Connections________________assign   rxn_1_i      =    txn_2_i;assign   rxp_1_i      =    txp_2_i;assign   rxn_2_i      =    txn_1_i;assign   rxp_2_i      =    txp_1_i;//__________________________Global Signals_____________________________//Simultate the global reset that occurs after configuration at the beginning//of the simulation. Note that both GT smart models use the same global signals.assign glbl.GSR = gsr_r;assign glbl.GTS = gts_r;initialbegingts_r    = 1'b0;       gsr_r    = 1'b1;gt_reset_in = 1'b1;#5000;gsr_r    = 1'b0;gt_reset_in = 1'b0;repeat(10) @(posedge init_clk_p);gt_reset_in = 1'b1;repeat(10) @(posedge init_clk_p);gt_reset_in = 1'b0;end//____________________________Clocks____________________________initialreference_clk_1_n_r = 1'b0;always #(CLOCKPERIOD_1 / 2) reference_clk_1_n_r = !reference_clk_1_n_r;assign reference_clk_1_p_r = !reference_clk_1_n_r;initialreference_clk_2_n_r = 1'b0;always #(CLOCKPERIOD_2 / 2) reference_clk_2_n_r = !reference_clk_2_n_r;assign reference_clk_2_p_r = !reference_clk_2_n_r;initialdrp_clk_r = 1'b0;always #(DRP_CLOCKPERIOD / 2) drp_clk_r = !drp_clk_r;initialinit_clk_p = 1'b0;always #(INIT_CLOCKPERIOD / 2) init_clk_p = !init_clk_p;assign init_clk_n =  !init_clk_p;//____________________________Resets____________________________initialbeginreset_i = 1'b1;#1000 reset_i = 1'b0;end//________________________Instantiate Dut 1 ________________aurora_8b10b_0_exdes example_design_1_i
(// User IO.RESET(reset_i),// Error signals from Aurora   .HARD_ERR(hard_err_1_i),.SOFT_ERR(soft_err_1_i),// Status Signals.LANE_UP(lane_up_1_i),.CHANNEL_UP(channel_up_1_i),.INIT_CLK_P(init_clk_p),.INIT_CLK_N(init_clk_n),.DRP_CLK_IN(drp_clk_r), .GT_RESET_IN(gt_reset_in),// Clock Signals.GTXQ0_P(reference_clk_1_p_r),.GTXQ0_N(reference_clk_1_n_r),// GT I/O.RXP(rxp_1_i),.RXN(rxn_1_i),.TXP(txp_1_i),.TXN(txn_1_i),// Error signals from the Local Link packet checker.ERR_COUNT(err_count_1_i)
);//________________________Instantiate Dut 2 ________________aurora_8b10b_0_exdes example_design_2_i
(// User IO.RESET(reset_i),// Error signals from Aurora   .HARD_ERR(hard_err_2_i),.SOFT_ERR(soft_err_2_i),// Status Signals.LANE_UP(lane_up_2_i),.CHANNEL_UP(channel_up_2_i),.INIT_CLK_P(init_clk_p),.INIT_CLK_N(init_clk_n),.DRP_CLK_IN(drp_clk_r), .GT_RESET_IN(gt_reset_in),// Clock Signals.GTXQ0_P(reference_clk_2_p_r),.GTXQ0_N(reference_clk_2_n_r),// GT I/O.RXP(rxp_2_i),.RXN(rxn_2_i),.TXP(txp_2_i),.TXN(txn_2_i),// Error signals from the Local Link packet checker.ERR_COUNT(err_count_2_i)
);always @ (posedge channel_up_1_i or posedge channel_up_2_i)
beginif((channel_up_1_i == 1'b1) && (channel_up_2_i == 1'b1))	begin	$display("\naurora_8b10b_0_TB : INFO : @Time : %t CHANNEL_UP is asserted in both DUT\n", $time);#5000 $display("\naurora_8b10b_0_TB : INFO : Test Completed Successfully\n");$finish;end
endalways @ (posedge err_count_1_i[7] or posedge err_count_2_i[7])
beginif((err_count_1_i >= 8'b0000_0001) || (err_count_2_i >= 8'b0000_0001))	begin	 $display("\nAURORA_TB : ERROR : TEST FAIL\n");$display("\nAURORA_TB : INFO  : ERR_COUNT1 = %b ERR_COUNT2 = %b\n",err_count_1_i,err_count_2_i);#1000 $display("AURORA_TB : INFO : Exiting from simulation ....\n");$finish;end 
end//Abort the simulation when it reaches to max time limit
initial
begin#(SIM_MAX_TIME) $display("\nAURORA_TB : INFO : Reached max. simulation time limit\n");$finish;
endendmodule

5.3 仿真工程结构说明

①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总线。

5.4 Aurora 8B/10B IP核 延迟开销

Aurora 8B/10B IP的延迟是由协议引擎(编解码、流水线处理、)和GT收发器的管道延迟引起的。随着用户接口数据宽度的增加,协议引擎的延迟也会增加;GT收发器的延迟取决于所选收发器的功能和属性。在K7器件的仿真实验大约在34个User_clk周期,其他器件请另测试,手册给出V7系列最小37个周期。
在这里插入图片描述

5.5 发送和接收数据

1)channel_up信号
在这里插入图片描述
2)s_axi_tx_tdata用户发送数据
在这里插入图片描述
3)m_axi_rx_tdata用户接收数据
在这里插入图片描述
通过仿真当channel_up信号置位拉高时,意味着Aurora 8b/10b IP核成功建立链路通道。s_axi_tx_tready和s_axi_tx_tvalid高有效时,用户发送数据有效,接收数据当m_axi_rx_tvalid有效时,接收端数据有效。在设计使用时需要注意:
①数据: 在用户发送每一帧数据的时候,Aurora8B10都会在数据的开始位置增加2byte的SCP和末尾增加2btye的EOF来表示数据帧的开始和结束标志(如果用户的数据btye数为奇数的话,会为其增加额外的一个PAD byte来使数据为偶数)。所以为了最大传输带宽,用户每次传输的数据byte数最好为偶数。
②时钟补偿: 传输通道每10000 bytes需要进行一次时钟补偿,每次时钟补偿需要发送12 bytes的数据,需要消耗6个或者3个时钟周期开销。
③传输延时:从发送端发送第一个数据开始,到接收端接收到第一个数据结束所消耗的时间,最小的延时为37/41个用户时钟周期,如有对时延有要求。

6 总结

本文介绍了高速接口Aurora8B/10B 协议,通过对协议的接口时序理解及握手机制及一些相关术语的学习,详细了解了高速接口Aurora8B/10B 协议的使用方法。通过FPGA仿真验证了该IP的使用方法和一些主要的关键信号。为使用高速串行接口设计提供基础。后续则继续总结分享FPGA中的一些技术应用,开发不易珍惜每一分原创和劳动成果,同时注意平时开发过程中的经验积累总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28765.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux-网络】深入拆解TCP核心机制与UDP的无状态设计

🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚引言 📚一、UDP协议 📖 1.概述 📖 2.特点 &#x1…

一文学会Spring

一、Spring简介 Spring的优点 Spring是一个开源免费的框架、容器Spring是一个轻量级的框架,非侵入式的控制反转IOC、面向切面AOP支持事务 Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器 二、IOC 2.1 IOC本质 控制反转IOC,是一种设计思想…

AWR microwave office 仿真学习(三)各类传输线模型学习

目录 引言Phase Spec: Coupled Lines (Closed Form): CLINPhysical Spec: Coupled Lines, Grounded Shield, Improved Accuracy (Closed Form): CLINPPhysical Specification, Floating Shield (Closed Form): COAXElectrical Specification, Grounded Shield (Closed Form): C…

TrustRAG:通过配置化模块化的检索增强生成(RAG)框架提高生成结果的可靠性和可追溯性

TrustRAG旨在风险感知的信息检索场景中提高生成内容的一致性和可信度。用户可以利用私有语料库构建自己的RAG应用程序,研究库中的RAG组件,并使用定制模块进行实验。论文展示了TrustRAG系统在摘要问答任务中的应用,并通过案例研究验证了其有效性。总体而言,TrustRAG通过语义…

pgsql行列转换

目录 一、造测试数据 二、行转列 1.函数定义 2.语法 3.示例 三、列转行 1.函数定义 2.语法 3.示例 一、造测试数据 create table test ( id int, json1 varchar, json2 varchar );insert into test values(1,111,{111}); insert into test values(2,111,222,{111,22…

计算机视觉算法实战——人脑解码(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域简介 人脑解码(Brain Decoding)是神经科学与计算机视觉交叉领域的一个重要研究方向,旨在…

[Computer Vision]实验六:视差估计

目录 一、实验内容 二、实验过程 2.1.1 test.py文件 2.1.2 test.py文件结果与分析 2.2.1 文件代码 2.2.2 结果与分析 一、实验内容 给定左右相机图片,估算图片的视差/深度;体现极线校正(例如打印前后极线对)、同名点匹配…

【Mac】git使用再学习

目录 前言 如何使用github建立自己的代码库 第一步:建立本地git与远程github的联系 生成密钥 将密钥加入github 第二步:创建github仓库并clone到本地 第三步:上传文件 常见的git命令 git commit git branch git merge/git rebase …

从0搭建Tomcat第二天:深入理解Servlet容器与反射机制

在上一篇博客中,我们从0开始搭建了一个简易的Tomcat服务器,并实现了基本的HTTP请求处理。今天,我们将继续深入探讨Tomcat的核心组件之一——Servlet容器,并介绍如何使用反射机制动态加载和管理Servlet。 1. Servlet容器的作用 S…

文件上传漏洞:upload-labs靶场11-20

目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 ,发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…

【音视频】视频基本概念

一、视频的基本概念 1.1 视频码率(kb/s) 视频码率是指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流进度也就越高 1.2 视频帧率(fps) 视频帧率…

Sqlserver还原备份文件时提示缺少日志文件

Sqlserver还原备份文件时提示缺少日志文件 解决方案:

《2025年软件测试工程师面试》消息队列面试题

消息队列 消息队列(Message Queue,简称 MQ)是一种应用程序之间的通信方法。 基本概念 消息队列是一种先进先出(FIFO)的数据结构,它允许一个或多个消费者从队列中读取消息,也允许一个或多个生产者…

前端基础之vuex

是一个专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式管理(读或写),也是一种组件间通信的方式,适用于任意组件间的通信 什么时候使用vuex? 1.多组件依赖同一状态 2.来自不同组件的行…

Node.js二:第一个Node.js应用

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 创建的时候我们需要用到VS code编写代码 我们先了解下 Node.js 应用是由哪几部分组成的: 1.引入 required 模块:我们可以使用 requi…

Python学习(十四)pandas库入门手册

目录 一、安装与导入二、核心数据结构2.1 Series 类型(一维数组)2.2 DataFrame 类型(二维数组) 三、数据读取与写入3.1 读取 CSV 和 Excel 文件3.2 写入数据 四、数据清洗与处理4.1 处理缺失值4.2 数据筛选4.3 数据排序 五、数据分…

2025东方财富笔试考什么?cata能力测评攻略|答题技巧真题分享

嘿,各位怀揣金融梦想、准备在 2025 年求职浪潮中大展身手的小伙伴们! 我是职小豚,在求职指导领域摸爬滚打了 10 年,每年都见证着无数求职者为心仪的岗位全力以赴。 一、东方财富:金融科技界的“数据狂魔” 东方财富&…

Ollama+AnythingLLM安装

一、文件准备 ‌ 1. 安装包获取‌ 从联网设备下载: AnythingLLMDesktopInstaller.exe(官网离线安装包)‌ deepseek-r1-1.5b.gguf(1.5B 参数模型文件)‌ 2. ‌传输介质‌ 使用 U 盘或移动硬盘拷贝以下文件至离线设…

java后端开发day27--常用API(二)正则表达式爬虫

(以下内容全部来自上述课程) 1.正则表达式(regex) 可以校验字符串是否满足一定的规则,并用来校验数据格式的合法性。 1.作用 校验字符串是否满足规则在一段文本中查找满足要求的内容 2.内容定义 ps:一…

Storm实时流式计算系统(全解)——下

storm编程案例-网站访问来源实时统计-需求 storm编程-网站访问来源实时统计-代码实现 根据以上条件可以只写一个类,我们只需要写2个方法和一个main(),一个读取/发射(spout)。 一个拿到数据统计后发到redis…