1 引言

有了上一讲的基础知识后,本篇进行基于SoC的PL与PS侧协同完成通过网口SGMII的udp传输,本教程为全网第一篇关于ZCU106开发板的教程,先上视频看效果。

ZCU106与PC的UDP通讯

2  实验内容

1、实验任务:通过ZCU106的SGMII网口与PC机完成基于UDP协议的数据传输

2、实验软件:Vivado 2019.1、Vivado SDK 2019.1、网络调试助手(自行下载)、友善串口调试助手

实验硬件:ZCU106、网线1一条

3、实验过程:

step1:建立项目工程:udp_test_ps

step2:建立PS侧设计,就和simulink一样搭建模块

 

step3:添加ZYNQ+支持

直接双击,界面就出现了芯片,然后点击下图的自动运行模块

然后变成了这样

我们双击后在左侧的PS-PL configuration的search搜索hpm,ba AXI HPM1 FPD的钩子去掉。

再次使用search搜索irq(中断信号),把IRQ0[0-7]改成0,然后直接点击OK

step4:修改ddr属性,这个可能每个开发板不一样。我的开发板必须设置成这个样子才能运行。

详情原因请看:FPGA学习之路-ZCU106板子点亮PS侧LED_发光的沙子的博客-CSDN博客_zcu106开发板

然后点击校验按钮,没问题后变成了这样:

step5:输出产品,创建HDL WARRP

step6:生存bit文件,并将bit文件输出到sdk中,然后直接店家Launch SDK按钮。

step7:建立app_cpu0程序并设置为server服务。

step8:删除下面红框两个文件,并修改main.c文件,并添加sys_intr.c、sys_intr.h、user_udp.c、user_udp.h这4个文件。

1、main.c

//--------------------------------------------------
// Company: 东北电力大学
// Engineer: Yang Zheng
//--------------------------------------------------#include "sleep.h"
#include "user_udp.h"
#include "sys_intr.h"
#include "lwip/ip.h"extern unsigned udp_connected_flag;
static  XScuGic Intc;   //GICstatic struct netif server_netif;
struct netif *netif;int main(void)
{ip_addr_t ipaddr, netmask, gw;/*  开发板MAC地址  */unsigned char mac_ethernet_address [] ={0x00, 0x0a, 0x35, 0x00, 0x01, 0x02};/*  开启中断系统  */Init_Intr_System(&Intc);Setup_Intr_Exception(&Intc);netif = &server_netif;xil_printf("Configuring default IP of 172.168.1.10\r\n");IP4_ADDR(&(netif->ip_addr),  172, 168,   1, 10);IP4_ADDR(&(netif->netmask), 255, 255, 255,  0);IP4_ADDR(&(netif->gw),      172, 168,   1,  1);ipaddr.addr = netif->ip_addr.addr;gw.addr = netif->gw.addr;netmask.addr = netif->netmask.addr;lwip_init();   //初始化lwIP库/* 添加网络接口并将其设置为默认接口 */if (!xemac_add(netif, &ipaddr, &netmask, &gw, mac_ethernet_address, XPAR_XEMACPS_0_BASEADDR)) {xil_printf("Error adding N/W interface\r\n");return -1;}netif_set_default(netif);netif_set_up(netif);        //启动网络user_udp_init();            //初始化UDPwhile(1){/*  将MAC队列中的包传输的LwIP/IP栈中   */xemacif_input(netif);if (udp_connected_flag) { //发送xil_printf("udp con is successed\r\n");sleep(10);udp_printf();}}return 0;
}

2、 sys_intr.c

//--------------------------------------------------
// Company: 东北电力大学
// Engineer: Yang Zheng
//--------------------------------------------------
#include "sys_intr.h"//---------------------------------------------------------
//                    设置中断异常
//---------------------------------------------------------
void Setup_Intr_Exception(XScuGic * IntcInstancePtr)
{Xil_ExceptionInit();Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,(void *)IntcInstancePtr);Xil_ExceptionEnable();
}//---------------------------------------------------------
//                    初始化中断系统
//---------------------------------------------------------
int Init_Intr_System(XScuGic * IntcInstancePtr)
{int Status;XScuGic_Config *IntcConfig;IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);if (NULL == IntcConfig) {return XST_FAILURE;}Status = XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}return XST_SUCCESS;
}

3、sys_intr.h

