lwip tcp发送_Microblaze搭建LWIP

本文介绍了如何在K7平台的Microblaze上搭建LWIP协议栈,重点讨论了LWIP的内存优化和API,并详细阐述了硬件工程的搭建步骤,包括添加MIG IP、Microblaze IP、AXI Ethernet IP等,以及LWIP库的修改和软件设计过程,强调了根据不同PHY芯片修改LWIP底层的重要性。
摘要由CSDN通过智能技术生成

K7平台的Microblaze搭建LWIP

1、概述

lwip 是瑞典计算机科学院(SICS)的 Adam Dunkels 开发的一个小型开源的 TCP/IP 协议栈。实现的重点是在保持 TCP 协议主要功能的基础上减少对 RAM 的占用。

  LwIP 是 Light Weight (轻型)IP 协议,有无操作系统的支持都可以运行。LwIP 实现的重点是在保持 TCP 协议主要功能的基础上减少对 RAM 的占用,它只需十几 KB 的 RAM 和 40K 左右的 ROM 就可以运行,这使 LwIP 协议栈适合在低端的嵌入式系统中使用。

lwIP 协议栈主要关注的是怎么样减少内存的使用和代码的大小,这样就可以让 lwIP 适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,lwIP 对 API 进行了裁减,可以不需要复制一些数据。

lwip 提供三种 API:1)RAW API 2)lwip API 3)BSD API。

RAW API 把协议栈和应用程序放到一个进程里边,该接口基于函数回调技术,使用该接口的应用程序可以不用进行连续操作。不过,这会使应用程序编写难度加大且代 码不易被理解。为了接收数据,应用程序会向协议栈注册一个回调函数。该回调函数与特定的连接相关联,当该关联的连接到达一个信息包,该回调函数就会被协议 栈调用。这既有优点也有缺点。优点是既然应用程序和 TCP/IP 协议栈驻留在同一个进程中,那么发送和接收数据就不再产生进程切换。主要缺点是应用程序不 能使自己陷入长期的连续运算中,这样会导致通讯性能下降,原因是 TCP/IP 处理与连续运算是不能并行发生的。这个缺点可以通过把应用程序分为两部分来克服,一部分处理通讯, 一部分处理运算。

lwip API 把接收与处理放在一个线程里面。这样只要处理流程稍微被延迟,接收就会被阻塞,直接造成频繁丢包、响应不及时等严重问题。因此,接收与协议处理必须 分开。LwIP 的作者显然已经考虑到了这一点,他为我们提供了 tcpip_input() 函数来处理这个问题, 虽然他并没有在 rawapi 一文中说明。讲到这里,读者应该知道tcpip_input()函数投递的消息从哪里来的答案了吧,没错,它们来自于由底层网络驱动组成的接收线程。我们在编写网络驱动时, 其接收部分以任务的形式创建。数据包到达后, 去掉以太网包头得到 IP 包, 然后直接调用tcpip_input()函数将其 投递到 mbox 邮箱。投递结束,接收任务继续下一个数据包的接收,而被投递得 IP 包将由 TCPIP 线程继续处理。这样,即使某个 IP 包的处理时间过长也不 会造成频繁丢包现象的发生。这就是 lwip API。

BSD API 提供了基于 open-read-write-close 模型的 UNIX 标准 API,它的最大特点是使应用程序移植到其它系统时比较容易,但用在嵌入式系统中效率比较低,占用资源多。这对于我们的嵌入式应用有时是不能容忍的。

2、硬件工程搭建

Step1: 添加 MIG IP 和 Clocking Wizard

c1e7f0abfefba802c66e0ca9e007d87c.png

图8‑100 添加 MIG IP 和 Clocking Wizard

Step2: 添加 Microblaze IP

6fabc0dff052a3aec7c48547a3583972.png

4b44b9d039779e3382300ad1757324a2.png

图8‑101 添加 Microblaze IP

Step3:添加 AXI Ethernet IP。

设置 IP 如下,其他默认

ed6e6ed35fa652831a57bacfdd4920e6.png

图8‑102 设置 IP

然后点击 Run Block Automation

1661fa3b306323cd4126a8ec1afdfbcd.png

e4c93280bd39003f72823bfacb4195bc.png

3901228b884d41c123a485941d9dc98b.png

图8‑103 Run Block Automation

Step4: AXI 1G/2.5G Ethernet Subsystem 中 gtx_clk 的输入时钟是 125Mhz ref_clk 的输入时钟是 200Mhz,作为其内部 IDELAYCTRL 的参考时钟。

通过 AUTO 自动连接,vivado 会自动通过 clk_wiz_0 输出时钟。

然后点击 Run Connection Automation

8973ae2073d2aa94d742da7ac431e397.png

6e95babf25e0ce3afba737abaea270d7.png

图8‑104 Run Connection Automation

其中 m_axi_sg_aclk 和 s_axi_lite_clk 及 m_axi_mm2s_aclk 都是系统时钟 100Mhz,将连接到一起。

51fd5df69e03794d96f07ff729693a68.png

图8‑105 IP连接

Step5: 添加 AXI Timer 和 axi_uartlite IP

bab4c51b217e8909f87e80d4ca0f966a.png

图8‑106 添加 AXI Timer 和 axi_uartlite IP

Step6: 点击 Run Connection Automation。

e1a4b73198e84fb41836d4a00eb31f72.png

296462a23b235c6c803237954cefc70f.png

图8‑107 点击 Run Connection Automation

Step7: 连接中断

将 microblaze_0_xlconcat 的 Number of Ports 设置为 5

51d410f09a275cbcf1847c813345c821.png

