找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3138

积分

0

好友

429

主题
发表于 10 小时前 | 查看: 4| 回复: 0

本章以太网通信实验基于 ZYNQ-MZ702P 开发板实现。请注意,在配置过程中,部分设置需要读者根据自己使用的具体硬件进行调整。文章末尾附有本项目的参考工程文件。

下面我们直接开始操作步骤。

1. 创建工程与配置 ZYNQ 处理系统

打开 Vivado,选择正确的开发板芯片型号,创建新工程。在工程中,点击 “Open Block Design”,然后在右侧的 Diagram 框图中点击加号 “+”,添加 “ZYNQ7 Processing System” IP 核并进行配置。

首先,我们需要配置 PS 端输出给 PL 端使用的时钟。

ZYNQ7 处理系统时钟配置界面

接下来,根据您所使用的具体开发板型号,配置 MIO(多功能输入/输出)引脚。这通常包括以太网、USB、SD卡、UART等接口的引脚分配。

ZYNQ7 MIO 配置主界面
以太网 ENET0 的 MIO 引脚详细配置
SD 卡和 UART 的 MIO 引脚配置

然后,选择开发板上搭载的 DDR 内存芯片的具体型号。

ZYNQ7 DDR 型号与参数配置界面

最后,使能 PS 与 PL 之间的中断接口,以便后续处理 DMA 等中断事件。

ZYNQ7 中断配置界面,启用 Fabric Interrupts

2. 添加并配置 AXI 以太网子系统

在 Block Design 中添加 “AXI 1G/2.5G Ethernet Subsystem” 模块。这个 IP 核将实现 PL 端的以太网 MAC 功能。

物理接口设置:选择 RGMII 接口模式,速度设置为 1 Gbps。请注意,RGMII 标准支持 1.8V 或 2.5V I/O 电压,请确保与您的 PHY 芯片兼容。
AXI 以太网子系统物理接口配置

MAC 功能设置:可以启用处理器模式、流量控制和统计计数器等功能。根据您的应用需求进行勾选。
AXI 以太网子系统 MAC 功能配置

共享逻辑设置:选择 “Include Shared Logic in Core”,这将把 IDELAYCTRL 等必要的时钟管理逻辑包含在核心内,提供一个完整的解决方案。
AXI 以太网子系统共享逻辑配置

其他配置保持默认即可,点击 OK。

3. 添加 AXI DMA 模块

为了高效地在以太网和 DDR 内存之间搬运数据,我们需要添加 “AXI Direct Memory Access” 模块。
AXI Direct Memory Access (DMA) 配置界面

4. 添加中断合并模块

添加一个 “Concat” 模块,并将其端口数量修改为 4。这个模块用于将来自 AXI 以太网和 AXI DMA 的多个中断信号合并为一个总线,再连接到 ZYNQ PS 的中断输入端口。
Concat 模块配置,设置为 4 个输入端口
Concat 模块与 ZYNQ PS 的中断端口连接示意图

5. 添加 AXI 互联模块

我们需要两个 AXI Interconnect 模块来实现复杂的总线连接。

  • 第一个用于连接 ZYNQ PS 的 GP Master 接口到各个从设备(如以太网子系统的控制接口、DMA的控制接口),通常使用默认配置。
  • 第二个用于连接 DMA 的数据搬运通道到 ZYNQ PS 的 HP Slave 接口(高性能端口),以访问 DDR。这里需要根据 DMA 的通道数配置 Slave Interfaces 的数量。
    AXI Interconnect 详细配置,Slave Interfaces 设为 3
    两个 AXI Interconnect 模块在框图中的应用示意

6. 连接所有模块

在 Block Design 中,可以先使用 “Run Connection Automation” 进行自动连线,然后手动检查和修正连接不正确的地方。最终的系统连接框图应如下图所示:
完整的 ZYNQ 以太网系统硬件框图

7. 创建外部端口并命名

