首先这个话题需要了解GMII,RGMII,XGMII最基本的数据格式。(X是罗马数据的10)
而GMII和RGMII他们的应用比较广,其他网友的介绍也比较详细,这里就不做过多的介绍。
在正式介绍转换之前,先介绍下XGMII,根据IEEE802.3的介绍(第46节)。是10Gb/s的网络接口。作用于MAC和PHY。其信号接口如下:
其中他们有各自的时钟(这里可以将收到的钟送给输出的钟),数据位宽为32bit,另外有4位分别表示他们的符号控制位,这4位控制位对应数据的32bit,以一个8位数据位对应一个控制位的一位。如下图所示:
弄清楚它的各个信号定义后,接下来了解下数据流:从下图可以看出它是以8bit为一个单位的方式采用了大端模式。而每个8bit正好是GMII的数据。
这里好清楚数据格式很重要。因为GMII是以8bit在传输,XGMII是以4个8bit拼成32位再传输。并且要注意大端的方式传输。如下图是我截取传输ICMP协议的XGMII的数据格式与GMII的数据格式。
接下来需要弄清楚传输的字符,如下表所示:
可以看出传输的空闲帧不再是GMII中的8’hdd,而是32‘h07_07_07_07。如下表是我整理的传输ICMP协议时GMII与XGMII的区别。为了方便对比我将XGMII的数据格式拆分成与GMII的数据格式一致。
从上图可以看出,除了空闲帧的区别,前导码也发生了改变,将最开始的一个8’h55替换为了8‘hfb,并且在数据的结尾增加了一个8位的结束控制符8’hfd。值得注意的是,XGMII中,传输字符控制位用1表示,传输数据用0表示。
因此我们再做模块转换时需要做的就是字符替换与位宽转换两个点。其RGMI如果需要转换成XGMII,则是需要先将RGMII和GMII之间的转换。
本人已在FPGA上用verilog实现GMII 、RGMII、XGMII之间的转化过程,并可以进行仿真测试。由于篇幅过多不尽详叙,需要详细技术质询可以私信我做进一步的交流。