fpga-gmac-rgmii

梳理fpga上gmac和rgmii。

基本概念

RGMII接口如下:

时序图如下:

特点:

  • 10Mbps使用的clock为2.5MHz,一个时钟周期为400ns,半个时钟周期为200ns。单沿采样。
  • 100Mbps使用的clock是25MHz。单沿采样。
  • 1000Mbps使用的clock是125MHz。双沿采样。

Clock Skew

从上面的时序看到,数据在时钟的边沿变化,如果不做处理,接收端无法稳定采样。为了解决这一问题,常见做法是为时钟信号添加延迟,使其边沿对准数据总线的稳定区间。可以FPGA侧、PCS侧、PHY侧添加时钟偏移。

理解一下:

PHY侧默认出来的时序是这样的:

PHY侧一般支持Delay Mode,可将时钟delay大概2ns左右。波形是这样的:

MAC侧期望收到的波形是这样的:

所以,如果PCB侧和FPGA侧,data path delay和clock path delay相同的话,那单纯的使用软件配置PHY侧的Delay Mode就可以了。

真实情况往往比这个更为复杂。在PHY侧产生数据的时候,还有个Tskew,也就是数据不稳定的时间,大概+0.5ns/-0.5ns

另外还需要满足Setup/Hold Time。大概1.2ns。

FPGA Constraint

在FPGA这侧,有两个需要注意的。

第一是需要采用IDDRE1。因为RXD有多bit数据,要保证这几个数据之间的delay足够小。所以用IDDRE1。

Forced RXDATA, TXCTL flops placement using primitives. Minimize skews across multiple flops.

第二是设置input delay。针对10Mbps的RGMII,可以设置max delay为202,min delay为196。(如果无法满足可以适当缩小0.1~0.2,主要是max delay)

这里之所以把delay设置得非常大,主要是因为vivado计算的时候和rgmii的时序是是有差别的。我们来看看这个差别。

以下面的为例子。

这个是设置max delay为200.5的时序报告

可以画出vivado的计算方式

这个是hold time的时序报告。

以下是vivado的计算方式:

而真实的波形出来是没有这么大的delay,所以波形是这样的。

从波形可以看出,主要影响的是setup time,如果把RXC往后delay得越多越好,但往往vivado也只能往后delay一部分,所以最好的还是,PHY出来就delay,PCB等长,FPGA这侧也约束max delay最大,这样出来的timing是最好的。