软件版本:VIVADO2017.4 操作系统:WIN10 硬件平台: ARTIX-7 系列开发板 4.1概述在以太网通信中,设备之间的物理层链路均由PHY芯片建立。PHY芯片内部含有一些列寄存器,用户可通过这些寄存器来配置PHY芯片的工作模式以及获取PHY芯片的若干状态信息,如连接速率、双工模式、自协商状态等。PHY内部寄存器的读写通过MDIO接口进行。 针对MA704开发板,例程mdio_phy设计了一个通过1个MDIO接口同时读取2个PHY芯片的寄存器值,来判断各个PHY芯片当前的连接状态是否满足全双工,1000Mbps的要求,若不满足则通过配置寄存器使PHY芯片重新进行自协商。另外,使用开发板的2个LED灯来指示各个PHY芯片的状态,亮表示连接正常;灭表示PHY芯片未完成自协商,或者连接不符合全双工、1000Mbps的要求。 4.2基本原理4.2.1 MDIO接口MDIO接口由数据传输时钟MDC和双向数据信号MDIO组成,如下图所示。 MDIO为双向接口,在PHY芯片外部需要连接上拉电阻,1个MDIO接口可以同时连接多个PHY芯片。由于MDIO协议中PHY芯片地址的位宽为5bit,因此,1个MDIO接口最多可以同时连接32个PHY芯片。MDIO接口通信协议如下表所示。 表1. MDIO接口通信协议
MDIO的寄存器读时序波形如下图所示。 MDIO的寄存器写时序波形如下图所示。 4.2.2 B50610B50610芯片最高可支持1.5Mhz的MDC时钟,本例程中使用了10Mhz的频率。 (1)PHY芯片地址 B50610芯片的PHY地址由TEST[3:2]和PHYA[0]引脚所决定,如下图所示。因此,B50610芯片可以有4个不同的PHY地址。 从开发板的原理图可以看到,2个B50610芯片正好对应2个不同的PHY地址,分别为0x0、0x18。因此,使用同1个MDIO接口就可以同时访问和配置2个B50610芯片。 (2)控制寄存器 B50610中地址为0x00的寄存器可用于芯片的复位以及其他功能的控制。本例程中用到了其中的bit9,用于使芯片重新进行自协商。寄存器描述如下图所示。 (3)状态寄存器 B50610中地址为0x19的寄存器反映了芯片当前的状态。本例程中用到了bit15,bit10~8,bit2,用于判断芯片自协商、连接速率、双工状态等信息。寄存器描述如下图所示。 4.3 模块设计4.3.1 模块结构MDIO接口模块结构如下图所示,由模块mdio_top及其子模块mdio_control组成。 4.3.2 模块接口(1)mdio_top模块 mdio_top模块各接口定义如下表所示。 表2. mdio_top模块接口定义
(2)mdio_control模块 mdio_control模块各接口定义如下表所示。 表3. mdio_control模块接口定义
4.3.3 模块原理(1)mdio_top模块 本模块主要完成PHY芯片状态监控和配置,并控制子模块mdio_control完成2个PHY芯片的寄存器的写入和读取。本模块的工作状态机如下图所示。 IDLE状态 本模块复位后随即进入本状态。在本状态,本模块等待外部模块输入MDIO启动信号mdio_en拉高,若接收到启动信号为1,则进入READ PHY STATUS状态,否则在本状态循环。 READ PHY STATUS状态 在本状态时,本模块向子模块mdio_control发送所要读取的PHY芯片地址phy_address和寄存器地址register_address,并将mdio_read_en使信号置1,使能mdio_control模块接收数据,随后进入WAIT AUTO NEG DONE状态。在本例程中,读取的为1.2.2节中所述地址为0x19的状态寄存器的bit15,bit10~8,bit2。该寄存器包含了当前以太网链路的连接速率、双工模式、连接状态等信息。 WAIT AUTO NEG DONE状态 在本状态时,本模块等待mdio_control模块返回寄存器读取完成信号mdio_read_done。当寄存器读取完成后,根据寄存器的值判断PHY芯片是否完成自协商,连接速率是否为1000Mbps,且传输模式是否为全双工。若满足上述条件,则将链路状态指示信号link_ok信号置1,并进入DELAY状态;若不满足条件,则将link_ok信号置0,并进入PHY RE AUTO NEG状态。若寄存器未读取完毕则在本状态循环。 PHY RE AUTO NEG状态 在本状态时,本模块向子模块mdio_control发送所需写入的PHY芯片地址phy_address和寄存器地址register_address,并将mdio_write_en使信号置1,使能mdio_control模块发送数据,随后进入DELAY状态。在本例程中,写入的为1.2.1节中所述的地址为0x00的控制寄存器的bit9,使PHY芯片重新进行自协商,重新建立以太网连接。 DELAY状态 在本状态时,本模块进行延时操作,等待以太网链路的重新建立。延时完成后进入READ PHY STATUS状态。该延时值可根据实际需求进行设置。 (2)mdio_control模块 本模块在mdio_top模块的控制下,完成MDIO接口协议的实现,以及PHY芯片相应寄存器的读写操作。 模块中,通过ODDR实现PHY芯片mdc时钟的输出。如下图。 通过IOBUF实现mdio双向端口,如下图。其中mdio_direction用于控制mdio接口的方向。 本模块的工作状态机如下图所示。 IDLE状态 本模块复位后随即进入本状态。在本状态时,本模块等待mdio_top模块拉高读寄存器使能信号mdio_read_en或写寄存器使能信号mdio_write_en。若读或写使能信号拉高则进入SEND PREAMBLE状态,否则在本状态循环。 SEND PREAMBLE状态 在本状态时,本模块通过MDIO接口发送32bit的MDIO通信前缀“1”,若mdio_top拉高是的读寄存器使能信号,则进入READ REG状态,若为写寄存器使能信号则进入WRITE REG状态。 READ REG状态 在本状态时,本模块根据mdio_top模块输入的PHY芯片地址phy_address和寄存器地址register_address,按照MDIO通信协议从PHY芯片读出相应地址的寄存器值read_register_data,输出至mdio_top模块,同时将读寄存器完成信号mdio_read_done拉高一个时钟周期,随后进入IDLE状态。 WRITE REG状态 在本状态时,本模块根据mdio_top模块输入的PHY芯片地址phy_address、寄存器地址register_address和寄存器值write_register_data,按照MDIO通信协议将配置值写入PHY芯片相应地址的寄存器中,寄存器配置完成后将寄存器配置完成信号mdio_write_done拉高一个时钟周期,随后进入IDLE状态。 4.4 程序测试开发板上的2个LED灯D5、D6分别用于指示LAN1、LAN2所对应PHY芯片的状态,用户可按照下面的步骤测试本例程。 测试1: 用1根千兆网线将开发板的2个网口连接。等待几秒钟后,2个LED灯应该全部亮起,表示2个PHY芯片连接正常。 图1-4-1 测试连接图 测试2: 拔下网线,几秒钟后,其中的2个LED灯会熄灭。重新插入网线,几秒种后,2个LED灯又重新亮起。 图1-4-2 测试连接图 测试3: 拔下网线,将其中1个网口与电脑连接,确认电脑网卡连接速率的设置为自动侦测,如下图。此时,1个LED亮起。 图1-4-3 测试连接图 将电脑网卡连接速率和双工模式设置改为100Mbps全双工,模拟连接状态不满足要求的情况,如下图。此时LED灯熄灭,PHY芯片会以固定周期不断尝试重新自协商和电脑重新建立连接。 图1-4-4 测试连接图 然后,将电脑网卡连接速率和双工模式设置重新改为自动侦测,几秒钟后,LED灯又会再次亮起。 |