关灯
请选择 进入手机版 | 继续访问电脑版
米联客uisrc 首页 2019版本 Zynq-Soc 5|GTX/GTP通信 查看内容
2

S05-CH04 PS 通过 GTX 实现 SFP 网络通信

摘要: 本例程将 PS 的ENET0/ENET1 通过 EMIO 的方式扩展至 PL。ENET0/ENET1 在 PL 部分通过 1G/2.5G Ethernet PCS/PMA or SGMII IP 核与高速串行收发器GTX 连接,从而可通过 SFP 接口实现PS 的 LWIP 光/电网络通信。

软件版本:VIVADO2017.4

操作系统:WIN10 64bit

硬件平台:适用米联客 ZYNQ系列开发板

米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!

4.1概述

      本例程将 PS 的ENET0/ENET1 通过 EMIO 的方式扩展至 PL。ENET0/ENET1 在 PL 部分通过 1G/2.5G Ethernet PCS/PMA or SGMII IP 核与高速串行收发器GTX 连接,从而可通过 SFP 接口实现PS 的 LWIP 光/电网络通信。

     本例程基于 Vivado 2017.4 版本开发,设计过程中参考了 Xilinx 官方的 xapp1082。

 

4.2基本原理

   本例程将 PS ENET1 的GMII 接口和 MDIO 接口通过 EMIO 方式引出。在 PL 端将引出的 GMII 接口和 MDIO 接口与 IP 核 1G/2.5G Ethernet PCS/PMA or SGMII 连接,1G/2.5G Ethernet PCS/PMA or SGMII 通过高速串行收发器GTX 与MZ7035 开发板的SFP 接口连接。在PS 端通过 SDK 自带的 lwip echo server  例程实现与电脑的 TCP 通信。

 

4.3 PL 部分设计

4.3.1 ZYNQ PS 设置

      要实现本例程的功能,在原有基础上 PS 需要添加 2 个设置。首先,将 ENET1 及其 MDIO 接口以EMIO 方式引出,如下图所示。

     设置 PS 输出 1 路 200MHz 的时钟,用于给 1G/2.5G Ethernet PCS/PMA or SGMII IP 核提供参考时钟。例如,使用FCLK_CLK0 输出 200M 时钟,如下图所示。

4.3.2 1G/2.5G Ethernet PCS/PMA or SGMII

 

4.3.2.1IP 核设置 

将 IP 核设置为PS 的以太网控制器。

选择 1000BASEX 模式,如下图。

      使用 7035 的 GTX 收发器作为 SFP 的接口,输入 IP 核内部的 MMCM 的时钟源选择为 GTX 收发器输出的时钟 TXOUTCLK,该 MMCM 将产生我们所需要的用户接口时钟。MDIO 接口默认启用。使能自协商。如下图。

  

      当设计中只包含 1 个此 IP 核时,应当将可共享的逻辑资源和硬件模块包含在 IP 核内部,这样会减少所生成的模块数量,简化设计。如下图所示。

      当设计中需要同时使用若干个此 IP 核,且所使用的GTX 均位于同一个GTX BANK 中。此时,只需其中 1 个IP 核内部的共享资源(MMCM、GTP PLL、GTX 参考时钟等)便可以满足所有 IP 核的需求,即选择将共享资源包含在 IP 核内部。其余 IP 核将这些共享资源从其内部剔除即可,即选择将共享资源包含在 example 中。

4.3.2.2 IP 核结构

4.3.2.2.1时钟网络

IP 核内部时钟网络结构如下图所示。

用户接口

       这里对一些重要的用户接口进行说明,其他接口可参考 IP 核手册。

GMII 接口

      GMII 接口的同步时钟为 IP 核的输出时钟 userclk2。GMII 接口发送时序如下图所示。

     GMII 接口接收时序如下图所示。

 

