基于Vivado的MYD-CZU3EG硬件平台搭建:深度学习边缘部署第一步

📅 2026/8/20 4:11:06
基于Vivado的MYD-CZU3EG硬件平台搭建:深度学习边缘部署第一步
1. 项目概述在边缘计算平台上启动深度学习如果你手头有一块赛灵思的MYD-CZU3EG开发板并且一直在琢磨如何把那些听起来高大上的深度学习模型真正跑在这块嵌入式硬件上那你来对地方了。这个项目或者说这个系列的第一部分就是要解决从零开始在MYD-CZU3EG上搭建起一个完整的、可用的深度学习推理环境。这不仅仅是点亮一个LED灯那么简单而是要让这块集成了ARM处理器和FPGA可编程逻辑的异构计算平台能够理解并执行一个训练好的神经网络模型。MYD-CZU3EG的核心是赛灵思的Zynq UltraScale MPSoC它把高性能的ARM Cortex-A53应用处理器、实时的Cortex-R5处理器以及一片大规模的FPGA可编程逻辑集成在了一颗芯片里。这种架构天生就适合边缘AI应用ARM端可以运行完整的Linux操作系统负责复杂的控制、数据预处理和后处理而FPGA端则可以定制化地实现神经网络中计算密集型的算子如卷积、池化实现极致的能效比和低延迟。我们的目标就是利用Vivado设计套件打通从硬件设计到软件部署的整个流程为后续的模型部署铺平道路。简单来说这个“Part 1”要干的事情就是使用Vivado为MYD-CZU3EG创建基础的硬件平台Platform并生成可以在ARM端启动的Linux系统。这是所有后续高级应用如使用Vitis AI进行模型部署的地基。没有这个地基后面的深度学习模型就是空中楼阁。无论你是嵌入式工程师想切入AI还是算法工程师想了解模型落地这个过程都是无法绕开的关键一步。2. 核心思路与平台选型考量在开始动手之前我们必须理清思路。为什么选择Vivado Flow面对MYD-CZU3EG这样的复杂平台通常有几种开发路径基于PetaLinux手动构建系统、使用赛灵思的Vitis统一软件平台或者像我们这里采用的以Vivado为核心的“传统”流程。每种方式各有优劣。2.1 为何选择Vivado Flow作为起点Vitis平台固然强大和现代它提供了更高层次的抽象但对于深入理解硬件架构和排除底层问题Vivado Flow提供了最透明、最可控的视角。选择它作为系列的开篇主要基于以下几点考量理解硬件根基深度学习在异构平台上的性能极度依赖于硬件资源的合理分配和接口带宽。通过Vivado手动搭建硬件平台你会清晰地知道PS处理系统即ARM部分和PL可编程逻辑即FPGA部分之间通过AXI总线是如何通信的DDR内存控制器是如何连接的以及各种外设的时钟和复位结构。这份“地图”对于后续的性能调优和故障排查至关重要。规避黑盒风险高级工具链有时像是一个黑盒虽然便捷但一旦出现启动失败、驱动异常等底层问题调试起来往往无从下手。从Vivado开始相当于你自己亲手组装了这台“电脑”每一个部件你都清楚它的来龙去脉出了问题你知道该检查哪条“线路”。流程的普适性这个流程是赛灵思FPGA/Soc开发的经典流程掌握了它你不仅能应对MYD-CZU3EG也能触类旁通地处理其他Zynq或Zynq UltraScale器件。它是基础技能不会过时。为高级工具链做准备Vitis AI等工具最终也需要一个标准的硬件平台作为输入。自己用Vivado创建的平台你能确保其符合规范并且完全理解其约束在集成时更能得心应手。2.2 整体流程设计我们的目标产出是一个能启动Linux的BOOT.BIN和image.ub文件。整体流程可以拆解为四个核心阶段它们环环相扣硬件设计Vivado创建工程配置Zynq UltraScale MPSoC的PS部分根据MYD-CZU3EG开发板的实际情况添加必要的PL端IP核如时钟、复位、AXI互联等并完成引脚约束和生成输出产品。硬件导出将Vivado设计的结果主要是硬件描述文件.xsa导出为后续的软件开发提供硬件定义。软件系统构建PetaLinux利用导出的硬件描述文件在PetaLinux环境中配置内核、设备树、根文件系统并编译生成最终的启动镜像。启动与验证将生成的镜像文件放入SD卡上电启动开发板验证Linux系统是否成功运行基础外设如串口、网络是否正常工作。这个流程中Vivado负责“造房子”的骨架和管线PetaLinux负责“装修”和安装“操作系统及应用软件”。第一部分的重心将放在前两个阶段即用Vivado“造好房子”。3. 开发环境搭建与工程创建工欲善其事必先利其器。在开始硬件设计之前必须准备好稳定、版本匹配的开发环境。版本冲突是嵌入式开发中最常见也最令人头疼的问题之一。3.1 工具链版本选择与安装赛灵思的工具版本需要谨慎匹配。对于MYD-CZU3EGZynq UltraScale器件我强烈建议采用以下组合这是经过大量项目验证的稳定搭配Vivado Design Suite: 2021.1 或 2022.1 版本。这两个版本对Zynq UltraScale的支持非常成熟。避免使用过于老旧的版本如2018.x或过于前沿的版本如2023.x前者可能缺少某些功能或IP更新后者可能存在未知的兼容性问题。本项目将以Vivado 2021.1为例进行说明。PetaLinux Tools: 必须与Vivado版本严格对应。Vivado 2021.1 对应 PetaLinux 2021.1。安装时需要确保PetaLinux的安装路径不包含中文和空格并且有足够的磁盘空间建议预留100GB以上。注意安装Vivado时在组件选择页面务必勾选“Zynq UltraScale MPSoC”相关的器件支持文件。如果漏选创建工程时将找不到对应的器件型号。3.2 创建Vivado硬件工程启动Vivado 2021.1我们开始第一步新建工程点击“Create Project”输入工程名例如my_czu3eg_base和存储位置。工程类型选择“RTL Project”并勾选“Do not specify sources at this time”因为我们后续会通过IP集成器来添加硬件模块。选择器件这是关键一步。在“Default Part”页面点击“Boards”选项卡。如果MYD-CZU3EG的板级支持包BSP已经安装这里应该能看到它。如果没看到则需要手动选择器件型号。点击“Parts”选项卡在筛选器中输入“xczu3eg”。通常选择xc7zu3eg-sfvc784-1-i工业级或-2-i扩展工业级。需要根据你手中开发板的具体型号确认。封装sfvc784和速度等级-1-2必须完全匹配否则后续引脚约束会全部错误。进入设计界面工程创建完成后在“Flow Navigator”中点击“Create Block Design”这是Vivado中用于图形化连接IP核的设计画布。给这个Block Design起个名字比如system。3.3 添加并配置Zynq UltraScale IP核在Diagram空白处右键选择“Add IP”搜索并添加“Zynq UltraScale MPSoC” IP核。双击添加进来的IP核会打开一个极其复杂的配置界面。别担心对于基础平台我们主要关注几个部分PS-PL Configuration这里配置PS和PL之间的接口。对于初版基础平台我们可以先保持默认即开启一个通用的M_AXI_HPM0_FPD接口供PL主设备访问PS内存以及一个S_AXI_HPC0_FPD接口供PS主设备访问PL。更精细的接口配置可以留待后续优化。Peripheral I/O Pins根据MYD-CZU3EG开发板的原理图启用所需的外设。通常UART 0是必须启用的用于串口调试输出。可能还需要启用QSPI用于启动、SD 0用于SD卡启动、USB 0、以太网等。务必对照开发板用户手册一个引脚一个引脚地确认。Clock Configuration配置PS输出的时钟供PL使用。例如可以启用PL0_REF_CLK并设置为100MHz作为PL侧的参考时钟。DDR Configuration配置DDR内存型号和参数。这是最容易出错的地方必须严格按照开发板使用的DDR芯片型号如MT40A256M16GE-083E来选择对应的“DDR4 Component”预设。频率、时序参数通常使用预设值即可除非你非常了解内存子系统。配置完成后点击“OK”关闭。Vivado会自动为这个Zynq IP核生成一系列未连接的接口。点击Diagram上方绿色的“Run Block Automation”按钮Vivado会自动帮你连接时钟、复位以及已启用外设的引脚。4. 硬件平台细化设计与约束完成Zynq MPSoC的基本配置后我们得到了一个“大脑”和它的一些“感官神经”。但一个完整的硬件平台还需要“血管”时钟网络和“骨架”物理引脚连接。4.1 添加必要的PL端IP与时钟处理虽然PS部分已经可以独立工作但为了平台的完整性和后续扩展我们通常在PL端添加一个时钟生成和复位管理单元。添加Clocking Wizard在Diagram中添加“Clocking Wizard” IP核。双击配置设置一个主要的输出时钟例如clk_out1为100MHz输入时钟选择我们之前在Zynq配置中启用的pl0_ref_clk。这个IP会生成PL侧所需的各种时钟并处理时钟使能、锁相环PLL等。添加Processor System Reset添加“Processor System Reset” IP核。它的slowest_sync_clk连接到clk_out1ext_reset_in连接到Zynq IP核的pl_resetn0。这个IP核会生成与输入时钟域同步的复位信号避免异步复位带来的亚稳态问题。连接与地址分配使用“Run Connection Automation”功能让Vivado自动连接这些IP的AXI接口和中断线到Zynq的互联矩阵上。完成后点击“Validate Design”F6检查连接是否正确。验证通过后在“Sources”面板中右键点击Block Designsystem选择“Generate Output Products”。这一步会为我们的图形化设计生成对应的RTL代码、网表文件和约束模板。接着选择“Create HDL Wrapper”让Vivado创建一个顶层的Verilog/VHDL文件来包裹这个Block Design。4.2 引脚约束与物理实现硬件设计的最后一步是告诉工具我们的逻辑信号对应到芯片的哪个物理引脚上。导入XDC约束文件开发板厂商MYIR通常会提供一个针对该开发板的约束文件.xdc。这是最准确、最省事的方式。在“Sources”面板的“Constraints”目录下右键“Add Sources”选择“Add or create constraints”然后导入这个.xdc文件。这个文件里已经定义了时钟引脚、复位引脚、LED、按键、串口引脚等所有板级连接的约束。手动检查与补充如果没有现成的约束文件那就需要根据原理图手动编写。这是一个细致活。例如对于串口UART0的引脚# 假设根据原理图UART0_TX 对应芯片的 AE10 引脚 set_property PACKAGE_PIN AE10 [get_ports {uart0_txd}] set_property IOSTANDARD LVCMOS33 [get_ports {uart0_txd}] # UART0_RX 对应 AD10 引脚 set_property PACKAGE_PIN AD10 [get_ports {uart0_rxd}] set_property IOSTANDARD LVCMOS33 [get_ports {uart0_rxd}]约束主要包括引脚位置PACKAGE_PIN、IO电平标准IOSTANDARD、驱动强度DRIVE、上下拉PULLUP/PULLDOWN等。生成比特流与导出硬件在“Flow Navigator”中点击“Generate Bitstream”。Vivado会依次进行综合Synthesis、实现Implementation和生成比特流文件.bit。这个过程耗时较长取决于设计复杂度。完成后我们关键的一步是导出硬件。导出硬件平台在菜单栏选择File - Export - Export Hardware。在弹出窗口中务必勾选“Include bitstream”。导出路径建议保持默认在工程目录下。这将生成一个.xsa(Xilinx Support Archive) 文件。这个文件封装了我们的硬件比特流、硬件描述信息以及约束是连接Vivado硬件世界和PetaLinux软件世界的桥梁。实操心得在第一次生成比特流时建议在“Implementation”设置中将“策略”选择为“Performance_Explore”或“Default”。前者会花更多时间做优化可能得到更高性能后者是平衡选择。先不要使用“Area_Optimized”因为我们初期更关注功能正确性。另外在导出.xsa前最好在Vivado中“Open Implemented Design”利用“I/O Planning”视图直观地检查一下引脚分配是否正确电压Bank是否有冲突这是一个很好的复查习惯。5. 常见问题与硬件调试实录即使按照步骤操作第一次尝试也难免会遇到问题。下面是我在多次项目中总结的几个典型“坑点”及其解决方案。5.1 启动失败DDR配置错误现象PetaLinux编译的系统镜像上电后串口无任何输出或输出乱码后停止。排查这是最常见的问题根源几乎都在Vivado中Zynq IP的DDR配置。解决反复核对开发板原理图上的DDR芯片型号确保与Vivado配置界面中选择的“Component”完全一致包括后缀。检查DDR的时钟频率是否在芯片支持的范围内。对于MYD-CZU3EG常见的配置1200MHz等效数据速率2400MT/s是一个常用值。如果开发板厂商提供了参考工程或.xsa文件直接用它来对比DDR配置参数是最快的方法。可以尝试暂时降低DDR频率如降到1066MHz进行测试排除信号完整性问题。5.2 引脚约束冲突或电平错误现象生成比特流时报告“Placement Error”或系统启动后某些外设如USB、以太网无法识别。排查检查约束文件.xdc。解决确认每个IOSTANDARD如LVCMOS33, LVCMOS18, LVDS等与对应Bank的VCCO供电电压匹配。例如Bank 65的VCCO是3.3V那么该Bank上的引脚就不能配置为1.8V的标准。使用Vivado的“I/O Planning”视图可以清晰地看到每个Bank的电压和已用引脚冲突处会高亮显示。对于差分信号如以太网RGMII的TX_CLK必须成对约束并使用正确的差分标准如DIFF_HSTL_I_18。5.3 时钟与复位信号未连接或未约束现象PL侧的IP核工作不正常或逻辑分析仪抓取不到PL侧时钟。排查检查Block Design中Clocking Wizard的输入时钟clk_in1是否连接到了Zynq IP的pl0_ref_clkProcessor System Reset的ext_reset_in是否连接到了pl_resetn0。解决确保连接线正确。在Diagram中时钟线通常为绿色复位线为蓝色。检查顶层Wrapper文件确认这些时钟和复位信号是否被正确引出为端口。如果没有需要在Block Design中右键点击该信号选择“Make External”。在约束文件中为这些时钟端口添加“create_clock”约束例如create_clock -name pl_clk -period 10.000 [get_ports pl_clk]。5.4 导出.xsa文件后PetaLinux无法识别现象在PetaLinux中使用petalinux-config --get-hw-description命令时提示无法识别或版本不兼容。排查Vivado和PetaLinux版本不匹配或者.xsa文件导出时未包含比特流。解决绝对保证Vivado与PetaLinux大版本号一致如都是2021.1。重新执行“Export Hardware”并务必勾选“Include bitstream”。将导出的.xsa文件复制到一个路径简单无中文、无空格的目录下再让PetaLinux去读取。5.5 资源利用率过高导致布线失败现象在“Implementation”阶段失败提示布线拥塞或资源不足。排查对于Zynq 3EG器件资源相对充裕但如果你添加了过多大型IP也可能出现此问题。解决查看综合后的资源利用率报告关注LUT、FF、BRAM、DSP的用量。在初期基础平台阶段利用率应该很低20%。如果确实因设计复杂导致可以尝试在Implementation设置中更换更激进的布线策略如Performance_ExplorePostRoutePhysOpt或手动添加布局约束。对于基础平台此问题较少见一旦出现应首先检查设计是否冗余。硬件调试是一门实践的艺术串口打印是最忠实的朋友。确保UART引脚约束正确波特率设置匹配通常是115200一个能正常打印启动日志的串口能帮你定位90%的启动阶段问题。在硬件设计阶段多花时间仔细检查能为后续的软件开发和深度学习部署节省大量的调试时间。至此我们已经成功搭建起了深度学习在MYD-CZU3EG上运行的硬件基石。在下一部分我们将带着这个.xsa文件进入PetaLinux的世界构建一个定制的Linux操作系统让这块硬件真正“活”起来。