//--------------------------------------------------
// Company: 东北电力大学
// Engineer: Yang Zheng
//--------------------------------------------------
#ifndef SYS_INTR_H_
#define SYS_INTR_H_#include "xparameters.h"
#include "xil_exception.h"
#include "xdebug.h"
#include "xscugic.h"#define INTC_DEVICE_ID          XPAR_SCUGIC_SINGLE_DEVICE_IDint Init_Intr_System(XScuGic * IntcInstancePtr);
void Setup_Intr_Exception(XScuGic * IntcInstancePtr);#endif /* SYS_INTR_H_ */

4、user_udp.c

//--------------------------------------------------
// Company: 东北电力大学
// Engineer: Yang Zheng
//--------------------------------------------------
#include "user_udp.h"
#include "lwip/ip.h"//---------------------------------------------------------
//                    变量定义
//---------------------------------------------------------
struct udp_pcb *connected_pcb = NULL;
static struct pbuf *pbuf_to_be_sent = NULL;static unsigned local_port = 7;      //本地端口
static unsigned remote_port = 8080;  //远程端口
volatile unsigned udp_connected_flag = 0;  //连接标志//---------------------------------------------------------
//                  UDP连接初始化函数
//---------------------------------------------------------
int user_udp_init(void)
{struct udp_pcb *pcb;ip_addr_t ipaddr;err_t err;udp_connected_flag = 0;/*  创建UDP控制块   */pcb = udp_new();if (!pcb) {xil_printf("Error Creating PCB.\r\n");return -1;}/*  绑定本地端口   */err = udp_bind(pcb, IP_ADDR_ANY, local_port);if (err != ERR_OK) {xil_printf("Unable to bind to port %d\r\n", local_port);return -2;}/*  连接远程地址   */IP4_ADDR(&ipaddr, 172, 168, 1, 100);err = udp_connect(pcb, &ipaddr, remote_port);if (err != ERR_OK) {xil_printf("Unable to connect remote port.\r\n");return -3;}else {xil_printf("Connected Success.\r\n");connected_pcb = pcb;udp_connected_flag = 1;}return 0;
}//---------------------------------------------------------
//                   UDP发送数据函数
//---------------------------------------------------------
void udp_printf(void)
{err_t err;char send_buff[512] = "hello world! author: Yang Zheng\r\n";  //待发送字符struct udp_pcb *tpcb = connected_pcb;if (!tpcb) {xil_printf("error connect.\r\n");}/*  申请pbuf资源  */pbuf_to_be_sent = pbuf_alloc(PBUF_TRANSPORT, 512, PBUF_POOL);memset(pbuf_to_be_sent->payload, 0, 512);memcpy(pbuf_to_be_sent->payload, (u8 *)send_buff, 512);/*  发送字符串  */err = udp_send(tpcb, pbuf_to_be_sent);if (err != ERR_OK) {xil_printf("Error on udp send : %d\r\n", err);pbuf_free(pbuf_to_be_sent);return;}pbuf_free(pbuf_to_be_sent);  //释放pbuf
}

5、user_udp.h

//--------------------------------------------------
// Company: 东北电力大学
// Engineer: Yang Zheng
//--------------------------------------------------
#ifndef SRC_USER_UDP_H_
#define SRC_USER_UDP_H_#include "lwip/err.h"
#include "lwip/udp.h"
#include "lwip/init.h"
#include "lwipopts.h"
#include "lwip/err.h"
#include "lwipopts.h"
#include "netif/xadapter.h"
#include "xil_printf.h"int user_udp_init(void);
void udp_printf(void);#endif /* SRC_USER_UDP_H_ */

step9:由步骤8可知,PC的ip地址为172.168.1.100,端口为8080;FPGA的ip地址为172.168.1.10,端口为7。

