ZYNQ防火墙开发12-ETH-AXI-GMII

PS和PL通信机制

Screenshot_20240423_155134

Screenshot_20240424_140715

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

  • 一 PS端 MIO功能直接扩展以太网口
  • 二 PS端通过EMIO的方式将以太网口映射到PL端口上
  • 三 PL端口的硬件以太网功能 通过AXI的方式供PS端调用

​ 第三种方式利用的是上图中的主 AXI GP0 接口。HP 从属 AXI 接口提供与 DDR3 内存控制器的高带宽连接 - 这将是 DMA 引擎所需要的,我们将在将 AXI 以太网子系统模块添加到我们的设计中后创建该引擎。

​ 之前gpio的方式是用的AXI GP。由于ARM是统一编址,所以GP的gpio也是通过地址配置。

​ AXI HP的PL是MASTER,DMA模式。

​ 和AXI DDR工程对比,DDR工程是PL_DDR_RW模块通过AXI HP访问DDR,而本工程是听过AXI INTERNET模块以DMA的方式通过AXI HP访问DDR。

​ 课程的目的是让还未有工作经验的同学尽快增加实战经验。为此还需说明下,实际开发当中有些和芯片相关的问题可以直接咨询芯片厂家的技术支持解决。而做为课程我这还需自己做好技术准备。

矿卡默认为第二种方式

1
2
root@zedboard-zynq7:~# dmesg |grep eth0 
macb e000b000.ethernet eth0: Cadence GEM rev 0x00020118 at 0xe000b000 irq 148 (00:0a:35:00:01:22)

通过dmesg可以看到为macb驱动

硬件驱动层实现原理
在硬件驱动层,主要是通过DMA进行网络数据包的收发,在控制器端维护一对TX/RX包含desc的队列,mac层收到的每一包数据以及要通过mac层发出的数据信息被保存在这一对队列中,zynq上linux驱动的代码实现位于

Macb.c (drivers\net\ethernet\cadence)中。

第二种方式和arm接phy的没有本质区别。另外我们需要PL端处理以太报文,所以本节采用第三种方式。

drivers/net/ethernet/xilinx/xilinx_axienet_main.c

TRANSMIT INTERFACE AND FLOW

From the above MAC Clock Domains figure we can see that the transmit data is stored in dual port memory starting from address 0x0 which uses word aligned addressing (4 bytes) which means we start at address 0x0 and then 0x4 (as 0x00, 0x01, 0x02, 0x03 are occupied with data).

imgTransmit Dual Port Memory

imgTransmit Flow

RECEIVE INTERFACE

The receive data is also stored in dual port memory which starts at address 0x1000. It is important to note that 0x17FC bit[0] on the data bus is used as a status to indicate the presence of a receive packet that is ready for processing by software.

imgReceive Dual Port Memory

imgReceive Flow

We could now look at sample transactions but in the best use of time let’s go straight to using the EthernetLite IP and learn from doing.

1 工程创建

1)具体步骤 新建一个VIVADO 工程,打开软件 选中Create Project, 如下图所示

img

2)点击NEXT ,在出现的第二个对话框“Project name”中输入工程名;在“Project location”中选择保存路径;勾选“Create project subdirectory”,最后点击“Next” 备注,所有的路径均不能出现中文名称

Screenshot_20240405_205003

3)点击 RTL PROJECT 选项,点击NEXT

img

4) 第四步Add Sources 选项直接留空,NEXT

5)第五步Add Constraints 选项直接留空,NEXT

6)选择芯片型号 我们板子上用的芯片是XC7Z010 ,并在列表栏中选择对应的封装型号,完整型号是XC7Z010CLG400-1 如下所示,选中后点NEXT

img

7)确认所选信息 点击“Finish”,完成vivado的工程创建

2 创建一个BLOCK设计

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

img

​ 在模块设计图中,您将看到一条消息,上面写着“Run Block Automation“。单击“Run Block Automation”链接。

Screenshot_20240425_104431

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

img

