基于Zynq7020双千兆以太网的数字信号处理板设计

2023-05-16

一、背景

背景
Xilinx公司在2010年发布了可扩展的处理器平台Zynq7000系列,它采用了28nm工艺,将FPGA与ARM cortex A9集成在一颗芯片上,实现了高性能、高集成度、低功耗。Zynq7000系列有多种芯片型号可供选择,主要差别在FPGA的规模、Coretex A9核的数量、管脚数量、成本等方面。在2013年,笔者所在公司需要开发一款嵌入式产品,其中的关键部件之一就是数字信号处理板。数字信号处理板的主要功能需求是:
(1) 处理2路来自高速ADC的信号,对信号进行实时滤波、降噪;
(2) 将处理后的信号通过以太网口、以tcp连接传输到上位机进行后续处理,每一路信号的净荷速率大约320Mbps;
(3) 数字信号处理板作为嵌入式设备的主控单元,对设备的各个模块进行配置、实时运行监测、实时故障诊断、故障上报等,同时通过以太网与上位机连接,以tcp连接实时上报状态、告警、故障,响应上位机的命令等;
综合比较了处理能力、集成度、成本、功耗等因素,我最终选择了Xilinx公司在2010年发布的Zynq7000处理器,具体型号是Zynq7020。Zynq7020上的主要资源包括:双核cotex A9,85K logic cell,4.9Mb block RAM,220 DSP slices 。
本文主要阐述数字信号处理单板的设计难点之一:双千兆以太网的设计以及调试中典型问题的解决方法。

二、以太网设计方案的选择

Zynq7020片内有2个ARM Cortex A9内核,我们分别称之为core0、core1,芯片内还内嵌了2个MAC控制器。在单板硬件上,我们部署了2个千兆以太网接口,分别称之为eth0、eht1。从功能需求可知:以太网需要传输2种类型的数据,一类是低速的控制面数据,主要是与上位机的消息交互,消息是突发性的,峰值数据速率不超过10Mbps,这对于千兆以太网负荷根本不是问题;第二类是高速的信号数据,净荷速率大约是每路320Mbps,且信号速率是恒定的,考虑到tcp报头的开销,以太网总传输速率大约在334Mbps。

对开发平台的说明:
集成开发工具SDK版本:SDK 14.5(该版本的SDK工具本身以及其所带的库文件都还有bug,库文件的bug在调试中自己加以修正了)
虚拟机:VMware_8.0.4
Ubuntu:12.04 LTS
GCC工具链:4.6.1
Linux kernel:从xilinx官网上下载了linux-xlnx-xilinx-v2013.4.tar.gz
在Zynq7020的功能部署上有三种方案可选择:
(1)方案一:core0、core1工作在SMP模式,嵌入式Linux OS管理2个核,提供完整的tcp/ip协议栈;
core0:控制eth0,实现控制面消息传输、一路334Mbps的数据传输;
coe1:控制eth1,实现一路334Mbps的数据传输;
(2)方案二:core0、core1工作在AMP模式,core0运行嵌入式Linux OS和完整的tcp/ip协议栈;core1裸跑、无OS,运行轻量级的tcp/ip协议栈lwip;
core0:控制eth0,实现控制面消息的传输;
core1:控制eth1,实现2路高速的数据传输,数据速率需达到334×2=668Mbps;
(3)方案三:core0、core1工作在AMP模式,core0运行嵌入式Linux OS和完整的tcp/ip协议栈;core1裸跑、无OS,运行轻量级的tcp/ip协议栈lwip;
core0:控制eth0,实现控制面消息传输、一路334Mbps的数据传输;
core1:控制eth1,实现一路334Mbps的数据传输;
三种方案似乎都能够实现需求,方案一实现上更简单一些,因为2个core是工作在SMP模式,不需要考虑cache、内存等核间公共资源的核间同步与互斥,也不需要考虑核间通信,但是,经过仔细的设计,测试结果却表明:这种方案不能保证每个网口稳定支持334Mbps的速率。
方案二、方案三都可以满足以太网的速率传输要求,我们在产品的第一个版本中选择了方案二(单网口支持668Mbps),在产品第二个版本中选择了方案三(每个网口分别支持334Mbps)。这两种方案中,Zynq7020的2个核都是工作在AMP模式下,相比于SMP模式,有很多设计细节需要仔细考虑,比如:
(1) 内存使用:core0、core1的代码及数据空间在大小上要合理分配,在物理上分开、避免冲突;
(2) Zynq7020中的二级cache是2个核共用的,在使用中要避免冲突;
(3) Eth0由core0驱动、eth1由core1驱动,在驱动层要做对应的更改;
(4) Lwip协议栈的性能优化,以便达到在千兆网上可稳定承载668Mbps的速率;
值得一提的是:在xilinx早期的SDK及Linux驱动中,对Zynq7020多核AMP模式的支持、对以太网驱动的支持也不完善,因此,我在产品调试中花费了大量时间和精力,解决了许多底层问题。令人欣慰的是:与SDK相关的工具问题、库文件的bug问题以及linux驱动对zynq芯片的支持问题,在xilinx后续发布的SDK版本、linux版本中,基本上都得到了修正。
下面就以太网的驱动、lwip的性能优化问题做稍微详细一些的描述。

