以太网学习(三)——FPGA的MAC与PHY芯片之间的接口,以及RGMII接口时序
主要有SMII, MII, RMII, GMII, RGMII这几种接口,其中SMII是串行的接口,引脚最少。
MII接口
通信速率10M/100M(百兆以太网的通信接口)
ETH_RXC:PHY侧输出给MAC的以太网的接受时钟
ETH_RXDV:PHY侧输出给MAC的接收有效信号
ETH_RXER:PHY侧输出给MAC的接收错误信号
ETH_RXD:PHY侧输出给MAC的4位接收数据
只有当ETH_RXDV为高电平,ETH_RXER为低电平时,这时传输的数据才是有效数据
ETH_TXC:发射时钟同样是有PHY芯片提供给MAC的
ETH_TXEN:MAC提供给PHY芯片的发送使能信号
ETH_TXER:MAC提供给PHY芯片的发送错误指示信号
ETH_TXD:MAC提供给PHY芯片的待发送的4位数据
只有当ETH_TXEN为高电平,ETH_TXER为低电平时,这时传输的数据才是有效数据
10M:时钟为2.5MHz,单沿采样;100M:时钟为25MHz,单沿采样
RMII接口(Reduced MII)
通信速率为10M/100M
发送数据核接收数据都是两位的;
参考时钟通常是由外部晶振提供给MAC侧或PHY芯片的;
CRS和DV信号复用一个端口;
10M:时钟为5M,单沿采样;100M:时钟为50M,单沿采样
GMII接口(Gigabit MII)
通信速率1G/100M/10M
与MII接口相比,TXC由MAC侧产生(原图中画错了),并且将数据位宽从4位提高到了8位;
10M:时钟为2.5M,单沿采样,只用到了4位;100M:时钟为25M,单沿采样,只用到了4位;1G:时钟为125M,单沿采样
RGMII(Reduced GMII)
通信速率为1G/100M/10M
TXC由MAC侧产生;
将RXDV和RXER信号集成到了RXCTL上,时钟上升沿采到的是RXDV,下降沿采到的是RXDV^RXER(异或);
将TXEN和TXER信号集成到了TXCTL上,时钟上升沿采到的是TXEN,下降沿采到的是TXEN^TXER(异或);
数据位宽由8位减少到了4位;
1G:时钟为125M,双沿采样;100M:时钟为25M,单沿采样;10M:时钟为2.5M,单沿采样
RGMII接口时序
RGMII接收时序(1G)(PHY芯片产生的信号时序)
注:由于下降沿传输的是异或结果,所以正常情况下,RXCTL信号一直为高电平时传输的才是有效数据。
为保证能够正确采到数据,PHY芯片需要将接收到的TXC信号延迟约1/4个时钟周期。
RGMII发送时序(1G)(FPGA MAC侧产生的信号时序)
注:由于下降沿传输的是异或结果,所以正常情况下,TXCTL信号一直为高电平时传输的才是有效数据。
为保证FPGA能够正确采到数据,PHY芯片需要将发送给MAC的RXC信号延迟约1/4个时钟周期。
对于ZC706开发板上的88E1116R PHY芯片来说,控制时钟是否延迟的方式是CONFIG引脚或者通过寄存器的方式进行配置:
这个意思是,如果CONFIG[3]连到了LED[0]上,那么相当于配置了接收时钟的延时处理,但是没有配置发送时钟的延时处理。
或者可以通过MDIO配置相对应的寄存器21_2.4和21_2.5,用软件的方式配置时钟延时:
查看ZC706的PHY芯片88E1116R部分的原理图:
发现CONFIG[3]连到了排针的中间的引脚2,如果将J45或J46的中间的引脚通过短路片与1脚相连,那么就可以将PHY芯片配置成发送时钟和接收时钟都添加延迟。
参考:正点原子官方视频
原文地址:https://www.cnblogs.com/vvvvvvip-xxLiu/p/15302320.html
- Golang读写文件操作
- 使用Dockerfile构建自己的etcd镜像
- 图像分割(五)
- 企业级Docker Registry开源工具Harbor的用户使用指南
- 后渗透工具Koadic:你真的了解我吗?
- Docker1.12尝试
- 颁奖乌龙就算了,怎么还性别歧视,好莱坞电影怎么了?数据笑而不语
- Python中关于集合(set)的思考
- 构建属于自己的原生docker images
- Docker-client for python使用指南
- Ansible基本配置以及使用示例
- redis超时原因系统性排查
- overlayfs存储驱动的使用以及技术探究
- 分页解决方案 之 分页算法——Pager_SQL的详细使用方法和注意事项
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法