​ 页面导航器中,选择“时钟配置”并打开“PL Fabric 时钟”树。请注意,默认情况下启用并设置为 100MHz,这将用作我们 AXI 接口的时钟。现在启用并分别将它们设置为 125MHz 和 200MHz。AXI 以太网子系统模块需要 FCLK_CLK1 (125MHz),它将用于为 RGMII 接口提供时钟。GMII 到 RGMII 和 AXI 以太网子系统 IP 都需要 FCLK_CLK2 (200MHz),并且需要为IDELAY_CTRLs提供时钟。FCLK_CLK0``FCLK_CLK1``FCLK_CLK2

Screenshot_20240425_110118

2)打开ZYNQ7 Processing system配置, 选中S AXI GP0 interface和M AXI GP0 interface。

Screenshot_20240424_221325

3)添加PS侧的中断

Screenshot_20240424_204917

Block Automation 使用 ZedBoard 的板定义文件与外部硬件(如 DDR 和板载以太网端口)进行连接和引脚分配。只需确保勾选“应用板预设”,然后单击确定即可。 Screenshot_20240425_104727

Screenshot_20240425_112718

  1. 添加AXI 1G/2.5G Ethernet Subsystem IP核。

Screenshot_20240424_205216

Screenshot_20240424_205945

5) 运行模块自动连接。

Screenshot_20240424_212201

​ 在块自动化运行其过程后,您会注意到它添加了一个名为 的时钟向导块。该模块生成一个 125MHz 和 200MHz 时钟来馈送以太网模块,但是我们将使用 Zynq PS 来生成这些时钟,因此我们不需要这个模块。在块上单击一次,然后按 Delete 将其从框图中删除。axi_ethernet_0_refclk``axi_ethernet_0_refclk

Screenshot_20240425_152720

6) 运行自动连接。

Screenshot_20240424_230118

​ 当自动化功能运行完毕后,您会注意到您再次可以选择“运行连接自动化”。也许在 Vivado 的未来版本中不会出现这种情况,但 2015.4 会出现这种情况。因此,再次单击“运行连接自动化”,勾选以启用所有自动化接口并确保设置正确。它们都应配置为连接到 HP 从站 AXI 接口 (S_AXI_HP0) 并使用“自动”时钟连接。

Screenshot_20240425_113300

​ 为以太网的端口添加 GMII-to-RGMII 模块了。打开 IP 目录并双击“Gmii 到 Rgmii”

Screenshot_20240425_113444

​ 双击 GMII-to-RGMII 块以打开 Re-customize IP 窗口

​ 在“核心功能”选项卡中,勾选“在设计中实例化 IDELAYCTRL”,将 PHY 地址设置为 8,然后选择“由 PHY 添加的偏斜”选项。请注意,GMII 到 RGMII 内核具有 MDIO 输入和 MDIO 输出。为什么MDIO总线必须通过内核?这是因为GMII到RGMII内核的逻辑位于MDIO总线上,用于接收来自MAC的命令以进行配置。我们在这里指定的 PHY 地址允许我们在 MDIO 总线上为内核提供唯一的地址,并且该地址与外部 PHY 的地址不同非常重要。在以太网 FMC 上,所有 PHY 都配置了地址 0,因此我们可以为 GMII 到 RGMII 内核提供 8 的地址,而不会产生总线冲突。至于“PHY添加的偏斜”选项,这与RGMII发射时钟有关。一些 PHY,包括以太网 FMC 上的 88E1510,具有为传入的 RGMII TX 时钟添加延迟的功能,以便它能够很好地对入 RGMII 传输数据进行采样。GMII到RGMII内核允许我们指定偏斜的添加位置:在PHY或FPGA架构(MMCM)中。偏斜应由一个或另一个添加,而不能由两者添加,否则时钟对数据采样的对齐将很差,RGMII接口将失败。

Screenshot_20240425_113623

Screenshot_20240425_113728

​ 现在,我们可以使用块自动化功能连接以太网块。请注意,程序框图中有一条消息,上面写着“Designer Assistance available.运行块自动化“。单击“运行块自动化”链接。

