Artix7 Microblaze下调试SDK官方lwIP RAW Mode TCP Server Application例程(详细说明)

这篇具有很好参考价值的文章主要介绍了Artix7 Microblaze下调试SDK官方lwIP RAW Mode TCP Server Application例程(详细说明)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Vivado 2019.1

FPGA: Artix7 XC7A100T
DDR3: MT41K256M16TW-107
PHY: RTL8211F(商业级)

为加快进入application,设置如下:
1.禁用autodetect, phy_link_speed设为100Mbps(此时autonegotiation被禁止,大大加快进入程序)
2.禁用dhcp, 使用默认IP地址设置(不用等待dhcp配置,加快速度)

先对SDK作简单的调整:
1.关闭保存自动编译
microblaze sdk,FPGA,fpga开发

2.显示行数
 microblaze sdk,FPGA,fpga开发

 microblaze sdk,FPGA,fpga开发

Vivado新建lwip例程所必须的工程,BD如下:

microblaze sdk,FPGA,fpga开发

1. AXI 1G/2.5G Ethernet Subsystem
microblaze sdk,FPGA,fpga开发

 只需要设置首页,其他默认

2. AXI Direct Memory Access (此IP在自动连线时软件会自动添加!)

microblaze sdk,FPGA,fpga开发

 3.Concat (一共5个中断通过AXI Interrupt Controller接入Microblaze,一定要全部接入MB中,否则例程不能正常工作)

microblaze sdk,FPGA,fpga开发

 4.AXI Interrupt Controller

microblaze sdk,FPGA,fpga开发

 microblaze sdk,FPGA,fpga开发

 microblaze sdk,FPGA,fpga开发

 5. AXI Timer (Timer为例程提供节拍)

microblaze sdk,FPGA,fpga开发

由AXI 1G/2.5G Ethernet Subsystem IP 引出的引脚连接到RTL8211F芯片

microblaze sdk,FPGA,fpga开发

 管脚分配约束如下:

#RGMII
set_property IOSTANDARD LVCMOS33 [get_ports reset_rtl_0]
set_property PACKAGE_PIN E21 [get_ports reset_rtl_0]