图8‑108 连接中断

Step8:axi_ethernet_0_dma 的中断 mm2s_introut、s2mm_introut 连接到 microblaze_0_xlconcat 两个端口上

66cab67273ec90c91bf3480fd8352da1.png

图8‑109 连接中断

Step9:将axi_ethernet_0 的 mac_irq、interrupt 连接到 microblaze_0_xlconcat 两个端口上

bf632ff6f7d56c2e8b147b76abb9bc9c.png

图8‑110 连接中断

Step10:将 axi time 的 interrupt 连接到 microblaze_0_xlconcat 最后一个端口上

17f29474d88dd7c16de4b4878ac4860e.png

图8‑111 连接中断

完成的硬件原理图

ef8e2fbaf2b2ac475de125613749c290.png

图8‑112 完成的硬件原理图

Step11:连接完成后,添加 xdc 文件,然后 Generate output,生成顶层文件

d090b62bac825a62db8e0aac36670dce.png

图8‑113 完成

8.5.6.3 LWIP库的修改

 Xilinx SDK 目录下面 xaxiemacif_physpeed.c 文件里面对 PHY 芯片有驱动,目前支持 MARVEL 和 TI 的部分 PHY 芯片,如果使用其他厂家的 PHY 芯片,需要更改驱动,否则协商不能通过。

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

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

将lwip141_v1_7 文件夹复制一份到工程目录的 sdk_repo\bsp 文件夹下,将其重新命名为 lwip141_v2_04。第一步,修改 lwip141_v2_04\data\lwip141.mld 文件(可用 Notapad++等编辑器打开),将其中的版本编号。

OPTION VERSION = 2.0;

修改为

OPTION VERSION = 2.08;

由于

打开 lwip141_v2_04\src\contrib\ports\xilinx\netif\xaxiemacif_physpeed.c 源文件,增加宏定义

#define Broadcom_PHY_IDENTIFIER      0x143

6060d9ca4e24f03d09b1889106610c24.png

8266c06e6fe85f694906bdf2d2e87d7b.png

图8‑114 代码分析

8.5.6.4 软件设计

新建SDK工程,导入修改过的lwip库文件

e1975e969746c8dc35f263dbc912a38e.png

图8‑115 导入修改过的lwip库文件

新建LWIP工程

34843db3f1e6e13f9f2a07fd1c0e6fae.png

图8‑116 新建LWIP工程

设置BSP文件

82b6ef9c8747379975e05354096dcdfd.png

533c0be5d5896f4e0324f87d25a9dfb4.png

图8‑117 设置BSP文件

测试

50748e20335030e2eda6a1f4f8a88eaa.png

ff60dda8aec2041047ac10f86e9a83c5.png

图8‑118 测试

8.5.6.5 需要注意的问题

根据不同的 PHY 芯片修改 LWIP 底层

 Xilinx SDK 目录下面 xaxiemacif_physpeed.c 文件里面对 PHY 芯片有驱动,目前支持 MARVEL 和 TI 的部分 PHY 芯片,如果使用其他厂家的 PHY 芯片,需要更改驱动,否则协商不能通过。

139e1ddb0664cbb802c3228e1543207a.png

在Microblaze 的 AXI Ethernet 里面有对 RGMII 接口的时序约束,不同的芯片需要修改约束的时间,如果差别不是很大则不修改也可以进行工作。

26f3a0e82659ee0aa977fd596bcec3b8.png36fa1a8261ee0c873b86a27abf0e780c.png

OUTPUT DELAY约束

需要注意是,在 AXI 1G/2.5G Ethernet Subsystem 中,rgmii_txc 的发送时钟 gtx_clk90,与 rgmii_td、rgmii_tx_ctl 的发送时钟 gtx_clk 存在 90°即 2ns 的相位差。因此,此时 PHY 芯片 RGMII 的 TX 接口时序不能使用默认的内部延迟模式,需要使用外部模式,其时序关系如下图。

6fcf92d94bedeeacca5915f265b97b7d.png

照上图中的 setup time 和 hold time, output delay 的 min 应该为-0.8ns, max 应该为 1.0ns。忽略 PCB 延迟

·INPUT DELAY约束

对于 input,需要使能内部延迟模式,

20bd0ddc11a096e5143e6cf36355263a.png

按照上图中的 setup time  和 hold time,input delay 的 min 应该为-(4-1.2)=-2.8ns,max =-1.2ns。忽略 PCB 延迟

因此需要查看 PHY 芯片的寄存器,确认使用 TX 外部模式,RX 使用内部延迟模式。

b12f5290d4741c36cce5c3396b9944d7.png

推荐阅读

Xilinx原语的用法

例说七层OSI参考模型

TCP/IP模型

TCP和UDP

以太网遵循的IEEE 802.3 标准

媒体访问控制(MAC,Media Access Control)

媒体独立接口(MII,Meida Independent Interface)

GMII、SGMII和SerDes的区别和联系

PHY(Physical Layer,PHY)通俗理解

FPGA实现网口通信的几种方式

千兆网UDP通信

FPGA千兆网TCP通信分析

基于FPGA的网口通信实例设计

基于UDP/IP协议的电口通信(一)

基于UDP/IP协议的电口通信(二)

基于UDP/IP协议的电口通信(三)

基于原语的千兆以太网RGMII接口设计
PHY_MDIO 接口设计

利用 IBERT 进行 GTX 信号眼图测试

Aurora 8B/10B光口通信
基于UDP/IP协议的光口通信
一大波HLS设计资料来了

2020版深入浅出玩转FPGA视频教程

点击上方字体即可跳转阅读哟

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值