
1. 从一张空白的BD画布说起ZYNQ Block Design到底在解决什么问题刚接触ZYNQ那会儿我最不适应的就是从纯FPGA思维切换到SoC思维。以前用纯FPGA脑子里就是一堆Verilog模块加约束文件顶层自己写引脚自己分配时钟自己约束整个工程结构一目了然。但ZYNQ不一样它内部硬生生塞了一个ARM处理器子系统PS端外面又包了一圈可编程逻辑PL端两边要通过AXI总线互联还要共享DDR、时钟、中断资源。如果还按纯FPGA那套手写顶层的方式去搭光是PS端的初始化配置就够你写几百行代码而且极容易出错。Vivado里的Block Design简称BD就是为解决这个问题而生的。它本质上是一个图形化的IP集成环境让你用拖拽和连线的方式把PS端、PL端IP核、自定义逻辑、总线互联模块拼装在一起然后自动生成顶层封装和地址映射。你可以把它理解成画电路原理图——只不过画的是SoC级别的系统框图工具帮你把底层的HDL胶水代码全部自动生成。这个内容适合谁看如果你已经装好了Vivado手头有一块ZYNQ开发板比如常见的7020、7010、7035等想从纯FPGA过渡到SoC开发或者你之前跑过别人搭好的BD工程但没自己从零建过那这篇内容就是写给你的。我会从新建工程开始一步步拆解BD的搭建逻辑、关键配置项的含义、常见踩坑点以及怎么验证你的BD是不是真的搭对了。注意BD不是万能的。它适合做PS-PL互联、标准总线IP集成、时钟与复位分发这类系统级工作。如果你要写高速流水线逻辑或者对时序极度敏感的模块还是老老实实写RTL把BD当成一个外壳来用。2. 动手之前的准备工作工程创建与器件选型2.1 Vivado版本选择与安装确认Vivado的版本选择在ZYNQ开发里是个绕不开的话题。我个人的经验是如果你用的是比较新的开发板比如基于ZYNQ UltraScale的板子建议用2020.2及以后的版本如果是经典的ZYNQ-7000系列比如70202018.3到2022.2之间的版本都很稳定。网上很多人问“vivado安装教程”和“vivado下载”这里不展开安装细节但有一点必须提醒安装时一定要勾选对应器件家族的器件支持包。比如你用的是xc7z020就必须确保安装了Zynq-7000系列的支持文件否则新建工程时根本找不到器件型号。另外安装目录不要带中文路径和空格这是老生常谈但每年都有人踩的坑。我见过有人装在“D:\我的项目\Vivado 2022.2”下面结果生成BD时各种路径报错排查了半天才发现是中文路径的问题。2.2 新建工程的几个关键选择打开Vivado点Create Project一路Next到器件选型页面。这里有几个选择需要说明Project Type选RTL Project勾选“Do not specify sources at this time”。因为我们要先搭BD源码后面再补。Default Part根据你的开发板原理图选择对应的器件型号。以常见的黑金7020开发板为例器件是xc7z020clg400-2。注意速度等级-2和封装clg400要和板子完全一致选错了后面生成比特流可能能过但跑不起来。Project name和路径路径尽量短不要有中文和空格。我一般习惯在D盘根目录建一个“ZYNQ_Projects”文件夹每个工程一个子目录。工程建好之后你会看到一个空的Vivado界面。左侧Flow Navigator里有IP INTEGRATOR、RTL ANALYSIS、SYNTHESIS、IMPLEMENTATION等几个大项。我们要操作的是IP INTEGRATOR下的Create Block Design。2.3 创建Block Design并添加ZYNQ PS核点击Create Block Design弹窗里给BD起个名字默认是“design_1”我建议改成有意义的名称比如“zynq_system”。名字虽然不影响功能但后面生成的文件名会跟着变工程多了之后好区分。创建完成后画布是空白的。点击画布上方的“”号Add IP在搜索框里输入“ZYNQ”会出现“ZYNQ7 Processing System”这个IP。双击添加画布上就出现了一个方块代表PS端。这时候你双击这个方块会打开一个叫“Re-customize IP”的配置界面。这个界面是BD学习的核心中的核心里面有一大堆配置页。第一次看可能会懵但别慌我们一步步来。3. ZYNQ PS核配置详解从DDR到MIO的逐项拆解3.1 PS-PL Configuration接口开关的总控台Re-customize IP界面左侧第一项是PS-PL Configuration。这个页面控制的是PS端向PL端暴露了哪些接口。展开General你会看到几个关键选项Master InterfacePS作为主设备向PL发起访问的接口。通常至少勾选一个M_AXI_GP0用于PS读写PL端的寄存器。Slave InterfacePL作为主设备访问PS端资源的接口。比如PL端要直接读写DDR就需要勾选S_AXI_HP0High Performance接口。InterruptsPL端向PS端发中断的接口。如果你有PL逻辑需要通知PS处理事件这里要勾选PL-PS Interrupt Ports。我一般会先勾上M_AXI_GP0和S_AXI_HP0中断先不勾等实际需要再加。每勾一个接口画布上的ZYNQ方块就会多出一个引脚后面连线的时候会用到。实操心得不要一次性把所有接口都勾上。接口越多BD越复杂综合时间越长而且很多接口你根本用不到。按需勾选后续可以随时回来改。3.2 DDR Configuration内存参数的确认DDR Configuration页面决定了PS端DDR控制器的参数。这里最关键的是DDR型号和位宽。如果你用的是开发板板子上焊的DDR型号是固定的你需要根据原理图或者开发板手册来确认。以黑金7020为例板载DDR3型号是MT41K256M16RE-125位宽16位容量512MB。在DDR Configuration里你需要选择对应的Memory TypeDDR3、Bus Width16bit、以及具体的器件型号。如果选错了最直接的后果就是FSBL跑不起来串口没有任何输出。这里有个小技巧很多开发板厂商会提供板级支持包Board Support Package里面已经预置好了PS端的配置。如果你在新建工程时选择了对应的BoardVivado会自动帮你填好这些参数。但如果你用的是通用器件型号就得手动填。3.3 MIO Configuration引脚分配的学问MIO Configuration页面控制的是PS端多功能IO的分配。ZYNQ的PS端有54个MIO引脚可以分配给UART、SPI、I2C、SD卡、以太网、USB等外设。这些引脚是PS端直接控制的不经过PL。常见的配置包括UART至少配一个UART用于串口打印调试信息。通常用MIO 48/49UART1或MIO 14/15UART0。SD卡如果要从SD卡启动需要配置SD0或SD1。通常用MIO 40-45SD0。以太网如果用PS端的千兆以太网需要配置MIO 16-27ENET0或MIO 28-39ENET1。USBPS端有两个USB控制器可以配置为Host或Device模式。QSPI Flash用于固化启动镜像通常用MIO 1-6。每个外设的引脚分配必须和你的开发板原理图一致。比如你的板子UART接的是MIO 48/49你在配置里就得选对应的引脚。选错了串口就没输出这是新手最常见的“板子没反应”原因之一。3.4 Clock Configuration时钟树的规划Clock Configuration页面控制PS端输出的时钟。ZYNQ PS端可以向外提供四路时钟FCLK_CLK0到FCLK_CLK3。这些时钟可以输出到PL端作为PL逻辑的时钟源。我一般的做法是FCLK_CLK0给PL端的主逻辑用频率根据需求设比如100MHz或50MHz。FCLK_CLK1给AXI总线互联用通常和FCLK_CLK0同频。FCLK_CLK2和FCLK_CLK3暂时不用保持默认。时钟频率的设定要考虑PL端逻辑的时序收敛。频率越高时序越难满足。如果你只是做低速控制逻辑50MHz足够了。如果要做高速数据采集可能需要100MHz甚至更高但这时候就要仔细看时序报告了。3.5 中断与复位配置中断配置在PS-PL Configuration的Interrupts子项里。如果你勾选了PL-PS Interrupt Ports画布上ZYNQ方块会多出IRQ_F2P引脚。这个引脚需要连接到一个中断控制器IP比如AXI Interrupt Controller再由中断控制器收集PL端各个中断源。复位方面ZYNQ PS端会输出一个FCLK_RESET0_N信号低电平有效。这个信号通常连接到PL端各个IP的复位引脚用于在PS端复位时同步复位PL逻辑。4. BD连线与IP集成从手动到自动的取舍4.1 添加必要的外设IPPS核配置好之后画布上只有一个ZYNQ方块。接下来要添加其他IP。常见的包括Processor System Reset复位管理IP接收PS端的复位信号分发给其他IP。AXI Interconnect总线互联IP当有多个主设备或从设备时需要它来仲裁和路由。AXI GPIO如果要做简单的GPIO控制可以用这个IP。AXI BRAM Controller如果要通过AXI总线访问BRAM。添加方式和添加ZYNQ核一样点“”号搜索IP名称即可。4.2 自动连线与手动调整Vivado提供了一个非常方便的功能Run Connection Automation。点击画布上方的“Run Connection Automation”工具会自动检测未连接的接口并尝试帮你连线。比如它会自动把ZYNQ的M_AXI_GP0连接到AXI Interconnect再把Interconnect连接到各个从设备IP。但自动连线不是万能的。有时候工具会连出你不需要的路径或者连错了方向。我一般会先跑一次自动连线然后手动检查每一条连线把多余的删掉把缺失的补上。手动连线的方式很简单把鼠标移到某个引脚上光标变成铅笔形状点击并拖动到目标引脚即可。连线时要注意接口类型必须匹配比如AXI接口只能连AXI接口时钟引脚只能连时钟引脚。4.3 地址分配与验证所有连线完成后需要做地址分配。点击Address Editor标签页你会看到所有AXI从设备的地址映射。Vivado会自动分配地址但你可以手动调整。比如你有两个AXI GPIO默认可能分配了不同的地址段你需要记下这些地址后面写软件的时候要用。地址分配的原则是每个从设备的地址范围不能重叠且要在PS端可访问的地址空间内。ZYNQ PS端的DDR地址空间通常是0x00000000到0x1FFFFFFF512MBPL端的AXI从设备通常映射到0x40000000以上的地址段。注意地址分配完成后一定要点Validate Design快捷键F6检查BD是否有错误。常见的错误包括接口未连接、时钟未连接、地址冲突等。Validate通过后BD才能生成正确的顶层文件。4.4 生成顶层封装与HDLValidate通过后右键BD文件选择Generate Output Products。这一步会生成BD对应的HDL文件、约束文件、以及IP核的网表。生成完成后再右键BD文件选择Create HDL Wrapper生成顶层的Verilog或VHDL文件。这个Wrapper文件就是整个BD的顶层里面例化了BD中的所有IP并定义了对外接口。你可以在这个Wrapper的基础上添加自己的RTL模块或者直接把Wrapper作为顶层进行综合。5. 常见问题与排查技巧实录5.1 BD综合报错找不到器件或IP这是最常见的问题之一。原因通常是器件支持包没装全或者IP核的License没有正确加载。排查步骤确认工程器件型号和实际板子一致。检查Vivado安装时是否勾选了对应器件家族。如果是IP License问题打开Help - Manage License查看相关IP的License状态。5.2 生成比特流失败Implement Design变红“vivado implement design变红”是很多新手遇到的问题。变红意味着实现阶段有错误。常见的错误类型包括时序不满足打开Timing Report看是哪条路径的建立时间或保持时间不满足。如果是BD内部的AXI总线时序问题可以尝试降低FCLK频率。引脚约束冲突检查XDC约束文件看是否有引脚被重复分配。资源超限如果PL端逻辑太大超出了器件资源也会报错。这时候需要优化逻辑或换更大的器件。5.3 串口无输出PS端没跑起来板子下载后串口没输出原因可能有很多DDR配置错误FSBL在初始化DDR时失败导致后续代码无法运行。启动模式设置错误板子上的启动模式跳线没设对。如果要JTAG启动跳线要设成JTAG模式。串口引脚配置错误MIO配置里UART引脚和实际板子不一致。波特率不匹配串口终端波特率设置和PS端不一致通常是115200。排查时可以用Vivado的XSCTXilinx Software Command-line Tool连接板子看PS端是否能被识别。如果XSCT能连上说明JTAG链路没问题问题出在PS端配置或软件上。5.4 BD修改后综合结果不更新有时候你改了BD配置但综合结果还是旧的。这是因为Vivado有缓存机制。解决办法是右键BD文件选择Reset Output Products然后重新Generate Output Products。如果还不行就删掉工程目录下的“.Xil”文件夹和“*.cache”文件夹重新综合。5.5 常见问题速查表问题现象可能原因排查方法BD Validate报错接口未连接或地址冲突检查连线打开Address Editor综合报错找不到IPIP未生成或License缺失重新Generate Output Products比特流生成失败时序不满足或引脚冲突查看Timing Report和XDC文件串口无输出DDR配置错误或启动模式不对检查MIO配置和板子跳线下载后板子无反应比特流未正确加载确认下载器和器件型号6. 从BD到完整系统的下一步BD搭好并验证通过后你就有了一个ZYNQ系统的硬件框架。接下来要做的是导出硬件File - Export - Export Hardware生成XSA文件。这个文件包含了PS端的配置信息和PL端的比特流是后续软件开发的基础。编写PL端逻辑在BD的Wrapper基础上添加你自己的Verilog模块连接到BD暴露的接口上。软件开发用Vitis或旧的SDK创建应用工程基于XSA文件生成BSP然后编写PS端的C代码。调试与固化通过JTAG下载调试确认功能正常后生成BOOT.bin固化到QSPI Flash或SD卡。我个人在实际操作中的体会是BD的最大价值在于把PS端的复杂配置图形化了让你不用去啃几百页的寄存器手册。但它也不是银弹BD生成的系统性能取决于你的配置是否合理。比如AXI总线的位宽、时钟频率、互联结构都会影响最终的数据吞吐量。我见过有人把AXI GP接口用来传大量数据结果带宽只有几十MB/s后来换成HP接口才跑到几百MB/s。所以理解每个接口的定位和性能特征比会拖拽连线更重要。最后再分享一个小技巧BD工程建好后养成定期备份的习惯。Vivado的工程文件有时候会因为版本升级或意外操作损坏尤其是BD的.bd文件。我一般会在每次重大修改后把整个工程目录压缩一份存到另一个盘。这个习惯帮我省过好几次重头再来的时间。