set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_rd[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_rd[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_rd[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_rd[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports rgmii_rtl_0_rx_ctl]
set_property IOSTANDARD LVCMOS33 [get_ports rgmii_rtl_0_rxc]

set_property PACKAGE_PIN A19 [get_ports {rgmii_rtl_0_rd[3]}]
set_property PACKAGE_PIN A18 [get_ports {rgmii_rtl_0_rd[2]}]
set_property PACKAGE_PIN C20 [get_ports {rgmii_rtl_0_rd[1]}]
set_property PACKAGE_PIN D20 [get_ports {rgmii_rtl_0_rd[0]}]
set_property PACKAGE_PIN C22 [get_ports rgmii_rtl_0_rx_ctl]
set_property PACKAGE_PIN C18 [get_ports rgmii_rtl_0_rxc]

set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_td[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_td[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_td[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {rgmii_rtl_0_td[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports rgmii_rtl_0_tx_ctl]
set_property IOSTANDARD LVCMOS33 [get_ports rgmii_rtl_0_txc]

set_property PACKAGE_PIN A21 [get_ports {rgmii_rtl_0_td[3]}]
set_property PACKAGE_PIN B21 [get_ports {rgmii_rtl_0_td[2]}]
set_property PACKAGE_PIN A20 [get_ports {rgmii_rtl_0_td[1]}]
set_property PACKAGE_PIN B20 [get_ports {rgmii_rtl_0_td[0]}]
set_property PACKAGE_PIN B22 [get_ports rgmii_rtl_0_tx_ctl]
set_property PACKAGE_PIN C19 [get_ports rgmii_rtl_0_txc]

set_property IOSTANDARD LVCMOS33 [get_ports mdio_rtl_0_mdc]
set_property IOSTANDARD LVCMOS33 [get_ports mdio_rtl_0_mdio_io]
set_property PACKAGE_PIN G21 [get_ports mdio_rtl_0_mdc]
set_property PACKAGE_PIN G22 [get_ports mdio_rtl_0_mdio_io]
 

BD完成后,Generate Bitstream, 然后File-Export-Export Hardware, File-Launch SDK.

进入SDK后,新建Application Project:

microblaze sdk,FPGA,fpga开发

选择lwIP TCP Perf Server:

microblaze sdk,FPGA,fpga开发

microblaze sdk,FPGA,fpga开发

例程src目录下默认生产不同平台文件,我们可以将没有用的文件删除,最后如下:

microblaze sdk,FPGA,fpga开发

 platform_mb.c 表示我们使用Microblaze平台

 lwiptcp_bsp: 例程的板级支持包。

我们先对支持包进行设置,右键lwiptcp_bsp
microblaze sdk,FPGA,fpga开发

 黄色部分为需要修改的,即禁用dhcp,phy_link_speed = 100Mbpsmicroblaze sdk,FPGA,fpga开发

 因为例程编译后很大,需要加载到DDR3中运行,此时需要设置,右键lwiptcp:

microblaze sdk,FPGA,fpga开发

 确保例程代码在ddr中,Heap Size和Stack Size需设置大一些,不然最后程序有可能不断重启microblaze sdk,FPGA,fpga开发

 点击Generate代替之前的Linker Scriptmicroblaze sdk,FPGA,fpga开发

 保存,编译生成lwiptcp.elf

重点: 因为为了调试方便,我们指定了100Mbps 网口速度而非默认的autodetect, 所以SDK提供的例程我们不需要作修改即可用在RTL8211F芯片。 当phy_link_speed设置为Autodetect时,
microblaze sdk,FPGA,fpga开发
此时我们需要修改lwip211_v1_0源码下的xaxiemacif_physpeed.c文件,添加RTL8211F的配置代码:
microblaze sdk,FPGA,fpga开发

 代码如下:
1. 先添加定义,因为RTL8211F的idenifier ID固定为0x1c
microblaze sdk,FPGA,fpga开发

 2. 找到unsigned get_IEEE_phy_speed(XAxiEthernet *xaxiemacp) 函数,添加RTL8211F配置代码, 代码实质工作就是配置8211的相关寄存器。最后这个函数返回autodetect后的Linkspeed. 当我们指定速度时,这个函数时跳过没有执行的。

unsigned get_IEEE_phy_speed(XAxiEthernet *xaxiemacp)
{
	u16 phy_identifier;
	u16 phy_model;
	u8 phytype;

	u16 control;
	u16 status;
	u16 status_speed;
	u32 temp_speed;
	u16 value;
	u32 timeout_counter = 0;


#ifdef XPAR_AXIETHERNET_0_BASEADDR
	u32 phy_addr = detect_phy(xaxiemacp);

	/* Get the PHY Identifier and Model number */
	XAxiEthernet_PhyRead(xaxiemacp, phy_addr, PHY_IDENTIFIER_1_REG, &phy_identifier);
	XAxiEthernet_PhyRead(xaxiemacp, phy_addr, PHY_IDENTIFIER_2_REG, &phy_model);

/* Depending upon what manufacturer PHY is connected, a different mask is
 * needed to determine the specific model number of the PHY. */
	if (phy_identifier == MARVEL_PHY_IDENTIFIER) {
		phy_model = phy_model & MARVEL_PHY_MODEL_NUM_MASK;

		if (phy_model == MARVEL_PHY_88E1116R_MODEL) {
			return get_phy_speed_88E1116R(xaxiemacp, phy_addr);
		} else if (phy_model == MARVEL_PHY_88E1111_MODEL) {
			return get_phy_speed_88E1111(xaxiemacp, phy_addr);
		}
	} else if (phy_identifier == TI_PHY_IDENTIFIER) {
		phy_model = phy_model & TI_PHY_DP83867_MODEL;
		phytype = XAxiEthernet_GetPhysicalInterface(xaxiemacp);

		if (phy_model == TI_PHY_DP83867_MODEL && phytype == XAE_PHY_TYPE_SGMII) {
			return get_phy_speed_TI_DP83867_SGMII(xaxiemacp, phy_addr);
		}

		if (phy_model == TI_PHY_DP83867_MODEL) {
			return get_phy_speed_TI_DP83867(xaxiemacp, phy_addr);
		}
	}
	else {
			if (phy_identifier==PHY_REALTEK_IDENTIFIER){

				xil_printf("Start PHY autonegotiation \r\n");

				/* 网线插拔检测 */
				XAxiEthernet_PhyRead(xaxiemacp, phy_addr, 1, &value); //BMSR register
				XAxiEthernet_PhyRead(xaxiemacp, phy_addr, 1, &value); //read twice
				if (value & 0x0004) xil_printf("Cable Linked\r\n");  //PHY_LINKED_STATUS

				XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, &control);
				 control |= IEEE_ASYMMETRIC_PAUSE_MASK;
				 control |= IEEE_PAUSE_MASK;
				 control |= ADVERTISE_100; //support 100Base FUll and Half
				 control |= ADVERTISE_10; //support 10Base FUll and Half
				XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, control);

				XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,&control);
				control |= ADVERTISE_1000;
				XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,control);

				XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
				control |= IEEE_CTRL_AUTONEGOTIATE_ENABLE;
				control |= IEEE_STAT_AUTONEGOTIATE_RESTART;
				XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);

				XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
				control |= IEEE_CTRL_RESET_MASK;
				XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);

				while (1) {
					XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
					if (control & IEEE_CTRL_RESET_MASK)
						continue;
					else
						break;
				}

				XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);
				xil_printf("Waiting for PHY to complete autonegotiation.\r\n");
				while ( !(status & IEEE_STAT_AUTONEGOTIATE_COMPLETE) ) {
					//sleep(1);
					usleep(500000);
					timeout_counter++;
					if (timeout_counter == 30) {
						xil_printf("Auto negotiation error \r\n");
						return 0;
					}
					XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);
				}
				xil_printf("autonegotiation complete \r\n");

				XAxiEthernet_PhyRead(xaxiemacp, phy_addr,0x1A, &status_speed); /* Commercial RTL8211*/
				/*		 if (status_speed & 0x400) {  //link ok
						 temp_speed = status_speed & 0xc000;
						 if (temp_speed == 0x8000)
							 return 1000;
						 else if(temp_speed == 0x4000)
							 return 100;
						 else
							 return 10;	 */

				 if (status_speed & 0x04) {  //link ok
					 temp_speed = status_speed & 0x30;
					 if (temp_speed == 0x20)
						 return 1000;
					 else if(temp_speed == 0x10)
						 return 100;
					 else
						 return 10;

				 }


			 }
			return XST_SUCCESS;
//	else {
	    LWIP_DEBUGF(NETIF_DEBUG, ("XAxiEthernet get_IEEE_phy_speed: Detected PHY with unknown identifier/model.\r\n"));
	}
