基于Lemon ZYNQ的PS实验十 千兆网络初测(基于MIO)

本文介绍在RTL8211F千兆网络基础上实现PS端的以太网网口功能。

  • 此章节内容适用于Lemon ZYNQ主板,如是其他板子请看对应板子目录
  • 本文在 vivado2018.3版本上演示

LWIP(Lightweight IP)是一款轻量级的网络协议栈,旨在为资源有限的嵌入式系统提供高效的网络通信功能。它支持多种网络协议(如 TCP、UDP 和 DHCP),具有灵活的配置选项以适应不同硬件资源,提供低延迟和高吞吐量的网络性能。

Xilinx 的SDK平台上就提供了多个Lwip示例项目,本次实验我们就借助其中的LWIP回环实验来演示我们ZYNQ主板的网络功能,也为后续更高阶的网络功能开发奠定基础。

写在前面:

ZYNQ 网络功能可以有4种方式实现

  • 一 PS端 MIO功能直接扩展以太网口
  • 二 PS端通过EMIO的方式将以太网口映射到PL端口上
  • 三 PL端口的硬件以太网功能 通过AXI的方式供PS端调用
  • 四 PL端用逻辑跑以太网功能(不需要PS端参与)

因为Lemon ZYNQ的主板网络部分是直接连接在PS端的,所以我们可以直接通过方式一 MIO直连的方式直接拓展以太网口。

准备工作:添加支持RTL8211F的LWIP库文件

因为我们Lemon ZYNQ板子上所使用的是RTL8211F, RTL8211F和RTL8211E有个别配置寄存器地址是不同的,而SDK和Vitis默认的 LWIP库仅支持RTL8211E,所以我们需要对库进行修改才能支持RTL8211F,详见SDK部分。(这部分对2016版之后的petalinux不产生影响) Digilent 官方手册也介绍了这部分的内容:https://files.digilent.com/resources/programmable-logic/documents/RTL8211F_PCN.pdf

添加支持RTL8211F的LWIP库文件

  • 下载可以适配RTL8211F芯片的 LWIP库:lwip211下载
  • 解压刚刚下载的lwip211库,并复制lwip211文件夹(请确认lwip211文件下就是data,doc文件夹,而不是另一个lwip211文件夹)
  • 将刚刚复制的lwip211文件夹粘贴到 Vivado 的SDK安装目录下 \Xilinx\SDK\2018.3\data\embeddedsw\ThirdParty\sw_services,如果你装的是vitis 则目录地址是\Xilinx2020\Vitis\2020.2\data\embeddedsw\ThirdParty\sw_services(即使文件夹下存在lwip211其他版本也要继续粘贴)
  • 完成上述操作后,如果您已经开启SDK或者Vitis,需要重启SDK和Vitis一遍。
  • 之后在SDK工程的BSP修改页面将默认的lwip更改为刚刚我们复制的lwip211(1.5版)(这部分下文第三部分中会介绍到)

一、工程创建

工程创建的过程可以参考试验一中的内容,这里不再详细描述了。基于Lemon ZYNQ的PS实验一 GPIO之用EMIO方式点亮LED(完整图文)(芯片型号选XC7Z020CLG400-1)

二、Vivado 中的设置

1)IP INTEGRATOR→Create Block Design,在弹出的对话框中输入设计名,最后点击“OK”,如下图所示

2)在右侧的窗口里 ,点击加号,在选择框里搜索ZYNQ,并找到ZYNQ7 PROCESSING SYSTEM ,双击并打开

3)软件自动生成了一个 zynq的block 如下图所示,接下来要做一些相应的设置,双击下图中的ZYNQ核

4)依次在弹窗里找到DDR Configuration→DDR Controller Configuration→DDR3,在Memory Part下拉菜单中根据自己板子上的DDR来选择相应的DDR3,本实验所用到型号:MT41K256M16RE-125,数据位宽选择16bit 最后点击“OK”,如下图所示。

5)因为Lemon ZYNQ主板的PS时钟是50M的晶振输入的,所以这里需要把默认的PS输入时钟33.33M改成50M

5)因为工程暂时用不到 AXI功能,所以可以先禁用AXI功能