三、以太网驱动的修改

core1是裸跑、无OS,SDK提供了lwip server的测试代码以及底层的以太网driver代码,我基于此代码进行修改,以实现在core1上支持ETH1。涉及到修改内容如下:
1、 core0上devicetree相关内容的修改,包括:
(1) 指定双核系统工作于AMP模式:在devicetree中,修改kernel的启动参数bootargs,在其中增加max_cpus=1,即:限定linux OS使用的cpu数量为1,另外一个cpu不属于linux OS管理;
(2) 在devicetree中,去掉对eth1的配置,以便kernel不对eth1进行相关的初始化;
2、 core0上的linux kernel中,对GIC中断distributor初始化(irq_gic.c)进行修改:原来所有的SPI(Shared Peripheral Interrupt)都只有core0接收,现需要将ETH1的MAC中断(中断号为77)改为由core1接收;
3、 core1上对PHY驱动的修改:修改Eth1的PHY1驱动。Zynq7020虽然有2个MAC控制器、可连接2个PHY,但是,PHY的控制总线(MDC、MDIO)是2个MAC共享的,在硬件设计中,只有MAC0的MDC、MDIO总线可以连接PHY,如下图所示。因此,core1如果要访问PHY1,需通过MAC0来中转,而这需要修改SDK的库文件来实现。
Zynq7020中的MAC
需要修改xilinx的SDK库文件有:Xemacpsif_hw.c, xemacpsif.c, xemacpsif.h, xemacpsif_physpeed.c
以上文件在xilinx的如下安装目录下:xilinx/14.5/ISE_DS/EDK/SW/ThirdParty/SW_service /lwip140_v1_04_a /src/contrib/port/Xilinx/netif。
4、 core1上增加对MAC1的初始化。由于在core0中不对ETH1进行初始化了,所以,在core1中必须完成对MAC1的初始化。包括:
(1)与MAC1相关的时钟:
AMBA peripheral clock control:SLCR.aper_clk_ctrl,寄存器地址是:0xf800012c,其中的bit7需要enable;(特别注意:这个时钟一定要首先enable,否则,MAC1的控制寄存器、配置寄存器都无法写入!)
GEM1的参考时钟:SLCR.gem1_ctrl,寄存器地址是:0xf800 0144。
(2)与MAC1相关的控制及配置寄存器;
以上4步正确完成,则在core1上的ETH1可以正常工作了,如:可以正常ping通了。

四、对lwip协议栈性能的优化

