ZYNQ PL通过EMIO ETHE1外接PHY由GMII转RGMII

ZYNQ使用AXI_Ethernet编译系统扩展多网口:

详见博客:https://mp.csdn.net/editor/html/104765046

一,硬件简介

1,3个以太网口,1个在PS,2个在PL;1个PS网口,1个PL网口在LINUX上同时使用,PL的网口挂到EMIO上。

2,从GMII过度到RGMII

GMII:

发送 gmii_tx_clk gmii_tx_d[7:0] gmii_tx_en gmii_tx_er

接收 gmii_rx_clk gmii_rx_d[7:0] gmii_rx_dv gmii_rx_er

RGMII:

发送 tx_clk tx_d[3:0] tx_ctrl

接收 rx_clk rx_d[3:0] rx_ctrl

首先数据总线从时钟单边沿采样8bit转变为了双边沿采样4bit,从88E1512 Datasheet中时序图可以直观看出这一点。RGMII中上升沿发送一字节数据的低四位,下降沿发送剩余的高四位数据。接收端时钟双边沿采样,因此125MHZ*8bit = 125MHZ*4bit*2 = 1000Mbit/s。至于GMII中的数据有效和数据错误指示信号被ctrl信号复用:tx_ctrl在时钟tx_clk上升沿发送是tx_en,在下降沿发送是tx_en ^ tx_er。rx_ctrl在时钟rx_clk上升沿接收是rx_dv,在下降沿接收是rx_en ^ rx_er。综上,RGMII接口引脚数从25个降低到14个。

从上边的时序图分析,数据在时钟的边沿变化。因此如果不做额外处理,接收端无法稳定采样。为了解决这一问题,常见的做法是为时钟信号添加延时,使其边沿对准数据总线的稳定区间。可以在控制器端、PCB走线以及PHY芯片内部添加时钟偏移,本文使用最后一种方式实现。

3,add clock skew

 在第三阶段中添加延迟。数据发送方向,FPGA侧的TX_CLK信号不需要额外处理,也就是说FPGA发送与数据边沿对齐的时钟信号。TXD和TX_CLK信号波形如图。使PHY芯片工作在延迟模式下时,FPGA单不需要添加额外的逻辑来保证稳定采样。发送方向直接将数据驱动时钟作为TX_CLK信号发送,接收方向直接利用RX_CLK对RXD信号采样。

二,vivado工程搭建配置

1,设置EMIO方式引出ETHE1

2,IP核设置

(1)vector unity logic设置

(2)gmii to rgmii设置

3,整体vivado设计方案

使用ZYNQ内部的MAC控制器实现数据链路层功能。但由于其接口为GMII,需要用到GMII_to_RGMII IP Core转换接口逻辑。上层网络协议则通过LWIP开源协议栈完成。首先配置ZYNQ IP,使能ENET1并以EMIO方式引出。

 

 

4,管教约束示例

FPGA与RGMII接口的PHY芯片之间的时序关系按照数据接口同步和数据采样方式属于源同步DDR采样。input delay约束对应接收方向,时序关系是中心对齐。output delay约束对应发送方向,时序关系是边沿对齐。前者由于很多时候不知道上游器件Tcko信息,会使用示波器测量有效数据窗口来计算。而后者因为是边沿对齐,通过示波器测量抖动窗口并使用skew based method计算。生成HDL文件之后接着我们从原理图上找到这些引脚的对应,做成XDC约束文件:

set_property PACKAGE_PIN K15 [get_ports mdio_rtl_0_mdio_io]
set_property IOSTANDARD LVCMOS33 [get_ports mdio_rtl_0_mdio_io]
set_property PACKAGE_PIN L16 [get_ports mdio_rtl_0_mdc]
set_property IOSTANDARD LVCMOS33 [get_ports mdio_rtl_0_mdc]
set_property PACKAGE_PIN K21 [get_ports {rgmii_rtl_0_rd[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_rd[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_rd[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_rd[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_rd[0]}]
set_property PACKAGE_PIN L21 [get_ports {rgmii_rtl_0_rd[2]}]
set_property PACKAGE_PIN L19 [get_ports {rgmii_rtl_0_rd[1]}]
set_property PACKAGE_PIN K18 [get_ports {rgmii_rtl_0_rd[0]}]
set_property PACKAGE_PIN J18 [get_ports {rgmii_rtl_0_td[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_td[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_td[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_td[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_td[0]}]
set_property PACKAGE_PIN K19 [get_ports {rgmii_rtl_0_td[2]}]
set_property PACKAGE_PIN J21 [get_ports {rgmii_rtl_0_td[1]}]
set_property PACKAGE_PIN J22 [get_ports {rgmii_rtl_0_td[0]}]
set_property PACKAGE_PIN L17 [get_ports rgmii_rtl_0_rx_ctl]
set_property PACKAGE_PIN L18 [get_ports rgmii_rtl_0_rxc]
set_property PACKAGE_PIN J16 [get_ports rgmii_rtl_0_tx_ctl]
set_property IOSTANDARD LVCMOS33 [get_ports rgmii_rtl_0_rx_ctl]
set_property IOSTANDARD LVCMOS33 [get_ports rgmii_rtl_0_rxc]
set_property IOSTANDARD LVCMOS33 [get_ports rgmii_rtl_0_tx_ctl]
set_property IOSTANDARD LVCMOS33 [get_ports rgmii_rtl_0_txc]
set_property PACKAGE_PIN K20 [get_ports rgmii_rtl_0_txc]
set_property PACKAGE_PIN P18 [get_ports {reset_rtl_0[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {reset_rtl_0[0]}]
set_property SLEW FAST [get_ports rgmii_rtl_0_txc]
set_property SLEW FAST [get_ports rgmii_rtl_0_tx_ctl]
set_property SLEW FAST [get_ports {rgmii_rtl_0_td[*]}]

三,debian系统配置

把里面的dts文件替换掉/mnt/workspace/osrc-lab/boards/MZ7X/debian/dts下的system-top.dts,然后再把FPGA工程也替换掉。

运行source settings64.sh

进入xilinx路径,执行get_hw_description.sh,更新FPGA的硬件

uboot 内核的配置文件没有做修改,我们可以直接执行 make_uboot.sh,编译 uboot。如果做了修改,需要先执行 cfg_uboot.sh

因为我们修改了内核文件下的 xilinx_mz7x_defconfig,所以需要执行 cfg_kernel.sh,进行配置内核文件

编译内核:新增加的EMIO扩展的网口需要增加驱动,所以再进入kernel源码路径执行执行 make menuconfig ARCH=arm

之后保存并且退出,执行save_kernel_defconfig.sh保存刚才的配置参数。每次配置修改内核后都要执行cfg_kernel.sh。

./save_kernel_defconfig.sh  ,  然后执行./cfg_kernel.sh

再执行make_kernel.sh,编译内核。

执行 create_image.sh

复制编译好的文件到Tf卡的uboot分区

四,网口测试

插入串口,接口为USB-232 然后接通到虚拟机,使用putty软件打开

开机后登录系统     用户名:osrc   密码:root

再进入管理员模式,输入ifconfig 可以看到有eth0 eth1 两路以太网

把和 PS-LAN(上图的eth0)网口连接的电脑网口网络IP地址设置为192.168.0.10

把和PL-LANA(上图的eth1)网口连接的电脑网口网络IP地址设置为192.168.10.10

然后设置系统的IP地址

然后分别ping 192.168.0.10,再ping 192.168.10.10

配置成功,两路以太网都能正常工作

Guess you like

Origin blog.csdn.net/wangjie36/article/details/107656663