independent_clock_bufg

      independent_clock_bufg 是频率为 200MHz 的输入时钟。在 IP 核的 example design 中,GMII 接口连接了IDELAYE2,并作为 IO 与芯片引脚连接。independent_clock_bufg 输入的 200MHz 时钟便作为 IDELAYCTRL 的参考时钟。在本例程中,GMII 作为内部信号,不用作 IO 口,所以不需要使用 IDELAYCTRL。

     除此之外,independent_clock_bufg 还供 IP 核内部的其他逻辑使用。因此,无论是否需要使用 IDELAYCTRL,

independent_clock_bufg 都必须输入 200MHz 的时钟。后缀 bufg 表示该 200MHz 时钟进入 independent_clock_bufg 端口前就已经通过 BUFG 进入了全局时钟网络。

     在例程中,这个 200MHz 时钟直接由PS 输出的 FCLK_CLK0 提供。

signal_detect

     要使 IP 核正常工作,需要将 signal_detect 置 1。例程中,通过 IP 核 Constant 将 signal_detect 置 1。Constant 设置

如下图所示。

Configuration_Vector

      Configuration_Vector 用于配置 IP 核的基本工作模式,可替代 MDIO 接口的功能。其具体含义如下图所示。

 

      由于例程中启用了 MDIO 接口,因此 Configuration_Vector 无实际使用。例程中,通过 IP 核 Constant 将输入的

Configuration_valid 置为 0,则使 Configuration_Vector 无效。Constant 设置如下图所示。

     在例程中,为了兼容之前的设计,Configuration_Vector 的默认配置如下:

an_adv_config_vector

     an_adv_config_vector 用于配置 IP 核的自协商功能,其具体含义如下图所示。对于 1000BASEX 模式,只需要

关注 bit5,bit8~7,bit13~12。IP 核的自协商功能可以通过 MDIO 接口进行配置,由于例程中启用了 MDIO 接口, 因此 an_adv_config_vector 无实际作用。例程中,通过 IP 核 Constant 将输入的 an_adv_config_val 置为 0,则使输入

an_adv_config_vector 无效。

      在本例程中,为了兼容之前的设计,an_adv_config_vector 的设置如下。使能全双工,不使用暂停进行流量控制, 无错误状态。

                                                 assign an_adv_config_vector = 16'b0000000000100001;

Status_Vector

      Status_Vector 反应了 IP 核工作状态,其具体含义如下图所示。可以把其中的若干个信号接至 LED 灯上进行观察。其中比较重要的几个信号分别为 bit0、bit1、bit12。在例程中,bit0 和 bit1 均被接到底板 LED 上显示。

phyaddr

      例程中启用了 MDIO 接口,由于 MDIO 接口时基于地址进行访问的,因此需要为 IP 核设置 1 个 phy address。在例程中,通过 IP 核 Constant 将 phy address 设置为 6。Constant 设置如下图所示。

4.3.3PS ENET1 与 1G/2.5G Ethernet PCS/PMA or SGMII 连接 

PS ENET1 与 1G/2.5G Ethernet PCS/PMA or SGMII 连接的基本原理如下图所示。

PL 部分的 IP 连接如下图所示。

其中,由于 1G/2.5G Ethernet PCS/PMA or SGMII IP 核在 1000BASEX 模式下固定为千兆速率全双工,所以通过

 EMIO 引出的ENETI 的 GMII 引脚中的COL 和 CRS 无需使用,全部通过 IP 核Constant 置为 0 即可。如下图所示。

    用PS 输出的 FCLK_RESET0_N 通过非门取反后作为 1G/2.5G Ethernet PCS/PMA or SGMII IP 核的复位信号。如下图所示。

      非门通过Utility Verctor Logic IP 实现,如下图所示。

4.3.4约束 

 

在 xdc 约束文件中,需要注意约束GTX 输入参考时钟的频率(125M):

create_clock -period 8.000 -name gtrefclk -add [get_ports gtrefclk_in_clk_p]