Core1上tcp/ip协议采用了轻量级的协议栈实现包lwip,为了要在单网口上承载稳定的668Mbps速率,必须从以下2个方面进行性能优化:(1)内存空间的分配及使用;(2)lwip的相关参数进行仔细调整;这二者缺一不可,否则,达不到性能要求,尤其是在单网口承载668Mbps情况下。
1、core1的内存分配
由于lwip协议栈需要大量的内存,因此,core1上总的内存空间分配不能太小,否则将严重制约lwip的性能。在性能测试中,曾出现一开始网速很低(几十Mbps)、并且找不到原因,在一次调整lwip相关参数时,编译器提示内存空间不够,这才受到启发去检查内存大小,发现链接文件中指定的整个core1上的内存只有区区4M bytes。如果没有lwip协议栈,这些内存对于应用而言倒也是绰绰有余,但是,增加了lwip后,内存就显得不足、严重影响了传输性能。重新设定了链接文件中的stack size、heap size以及整个内存的size:
Stack size = 0x20000
Heap size = 0x20000
内存size = 0x04000000
从而显著地提升了lwip的性能、提升了网口速率。
2、lwip协议栈的参数调整
在lwip的实现中,有很多参数可以通过配置来灵活地调整,实际应用需要根据具体的场景进行参数分析和参数调整。在我们的应用场景中,主要是向外发送大量的数据包,并且每个数据包大小固定、且很大(20K字节左右),而从外部接收到的数据包很少。经过分析与测试,如下的参数设置可达到优异的性能:

参数调整后值缺省值描述
n_tx_descriptor51264/
mem_size2097152131072byte size of heap memory
memp_n_pbuf819216number of memp struct pbufs
memp_n_tcp_seg2048256number of simultaenuously queued tcp segments
tcp_snd_buf655358192tcp sender buffer space (bytes)
tcp_wnd655352048tcp windows (bytes)
pbuf_pool_bufsize20481700size of each pbuf in pbuf pool
pbuf_pool_size10240256number of buffers in pbuf pool
经过上述2个主要步骤的优化,网口的传输速率终于达到了要求!

五、小结