#endif
#ifdef PCM_PMA_CORE_PRESENT
	return get_phy_negotiated_speed(xaxiemacp, phy_addr);
#endif
}

返回link speed后,进入configure_IEEE_phy_speed(XAxiEthernet *xaxiemacp, unsigned speed)函数,我们在这个函数添加了配置8211 LED的代码:

    #define GREEN_LED 2 // 绿灯是LED2
    #define YELLOW_LED 1 // 黄灯是LED1


//配置网口LED灯状态
	XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, 31, 0xd04);
    temp = 0x0b << (5 * GREEN_LED); // 绿灯表示连接状态
    temp |= 0x1b << (5 * YELLOW_LED); // 黄灯表示数据包收发状态
    XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, 0x10, temp);

    temp = 1 << (YELLOW_LED + 1); // 绿灯不指示EEE节能状态, 插了网线后灯要常亮  // 但黄灯要指示EEE节能状态, 没有数据包时灯要熄灭

    XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, 0x11, temp);
    XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, 31, 0);
    // 插上网线后, 绿灯常亮; 拔掉网线后, 绿灯熄灭
    // 链路支持EEE节能: 有数据传输, 黄灯闪烁, 否则熄灭
    // 链路不支持EEE节能: 有数据传输, 黄灯闪烁, 否则常亮

回到之前最终生产了lwiptcp.elf,下面进行下载验证:

1. Xilinx - Program FPGA (作用1:将top_wrapper.bit 硬件流文件加载到FPGA中,并把bootloop.elf加载到BRAM用于引导后面的lwiptcp.elf。 所用2:并把两个文件合并生成一个download.bit文件,用于后面的程序固化到外部SPI FLASH中)

microblaze sdk,FPGA,fpga开发

 microblaze sdk,FPGA,fpga开发

 microblaze sdk,FPGA,fpga开发

 2. 右键工程lwiptcp - Run as - Run Configurations

microblaze sdk,FPGA,fpga开发

 microblaze sdk,FPGA,fpga开发

 点击Run后,SDK将lwiptcp.el加载到DDR3中并reset FPGA。(因为lwiptcp.elf编译后大小有30.28M,只能加载到DDR中,看之前设置)

microblaze sdk,FPGA,fpga开发microblaze sdk,FPGA,fpga开发

 因为lwiptcp.elf太大,FPGA reset后需要等待十几秒才能运行。

microblaze sdk,FPGA,fpga开发

iperf.exe windows默认没有,需要自己复制到c:\windows目录下(注意这里是第一版本的iperf, iperf3 不能用)

命令: iperf -c 192.168.31.55 -i 5 -t 30 -w 2M

microblaze sdk,FPGA,fpga开发

实测100Mbps下,带宽只有16.7Mbps, 不知道什么原因。文章来源地址https://www.toymoban.com/news/detail-698573.html

