Aurora 64B66B是Xilinx提供的高性能串行通信协议IP核,广泛应用于FPGA间的点对点数据传输。它采用64B/66B编码方案,具有较高的编码效率和时钟恢复能力。在实际项目中,我们通常需要通过AXI4-Stream接口与Aurora IP核进行数据交互。
AXI4-Stream接口的主要信号包括:
这里有个特别需要注意的地方:Aurora IP核的s_axi_tx_tready信号行为比较特殊。它不像常规AXI4-Stream接口那样保持稳定可用状态,而是会根据IP核内部状态动态变化。这就给发送端设计带来了挑战——我们需要一种机制来缓冲数据,同时能够快速响应tready信号的突发变化。
在Aurora发送端设计中,FIFO主要解决两个问题:
我曾在项目中尝试过不使用FIFO直接连接的设计,结果遇到了严重的数据丢失问题。当tready信号突然无效时,如果没有缓冲机制,正在传输的数据就会丢失。这让我深刻认识到FIFO在这个场景中的必要性。
标准FIFO读模式的工作流程是:
这种模式在与Aurora接口配合时会遇到时序对齐问题。因为tready信号可能在任何时候变化,如果我们等到tready有效才发出rd_en,数据需要等到下一个周期才能使用,这就可能错过当前周期的发送机会。
First-Word Fall-Through(FWFT)模式改变了FIFO的读行为:
这种行为的时序特性完美匹配Aurora接口的需求。我们可以将FWFT FIFO的valid信号直接连接到tvalid,dout连接到tdata。当tready有效时,只需在同一个时钟周期断言rd_en即可完成数据传输。
在Vivado中使用FIFO Generator IP核配置FWFT模式时,需要注意以下参数:
我推荐在RTL代码中这样实例化FWFT FIFO:
verilog复制afifo_fwft u_tx_fifo (
.rst(reset),
.wr_clk(sys_clk),
.rd_clk(gt_clk),
.din(tx_data_in),
.wr_en(tx_valid_in),
.rd_en(tx_ready & tx_valid),
.dout(s_axi_tx_tdata),
.full(),
.empty(),
.valid(s_axi_tx_tvalid)
);
基于FWFT FIFO的发送端典型设计包含以下关键逻辑:
这里有个实际项目中的经验:FWFT FIFO的empty信号通常不需要连接到Aurora接口,因为valid信号已经隐含了空状态信息。这样可以简化接口设计。
让我们分析几个典型场景的波形:
场景1:正常传输
场景2:tready突发无效
场景3:FIFO变空
在实际项目中,我遇到过几个典型问题:
推荐以下验证步骤:
一个实用的调试技巧是在ILA中添加以下信号:
根据项目经验,这些参数对性能影响较大:
对于高性能应用,可以考虑:
我在一个400Gbps的项目中采用FWFT FIFO配合Aurora IP核,成功实现了零丢包传输。关键点在于精心调整FIFO参数和严格验证各种极端场景。记住,在高速串行设计中,仿真通过的案例在实际硬件中可能会暴露新的问题,因此充分的硬件测试必不可少。