本文主要描述了利用Xilinx的Zynq7020 SOC实现高速数字信号采集板的方案,产品开发时间是在2013年、上市时间在2014年上半年。重点描述了方案中,通过Zynq7020实现双千兆以太网进行高速数据传输的难点,以及在实际中所解决的问题。本文中的方案二、三都已实现了产品化,其中,方案二实现了单网口稳定承载668Mbps的网速,方案三实现了2个网口分别承载334Mbps的网速。从性能、功耗、成本、集成度、可扩展性等因素考量,Zynq7000 SOC是实现高速数字信号处理板的最有竞争力的方案之一。
从2013年到现在(2019年),Xilinx的Zynq7000系列处理器已经在许多行业得到了广泛应用,Zynq处理器也在不断向前演进,形成了Zynq7000、Zynq Ultrascale+MPSOC、Zynq Ultrascale+RFSOC三种主要系列,每个系列又有面向不同应用的多种规格,AI边缘计算、AI云计算等领域都是zynq处理器可以大显身手的地方,另外,Xilinx的开发工具、开发平台也在持续演进,如:2019年10月发布的、里程碑式的统一软件平台Vitis!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Zynq7020双千兆以太网的数字信号处理板设计 的相关文章

  • 信号量sem_init,sem_wait,sem_post

    本篇文章是信号量的简单入门 xff0c 主要学习关于信号量四个函数的使用 文章综合整理了两篇文章 xff1a http blog csdn net qyz og article details 47189219 http blog csdn
  • readdir函数

    readdir会不断读取目中的文件及目录 xff0c 但不会读子目录中的文件 include lt sys types h gt include lt dirent h gt include lt stdio h gt include lt
  • fwrite写文件是乱码

    fwrite写的二进制文件 xff0c 所以我们打开所写的文件是乱码 xff0c 但数据是正确的 xff0c 我们通过fread函数按照原来的数据格式读取即可 可以参考该文 include lt sys types h gt include
  • 经典面试题 动态链接库与静态链接库的区别

    经典面试题 动态链接库与静态链接库的区别 面试轻松学习 xff0c offer快点拿 文章目录 经典面试题 动态链接库与静态链接库的区别一 动态链接库是什么 xff1f 二 静态链接库是什么 xff1f 三 区别1 静态链接库速度快 xff
  • Docker占用的磁盘空间清理

    Docker占用的磁盘空间清理 1 docker system命令 在谁用光了磁盘 xff1f Docker System命令详解中 xff0c 我们详细介绍了docker system命令 它可以用于管理磁盘空间 docker syste
  • 卡尔曼滤波算法详细推导(全网最详细的推导过程)

    本文是来源于B站Dr CAN的视频的学习笔记 xff0c 有需要详细了解的 xff0c 可以到B站看相关视频DR CAN的个人空间 1 递归算法 例 xff1a 假设测一段距离 xff0c 第一次测 z 1 z 1 z 1 61 50 1m
  • ADC采样滤波算法利用卡尔曼滤波算法详解

    1 ADC采样模型 xff08 本文为笔者早期所写 xff0c 当时对卡尔曼滤波器理解尚未透彻 xff0c 如今回顾 xff0c 该模型还有所缺陷 xff0c 推荐读者看卡尔曼的推导过程或者B站大佬Dr CAN的空间 xff09 假设ADC
  • 微信支付趟过的坑

    这段时间在做微信支付开发 xff0c 在公司的公众号审批下来后 xff0c 我这边的测试用例也已经开发完毕 xff0c 于是拿着具体的数据来调试了 xff0c 大段大段的代码就不贴了 xff0c demo里有 xff0c 这里就说说调试过程
  • java底层原理

    Java运行三部曲 xff1a 编写 xff0c 编译 xff0c 运行 编写 xff1a 硬件编写代码 xff0c 就是我们写代码 编译 xff1a javac将文件编译成一个或多个 class文件 编译中间的过程主要是类型和格式的检查
  • 信息化时代下的我们----弄潮儿

    读完 信息化与信息管理实践之道 的部分章节想起了 第三次浪潮 中的一段话 xff0c 摘录如下 人类到现在已经经历了两次巨大的变革浪潮 这两次浪潮都淹没了早先的文明和文化 xff0c 都是以前人所不能想象的生活方式 xff0c 替代了原来的
  • ORB-SLAM稠密点云地图构建(黑白+彩色)+ pcd文件以八叉树形式表示

    pcl1 8 1 VTK 7 1 1 版本一定要对好 xff0c 如果安装了不符的版本如我之前安的pcl1 1 3和VTK8 2 一定要卸载干净不然会一直报错 xff0c 不同版本的pcl和vtk是无法共存的 xff0c 并且光把包删除是不
  • 一步步学习多线程(一) 重要概念

    几个重要的概念 1 同步 xff08 synchronous xff09 和 异步 xff08 asynchronous xff09 2 并发 xff08 Concurrency xff09 和 并行 xff08 Parallelism x
  • MAVLink功能开发,移植教程。

    MAVLink功能开发 本文由 智御电子 提供 xff0c 同时提供视频移植教程 xff0c 以便电子爱好者交流学习 1 MAVLink简介 MAVLink是一种针对微型飞行器 xff0c 推出的轻量化 xff0c 仅由头文件信息编码而成的
  • workerman问题总结大全及解决方案

    workerman无法正常访问 问题描述 xff1a 在阿里云ECS上部署了workerman的应用 xff08 ECS是专有网络 xff09 xff0c 在ECS安全组里已经允许workerman需要的全部端口 xff0c 但是外网一直不
  • Eclipse Android开发遇到:"The type org.apache.http.HttpResponse cannot be resolved."问题的解决办法

    今天在做手机卫士的项目中 xff0c 在联网下载的功能模块中遇到The type org apache http HttpResponse cannot be resolved It is indirectly referenced fro
  • UG创建图纸明细表失败的情况

    今天进行UG二次开发的时候 xff0c 由于要在图纸中自动加入零件明细表 xff0c 但是当我在图纸中插入明细表的时候UG会弹出错误对话框 xff1a 当打开UGII UPDATE ALL ID SYMBOLS WITH PLIST变量时
  • 字符串末尾自动加上'\0'的情况

    之前一直都有一个问题困扰着我 xff0c 就是我们知道C风格的字符串在用strlen求长度时只会遇到 39 0 39 结束 xff0c 如果一个字符数组全部填满了 xff0c 而在末尾没有加上 39 0 39 就会出现结果不定的现象 xff
  • c++类成员变量的初始化顺序以及特殊成员的初始化方法规则

    说到类的成员变量的初始化顺序 xff0c 对于初学者很多容易混淆其顺序 xff0c 以为简单的按初始表来初始化 xff0c 其实不然 xff0c 现在我来详细讲解下类的初始化顺序 xff1a 首先由简单开始 xff1a class peop
  • deque 迭代器失效的问题详解

    今天在看STL源码的时候 xff0c 无意写了如下的代码 xff0c 发现程序崩溃了 xff1a lt span style 61 34 font size 14px 34 gt deque lt int gt iterator iter
  • Python中__init__.py文件的作用

    在创建python包的过程中 xff0c IDE都会在包根目录下创建一个 init py文件 xff0c 该Python文件默认是空的 目录结构如下 xff1a Pycharm下的package树结构 xff1a 在Finder中的目录结构

随机推荐

  • 使用Ajax以及CSS+DIV高仿谷歌搜索(附源码下载)

    在使用 Google 搜索或者是 Baidu 搜索的时候 xff0c 在输入搜索关键字的同时 xff0c 会自动弹出匹配的其他关键字的提示 xff0c 全心全意为人民服务的精神在这里崭露无遗 这种利用 Ajax 技术实现输入提示和自动完成的
  • 导致索引失效的可能情况

    如下是可能导致索引失效的情况 xff1a 1 xff0e 隐式转换导致索引失效 这一点应当引起重视 也是开发中经常会犯的错误 由于表的字段tu mdn定义为varchar2 20 但在查询时把该字段作为number类型以where条件传给O
  • 二叉搜索树的增删查

    今天把搜索二叉树的思路又理了一遍 xff0c 把代码又从头到尾敲了一遍 xff0c 各位看客就不要在意代码粗糙和内存溢出了 xff0c 主要把插入和删除的过程理了一遍 xff0c 其中比较复杂的地方就是搜索二叉树的删除 xff0c 涉及了很
  • 中缀表达式转前缀和后缀表达式

    之前笔试中国电信IT研发中心的时候 xff0c 遇到了几个前 中 后缀表达式的相互转换 xff0c 当时忘得差不多了 xff0c 今天好好把该方面的知识好好复习 xff0c 并把相关代码和思路自己缕了一遍 xff1a 将中缀表达式转换为前缀
  • java prometheus 自定义exporter开发,以及实现多个接口返回metrics

    普罗 自定义exporter开发 exporter的作用是采集需要监控的数据 xff0c 并将采集到的数据转换成prometheus所需要的数据格式 xff0c 将这些转换后的数据返回 xff0c 供给prometheus 使用 java
  • 双系统重装Ubuntu经验分享

    真的很喜欢ubuntu 但又没有恒心把它学通透 xff0c 毕竟不是相关专业 第一次重装是因为没多少经验 xff0c 安装qqforlinux的时候多了两个东西 xff0c 还自己生成了快捷方式 xff0c 就想点开看看是啥 xff0c 结
  • 还在迷茫不知Dashboard是什么?答案在文中揭晓

    Dashboard的中文翻译是 仪表盘 xff0c 与汽车的仪表盘相同 一种反映车辆各系统工作状况的装置 xff0c 有车速里程表 转速表 燃油表等 司机可以很方便地从汽车仪表盘中获得汽车整体状况 而Dashboard沿袭了汽车仪表盘理念
  • 问题:UPDATE 失败,因为下列 SET 选项的设置不正确: 'ARITHABORT'。

    解决方案 1 你可以在TSQL前Set ARITHABORT ON 代码如下 Set ARITHABORT ON GO INSERT INTO ta 2 在ADO NET中 你可以这样来写 C 代码 MyConnection Execute
  • 智能制造:三体智能革命

    赵敏 宁振波 郭朝晖是走向智能研究院资深专家 xff0c 三体智能革命 编委会中三位重要作者 他们从去年5月起多次参加了中国工程院主持的 中国智能制造发展战略研究报告 的研讨 评审与修订工作 xff0c 对该报告的形成过程 研究主旨和详细内
  • 小觅相机SDK samples安装Link error: cannot find -lvtkproj4

    Link error cannot find lvtkproj4 error ld returned 1 exit status 找不到相关动态库文件 设置软链接 xff1a ln s usr lib x86 64 linux gnu li
  • 年度回忆录(2011.12----2012.09)

    前几天刚刚参加了提高班十期的开学典礼 xff0c 最近师院的新生也陆 陆续 续的开始报道了 每年到这个时候都会感慨 年年岁岁花相似 xff0c 年年岁岁人不同 啊 对于提高班来说每年都有新的血液注入进来 xff0c 提高班的队伍在不断的扩大
  • python函数(变量,参数)

    函数的变量 1 xff0c 全局变量 定义在最外层的变量 xff0c 对于所有的内函数都能调用 2 xff0c 局部变量 定义在函数内的变量叫做局部变量 xff0c 在函数外是不能访问局部变量 注 xff1a 全局变量不能直接在函数内部进行
  • 程序员读书和练习的方法(个人观点)

    lt 传送门 gt 针对本文的交流探讨 gt 总宗旨 xff1a 打好计算机通用理论基础 通用实战能力 xff0c 便于需要时对各领域的无障碍深钻 时间宝贵 xff0c 不要为了学习而学习 计算机通用理论基础 xff1a 计算机各领域理论基
  • 从零开始的Ubuntu 16.04下PX4编译环境的搭建

    近来入手了一块pixhawk xff0c 想进行一些基于已有代码的二次加工 xff0c 于是到官网https dev px4 io 上看教程 官网上的教程是分为中文 英文以及韩文的版本 很多人肯定第一反应就是看中文的版本 但是这样做弊端真的
  • 驱动程序开发:SPI设备驱动

    目录 Linux下SPI驱动简介SPI架构概述SPI适配器 xff08 控制器 xff09 SPI设备驱动spi driver注册示例SPI 设备和驱动匹配过程编写imc20608六轴传感器SPI驱动设备树编写操作具体的imc20608驱动
  • 操作系统知识点(二)

    文章目录 内存管理程序执行过程内存保护 连续分配非连续分配基本分页存储管理方式基本分段存储管理方式段页式存储管理方式 虚拟内存局部性原理请求分页存储管理 内存管理 内存管理 Memory Management 是操作系统设计中最重要和最复杂
  • VR行业发展的前景和现状?

    标题 VR行业发展的前景和现状 xff1f 1 一个新事物的产生 xff0c 总是伴随着看好和唱衰两种声音 这两种态度自然有其可以理解的地方 xff0c 因为摆在我们面前的是未知 xff0c 而坐在餐桌前的两拨人 xff0c 站在不同的角度
  • 头文件与库的区别

    昨天突然问了一下什么是头文件 xff0c 我一听就傻了 xff0c 虽然上课的时候老师在讲编译的四个过程的时候说了一下 xff0c 但是还是不太理解 xff0c 我们知道编译过程中的预处理阶段会进行头文件展开 xff0c 宏替换以及条件编译
  • 进程、线程

    线程 xff08 thread xff09 线程其实是操作系统能够进行运算调度的最小单位 它是被包含在进程之中的 xff0c 是进程中的实际运作单位 一条线程指的是进程中一个单一顺序的控制流 xff0c 一个进程中可以并发多个线程 xff0
  • 基于Zynq7020双千兆以太网的数字信号处理板设计

    一 背景 背景 Xilinx公司在2010年发布了可扩展的处理器平台Zynq7000系列 xff0c 它采用了28nm工艺 xff0c 将FPGA与ARM cortex A9集成在一颗芯片上 xff0c 实现了高性能 高集成度 低功耗 Zy