目录
一、NFC简介
二、仿真和测试
NFC帧内容
发送NFC_OFF(启动流控)
发送NFC_ON(关闭流控)
仿真verilog结果
在使用高速接口Aurora进行数据跨片传输时,发送端的axi有ready,而接收端的axi没有ready信号。所以接收端不能直接通过拉低ready信号对另一片FPGA的输出进行反压。这时候需要用到Aurora IP核自身的反压功能。
流控一共有两种模式一种是NFC和UFC
Aurora 64B/66B仅支持GTYE3/GTYE4 16.375G设备的UFC功能
本次实验使用的是Aurora 64B/66B和NFC功能。
一、NFC简介
本地流控制(NFC)接口,其允许接收机通过指定必须放入数据流的空闲数据跳数来控制接收数据的速率。甚至可以通过请求发送器临时发送空闲(XOFF)来完全关闭数据流。NFC 通常用于防止FIFO 溢出条件。
Flow Control设置(针对Framing模式)
Flow Control设置(针对Framing模式)
- 立即模式允许将空闲代码插入数据帧内
- 完成模式仅将空闲代码插入完整数据帧之间(仅适用Framing模式)
NFC接口如下:
二、仿真和测试
当接收端FPGA1_RX接收不过来时(用aururo_rdy=1'b0表示),需要往发送端FPGA2_TX发送NFC帧,暂停FPGA2_TX的发送。当aururo_rdy=1'b1时,再次发送NFC帧,关闭流控。
NFC帧内容
NFC不同模式下的data内容区分大小端模式,默认为大端模式,高位数据在低位。
- data[7]=1,表示流控开启。此时数据流完全赞同。
- data[8:15]为n时,使得另一片的FPGA发送数据包之间插入n+1个空闲时间。即FPGA1给FPAG2_TX的数据包之间插入空闲时间,降低TX的发送流量(降速),防止FPGA1_RX数据量太大处理不过来。
- data[0:6]:全0,这个字段一般用不上(官方解释是don't care)
- [15:0]data=16'b0,全0表示流控关闭。
- 实际应用时,需要降低流量,发送一帧NFC,其中data[7]=0,data[8:15]设置需要插入的空闲数,越大流量越少。需要完全截断流量时,设置data[7]=1,当需要关闭截断时,需要再发一帧data[7]=0的NFC帧。
大小端数据格式如下:
本次实验采用默认模式(大端),利用状态机实现状态跳转。
代码如下:
状态转移图如下(粗略):
发送NFC_OFF(启动流控)
当aururo_rdy信号为0(FPGA1_RX接收不过来),跳转到SEND_OFF_DATA,发送NFC帧。此时等待IP给出的s_axi_nfc_tready(一拍),一拍后nfc_valid和nfc_data信号随s_axi_nfc_tready信号同时拉低。
时序图如下:
发送NFC_ON(关闭流控)
过程和状态机转移和发送NFC_OFF类似,但此时数据内容为全0,NFC插入空闲时间默认为2。也可以修改data内的数值。
Flag信号
为了防止aururo_rdy拉低或拉高时,多次发送NFC_OFF(开启流控帧)和NFC_ON(关闭流控帧),我采用了Flag信号进行指示。
一开始flag为0,当需要发送一帧NFC_OFF时,检测到flag为0,则发送NFC_OFF,同时flag拉高;当需要关闭流控,发送NFC_ON时,检测到flag为1,则发送NFC_ON,同时flag拉低。
仿真verilog结果
如图所示,红色的aururo_rdy是接收端给到FPGA1aururo的反压,拉低后,发送NFC帧给另一片FPGA2的TX端,使另一片tx_ready拉低,停止另一片的数据帧的发送。最后检查了帧的数量,没有发生丢帧的情况。