Menu Close

以太网PHY 之 MDIO接口及应用(Verilog IP)

在以太网PHY 之 MDIO接口及应用文章中,我们介绍了MDIO 的原理,本节中,主要讲述MDIO 的Verilog 语言实现。 MDIO可以通过Verilog ,VHDL, C语言等多种方法实现, 根据用户的不同需求和硬件资源情况自行处理。

由于MDIO读写过程相对比较复杂,更多细节会在视频里进行讲解。本节课通过Verilog代码分为三个部分实现,分别为MDIO IP框架设计,MDIO端口定义及描述,MDIO代码实现。下文就这三个部分展开讲解。

 

1.  MDIO IP核框架设计

MDIO的IP 框架图如下:

 

图1 IP框架图

本节课将使用的MDIO  协议格式(SMI)如下:

图2

图3

图4

根据图2,3,4中所示的MDIO协议设计FPGA程序。

 

2. 输入和输出端口定义及描述

  • phy_addr[4:0]:指定以太网PHY 的地址(根据硬件原理图连线),软件或者FPGA上层设置这个端口。
  • smi_data[24:0]:输入数据接口,25bit 包括: {st_op, phy_reg, phy_reg_val_w} <= smi_data;
  • smi_en:输入信号(enable),当smi_done == 1 时,启动数据发送,smi_en 是单时钟周期的信号。
  • smi_dout [15:0]:从以太网PHY中读出的数据, 将被送给上层软件或者FPGA。当smi_done == 1 后, 软件或者上层的FPGA就可以读取这个值了。
  • smi_done:MDIO 操作完成指示信号。 指示smi_dout 是否有效,以及上层软件或FPGA是否可以发送下一个命令。
  • sim_err:指示本次输入命令无效。
  • e_mdc:    连接 MDC pin 到以太网PHY。
  • e_mdio_i: 输入信号到MDIO pin 三态门中。
  • e_mdio_o:从MDIO pin 三态中得到的输出信号。
  • e_mdio_t :输出信号到MDIO pin 三态门中,指示当前三态门的状态(输出,输入)。

3.Verilog代码设计

以下代码基于图1中的框架设计,程序如下:

  • mdio_phy.v 代码:


 

  • mdio_core.v 代码:


 

mdio_core.v 模块主要是控制接口中的数据信息,转换为MDIO PHY层所需要的数据。 本模块主要是和软件或者FPGA上层做命令层面的交互。同时,和下方的MDIO PHY信号握手,通过这个模块,隔离了命令层和PHY层的数据交互。

  • mdio_app.v  代码:


 

 

 

4.总结

根据MDIO帧格式,MAC层向PHY层发送数据或者从PHY芯片中接收数据。同时这个代码具有可封装性,以使用于FPGA独立使用、CPU 接口 或者ASIC  时封装IP 使用。

 

注:具体Verilog 代码流程讲解,请参考相关视频。

 

 

Posted in FPGA, FPGA 教材教案, Verilog, 教材与教案, 文章