6) 使能 ENET0 和 MDIO 功能, ENET0对应MIO 16-27 MDIO对应 MIO52-53, 另需要将BANK1 电平设置成 LVCMOS1.8V (因为网络PHY电路上是基于1.8V的)

网络部分还有个Reset 信号,电路上是接在MIO9的,需要先试能GPIO MIO功能,再对ENET0 reset脚进行设置。

7)在PS的MIO配置选项增加UART部分,使能UART 0 并在IO选项里选择MIO(14-15)方式

8) 随后点OK 保存修改, 点击“Run Block Automation”如下图所示。在弹出的选项中保持默认,点击“OK”,即可完成对ZYNQ7 Processing System的配置

9) 在source→Design Source ,右键我们创建的BLOCK工程,点击create HDL wrapper,打包BLOCK文件并生成.v代码

在弹出的菜单里直接点选OK

10) 点击绿色箭头RUN 对代码进行编译

11) 生成bit文件 :按下Generate Bitstream 完成综合以及生成bit文件,等待弹出综合完成的窗口

三、SDK部分设计

1)File→Export→Export hardware…在弹出的对话框中勾选“include bitstream”,点击“OK”确认,如下图所示。

2)File→Lauch SDK,在弹出的对话框中,保存默认,点击“OK”,如下图所示。

系统将自动打开SDK开发环境

3)在SDK环境下创建网络工程

输入一个工程名,然后点选下一步,选择 LwIP Echo Server选项,自动导入网络SDK自带的网络例程。

4) 这里需要稍微等几分钟(可以去上个厕所)等LWIP ECHO Server工程的一些加载准备工作完成后再操作,否则修改BSP可能会失效。

5)修改工程的BSP(重要)

a) 点选 工程BSP的 system.mss 在右侧界面 点选Mdoify this BSP’s Settings 对BSP进行修改。(这步之前需要完成本文最开始的准备工作添加支持RTL8211F的LWIP库文件)

b) 重要:在设置界面的Overview 下将原本系统默认的lwip202修改成我们添加的lwip211(1.5),之后点选OK。

之后我们对官方的工程就算修改完成了。

四、下载和调试

1) 硬件部分将网络模块的RJ45接上网线,网线可以和电脑端直连,也可以和路由器直接进行连接。

2)将主板通过TYPEC 连接电脑(在设备管理器中查看主板的串口在系统中的串口号),并且在SDK 的终端中添加这个串口,如下图所示(波特率115200) 也可以用第三方串口助手来调试

3)新创建的工程最好先对Run as 进行配置:右键工程,并点选Run As -> Run Configurations

4) 在弹出的窗口中对Reset entire system 和 Program FPGA两个选项进行勾选操作,这样就不会出现下载程序debug的时候概率性不工作的问题了。(这样操作后系统会自动对FPGA进行配置,不需要按之前工程手动对FPGA进行编程了)

PS如果没有出现下图对话框,可以直接双击左侧的applicationo (System Debugger)。

5)设置好之后,选择Run As -> Launch on Hardware (System Debugger) 进行调试。

6)通过串口观察到网络已经启动,并且速度为1000M, 网络IP为192.168.1.10(BSP默认是关闭自动获取IP的,所以IP都是192.168.1.10)

7)用相同路由器网段的 WINDOWS电脑 ping 一下这个IP 可以ping 通,说明网络连接成功了(如果是和电脑直连的方式,如果ping失败了,请将除了有线网络之外的网络连接都先禁用掉,不然可能会造成无法PING通的情况)

8)通过网络助手连接后,发送什么数据,就能通过网络接收到什么数据(设置的端口号是7,IP地址按照之前SDK 串口读到的板子IP地址设置)

五、自动获取IP设置(适用于连接路由器的情况)

1)想要让工程可以自动获取IP地址,我们需要对刚才的BSP再进行设置:在bsp 中将刚才我们的lwip211 中的 dhcp_does_arp_check 和lwip_dhcp 两个功能从false改成true即可。

2)修改过后再对工程进行重新编译调试,通过串口回传的数据可以看到板子已经自动获取了新的IP地址(不是192.168.1.10了)。 当然如果长时间没有获取到IP地址,主板仍然会把IP设置成默认地址。

以上是本次回环实验的流程。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注