开发者分享 | 如何使用 10G/25G 以太网 IP core 上的 1588 功能

作者:XILINX 高级产品应用工程师 Gary,本文转载自: XILINX开发者社区微信公众号

以太网 IP 核的 1588 功能是用来实现,在 IP 内部为TX侧发送包打上发送出去这个时间节点的时间戳,以及获得 RX 侧收回来的包在 IP 接口处的时间戳。然而10G/25G 的 IP 例子工程没有提供演示,本文主要介绍了如何使用这个 IP 的 1588功能。

产生一个例子工程的仿真

1. 打开Vivado新建工程,添加一个 10G/25G以太网 IP core,注意在 IP 的 GUI 里勾上 1588功能(如图),然后右键产生example design

为了能同时支持 1-step 和 2-step,这里在产生 IP 时选择了“OneStep”的 1588

2. 工程产生完成后,需要先给 tx/rx_systemtimer 加上参考时间值。如果用的是 2020.2,新的 IP 例子工程已经自带了 timer_syncer 模块,为 systemtimer 提供输入。但如果用的是之前的版本,你只需要写一个计数器的逻辑,输出为标准时间 ns 计数,提供给 systemtimer 输入就行了,到时候 IP 在发出包的那一刻,会把 tx_systemtimer 当时的值作为时间戳使用,或者在收到包的那一刻,把当时的 rx_systemtimer 的值拿来使用

下面是一个简单的计数器代码示例,选自 100GCMAC 的 IP 参考设计中产生 tx_systemtimer的逻辑,供参考使用

3. 最后给工程加上仿真选项,帮助加速仿真速度,就可以开始做工程的功能仿真了

如何使用1588功能

1. 首先使能 IP 的 1588 的 1-step 功能,可以在逻辑里将 IP 的输入“ctl_tx_1step_enable” 置1,如果使能了 IP 的 AXI 读写寄存器接口的话,也可以将地址 0038 的 bit0 写1

2. 同样地方式,通过修改信号 “ctl_ptp_transpclk_mode” 选择 OrdinaryClock 模式或者TransparentClock 模式。在 OC 模式下,时间戳会直接覆盖原以太网包里的值,但在 TC 模式下,时间戳则会叠加在原来位置的数值上面。具体可参考 1588 协议

3. 接着跑仿真,先在设计逻辑里将 “tx_ptp_1588op_in” 接为 01,观察 1-step 模式下的 IP 的工作行为,仿真结果如下图示

由于这里的 “tx_ptp_tstamp_offset_in” 为0,发送包的第一拍数据 “tx_axis_tdata” 会从原来的值 “fe14ffffffffffff”被 IP 替换成时间戳,也就是在 RX 侧看到收到的数据包的第一拍数据 “rx_axis_tdata” 已经变成了 “010005xxxxxxxxxx”

实际上 IP 在 1-step 工作模式下,2-step也是同时工作的,对应 “tx_ptp_tstamp_valid_out” 拉高的 “tx_ptp_stamp_out” 的值,就是这个包的时间戳,输出给客户,这个时间戳的值客户可以自行稍加修改添加到下一个包再发出去,这就是 2-step 的工作模式

用于2-step的“tx_ptp_stamp_out”和填进包里的1-step时间戳略有区别,差距就是 “ctl_tx_ptp_latency_adjust”,差异的原理细节可参考 IP 的文档 PG210

用户可以自行给他发的每个包输入不同的“tx_ptp_tag_field_in”值,然后当IP输出 “tx_ptp_stamp_out” 时间戳的时候,只要找到对应的 “tx_ptp_pstamp_tag_out” 值,就是相同 tag_in 对应的那个包的时间戳

RX 侧收进包的时间戳,为 "rx_ptp_stamp_out”,目前时间戳的点都是 IP 的接口,所以在环回仿真里面,RX 侧的时间戳会比TX侧的时间戳大,差了一整个 GT 的延时没有计算进去,用户应当在AR搜索中找到自己用的器件对应GT的具体latency,静态延时值可通过ctl_tx/rx_latency 信号合进 IP。并且,延时结果能在功能仿真里面体现出来

4. 最后你还可以随时在逻辑里修改 "tx_ptp_1588op_in" 的输入,当接为 00 或者 10 的时候,IP 就不会再自动打上时间戳,第一拍保留了数据包的原始数据 "fe14ffffffffffff”,并且如果1588op=00 的时候,"tx_ptp_tstamp_valid_out" 也不会再拉高,如下图

最新文章