2. Aurora核架构解析:发送端架构、接收端架构、时钟与复位管理、用户接口(AXI4-Stream)

好,咱们今天来聊聊Aurora核的内部架构。说实话,我第一次看Aurora的文档时,也被那一堆框图搞得有点晕。但后来我发现,只要抓住发送端、接收端、时钟复位和用户接口这四个核心模块,整个架构就清晰了。下面我按自己的理解,把这四个部分拆开来讲。

2.1 发送端架构:数据是怎么发出去的?

发送端说白了,就是把用户数据打包成Aurora帧,然后串行化发出去。我习惯把它分成三个流水级来看:

  • 用户接口层:接收AXI4-Stream数据,做跨时钟域处理
  • 帧封装层:添加帧头、CRC校验、填充数据
  • 串行化层:并行转串行,加上8B/10B编码

嗯,这里要注意一个关键点——数据对齐。我在项目中遇到过一个问题:发送端明明送出了数据,接收端却一直报错。查了半天,发现是发送端没有在帧头位置插入正确的K码。说白了,Aurora核是靠K码来识别帧边界的,这个对齐一旦出错,后面全乱套。

发送端核心时序要求

  • tvalid和tready握手必须符合AXI4-Stream规范
  • tlast信号必须在帧最后一个数据有效时拉高
  • 帧间隔至少需要2个时钟周期的空闲

2.2 接收端架构:数据是怎么收回来的?

接收端是发送端的逆过程,但难度其实更大。你想想看,数据从线路上过来,带着各种抖动和噪声,接收端得先恢复时钟,再找到帧边界,最后才能把数据交给你。

接收端的主要模块包括:

  1. CDR(时钟数据恢复):从串行数据流中提取时钟
  2. 字对齐模块:通过K码找到32位数据的边界
  3. 通道绑定模块:多通道时做去偏移
  4. 帧解析模块:去掉帧头、校验CRC
  5. 用户接口模块:将数据转成AXI4-Stream格式送出

我曾经调试过一个接收端丢数据的案例。现象是偶尔丢一个包,但频率不高。用IBERT抓眼图,发现眼宽没问题。后来我怀疑是通道绑定出了问题——两个通道的skew超过了绑定窗口。调整了GT的延迟参数后,问题就解决了。所以啊,接收端的问题往往出在物理层,而不是逻辑层。

注意:接收端的tready信号不能随意拉低。如果你在接收数据过程中拉低了tready,发送端可能会重传,导致带宽利用率下降。我建议在接收FIFO深度还剩1/4时就提前拉高反压信号。

2.3 时钟与复位管理:最容易出坑的地方

时钟和复位,是Aurora核里最容易踩坑的地方。我见过太多工程师在这上面花了一两周时间。

先看时钟域:

时钟域 来源 频率 说明
用户时钟 用户逻辑提供 与线速率相关 用于AXI4-Stream接口
GT时钟 GT参考时钟 固定值 用于串行收发器
核时钟 由GT时钟分频得到 线速率/32 用于内部逻辑

我个人习惯的做法是:用户时钟和核时钟使用同一个PLL输出。这样能避免跨时钟域带来的亚稳态问题。如果实在要用不同时钟,那一定要在接口处加异步FIFO。

再来看复位。Aurora核的复位有讲究:

  • 硬复位:复位整个核,包括GT,需要至少100us
  • 软复位:只复位逻辑部分,GT保持锁定
  • 通道复位:只复位某个通道

嗯,这里有个坑——复位顺序。我曾经在项目里先释放了用户逻辑复位,再释放GT复位,结果GT的初始化序列被打乱了,导致链路一直起不来。正确的做法是:先释放GT复位,等GT锁定后再释放核复位,最后释放用户接口复位。

小技巧:在调试阶段,我习惯把复位信号引到GPIO上,用示波器观察复位释放的顺序。这样能快速定位复位相关的问题。

2.4 用户接口(AXI4-Stream):数据进出的通道

用户接口用的是AXI4-Stream协议。这个协议其实很简单,就几个信号:

  • tdata:数据总线,通常32位或64位
  • tvalid:发送方表示数据有效
  • tready:接收方表示可以接收
  • tlast:表示帧的最后一个数据
  • tkeep:表示哪些字节有效

说白了,就是tvalid和tready握手。当tvalid和tready同时为高时,数据被传输。这个握手机制保证了数据不会丢失。

我遇到过一个问题:用户逻辑的tvalid信号在帧中间突然拉低了。Aurora核会认为这是一个帧错误,直接丢弃整个帧。所以啊,一旦开始发送一个帧,tvalid必须保持高直到tlast拉高

另外,tkeep信号也容易被人忽略。如果你的数据宽度是32位,但实际有效数据只有1个字节,那tkeep就要设置为4'b0001。否则接收端会收到无效数据。

AXI4-Stream接口时序示例

// 发送一个32字节的帧
// 时钟周期1: tvalid=1, tready=1, tdata=0x12345678, tkeep=4'b1111, tlast=0
// 时钟周期2: tvalid=1, tready=1, tdata=0x9ABCDEF0, tkeep=4'b1111, tlast=1
// 注意:tlast在最后一个数据时拉高

2.5 架构总览:一张图看懂

说了这么多,我画了一张架构图,把发送端、接收端、时钟复位和用户接口的关系展示出来。你一看就明白了。

Aurora核架构总览 用户接口 AXI4-Stream tdata/tvalid/tready/tlast 发送端架构 帧封装 → 8B/10B编码 并行转串行 → GT发送 添加帧头/CRC/填充 接收端架构 GT接收 → 串行转并行 字对齐 → 通道绑定 帧解析/CRC校验 时钟与复位管理 用户时钟 | GT时钟 | 核时钟 硬复位 → 软复位 → 通道复位 串行数据 串行数据 GT 收发器 用户接口 发送端 接收端 GT收发器 时钟/复位

从这张图你能看到,用户接口是数据进出的门户,发送端和接收端分别处理数据的发送和接收,GT收发器负责物理层的串行通信,而时钟和复位管理则像心脏一样,为整个系统提供稳定的节拍和启动顺序。

好了,这一章的内容就到这里。记住我强调的几个关键点:发送端注意K码对齐,接收端注意通道绑定,时钟复位注意释放顺序,用户接口注意tvalid的连续性。把这些搞明白了,Aurora核对你来说就没啥秘密了。

专注资料整理