Screenshot_20240425_134534

​ 要将 GMII 到 RGMII 内核连接到 PS,我们需要在 PS 中启用 GEM1。 双击 Zynq PS 模块,然后在页面导航器中选择“MIO 配置”。勾选以启用“ENET 1”并选择“EMIO”(扩展多路复用输入/输出)。选择EMIO后,我们可以将GEM1路由到FPGA架构,然后将其连接到GMII到RGMII内核,然后再连接到以太网FMC。 Screenshot_20240425_114027

​ 现在您应该在 Zynq PS 块上看到两个额外的端口:和 。在 GMII 到 RGMII 模块和 Zynq PS 之间建立连接。GMII_ETHERNET_1MDIO_ETHERNET_1MDIO_GEMMDIO_ETHERNET_1

Screenshot_20240425_114224

​ 现在在 GMII 到 RGMII 模块的“GMII”和 Zynq PS 之间建立连接。GMII_ETHERNET_1

Screenshot_20240425_114308

​ 现在我们需要将 和 “RGMII” 端口设为外部端口,以便它们可以连接到以太网 FMC。右键单击每个接口,然后选择“设为外部”。MDIO_PHY

Screenshot_20240425_114623

​ GMII 到 RGMII 模块不能为我们提供 PHY 的复位信号,因此我们必须添加一些逻辑来提供该信号。打开 IP 目录并添加“实用程序简化逻辑”IP。

Screenshot_20240425_135329

​ 双击该块并将“C Size”设置为 1,将“C Operation”设置为“and”。然后单击“确定”。util_reduced_logic_0

Screenshot_20240425_144949

​ 现在右键单击块的输出,然后选择“Make External”。util_reduced_logic_0

Screenshot_20240425_135606

​ 现在打开 IP 目录并将 Concat(连接)IP 添加到设计中。串联 IP 采用一系列单个输入并将它们串联成矢量输出。我们需要这个 IP 能够将所有中断连接到 PS 的矢量输入。IRQ_F2P[0:0]

gmii_to_rgmii_and_axi_ethernet_subsystem_45

​ 双击 Concat 块并将端口数设置为 4。然后单击“确定”

Screenshot_20240425_135606

​ 我们必须将所有中断连接到 Concat IP。逐一完成并建立以下所有连接。请注意,引脚分配的顺序并不重要,因为它将在硬件描述中全部传输到 SDK,并由 BSP 正确映射。

  1. Connect axi_ethernet_0_dma/mm2s_introut to xlconcat_0/In0

  2. Connect axi_ethernet_0_dma/s2mm_introut to xlconcat_0/In1

  3. Connect axi_ethernet_0/mac_irq to xlconcat_0/In6

  4. Connect axi_ethernet_0/interrupt to xlconcat_0/In7

    Screenshot_20240425_140513

​ 将FCLK_CLK2(200MHz时钟)连接到以太网模块。首先连接到 的引脚FCLK_CLK2ref_clkaxi_ethernet_0。

Screenshot_20240425_142406

​ 然后将FCLK_CLK2连接到 GMII 到 RGMII 模块的“clkin”引脚。现在,对于那些好奇的人,您可能注意到GMII到RGMII模块只有一个时钟输入(clkin)。该输入必须连接到200MHz,该时钟将用于为IDELAY_CTRL提供时钟,但它也将用于生成其他三个时钟:125MHz、25MHz和2.5MHz,分别用于1Gbps、100Mbps和10Mbps的链路速度。实际链路速度由PHY在自动协商过程中确定,由处理器从PHY读取链路速度,然后将该值传递到GMII到RGMII内核,以便它使用适当的时钟。默认情况下,它设置为使用 2.5MHz 时钟来实现 10Mbps 的链路速度。

Screenshot_20240425_142729

​ 将 and 端口连接到外设复位信号。请记住连接它们(一次一个)。tx_resetrx_reset

Screenshot_20240425_145047

