利用ZYNQ SOC快速打开算法验证通路(2)——数据传输最简方案:网络调试助手+W5500协议栈芯片
在上一篇该系列博文中讲解了MATLAB待处理数据写入.bin二进制数据文件的过程,接下来需要将数据通过以太网发送到ZYNQ验证平台。之前了解过Xilinx公司面向DSP开发的System Generator可以通过硬件协仿真的方式,进行算法板级验证。一个是本人不熟悉这种方式,再一个缺乏通用性,也无法在系统层面进行硬件验证。当然方案有很多,熟悉上位机的朋友完全可以自己写个软件完成数据传输和算法结果对比等功能。
这里选择最简单的方案:在上位机通过网络调试助手将数据打包并发送至以太网端口,ZYNQ端利用W5500硬件协议栈芯片解析数据。有人可能会说用ZYNQ这么高端的设备还使用外接协议栈芯片连接以太网真是浪费,这里就算是开个头吧,只能说根据能力和现有条件选择传输方案。如果数据量较大的场合,可考虑用LWIP开源协议栈或直接利用verilogHDL编写UDP/IP协议和MAC控制器的方式实现1000Mbps速率传输。
本文主要总结内容包括:TCP协议基础 网络调试助手应用事项,以及W5500的驱动移植。为了保证数据正确性,选用TCP这一可靠传输协议。以下介绍两个比较浅显易懂的博文,供没有网络和TCP协议基础的朋友参考。(见参考链接1 2)
有了以上基础知识,我们就可以正确配置网络参数了。查看W5500驱动中网络参数配置部分代码:
void Load_Net_Parameters(void) {
//加载端口0的工作模式,TCP客户端模式
S0_Mode = TCP_CLIENT; //UDP_MODE Gateway_IP[] = ; //加载设备网关参数
Gateway_IP[] = ;
Gateway_IP[] = ;
Gateway_IP[] = ; Sub_Mask[] = ; //加载设备子网掩码
Sub_Mask[] = ;
Sub_Mask[] = ;
Sub_Mask[] = ; Phy_Addr[] = 0x0c; //加载设备物理地址(mac)
Phy_Addr[] = 0x29;
Phy_Addr[] = 0xab;
Phy_Addr[] = 0x7c;
Phy_Addr[] = 0x00;
Phy_Addr[] = 0x01; IP_Addr[] = ; //加载本设备(FPGA端)IP地址
IP_Addr[] = ;
IP_Addr[] = ;
IP_Addr[] = ;
//加载设备端口0(socket 0)的端口号5000
S0_Port[] = 0x13; //十六进制 1388转换成十进制为5000
S0_Port[] = 0x88; //设定的是客户端模式
if(S0_Mode == TCP_CLIENT)
{
//加载端口0的目的(如调试用的pc机)IP地址
S0_DIP[] = ;
S0_DIP[] = ;
S0_DIP[] = ;
S0_DIP[] = ; //加载端口0的目的(如调试用的pc机)端口号6000
S0_DPort[] = 0x17;
S0_DPort[] = 0x70;
} //设定的是UDP模式,初始化给一个目的IP和端口号。
if(S0_Mode == UDP_MODE)
{
//加载端口0的目的(如调试用的pc机)IP地址
UDP_DIPR[] = ;
UDP_DIPR[] = ;
UDP_DIPR[] = ;
UDP_DIPR[] = ;
//加载端口0的目的(如调试用的pc机)端口号6000
UDP_DPORT[] = 0x17;
UDP_DPORT[] = 0x70;
}
}
此处将PC端作为TCP协议中服务器,ZYNQ验证平台视为客户端,即为“呼叫端”。由代码看出PC端IP地址为192.168.90.188,子网掩码应设为:255.255.255.0,这样ZYNQ与PC端在一个子网内,可直接通过网线连接。 端口号为6000。驱动中包含W5500 SPI用户接口时序部分代码,可简单修改调用本人的博文《ZYNQ EMIO使用及可重用封装》中的EMIO接口函数(见参考链接3)。
根据上面参数配置好PC端的IP地址 子网掩码后,我们来看下网络调试助手的“坑”。
基本使用没什么可说的,网上教程很多。关键是画红框的部分。这里的发送周期要尽量设置大些,因为整个数据文件会被切割成多个数据包,每个包的发送和允许重传时间由总的发送周期分配得到。如果文件较大,发送周期又设置的较小,会导致后半部分被丢弃(所设置时间只够传输文件的前半部分)。RX方向接收数据时选择接收转向文件,注意两点:1 接收文件的扩展名同样要为.bin 2 不要选择十六进制显示,否则接收数据会变成字符串(可能是软件bug)。
W5500的C语言驱动基于网上流传的STM32版本代码。其中应用API为Process_Socket_Data中的发送和接收函数:Write_SOCK_Data_Buffer Read_SOCK_Data_Buffer。两者内部控制读写指针偏移以及调用SPI接口函数完成数据传输,此处不进行详述,关于W5500的C语言驱动可看教程视频(见参考链接4)。最后附上环回数据的demo效果:
对于网络传输部分的总结就到这里,后边可能会考虑利用LWIP完成高速传输。数据传到ZYNQ了,下一步当然是先缓存起来,再发送到PL端验证算法模块,这样做的好处是可以模拟实时数据流,比如验证通信算法和视频处理算法时尤为适用。华丽分割线
---------------------------------------------------------------------------------------------------------------------------------------------------------
参考链接:
1 五分钟读懂TCP 协议——TCP协议简介 - CSDN博客
https://blog.csdn.net/ningdaxing1994/article/details/73076795
2 计算机网络: IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解 - 互联网隐者 - 博客园
https://www.cnblogs.com/iceJava/p/5372033.html
3《ZYNQ EMIO使用及可重用封装》 - 没落骑士 - 博客园
https://www.cnblogs.com/moluoqishi/p/9198772.html
4 STM32F103+W5500 全硬件以太网开发板视频教程 (1)- TCP服务器(静态)_土豆视频
http://new-play.tudou.com/v/XMzQyODk0NjAzNg==.html?from=s1.8-1-1.2
利用ZYNQ SOC快速打开算法验证通路(2)——数据传输最简方案:网络调试助手+W5500协议栈芯片的更多相关文章
- 利用ZYNQ SOC快速打开算法验证通路(1)——MATLAB浮点数与定点二进制补码互转
最近本人一直在学习ZYNQ SOC的使用,目的是应对科研需要,做出通用的算法验证平台.大概思想是:ZYNQ PS端负责与MATLAB等上位机数据分析与可视化软件交互:既可传输数据,也能通过上位机配置更 ...
- 利用ZYNQ SOC快速打开算法验证通路(6)——LWIP实现千兆TCP/IP网络传输
一.前言 之前ZYNQ与PC之间的网络连接依赖于外接硬件协议栈芯片,虽然C驱动非常简单,但网络带宽受限.现采用LWIP+PS端MAC控制器+PHY芯片的通用架构.关于LWIP库,已经有很多现成的资料和 ...
- 利用ZYNQ SOC快速打开算法验证通路(6)——利用AXI总线实时配置sysGen子系统
利用ZYNQ验证算法的一大优势在于,可以在上位机发送指令借助CPU的控制能力和C语言易开发特点,实时配置算法模块的工作模式.参数等对来对其算法模块性能进行全面的评估.最重要的是无需重新综合硬件模块. ...
- 利用ZYNQ SOC快速打开算法验证通路(4)——AXI DMA使用解析及环路测试
一.AXI DMA介绍 本篇博文讲述AXI DMA的一些使用总结,硬件IP子系统搭建与SDK C代码封装参考米联客ZYNQ教程.若想让ZYNQ的PS与PL两部分高速数据传输,需要利用PS的HP(高性能 ...
- 利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator
一.前言 利用FPGA设计算法一直以来都是热点,同样也是难点.将复杂的数学公式 模型通过硬件系统来搭建,在低延时 高并行性等优势背后极大提高了设计难度和开发周期.Xilinx公司的sysGen(sys ...
- 利用ZYNQ SOC快速打开算法验证通路(3)——PS端DMA缓存数据到PS端DDR
上篇该系列博文中讲述W5500接收到上位机传输的数据,此后需要将数据缓存起来.当数据量较大或者其他数据带宽较高的情况下,片上缓存(OCM)已无法满足需求,这时需要将大量数据保存在外挂的DDR SDRA ...
- 利用Zynq Soc创建一个嵌入式工程
英文题目:Using the Zynq SoC Processing System,参考自ADI的ug1165文档. 利用Zynq Soc创建一个嵌入式工程,该工程总体上包括五个步骤: 步骤一.新建空 ...
- 基于Python的函数回归算法验证
看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归回归方法就是寻找方差的最小值y = kx + bxi, yiy ...
- 利用朴素贝叶斯算法进行分类-Java代码实现
http://www.crocro.cn/post/286.html 利用朴素贝叶斯算法进行分类-Java代码实现 鳄鱼 3个月前 (12-14) 分类:机器学习 阅读(44) 评论(0) ...
随机推荐
- PostgreSQL基础知识分享
1.架构 PostgreSQL是一个关系数据库,采用c/s架构.一个PostgreSQL会话包括: 服务端进程——postgres:用于管理数据库文件,并接受来自客户端的数据库连接, 同时代替客户端执 ...
- React 中 Link 和 NavLink 组件 activeClassName、activeStyle 属性不生效的问题
首先 导航链接应该使用 NavLink 而不再是 Link NavLink 使用方法见 https://github.com/ReactTraining/react-router/blob/mas ...
- [usaco18Feb] New Barns
题意 每次新建一个节点,并与一个已知节点连边.(或者不连).多次询问以某个已知点点出发的最远路径长度. 分析 显然,在任何时候图都是一个森林.由树的直径算法可知,与某点最远距的点必然是树的直径的一段. ...
- xtrabackup备份(MySQL备份)与恢复
xtrabackup备份(MySQL备份)与恢复 1. innobackupex参数选项 --no-timestamp: 不创建一个时间戳 --defaults-file=[MY.CNF] //指定配 ...
- 汇编语言 实验14 访问CMOS RAM
汇编语言 访问CMOS RAM CMOS RAM 是什么? 存放计算机开机必备的一些数据的硬件,由BIOS(Basic input/output system)调用其数据. 怎么用? 首先要理解端口的 ...
- Python进阶:迭代器与迭代器切片
2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...
- 行为驱动:Cucumber + Selenium + Java(三) - 使用标签实现测试分组
在上一篇中,我们写出了Selenium + Cucumber + Java环境下的第一个BDD自动化测试用例,这一篇我们说说怎么用标签对用例进行分组. 3.1 Cucumber标签 实际工作中,我们的 ...
- Spring boot 之自动生成API文档swagger2
目前解决API的方案一般有两种 1.编写文档接口.2.利用一些现成的api系统.3.如我一般想搞点特色的就自己写个api系统:http://api.zhaobaolin.vip/ ,这个还支持多用户. ...
- Java开发知识之Java的异常处理
Java开发知识之Java的异常处理 一丶异常概述 在讲解异常之前,我们要搞清楚.什么是异常. 通俗理解就是我们编写的程序出问题了.进行处理的一种手段. 比如我们的QQ.有的时候就崩溃了.比如出现xx ...
- 阿里云ACE共创空间——MQ消息队列产品测试
一.产品背景消息队列是阿里巴巴集团自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息订阅和发布.消息轨迹查询.定时(延时)消息.资源统计.监控报警等一系列消息云服务,是企业级互联网架构 ...