将需要连接到开发板物理引脚的网络(如 RGMII、MDIO、复位信号)创建为外部端口,并为它们起一个易于识别的名字。
创建外部端口并对以太网相关信号进行命名

8. 验证设计

点击工具栏中的 “Validate Design” 按钮(或按 F6),检查当前 Block Design 中是否存在连接错误或配置问题。
Vivado Diagram 工具栏中的 Validate Design 按钮

9. 添加引脚约束文件

在工程中添加或创建一个约束文件(.xdc),将前面创建的端口映射到开发板的具体物理引脚,并设置正确的 I/O 电气标准。以下是一个针对特定板卡的 RGMII 接口约束示例,请务必根据您的板卡原理图进行修改

### -----------------RX------------------###
set_property PACKAGE_PIN B19 [get_ports rgmii_rxc]
set_property PACKAGE_PIN A21 [get_ports rgmii_rx_ctl]
set_property PACKAGE_PIN B20 [get_ports {rgmii_rd[0]}]
set_property PACKAGE_PIN C18 [get_ports {rgmii_rd[1]}]
set_property PACKAGE_PIN A19 [get_ports {rgmii_rd[2]}]
set_property PACKAGE_PIN A18 [get_ports {rgmii_rd[3]}]
### -----------------TX------------------###
set_property PACKAGE_PIN B15 [get_ports rgmii_txc]
set_property PACKAGE_PIN C15 [get_ports rgmii_tx_ctl]
set_property PACKAGE_PIN A17 [get_ports {rgmii_td[0]}]
set_property PACKAGE_PIN A16 [get_ports {rgmii_td[1]}]
set_property PACKAGE_PIN B17 [get_ports {rgmii_td[2]}]
set_property PACKAGE_PIN B16 [get_ports {rgmii_td[3]}]