​ 现在我们需要将 125MHz 时钟连接到 AXI 以太网子系统模块(包含共享逻辑的端口)的端口。我们确实为此目的启用了FCLK_CLK1,如果您愿意,可以建立这种连接,但在本教程中,我们将探索另一种可能性。以太网FMC具有板载125MHz振荡器,也可用于供电。为了使用它,我们只需要在设计中添加一个差分缓冲器。打开 IP 目录,将“实用程序缓冲区”添加到设计中。gtx_clkaxi_ethernet_0gtx_clk

gmii_to_rgmii_and_axi_ethernet_subsystem_51

​ 将缓冲区的输出连接到的axi_ethernet_0 的 gtx_clk 输入

Screenshot_20240425_152818

现在右键单击缓冲区的每个单独输入,然后选择“设为外部”。您最终应该得到两个名为 和 的外部输入端口。IBUF_DS_P[0:0]IBUF_DS_N[0:0]

Screenshot_20240425_153103

​ 有两个输入,用于启用板载125MHz振荡器并选择其频率(也可以设置为250MHz)。我们需要在设计中添加一些常数,以启用振荡器并将其输出频率设置为125MHz。打开 IP 目录并添加两个常数constant IP。

gmii_to_rgmii_and_axi_ethernet_subsystem_56

​ 默认情况下,它们将设置为常量输出 1,这正是我们所需要的。因此,我们所要做的就是将它们的输出设置为外部,并将它们重命名为 和 。结果应如下图所示。ref_clk_oeref_clk_fsel

Screenshot_20240425_153601

最终布线综合完成

Screenshot_20240507_141623

3 PS部分工程创建

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

img

img

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

img

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

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

img

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

img

\4) 创建好LWIP工程后,我们 需要手动修改其连接速度,默认是AUTO自动协商,实测自动协商的时候只会识别到10M 的网络, 这里我们手动在BSP中将设置修改成100Mbps

img

5)对网络进行调试

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

img

6)接下来右键点选工程,然后点Run As 进行配置,点选 Run Configurations

img

双击 最下方的System Debugger 选项,直到右边出现配置页面

img

勾选 Reset entire system 和Program FPGA 再下载,否则有可能不能正常访问网络(原因请看备注)

备注:如果先下载PL 后debug的方法操作 可能会出现无法自动获取路由器的IP(并且无法ping通的情况),并且路由器列表上没有检测到设备(猜测可能是因为PL单独下载后,PS还没下载的情况下,路由器和板子握手失败后,就停止了板子访问网络的权限,造成板子网络部能正常工作),所以这里要求要勾选reset entire system,和program fpga选项(让系统每次debug 都能重新配置整个fpga)

img

之后点选Apply 和 Run

通过串口观察到网络已经启动,并且速度为100M, 网络IP为192.168.1.110(板子需要连接到路由器才能分配到IP) 如果板子和PC直接通过网线直连 看本文最后的部分

img

用相同路由器网段的 WINDOWS电脑 ping 一下这个IP 可以ping 通,说明网络连接成功了

img

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

img

板子和PC 通过网线直连的注意事项

直连状态会无法获得IP,那系统自动分配IP 192.168.1.10, 那本地主机也记得将对应的网络口设置成192.168.1.* 的网络段, 网关设置成192.168.1.1才可以ping通 (另外:之前别的千兆网络芯片用这个工程时,直连需要用交叉线,但是EBAZ4205的百兆测试下,实测不用交叉线也可以直连,大家自行尝试,如果不能ping通,请尝试用交叉网线)

另外因为我们之前强制设置了百兆模式,所以直连状态下,电脑端的网络也需要手动设置成百兆,否则会永远link down link up反复切换

img

img

img

img

LWIP

platform_setup_interrupts


ZYNQ防火墙开发12-ETH-AXI-GMII
http://witbit.cn/视频课程/FIREWALL_GATEWAY/ZYNQ防火墙开发12-ETH-AXI-GMII.html
作者
朝彻
发布于
2025年2月13日
许可协议