以及所使用SFP连接的GTX位置,“SFP-A”位于MGT BANK112,对应GTX位置为X0Y15,如下图所示。

对应 xdc 约束为:

set_property LOC GTXE2_CHANNEL_X0Y15 [get_cells */*/*/*/transceiver_inst/gtwizard_inst/*/gtwizard_i/gt0_GTWIZARD_i/gtxe2_i]

4.4 PS 程序设计

4.4.1LWIP 库修改

4.4.1.1修改原因

 

       SDK 2017.4 自带的 LWIP 1.4.1 库的版本为 2.0,直接使用该库将无法通过 SFP 实现网络通信。因此需要进行修改。

       修改的原因有 2 个,第 1 个原因是由于 2017.4 版本产生的新 bug。在 2015.4 版本中,若 PL 部分使用了 1G/2.5G Ethernet PCS/PMA or SGMII IP 核,在 vivado 中编译完成 export 导入 SDK 后在工程bsp 的 xparameters.h 头文件中会包含一些与 1G/2.5G Ethernet PCS/PMA or SGMII IP 核相关的宏定义。例如,使用 1000BASEX 模式时,产生的宏定义为:

                         #define XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT 1

                         #define XPAR_PCSPMA_1000BASEX_PHYADDR 6

或者,使用SGMII模式时,产生的宏定义为:

                          #define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1

                          #define XPAR_PCSPMA_SGMII_PHYADDR 6

   通过分析lwip库底层驱动代码,发现这些宏定义是lwip库底层代码的编译选项。在lwip库的lwip141_v2_0\src\contrib\ports\xilinx\netif\xemacpsif_physpeed.c和xemacpsif_hw.c两个文件中被使用。用于决定MDIO接口配置外部PHY的方式。显然,作为1000BASEX PHY、SGMII PHY或通常的PHY 芯片的寄存器定义和配置方式是存在区别的,不能相互兼容。所以上述的宏定义对于使用1G/2.5G Ethernet PCS/PMA or SGMII IP核时至关重要。

          而这些宏定义在 2017.4 版本中却不再出现。因而导致无法使用 LWIP 库对 1G/2.5G Ethernet PCS/PMA or SGMII IP 核进行正常配置使用。

         第2 个原因是由于lwip底层驱动自身存在的设计瑕疵。只要在PL部分使用1G/2.5G Ethernet PCS/PMA or SGMII IP核,即SDK工程的bsp里存在宏定义

                            #define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1

或者

                            #define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1

        那么,lwip底层驱动将只能通过MDIO接口采用对1G/2.5G Ethernet PCS/PMA or SGMII IP核进行的配置方式。也就是说,只要使用了1G/2.5G Ethernet PCS/PMA or SGMII IP核,那么与PS连接的RGMII 接口的PHY芯片将不能被正常检测和配置,此时lwip将无法使用直接与PS连接的网口。这就对设计产生了限制。 

         为此,我们需要修改lwip库。

 

4.4.1.2修改方法 

        首先,找到SDK安装目录下的LWIP库的路径,例如

        C:\Xilinx\SDK\2017.4\data\embeddedsw\ThirdParty\sw_servic

        将lwip141_v2_0 文件夹复制一份到工程目录下的sdk_repo\bsp 文件夹下将其重新命名为

lwip141_v2_05。

        第一步,修改 lwip141_v2_05\data\lwip141.mld 文件(可用 Notapad++等编辑器打开), 将其中的版本编号

        OPTION VERSION = 2.0;

        修改为

        OPTION VERSION = 2.05;

         然后, 在其中增加如下字段:

BEGIN CATEGORY pcs_pma_core_options

         PARAM name = pcs_pma_core_options, desc = "Options setting the pcs pma core related parameters"

        PARAM name = use_pcs_pma_core_on_zynq, desc = "Option if set to 1 ensures emacps is used as emio, and connect to pcs_pma_core in pl. Valid only for Zynq", type = bool, default = false;

         PARAM name = use_1000basex, desc = "Option if set to 1 to ensures pcs_pma_core is using 1000basex mode", type = bool, default =

false;

 

        PARAM name = use_sgmii, desc = "Option if set to 1 to ensures pcs_pma_core is using sgmii mode", type = bool, default = false;  PARAM name = 1000basex_phy_address, desc = "Option to define the phy address corresponding to the set in pcs_pma_core in

1000basex mode", type = int, default = 0;

       PARAM name = sgmii_phy_address, desc = "Option to define the phy address corresponding to the set in pcs_pma_core in sgmii mode", type = int, default = 0;

END CATEGORY

        增加这段代码的目的是为了在SDK 中BSP 设置里, lwip 参数设置窗口中增加一栏选项

pcs_pma_core_options,其中包含5个子选项。如下图所示。

     其中,use_pcs_pma_core_on_zynq表示PL端是否使用了1G/2.5G Ethernet PCS/PMA or SGMII IP核; use_1000basex表示IP核是否配置为1000BASEX模式;use_sgmii表示IP核是否配置为SGMII模式; 1000basex_phy_address表示使用1000BASEX模式时的phy address;sgmii_phy_address表示使用SGMII 模式时的phy address。这两个phy address必须与vivado中IP核的配置完全一致,例如,

 

本例程中phy address为6。

然后,打开lwip141_v2_05\data\lwip141.tcl 文件,增加如下字段:

# PCS PMA CORE options

set use_pcs_pma_core_on_zynq [common::get_property CONFIG.use_pcs_pma_core_on_zynq $libhandle] set use_1000basex [common::get_property CONFIG.use_1000basex $libhandle]

set use_sgmii [common::get_property CONFIG.use_sgmii $libhandle]

set 1000basex_phy_address [common::get_property CONFIG.1000basex_phy_address $libhandle] set sgmii_phy_address [common::get_property CONFIG.sgmii_phy_address $libhandle]

 

if { $use_pcs_pma_core_on_zynq == true } {

puts $lwipopts_fd "\#define USE_PCS_PMA_CORE 1"

}

if { $use_1000basex == true } {

puts $lwipopts_fd "\#define XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT 1"

puts $lwipopts_fd "\#define XPAR_PCSPMA_1000BASEX_PHYADDR $1000basex_phy_address"

}

if { $use_sgmii == true } {

puts $lwipopts_fd "\#define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1" puts $lwipopts_fd "\#define XPAR_PCSPMA_SGMII_PHYADDR $sgmii_phy_address"

 

}

puts $lwipopts_fd ""

增加这段代码的目的是为了在工程所对应的bsp中的lwipopts.h头文件里,如下所示。

是否增加,如下:

4.4.2创建工程

     本例程使用了 SDK 自带的 lwip echo server example 来验证PS 通过 SFP 接口的网络通信功能,因此在创建工程时选择 LwIP Echo Server 模板,如下图所示。该例程基于 LWIP 库在ARM 中建立一个 TCP Echo Server,IP 地址为192.168.1.10,端口号为 7。

 

4.4.2.1Lwip 库设置 

     在 SDK 软件中选择修改后的 lwip 库的路径(用户需根据实际情况更改此路径,若不更改将产生错误),如下图所示。

      修改完成后,打开BSP 设置,此时 lwip echo server 例程使用的是 SDK 自带的 2.0 版本 LWIP 库,为了替换成我们所修改过的 2.05 版本,首先需要取消 lwip141 2.05 的勾选,如下图所示。

      然后关闭 SDK,然后重启 SDK 打开该工程目录。然后打开 BSP 设置,此时 lwip 库便变成了所修改过的 2.05

版本,如下图所示。勾选 lwip141 v2.05 版本。

      将 use_axieth_on_zynq 和 use_emaclite_on_zynq 设为 0。如下图所示。

      在 lwip 库增加的选项中,由于PS 的 ENET1 要与 PL 端的 IP 核 1G/2.5G Ethernet PCS/PMA or SGMII 连接,所以 use_pcs_pma_core_on_zynq 要设置为 ture。IP 核配置为 1000BASEX 模式,所以将 use_1000basex 设为 ture。vivado 中 IP 核的 phy address 配置为 6,所以 1000basex_phy_address 设为 6。其余两项不用修改。如下图所示。

4.4.2.2example 工程修改 

 

创建工程以后,删除一些无需使用的源文件,只保留如下几个.c 和.h 文件即可。

然后将 main.c 中的如下几段代码注释掉:

      因为IP 核与PS 的ENET1 连接,需要使用ENET1,所以将platform_config.h 的关于EMAC 的宏定义改为ENET1,如下图所示。

4.5程序测试

 

4.5.1ENET1 SFP 接口通信

      将 SFP 电模块插入开发板底板丝印标有“SFP-A”对应的 SFP 屏蔽笼内。位置如下图箭头所示。

      通过网线将其与电脑连接,将电脑的 ip 地址设为 192.168.1.100,子网掩码为 255.255.255.0。然后给开发板上电, 通过 SDK 将程序下载入开发板后,观察 SDK 串口打印信息,如下图示所示。注意此时的 phy address 为 6,对应 IP 核 1G/2.5G Ethernet PCS/PMA or SGMII 的 phy 地址。

 

       此时可以观察到底板上丝印标有“LD1”和“LD2”的 2 个 LED 灯常亮,如位置下图所示。代表 IP 核 1G/2.5G Ethernet

PCS/PMA or SGMII 通过 GTX 的通信链路建立并初始化完成。

       打开网络调试助手,以TCP Client 模式连接开发板的IP 地址 192.168.1.10,端口号 7,输入文字发送,网络调试助手便可收到开发板返回相同的文字,如下图所示。

 

4.5.1ENET0 电口通信

 

       为了验证修改后的 lwip 库可以同时兼容外部 PHY 芯片的MDIO 配置方式。对与 PS 的 ENET0 连接的电口使用相同的程序进行测试。

       由于使用ENET0,需要将工程 platform_config.h 的关于EMAC 的宏定义改为ENET0,如下图所示。

 

4.5.1.1lwip 库设置 

 

使用电口 PHY,要将 lwip 库新增选项中的 use_pcs_pma_core_on_zynq 设置为 false。

 

4.5.1.2 网络测试 

      通过网线将开发板网口与电脑连接,确保电脑的 ip 地址设为 192.168.1.100,子网掩码为 255.255.255.0。然后给开发板上电,通过 SDK 将程序下载入开发板后,观察 SDK 串口打印信息,如下图示所示。注意此时的phy address 为 0,对应PS MIO 所接外部PHY 芯片的地址。

       同理,打开网络调试助手,以TCP Client 模式连接开发板的 IP 地址 192.168.1.10,端口号 7,输入文字发送, 网络调试助手便可收到开发板返回相同的文字,如下图所示。


路过

雷人

握手

鲜花

鸡蛋

说点什么...

已有2条评论

最新评论...

veghm2020-8-24 22:59引用

学习

zwf2019-10-26 20:44引用

学习

查看全部评论(2)

本文作者
2019-9-28 13:35
  • 6
    粉丝
  • 1403
    阅读
  • 2
    回复

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B
热门评论
排行榜

关注我们:微信公众号

官方微信

官方微信

客服热线:

0519-80699907

公司地址:常州溧阳市天目云谷3号楼北楼2楼

运营中心:常州溧阳市天目云谷3号楼北楼2楼

邮编:213300 Email:270682667#qq.com

Copyright   ©2019-2026  米联客uisrc内容版权归©UISRC.COM技术支持:UISRC.COM  备案号:苏ICP备19046771号