FPGA--ZCU106通过SFP+/SGMII模块传输数据-第二讲(全网唯一)相关推荐

  1. FPGA--ZCU106通过SFP+/SGMII模块传输数据-第一讲(全网唯一)

    1  引言   距离上次文章已经过去了一个半月,但并没有停止研究fpga的脚步,今天给大家带来的是基于ZCU106开发板的通过SFP+/SGMII口通过光纤或网线与PC机传输数据的内容,本系列教程计划 ...

  2. 基于FPGA的Hamiton方程--辛几何算法实现(全网唯一)

    1.本文实验基于冯康院士的<哈密尔顿系统的辛几何算法>开展,链接:https://pan.baidu.com/s/1GM0Px7SLWBWzh4sXmAdcwg  提取码:fmkt 2.虽 ...

  3. FPGA之旅设计99例之第二十一例----VGA串口SDRAM显示图片

    一. 简介 本例将接着上一例实现的sdram控制器进行封装.上例中只是实现了一个基本的控制器,在实际使用中,通常读写时钟是两个不同频率的,所以并不能满足要求. 在本例中,将对读写接口进行封装,将读写接 ...

  4. XFP光模块与SFP+光模块有何区别?能互通吗?

    在光纤网络中,光模块是实现数据传输必不可少的组件之一.10G光模块凭借着较低的成本和功耗被广泛应用于学校.公司等应用环境中.XFP光模块和SFP+光模块是两种常见的10G光模块,您对它们了解多少?知道 ...

  5. FPGA学习之串口发送模块设计与验证

    FPGA学习之串口发送模块设计与验证 1.实验目的: 实现一个串口输出,通过上位机PC查看接收到的是否是串口发送的数据. 2.实验介绍: 学习UART通信原理及其硬件电路设计,使用FPGA实现UART ...

  6. FPGA之旅设计99例之第二十例---SDRAM存储器实现

    一. 简介 本例将介绍SDRAM的使用.SDRAM是一个存储器件,存储容量大,存储速度比较快,速度可达100M,特别适合用来当中视频或者音频中的存储器件. 在采集到OV5640传输过来的图像数据的时候 ...

  7. 如何为SFP光模块搭配对应的光纤跳线?

    光模块没有了光纤跳线,就不能实现光纤网络连接.由于光模块的不同传输介质,光纤接口.传输距离和数据速率都会有区别.想要识别这些光模块并不难,但是为光模块搭配合适的光纤跳线还是需要花一些心思的,易天光通信 ...

  8. 易天教你如何保养SFP光模块

    人们都想要留住青春,拥有好的皮肤,这些都是需要保养的.那么你们又知不知道其实光模块也是需要保养的呀? SFP光模块里面涵盖了许多精密的光学元件和电路元件,在日常使用中,我们需按照规范进行操作,否则很容 ...

  9. sfp光模块和sfp+高速线缆有什么区别?

    一.什么是sfp光模块?什么是sfp+高速线缆? sfp光模块是小型热插拔光模块,是GBIC光模块的升级版本,体积比GBIC光模块减少一半,但它却可以在相 同的面板上配置多出一倍以上的端口数量,功能上 ...

最新文章

  1. 小程序 循环中有多个input,怎么获取每个input输入框的值
  2. php评星,jQuery+PHP星级评分实现方法
  3. WiFi曝出安全漏洞几近“裸奔”:运营商能借机收割一波红利吗?
  4. 怎么通过controller层退出登录_控制层访问拦截
  5. AssemblyVersion,AssemblyFileVersion和AssemblyInformationalVersion之间有什么区别?
  6. lock free(无锁并发)是什么
  7. springmvc并发调用controller方法时对局部变量的影响
  8. javweb音乐网站_基于jsp的音乐网站-JavaEE实现音乐网站 - java项目源码
  9. 理解 HTTP 幂等性
  10. Hello Guice
  11. 【WiFi】WiFi 6E
  12. 网众无盘linux挂载u盘,个人总结出的49条网众无盘系统常见故障解决方法
  13. 快手加抖音自动刷视频脚本,引用的是python+易语言编程
  14. 【历史上的今天】1 月 31 日:Python 之父出生;宏碁大战联想;SBC 收购 ATT
  15. Hanselminutes Podcast 244-Benjamin van der Veen的Kayak,OWIN,开源Web服务器等
  16. Git学习-本地版本库的创建与简单操作
  17. 零基础Java难学吗?自学怎么样?
  18. 踩方格(空间压缩+动态规划+暴力递归)
  19. 西安交大计算机学院 栾佳锡,史椸-西安交通大学-自动化科学与工程学院
  20. 微信服务器在哪里修改密码,微信怎么修改密码?微信在哪里修改密码?

热门文章

  1. Android 老生常谈之MVC与MVP
  2. 【目标检测】Receptive Field Block Net for Accurate and Fast Object Detection论文理解
  3. Foo,getName题解分析
  4. 转java通过身份证号码获取出生日期、性别、年龄
  5. AipOcr百度文字识别API Key和Secret Key申请及应用例子说明
  6. python爬虫:requests和urllib爬豆瓣Top250
  7. Invalid prop: custom validator check failed for prop “pagination“.
  8. SAP中税码、税率、税务科目的几个表及其中的勾稽关系
  9. 二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解
  10. redis的zset为什么用调表不用红黑树