FPGA实现以太网(一)、以太网基础知识
在前一文FPGA实现以太网(一)、以太网基础知识我们知道,以太网通信中的物理层链路基本上是由 PHY 芯片建立。PHY 芯片有一个配置接口,即 MDIO接口,可以配置 PHY 芯片的工作模式以及获取 PHY 芯片的若干状态信息。PHY芯片里面有很多寄存器,里面存放着PHY芯片的工作模式以及工作状态,比如链接情况、链接速率等等。MAC侧和PHY芯片的链接示意图如下:
整个芯片的内部结构图如下所示:
MDIO协议是一个标准的、广泛使用的协议,因此帧格式都是一致的。以我开发板上的RTL8211芯片手册为例,其帧格式如下:
- Preamble :32位的前导码;由MAC端发送32个连续的1用于同步PHY芯片。
- ST:2位的帧开始信号;由01表示新的一帧信号的到来。
- OP:2位的操作码;10表示读,01表示写。
- PHYAD :5位的PHY 地址;用于表示与哪个 PHY 芯片通信,因为一个 MAC 上可以连接多个 PHY 芯片。
- REGAD:5位的PHY芯片里面的寄存器地址;用于表示操作PHY芯片里的哪一个寄存器。
- TA:2位的转向信号;主要是这是寄存器地址和帧的数据字段之间的2位时间间隔,以避免在读事务期间争用。在读命令中,MDIO 在此时由 MAC 驱动改为 PHY 驱动,在第一个 TA位,MDIO 引脚为高阻状态,第二个 TA 位,PHY 将 MDIO 引脚拉低,准备发送数据;在写命令中,不需要 MDIO 方向发生变化,MAC 固定输出 2’b10,随后开始写入数据。
- DATA:16 位数据,在读命令中,PHY 芯片将对应的 PHYAD 的 REGAD 寄存器的数据写到 DATA中;在写命令中,PHY 芯片将接收到的 DATA 写入 REGAD 寄存器中。在 DATA 传输的过程中,高位在前,低位在后。
- IDLE:1位空闲态;此时 MDIO 为无源驱动,处于高阻状态,但一般用上拉电阻使其上拉至高电平。
MDIO写时序如下所示:
- MAC在MDC下降沿发送32位的1。
- 然后MAC在MDC下降沿发送01,此时PHY芯片会在时钟上升沿采集,如上图的竖线位置。
- 因为是写操作,所以MAC接着发送了操作码01,表示当前为写操作。
- 接着MAC发送了5位的PHY地址,例子中的PHY地址为5’b00001。
- 然后MAC发送了5位需要操作的PHY芯片里面的寄存器地址,这里是5‘b00000。
- 因为是MAC侧写数据,因此发送了2位10的转向码,依然是MAC控制着MDIO总线。
- 最后MAC侧发送16位的数据。
- 最后MAC将MDIO拉成高阻态。
- MAC在MDC下降沿发送32位的1。
- 然后MAC在MDC下降沿发送01,此时PHY芯片会在时钟上升沿采集,如上图的竖线位置。
- 因为是读操作,所以MAC接着发送了操作码10,表示当前为读操作。
- 接着MAC发送了5位的PHY地址,例子中的PHY地址为5’b00001。
- 然后MAC发送了5位需要操作的PHY芯片里面的寄存器地址,这里是5‘b00000。
- 因为是MAC侧读数据,因此MAC拉高MDIO为高阻态Z,在第二个操作位的0是由PHY拉低的表示响应成功;如果第二个操作位是1,表示操作失败。
- 最后PHY侧发送16位的数据,MAC侧在MDC上升沿采集数据。
- 最后MAC将MDIO拉成高阻态。
一个PHY芯片里有很多寄存器,每个寄存器的作用都是不一样的,我们这里只介绍我们用到的寄存器功能。
这个寄存器我们只看协商后的速度即可,其它的以后用到了再看:
PHY芯片的复位管脚为PHYRSTB,低电平有效;复位必须持续10ms。
我们先实现读取PHY的状态,看连接速度、是否链接成功,后续再增加其它的操作,系统框图如下:
驱动代码如下:
5.3.1 写操作仿真
我们先试一下写操作,假如需要在寄存器(0x00)里面写入数据(0x1234),仿真代码如下:
5.3.2读操作仿真
接下来我们仿真读操作,仿真代码就改一下读写指令,其它的都不用改,仿真代码如下:
5.4.1 Verilog代码
控制模块代码如下:
5.4.2 仿真验证
我们先把两个模块用顶层连上,然后给模块输入时钟即可,仿真代码如下:
打开仿真波形,我们先来看PHY芯片的复位引脚:
我们仿真完后,添加一些信号的ILA进行debug,然后用网线连接开发板,下载程序后打开波形窗口
下板后我们打开网络适配器看当前已经链接上了,速率为1000Mbps;我们debug读出的0x01寄存器的数据是0x796d对应的2进制是{0111_1001_0110_1101},读取0x00寄存器的数据是0x1140对应的2进制是{0001_0001_0100_0000};我们打开前面的寄存器描述来看
前面我们已经验证了MDIO的操作时序正确,这次我们添加外部按键来控制整个PHY芯片来实现速率可调,复位可调等操作。
我们使用外部4个按键,按下可以设置速率10M,100M,1000M以及复位操作;通过四个LED灯来显示,第一个LED亮表示当前速率是10M,第二个LED亮表示当前速率是100M,第三个LED亮表示当前速率是1000M,第四个LED亮表示当前链接成功(ps:如果没有link成功,所有灯都不会亮),系统框图如下:
因为前面MDIO读写操作已经验证成功,所以我们这里直接下板,debug看关键信号就可以了,下板打开debug窗口: