ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

从工博会到实战:Zynq SoC在工业控制中的落地指南

从工博会到实战:Zynq SoC在工业控制中的落地指南 1. 2017工博会现场Xilinx展台聊的其实不是芯片1.1 Xilinx在工博会上到底展示了什么2017年工博会我在自动化展馆里转了一圈后专门跑去Xilinx展台蹲了大半天。那时候工业智能化已经是个热词但真正能落到产线上的方案还不多很多厂商拿出来的东西还是PPT概念。Xilinx展台算是少数让我觉得“这个东西拿回去就能做产品”的展位——伺服驱动参考设计、EtherCAT工业以太网节点方案、机器视觉处理平台、Zynq SoC的PLC原型全都在现场跑着演示。那一整套东西给我的第一感觉是Xilinx这次不是来卖芯片型号的而是来卖“工业解决方案”的。展台工作人员聊的也不是逻辑资源、LUT、DSP48这些参数而是你的伺服要做多少kHz电流环、你的主站打算走EtherCAT还是Profinet、你的视觉系统要同时接几路相机。这种聊法在芯片厂商里不太常见说明Xilinx那几年在工业领域的投入确实是动真格的。1.2 为什么工业客户比通信客户更“挑”实时性说到这个问题就要先理解工业场景和通信场景的本质差异。通信系统里数据延迟是毫秒级甚至更宽松偶尔丢几包数据重传一下也没问题用户基本感觉不到。但工业现场完全不是这个逻辑——伺服驱动器的电流环采样周期通常要求到几十甚至上百kHz位置环和速度环也要在几十微秒级别完成一个控制周期慢了电机就会抖加工精度就会崩严重时直接撞机。这种场景下传统处理器那种“中断来了先保存现场再跳转处理”的运作方式就不够看了因为中断响应时间本身就有抖动。FPGA的逻辑是硬件并行执行的每个时钟周期干什么都是确定的没有操作系统调度没有缓存未命中没有中断延迟所以工业控制领域对FPGA的需求天然就很强。Xilinx在工博会上反复强调“确定性延迟”这个词听着抽象但对做过运动控制的人而言它就是生命线。2. 工业方案里FPGA凭什么比ARM/MCU更吃香2.1 单片机、DSP与FPGA的分工很多刚接触工业电子的朋友会有个疑问现在ARM Cortex-M系列单片机主频已经跑到几百MHzDSP的算力也不差为什么伺服驱动器、机器人控制器的高端方案还是绕不开FPGA我用一个比较生活化的类比来解释。单片机或者DSP就像一个全能型的单干户什么活都能干但一次只能干一件事而且每换一件事都要花时间“收拾工具”。FPGA则像一条手工流水线你把几十个工人逻辑单元排好每个人只干自己的那一小步原料数据从流水线一头进去产品从另一头出来中间每个环节的耗时都是固定的不会因为“今天工人状态不好”就出偏差。伺服控制就是典型的流水线型任务编码器数据读取、坐标变换、电流环PI运算、PWM占空比计算、故障保护这些环节有严格的前后依赖关系但又需要在一个极短的控制周期内全部完成。用MCU做每一步都需要取指令、译码、执行指令周期不可控用FPGA做每个环节都是独立的硬件电路一拍下去同步完成时间和结果都可预期。2.2 确定性延迟是工业控制的命门那“确定性”到底意味着什么我举个例子假设一个伺服驱动器的电流环周期是62.5微秒也就是16kHz这意味着从ADC采样到PWM更新整个链路的延迟必须严格小于一个周期而且每次都要小于。如果某一次因为中断响应慢或者总线冲突多花了10微秒电流环的相位裕度就会塌电机就会发出高频啸叫甚至功率级直接炸掉。我用DSP做过一段时间的电机控制后来换到Zynq平台最直观的感受就是FPGA这边写代码的时候你心里能精确知道信号从输入到输出经过了多少个时钟周期你甚至可以用约束文件把这些路径锁死。MCU那边做不到这种级别的掌控力因为它的内部时序有太多你看不见的硬件行为在干预。这也是为什么高端伺服、机器人控制器、CNC系统核心控制环路里一定会有FPGA而ARM/MCU/MIPS这些处理器反而只负责外围通信和上层逻辑。3. Zynq SoC为什么是工业智能化的主力3.1 PS与PL各管哪摊事Zynq系列在工博会上被反复提及是因为它把ARM处理器和FPGA逻辑做进了同一颗芯片里。这在实际工程里带来的好处太大了。以前要做一套设备板上至少要有两颗大芯片一颗MCU负责跑协议栈和算法一颗FPGA负责做实时I/O和信号处理两颗芯片之间的通信还得靠并行总线或者SPI速度慢不说调试起来也麻烦。Zynq把这两颗合并以后ARM核心PS和可编程逻辑PL之间是AXI高速总线互联的带宽可以做到几十Gbps级别延迟只有几百纳秒跟片外通信完全不是一个量级。我倾向于把PS端理解成“大脑”PL端理解成“小脑”。大脑负责思考——跑Linux做视觉算法、走EtherCAT协议栈、处理HMI通信、做运动规划小脑负责本能反应——编码器接口协议、PWM生成、硬件急停、故障联锁。大脑出点小问题可以重启小脑必须每时每刻都精准执行因为小脑直接连着功率级和电机。3.2 从一张伺服驱动板卡看Zynq怎么分工我曾经做过一款采用Zynq-7020的伺服驱动器参考设计板子布局大致是这样的PL端接了12路PWM输出驱动三相IGBT逆变桥同时接了3路编码器接口增量式或绝对值支持BiSS、EnDat这些协议还有一堆数字量输入输出用于限位开关和急停信号。这些接口用FPGA来做非常顺因为它们都是时序敏感型接口尤其BiSS和EnDat这种绝对值编码器协议时序要求非常苛刻用MCU模拟主从时序很容易丢帧。PS端则跑了Linux上面放着EtherCAT从站协议栈每毫秒跟主站同步一次同时跑着上位机通信程序把位置、速度、报警这些状态通过Modbus TCP或者OPC UA传给HMI。中间的数据通路是EtherCAT主站下发的目标位置经过PS端运动规划算法算好通过AXI总线写到PL端的寄存器PL端再按照自己的固定时序把对应的PWM占空比更新出来。整个过程环环相扣但两端的实时性压力都得到了合理分配。3.3 异构SoC给工业设备带来的连锁反应Zynq这种异构架构不只是省了一颗芯片的BOM成本它还改变了工业设备的软件维护方式。以前纯FPGA方案逻辑稍有改动就要重新综合、重新烧写比特流现场升级还要人去厂房开箱操作Zynq方案里大部分业务逻辑可以写成C/C代码跑在Linux上升级直接把新程序扔过去重启就行FPGA逻辑的更新频率也大幅降低了因为很多原本用Verilog实现的外设接口现在可以直接用Zynq的硬核IP来搞定。对设备厂商来说这意味着产品迭代速度快了一大截。工博会上Xilinx的方案展示里几乎所有demo都配了一个Linux系统在跑图形界面这说明他们已经把Zynq当做一个“带可编程逻辑的嵌入式计算机”来推而不是一个“带ARM的FPGA”。这个定位转变非常关键它拉低了工程师的开发门槛——你不需要先精通Verilog也能用C语言把一套工业设备的主程序写起来FPGA部分只在外围接口和时序关键路径上介入。4. 从工博会样品到自己的板卡Xilinx工业开发实操指南4.1 选型别只看逻辑资源先想接口和封装工博会上看了那么多demo回来真正要动手设计自己的项目时第一步永远是选型。很多初学者选Xilinx芯片时只盯着逻辑单元数量这是个很危险的思维。我见过有人选了资源非常豪华的Kintex-7做伺服控制结果板卡尺寸压不下来功耗也超标散热设计做得头疼也有人做机器视觉选了没有GTX高速收发器的Artix-7结果相机接口要用CameraLink只能外接转换芯片白白增加了成本和可靠性风险。选型的第一件事是把接口列出来需要几路串口、几路以太网、几路高速收发器、几路差分I/O、需要什么电平标准。然后才是逻辑资源预算。拿典型的工业应用来说做伺服驱动器Zynq-7010或7020基本够用因为伺服控制核心逻辑量并不大主要是PWM、编码器接口、故障保护这些加起来用不了多少LUT但如果你要做多轴机器人控制同时还要接视觉那就要考虑Zynq-7030以上因为PS端的ARM核心数量和PL端的DSP资源都要翻倍。4.2 Vivado下搭建最小PSPL系统确定了芯片型号以后开发环境的搭建也有讲究。Xilinx的工具链那几年已经统一到Vivado用起来确实比重老的ISE顺手很多但因为设计理念差别太大新手很容易被各种概念绕晕。我建议把第一个目标定得非常小在Zynq上点亮一颗LED同时让ARM跑一个Hello World。目标虽小但它能帮你把“硬件工程→导出硬件→SDK软件→运行调试”这条完整的链路走通。具体流程是新建Vivado工程创建Block Design在里面添加ZYNQ7 Processing System模块双击这个模块配置PS端的DDR、UART、MIO等外设如果点亮的LED是接在PL端的还需要添加一个AXI GPIO IP然后运行Connection Automation让Vivado自动帮你把AXI接口连到PS端分配好地址接着Generate Output Products、Create HDL Wrapper、Generate Bitstream整个硬件工程就完成了。然后把硬件导出到SDK新建一个Application Project写几行XGpio_Write的代码下载运行LED就会亮了。这个流程看起来简单实际走一遍会踩到不少坑。比如Block Design里有些信号没连好综合时Wire的warning一多排错就麻烦AXI地址分配如果冲突上板后访问外设会直接挂死。我的建议是初期不要手动连那么多线老老实实用Vivado的自动化连接功能它对小白友好度极高。4.3 自定义IP的正确姿势工博会上那些伺服驱动demo底层原理并不神秘就是把电流环算法做成了自定义IP核挂到AXI总线上让PS端可以配置参数。这个“自定义IP”的概念对很多从MCU转过来的工程师来说是个坎但其实是FPGA开发里的基本功也是Xilinx平台最有价值的部分。在Vivado里Tools → Create and Package New IP模板向导会帮你生成一个挂载在AXI4-Lite总线上的从机模块里面自带寄存器读写逻辑。你只需要在模板里加入自己的功能逻辑比如把寄存器0定义为PWM周期寄存器1定义为占空比再写一小段HDL把这两个寄存器的值转换成PWM波形输出。然后Package IP就能像调用官方IP一样调用你自己写的这个模块了。我自己的经验是自定义IP的关键在于信号划分。哪些信号走AXI总线由CPU配置哪些信号直接引出到顶层接口去接外部硬件一定要在设计一开始就想清楚。不然做到后面你会发现CPU配置和硬件数据流搅在一起寄存器地址分配得乱七八糟调试到崩溃。5. 工程师最容易踩的坑驱动、Flash与调试实录5.1 Platform Cable USB驱动加载失败的经典坑玩Xilinx的工程师大概率都遇到过这个提示“Platform Cable USB Firmware LoaderWindows无法加载这个硬件的设备驱动”。我当年第一次碰到时以为是线坏了换了一条原装线还是不行后来才发现是驱动签名的锅。Windows 10 64位系统对驱动签名要求很严而Xilinx老版本Vivado自带的驱动没有通过微软签名认证系统直接拒绝加载。解决方法有两种一种是在“设置→恢复→高级启动”里选择“禁用驱动程序强制签名”然后再手动安装Vivado安装目录下data/xicom/cable_drivers/nt64里的驱动另一种是干脆把Vivado升级到比较新的版本新版驱动基本都解决了签名问题。还有一个小坑是安装过其它基于FTDI芯片的调试工具驱动后两者会互相覆盖。如果你以前用STM32的ST-LINK或者其它JTAG调试器系统里已经有一个FTDI驱动那插入Xilinx的Platform Cable USB后可能会被旧驱动占用设备管理器里显示的不是“Xilinx Cable”而是未知设备或者USB Serial。这时候先把旧设备卸载再装新驱动往往就好了。5.2 Zynq支持的NAND Flash到底怎么选Zynq的BootROM支持的启动设备有QSPI NOR Flash、SD卡、NAND Flash很多项目为了兼顾成本和容量会想用NAND。但我见过不少工程师在NAND选型上吃过亏核心问题在于Zynq BootROM对NAND的支持有严格限制它只支持符合ONFI 1.0标准的SLC NAND不支持MLC/TLC对页大小、块大小、寻址方式都有要求具体的兼容型号列表在Xilinx的UG585文档Zynq-7000 TRM附录里有。曾经有个项目组选了一颗大容量的MLC NAND理由是“存储空间大、价格便宜”结果BootROM根本不识别后来只能改成SD卡启动NAND当作普通数据存储用白白增加了一路电源和PCB面积。我的建议是启动用的NAND一定要照着官方兼容列表选常见的镁光MT29F系列、赛普拉斯S34ML系列里都有兼容型号如果你对NAND那套坏块管理、ECC机制没把握干脆老老实实用QSPI NOR做启动容量虽然小一点但省心太多。顺带说一句BootROM不处理NAND坏块这部分工作要由FSBL来完成。如果你的FSBL没有做好坏块跳过机制生产了几百块板子之后你就会在某一次启动失败中深刻理解“为什么那几片Flash刚好有坏块”。5.3 LTPI、DPD、100G以太网这些热词离工业到底有多远搜Xilinx相关内容时经常会碰到LTPI、DPD、100G以太网IP核这些热词很多做工业的朋友可能觉得跟自己没关系但其实一部分已经在往工业方向渗透了。LTPI全称是Low Pin Count Interface是一种低引脚数的边带管理总线协议用于处理器、交换芯片和BMC之间传递管理信息。在工业设备里如果主控板需要带外管理功能完全可以在FPGA里用逻辑实现LTPI接口协议跟BMC芯片对接这样主系统死机了仍然能通过管理通道做远程复位和状态监控。DPD是数字预失真主要用于射频功放线性化跟传统的PLC、伺服这些工业设备确实不太沾边但如果你的产品涉及工业无线通信或者专网基站那Xilinx的DPD IP核就是绕不开的核心资产它利用FPGA并行计算能力实时做多项式预失真处理。100G以太网类似看起来是数据中心的东西但现在高清工业相机加AI检测的场景越来越多一个产线上十台相机同时回传无损图像单台相机的数据带宽就要好几个Gbps后端的汇聚和预处理设备用FPGA加高速以太网接口IP已经是很现实的需求了。所以我的态度是不要被热词吓到但也不要无视它们。Xilinx的IP核体系是一整套生态今天你用不上某个IP不代表明年用不上关键是掌握“寄存器配置AXI总线硬件加速”这套通用的使用框架换任何IP都只是一层窗户纸。6. 常见问题与排查技巧实录这些年带过不少新人做Xilinx工业项目我把大家最容易反复问的问题整理了一张速查表有需要可以直接收藏。问题现象可能原因解决方案Vivado综合报时序收敛失败跨时钟域信号没有正确处理检查时钟约束文件跨时钟域一定要用同步器或异步FIFO上电后PS启动失败DDR初始化卡死DDR引脚约束错误或器件型号没选对核对自己的板卡原理图核对DDR器件型号和Bank电压AXI读写总是返回错误地址溢出或总线宽度不匹配检查地址编辑器中的分配范围核对数据总线位宽烧写比特流后功能正常但重启丢失配置模式跳线和Flash型号不匹配检查MIO配置引脚确认QSPI型号在支持列表里JTAG连接不稳定下载经常中途断线线缆质量太差或USB口供电不足换短线尽量用主机后面板的USB口必要时外加隔离器用ILA调试抓不到信号信号被优化掉了或布线不合理加(* mark_debug true *)属性再重新综合布线Linux启动卡在ubootFSBL生成的启动镜像有问题重新检查FSBL工程和boot.bin的生成步骤表格里最后一条值得多说两句。Zynq启动Linux的流程是BootROM → FSBL → U-Boot → Kernel这个链路里任何一个环节出问题都会起不来。很多新手在SDK里生成FSBL后忘了把FSBL和bitstream、U-Boot一起打包成BOOT.BIN或者打包顺序错了导致上电直接卡死。这类问题跟芯片本身关系不大纯粹是流程经验问题多踩几次坑、多看日志输出慢慢就有感觉了。还有一个细节很多资料不会提Xilinx工具的工程路径不要带中文也不要有空格甚至不要放在桌面那种很深很长的路径下面。Vivado对路径深度和特殊字符的容忍度非常低我见过因为这个导致综合结果不可复现的案例排查了整整一天最后把工程移到一个短路径后重新跑所有问题消失了。7. 最后聊点个人体会从2017年工博会看完Xilinx的方案到现在我自己也做了好几个基于Zynq的工业控制器项目最大的感受是Xilinx那年的展台其实是在给整个工业界传递一个信号——FPGA不再是通信和军工行业的专属品它在最讲究稳定和实时的工业现场同样能挑大梁。如果你正准备入门Xilinx工业开发我建议你别一上来就盯着复杂的伺服算法或者机器视觉管道先找一块开发板把“PS端跑Linux读写PL端寄存器”这个最基本的操作做扎实。这个能力一旦有了后面不管是接EtherCAT、接视觉相机还是做自定义运动控制IP都会顺理成章。另外再分享一个小技巧遇到任何Xilinx相关的报错先去查Xilinx官方文档和Answer Record别急着上论坛刷帖。很多看起来是工程问题的坑其实文档里早就写得很清楚了只是大家习惯跳过590页的UG585直接面向百度编程。养成先查官方文档的习惯你至少能少走一半弯路。
返回列表