set_property IOSTANDARD LVCMOS18 [get_ports rgmii_rxc]
set_property IOSTANDARD LVCMOS18 [get_ports rgmii_rx_ctl]
set_property IOSTANDARD LVCMOS18 [get_ports {rgmii_rd
  • }] set_property IOSTANDARD LVCMOS18 [get_ports rgmii_txc] set_property IOSTANDARD LVCMOS18 [get_ports rgmii_tx_ctl] set_property IOSTANDARD LVCMOS18 [get_ports {rgmii_td
  • }] set_property PACKAGE_PIN R18 [get_ports mdio_mdc] set_property PACKAGE_PIN T17 [get_ports mdio_mdio_io] set_property IOSTANDARD LVCMOS18 [get_ports mdio_mdc] set_property IOSTANDARD LVCMOS18 [get_ports mdio_mdio_io] set_property IOSTANDARD LVCMOS18 [get_ports phy_reset_n_0[0]] set_property PACKAGE_PIN T19 [get_ports phy_reset_n_0[0]]
  • 10. 生成输出产品

    在 Sources 窗口中,右键点击 Block Design 文件(如 system.bd),选择 “Create HDL Wrapper…” 来生成顶层的 HDL 封装文件。
    在 Sources 面板中右键创建 HDL Wrapper
    然后,右键点击该 Wrapper 文件,选择 “Generate Output Products…”,Vivado 将综合生成该设计所需的所有 IP 核网表文件。

    11. 综合、实现并生成比特流

    点击 Flow Navigator 中的 “Generate Bitstream”。Vivado 将自动执行综合、布局布线,并最终生成可以下载到 FPGA 的 .bit 文件。
    Vivado 流程导航中的 Generate Bitstream 按钮

    12. 导出硬件平台

    生成比特流成功后,我们需要导出硬件平台信息,以便进行软件开发。在 Vivado 菜单栏中选择 File -> Export -> Export Hardware…
    Vivado 菜单中的 Export Hardware 选项
    在弹出的窗口中,务必勾选 “Include bitstream”,然后点击 OK 导出。
    导出硬件平台对话框,勾选 Include bitstream

    13. 启动 SDK / Vitis 开发环境

    接下来启动嵌入式软件开发环境。在 Vivado 中,可以通过 File -> Launch SDK(旧版)来打开。如果您使用的是新版 Vitis,则需要手动打开 Vitis 并基于导出的 .xsa 文件创建平台工程和应用工程。
    Vivado 中启动 SDK 的菜单项

    14. 创建应用工程

    在 SDK/Vitis 中,选择 File -> New -> Application Project
    SDK 中新建应用工程的菜单路径
    在新建项目向导中,输入项目名称(如 lwip_work),硬件平台选择上一步导出的平台,处理器选择 ps7_cortexa9_0,语言选择 C。
    新建应用工程向导,配置项目名称和硬件平台
    点击 Next,在模板选择页面,找到并选择 “lwIP Echo Server” 模板,然后点击 Finish。这个模板为我们创建了一个基于轻量级 IP 协议栈(lwIP)的 TCP 回显服务器示例程序。
    选择 lwIP Echo Server 应用模板

    15. 配置板级支持包 (BSP)

    工程创建完成后,我们需要配置板级支持包的设置,以适配我们的 PL 端以太网设计。在项目浏览器中,找到并打开 system.mss 文件,点击 “Modify this BSP’s Settings”。
    在 system.mss 文件中打开 BSP 设置
    在弹出的 BSP 设置窗口中,找到 lwip202 库的配置。因为我们的以太网 MAC 位于 PL 端(通过 AXI 以太网子系统实现),所以需要将以下两个关键参数设置为 1

    • use_axieth_on_zynq
    • use_emaclite_on_zynq

    如果您是使用 PS 端的硬核以太网进行测试,则应将这两个值设为 0

    同时,将 phy_link_speed 设置为 “Autodetect”。这个设置需要与连接电脑的网口协商模式相匹配。
    lwIP BSP 设置界面,关键参数已圈出

    如何检查电脑网口设置?

    1. 在 Windows 搜索栏输入“查看网络连接”并打开。
      Windows 开始菜单搜索网络连接
    2. 右键点击你正在使用的以太网适配器,选择“属性”。
      网络连接窗口,右键点击以太网属性
    3. 点击“配置”按钮。
      以太网属性对话框,点击配置按钮
    4. 在弹出窗口中选择“高级”选项卡,在属性列表中找到“连接速度和双工模式”,查看右侧的值。通常电脑默认设置为“自动侦测”,这与我们 BSP 中的 “Autodetect” 对应。
      网卡高级属性中的连接速度和双工模式设置

    16. 检查并修改 MAC 地址

    打开应用工程中的 src/main.c 文件。
    SDK 项目浏览器中的 main.c 文件位置
    查看模板代码中定义的 MAC 地址数组:

    unsigned char mac_ethernet_address[] = { 0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 };

    main.c 源码中的 MAC 地址定义
    您需要确保这个 MAC 地址在您的局域网中是唯一的。可以通过在命令行中运行 arp -a 来查看局域网内已知的设备 MAC 地址。如果存在冲突,请修改 main.c 中的地址为任意不冲突的值。

    17. 编译工程

    右键点击应用工程项目,选择 “Build Project”。确保编译没有错误。
    在 SDK 中右键构建项目

    18. 配置运行设置

    在运行程序之前,需要配置调试/运行设置。右键点击工程项目,选择 Run As -> Run Configurations…
    SDK 中打开运行配置的菜单
    在左侧选择 “System Debugger” 类型的配置,在右侧的 “Target Setup” 标签页中,勾选以下选项

    • Reset entire system
    • Program FPGA

    这些选项确保在下载软件前,先对 FPGA 进行编程,加载我们刚才生成的硬件比特流文件。
    运行配置中的目标设置,关键选项已勾选

    19. 硬件连接与上电

    将开发板通过以下线缆与电脑连接:

    1. 电源线:为开发板供电。
    2. JTAG 下载线(通常是 USB 转 JTAG):用于下载比特流和调试程序。
    3. 串口线(通常是 USB 转 UART):用于查看开发板打印的调试信息。
    4. 以太网网线:直接连接开发板的以太网口和电脑的以太网口。
      ZYNQ-MZ702P 开发板实物图

    20. 打开串口终端

    在 SDK/Vitis 中,我们需要一个终端来查看来自开发板的串口打印信息。通过 Window -> Show View -> Other…,在 Xilinx 分类下找到并打开 “SDK Terminal”。
    在 Show View 中查找 SDK Terminal
    在打开的终端窗口中,配置正确的串口号和波特率(通常是 115200),然后点击连接。

    21. 配置电脑 IP 地址

    由于 lwIP Echo Server 模板默认设置的开发板 IP 地址是 192.168.1.10,我们需要将电脑的以太网网卡配置到同一网段。

    1. 如前所述,打开以太网适配器的属性。
    2. 双击 “Internet 协议版本 4 (TCP/IPv4)”。
    3. 选择 “使用下面的 IP 地址”,并设置:
      • IP 地址:192.168.1.100 (只要不是 192.168.1.10 且在同一网段即可)
      • 子网掩码:255.255.255.0
      • 默认网关:可以不设或设为 192.168.1.1
    4. 点击确定保存。
      手动设置电脑 IPv4 地址为 192.168.1.100

    22. 下载并运行程序

    一切准备就绪后,在之前配置好的 “Run Configuration” 窗口点击 “Run”。SDK/Vitis 将依次执行:重置系统 -> 编程 FPGA -> 下载应用程序 -> 运行程序。

    23. 测试验证

    如果一切正常,您将在 SDK Terminal 中看到来自开发板的启动信息,其中包含获取到的 IP 地址、子网掩码、网关以及 TCP 服务器启动的提示。
    串口终端显示的开发板启动与网络配置信息

    第一步,进行 Ping 测试:打开电脑的命令提示符(cmd),输入 ping 192.168.1.10。如果网络连通,您将看到来自开发板的回复。
    在 CMD 中 Ping 开发板 IP 地址成功

    第二步,进行 TCP 通信测试:使用网络调试助手(如 NetAssist)进行测试。

    1. 打开软件,协议类型选择 “TCP Client”
    2. 远程主机地址填入 192.168.1.10,端口填入 7(这是 Echo Server 的默认端口)。
    3. 点击“连接”。
      网络调试助手 TCP 客户端连接设置
    4. 如果需要,在扩展选项中将本地主机地址指定为刚才设置的 192.168.1.100
      网络调试助手 TCP 客户端扩展选项
    5. 连接成功后,在发送区输入任意字符或字符串,点击发送。您将立即在接收区看到完全相同的内容被“回显”回来,这表明基于 TCP/IP 协议栈的以太网通信功能已成功实现。
      网络调试助手成功收发数据,实现回显

    至此,基于 ZYNQ PL 端扩展以太网,并运行 lwIP 协议栈实现 TCP 服务器的完整实验流程结束。这个过程涵盖了从硬件 IP 核配置、引脚约束、比特流生成到嵌入式软件工程创建、BSP 配置和网络测试的全链路操作,是理解 ZYNQ 软硬件协同设计和 计算机基础 网络通信的绝佳实践。

    提示:本教程涉及的配置细节较多,强烈建议读者在动手操作时,结合自己开发板的原理图和官方文档进行微调。欢迎在 云栈社区 分享你的实现经验或遇到的问题。




    上一篇:SSH安全加固最佳实践:12个步骤为你的Linux服务器上把锁
    下一篇:OpenClaw AI Agent设计拆解:从Skill机制到Prompt追踪的架构启示
    您需要登录后才可以回帖 登录 | 立即注册

    手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

    GMT+8, 2026-2-10 19:30 , Processed in 0.313786 second(s), 39 queries , Gzip On.

    Powered by Discuz! X3.5

    © 2025-2026 云栈社区.

    快速回复 返回顶部 返回列表