到了这里,关于Artix7 Microblaze下调试SDK官方lwIP RAW Mode TCP Server Application例程(详细说明)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA Artix7-100T实现手写字硬件加速,纯Verilog编写的CNN神经网络加速器,有效减轻误识别问题

    fpga实现cnn神经网络加速 手写字硬件加速 FPGA artix7-100t 纯verilog编写 神经网络硬件加速 使用ov5640摄像头dvp接口 verilog实现手写字识别 包括卷积层、全连接层、池化层、softmax,有效减轻误识别问题。 注意: 该项目并未使用到arm核,是使用传统fpga的逻辑资源实现的。 ID:92299 7141

    2024年04月23日
    浏览(31)
  • Xilinx Artix7-100T低端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

    Xilinx Artix7-100T低端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰,以至于Xilinx官方不得不推出专用的IP核供开发者使用,不然太高端的操

    2024年02月05日
    浏览(51)
  • FPGA 学习笔记:Vivado 2018.2 MicroBlaze 启动 SDK

    Vivado 2018.2,配置好 MicroBlaze Uartlite等Block Design后,生成了 bin、bin文件,此时烧写到FPGA板子上,发现没有任何动静,所以需要 SDK的支持 这里使用的Vivado 2018.2,最新的 Vivado版本,如 Vivado 2020.2,启动的SDK 是 :Vitis,启动方式稍微有点不同,后面补充 Vivado 2020.2版本的操作方法

    2024年02月12日
    浏览(52)
  • 「亲测可用」Adobe Camera Raw 16 for win/mac 官方下载

    官方地址: Camera Raw plug-in installer 直接下载: macOS Windows Download latest Camera Raw for macOS Download latest Camera Raw for Windows ·镜头模糊 ·HDR图片 ·混色器

    2024年02月06日
    浏览(125)
  • RAW 编程接口 TCP 函数简介

    LwIP_Periodic_Handle 函数是 一个必须被无限循环调用的 LwIP支持函数,一般在 main函数的无限循环中调用,主要功能是为 LwIP各个模块提供时间并查询链路状态 ,该 函数有一个形参,用于指示当前时间,单位为 ms。 对于 TCP功能,每 250ms执行一次 tcp_tmr函数;对于 ARP,每 5s 执 行一

    2024年04月12日
    浏览(33)
  • Lwip之TCP协议实现(二)

    接上文:Lwip之TCP协议实现(一)_龙赤子的博客-CSDN博客 第二部分:数据输入处理 Tcp数据的输入处理主要在文件tcp_in.c中实现。输入的数据包在IP层进行分发处理。如果输入的数据包为TCP包,则调用tcp_input进行TCP包的输入处理。因此,tcp_input为tcp输入处理的入口。在tcp_input中会

    2023年04月09日
    浏览(35)
  • Lwip之TCP协议实现(一)

    TCP本身是一个相对复杂的协议,Lwip中最复杂的部分也是此处。这里,我们分部分描述。 第一部分:TCP处理 Tcp.c该文件提供了一些通用的函数接口。该文件中的函数主要的操作对象就是tcp_pcb,包括对tcp pcb的设置,修改读取等。另外,在该文件中还实现了tcp的定时器。 目录 一

    2023年04月09日
    浏览(31)
  • LWIP协议与TCP/IP

             a. 例如: LWIP 这个东西是干什么用的 :他就是一个裁剪后保持大部分TCP/IP功能的协议。用少量的资源消耗实现一个较为完整的TCP/IP协议栈,其中“完整”主要指的是TCP协议的完整性,实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。此外LwIP既可以

    2023年04月23日
    浏览(39)
  • 【lwip】14-TCP协议之可靠传输的实现(TCP干货)

    ‍ 前面章节太长了,不得不分开。 这里已源码为主,默认读者已知晓概念或原理,概念或原理可以参考前面章节,有分析。 参考:李柱明博客:https://www.cnblogs.com/lizhuming/p/17438743.html ‍ lwip的时钟机制可以翻看前面章节。 lwip的TCP可靠传传输的实现离不开两个时钟处理函数:

    2024年02月06日
    浏览(49)
  • virtualBox解决不能为虚拟电脑 AR_Base 打开一个新任务. Raw-mode is unavailable courtesy of Hyper-V. win11亲测有用。

    数值意义如下: 找到“HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNetworkSetup2Interfaces”下,将文件夹一个一个展开,找到如图所示一个文件夹,这就是“Virtualbox Host-Only Network Adapter”虚拟网卡残留的信息,然后将其删除。

    2024年02月05日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包