网站建设项目计划网站模板下载湖南岚鸿网站
网站建设项目计划,网站模板下载湖南岚鸿网站,安徽建设项目建设工程在线,网站开发进度设计与阶段目标1. 为什么需要双重固化#xff1f;从一次“掉电丢失”的尴尬说起
几年前#xff0c;我接手了一个基于Zynq-7000的工业控制器项目。项目调试一切顺利#xff0c;功能完美#xff0c;客户现场演示也大获成功。就在我们准备收工#xff0c;拔掉下载器、关掉电脑电源的瞬间&am…1. 为什么需要双重固化从一次“掉电丢失”的尴尬说起几年前我接手了一个基于Zynq-7000的工业控制器项目。项目调试一切顺利功能完美客户现场演示也大获成功。就在我们准备收工拔掉下载器、关掉电脑电源的瞬间客户随口问了句“这板子重启后刚才调好的参数还在吧” 我信心满满地点头然后按下了复位键。结果屏幕一片漆黑所有逻辑功能“消失”了。那一刻的尴尬我至今记忆犹新。原来我只把程序下载到了FPGA的易失性内存里一掉电所有努力付诸东流。这就是程序固化的意义所在。对于Zynq-7000这类包含处理器系统PS和可编程逻辑PL的芯片我们开发的PL逻辑比如你的图像处理算法、电机控制IP核需要存储到非易失性存储器中让板子上电就能自动加载运行。而“双重固化”策略简单说就是给你的程序上“双保险”既能在板载的QSPI Flash里安家也能拷贝到通用的SD卡里启动。这在实际项目中太有用了QSPI Flash焊死在板上适合量产产品稳定可靠SD卡则可以随时更换不同版本的程序极其适合前期开发调试、现场升级或者小批量试产。很多刚接触Zynq的朋友会疑惑我的设计只用到了PL纯FPGA逻辑为什么固化还得拉上ARM核PS这确实是Xilinx设计的一个特点。Zynq的启动流程是由PS主导的PS负责从外部存储器读取配置数据来配置PL。所以即使你的应用完全不用ARM跑软件为了固化PL程序你也必须在Vivado里把ZYNQ7 Processing System这个IP核请出来并正确配置它去管理Flash或SD卡。别担心这个过程就像给PL程序配一个“专属启动秘书”秘书PS虽然不干你的主要业务但离了它你的业务PL逻辑就没法自动开张。在Vivado和Vitis 2019.2这个经典版本下工具链其实已经为我们做了很多自动化的工作但关键的配置步骤和原理如果没搞清依然会踩坑。接下来我就带你一步步实现从零开始构建一个同时支持QSPI Flash和SD卡启动的双重固化方案把踩过的坑和验证过的经验都分享给你。2. 第一步在Vivado中打造“硬核”基础工程万事开头难但开头对了后面就顺了。我们的起点是一个功能正常的纯PL工程。假设你已经用Vivado 2019.2完成了一个LED闪烁或自定义IP的设计并且通过了功能仿真和上板调试。记住这个工程我们称之为“纯PL工程”。接下来我们要做的就是在这个工程里引入Zynq的PS系统并把它和我们的PL逻辑“捆绑”在一起。2.1 引入Zynq PS核并完成关键配置首先在Vivado中打开你的纯PL工程。在左侧Flow Navigator点击Create Block Design给bd文件起个名字比如system。在画布中点击“”号添加IP搜索并添加ZYNQ7 Processing System。双击添加进来的Zynq IP核打开重配置窗口。这里是我们配置的核心战场配置错了后续固化必然失败。首先勾选你需要的存储控制器。在左侧导航栏找到Peripheral I/O Pins如果你计划使用QSPI Flash固化就在这里勾选Quad SPI Flash。勾选后下方会显示具体的引脚复用MIO通常保持默认即可除非你的硬件原理图有特殊连接。如果你计划使用SD卡启动同样在这里勾选SD 0或SD 1根据你的板卡原理图选择。这样PS才会把对应的MIO引脚配置为SD卡模式。一个关键细节我强烈建议即使你目前只确定用一种方式也把这两个都勾选上。这为你后续增加启动方式留出了硬件定义空间而且不会增加额外的逻辑资源消耗。配置界面大概长这样以同时勾选为例Quad SPI Flash: [√] SD 0: [√]其次根据硬件调整Bank电压和DDR配置。切换到MIO Configuration-Bank1 I/O Voltage。这里必须和你的板卡硬件匹配比如很多开发板像Digilent、正点原子的一些型号的Bank1电压是1.8V你就需要在下拉菜单中选择LVCMOS 1.8V。选错了电压可能导致PS无法启动或Flash/SD通信失败。接着找到DDR Configuration选项。这里是另一个大坑。你需要根据板子上焊接的DDR颗粒型号选择正确的DDR Controller Configuration。比如是“Micron MT41K256M16HA-125”就选它。如果列表里没有完全一致的型号选择一个时序兼容的型号。这一步信息务必从板卡原理图或手册中获取瞎选会导致系统不稳定甚至无法启动。最后做减法关闭不需要的PS功能以简化设计。因为我们只借用PS来做启动配置很多高级功能用不上。在PS-PL Configuration页面下找到AXI Non Secure Enablement-GP Master AXI Interface取消勾选M_AXI_GP0 interface。同样在Clock Configuration-PL Fabric Clocks下取消勾选FCLK_CLK0。在PS-PL Configuration-General-Enable Clock Resets下取消勾选FCLK_RESET0_N。关闭这些接口和时钟可以避免产生一堆无用的端口让我们的顶层接口更干净。配置完成后点击OK。回到Block Design画布你会发现Zynq IP核的接口少了很多只剩下DDR和FIXED_IO包含SD、QSPI、UART等复用引脚。点击上方绿色的Run Block Automation让Vivado自动帮你完成外部端口连接。2.2 将PL逻辑与PS系统“合二为一”现在我们的工程里有两部分原始的PL顶层模块比如叫my_pl_top和刚刚创建的包含Zynq PS的Block Designsystem。我们需要把它们整合到一个顶层文件里。在Block Design上右键选择Create HDL Wrapper让Vivado为这个bd生成一个顶层的Verilog或VHDL封装文件例如system_wrapper.v。这个文件实例化了整个Zynq系统。接下来是关键操作手动编辑这个system_wrapper.v文件。我们需要在这个wrapper模块的端口声明和实例化部分添加我们原有PL顶层模块的所有输入输出端口。然后在这个wrapper模块内部实例化我们的PL模块并将端口正确连接。举个例子假设你的PL顶层模块有sys_clk,sys_rst_n,led[1:0]这些端口。你需要在system_wrapper的模块声明中加入它们然后在system_wrapper的模块内部在system_i(Zynq系统实例) 的后面添加你的PL模块实例比如my_pl_top u_my_pl_top ( .sys_clk(sys_clk), ... )。这一步看似繁琐但原理很简单我们创建了一个新的顶层文件这个文件一方面把Zynq PS系统“包”起来另一方面也把我们的PL逻辑“包”进来两者在顶层是并列关系。之后这个system_wrapper.v就将成为我们整个设计的唯一顶层。完成后在Vivado左侧的Sources窗口中确保将system_wrapper.v设置为顶层模块右键 - Set as Top。然后你需要将原来PL工程的约束文件XDC中的引脚重新分配给这个新顶层文件system_wrapper中新添加的那些PL端口。因为物理引脚连接的是你的PL逻辑而不是Zynq核。2.3 生成比特流与硬件描述文件设置好顶层和约束后就可以点击Generate Bitstream进行综合、实现并生成比特流文件了。这个过程会有点长。这里有一个非常重要的验证点比特流生成后打开Implementation后的报告查看资源利用率LUT、FF、BRAM等。这个利用率应该和你最初纯PL工程生成的利用率非常接近可能只多出几十个LUT用于PS的接口逻辑。如果发现资源利用率暴跌比如从5000 LUT变成200或者暴涨得离谱那几乎可以断定是前面创建Wrapper或整合步骤出了问题。最常见的原因是生成了多个Wrapper导致工程源文件混乱。最干脆的解决办法是回到配置好Zynq核的Block Design那一步从头创建Wrapper并整合或者直接新建一个工程来操作。比特流生成无误后最后一步是导出硬件平台。在菜单栏选择File - Export - Export Hardware。在弹出窗口中务必勾选 “Include bitstream”。点击OK后Vivado会在工程目录下生成一个.xsa文件例如design_1_wrapper.xsa。这个文件包含了我们的硬件比特流信息、Zynq PS配置以及地址空间分配等所有信息是通往Vitis软件世界的“护照”。3. 第二步在Vitis中制作启动镜像Boot Image拿到.xsa文件我们的战场就从Vivado转移到了Vitis 2019.2。Vitis在这里的核心任务是生成一个可以被Zynq启动流程识别的BOOT.BIN文件。这个文件是个“包裹”里面按顺序打包了必要的启动组件。3.1 创建平台与FSBL工程启动Vitis选择或新建一个工作空间Workspace。首先我们需要基于.xsa文件创建一个硬件平台项目。点击File - New - Platform Project。输入项目名如hardware_platform点击Next。在下一页点击 “Browse” 选择我们刚才生成的.xsa文件然后Finish。平台项目创建好后Vitis会自动解析.xsa文件。接下来创建最重要的FSBLFirst Stage Boot Loader工程。FSBL是Zynq启动的第一段代码由PS的ARM核执行它的职责就是初始化必要的硬件包括你刚刚配置的QSPI/SD控制器然后从外部存储器中加载后续的应用程序或PL配置。点击File - New - Application Project。在向导中选择上一步创建的硬件平台项目。输入工程名例如fsbl。点击Next在模板选择页面找到并选择Zynq FSBL。这个模板是Xilinx提供的标准FSBL代码我们无需修改。在下一个页面有一个关键选项Generate boot components。请确保它被勾选上这会让Vitis在编译FSBL的同时为生成启动镜像做好准备。点击FinishVitis会自动创建并编译FSBL工程。编译成功后你可以在工程目录下的Debug或Release文件夹里找到fsbl.elf文件。这就是我们的“启动引导员”。3.2 生成最终的BOOT.BIN文件有了FSBL和包含PL比特流的硬件平台我们就可以打包生成启动镜像了。在Vitis左侧的Explorer视图中右键点击你的FSBL应用工程例如fsbl_system选择Create Boot Image。这时会打开一个Boot Image配置界面。你会发现Vitis已经智能地为我们填充了好几个部分Bootloader partition: 这里会自动关联到我们刚编译好的fsbl.elf。Hardware Partition (Bitstream): 这里会自动关联到从.xsa中提取出来的PL比特流文件.bit。这就是要固化到Flash里的PL程序核心。Second/Third Partition: 如果你的设计还有在PS上运行的应用程序比如一个Hello World或者控制程序这里可以添加对应的.elf文件。对于纯PL固化这部分可以留空Vitis可能会有一个占位符不影响。重点来了检查输出格式和路径。在Output Format下确认选择了boot.bin。在Output Path选择一个你容易找到的目录或者使用默认的Debug文件夹下的bootimage目录。点击Create ImageVitis就会开始工作。它首先会运行一个叫bootgen的工具根据上述分区配置将FSBL、比特流等文件按照Zynq启动头格式要求拼接、加密如果使能、打包最终生成一个BOOT.BIN文件。这个BOOT.BIN就是我们用于固化的“终极文件”。你可以在Output Path指定的目录里找到它。为了验证你可以先不固化在Vitis中直接通过JTAG下载这个Boot Image到板子上右键工程 - Run As - Launch Hardware。如果板子能正常运行你的PL逻辑说明Boot Image制作成功。4. 第三步双重固化实战——QSPI Flash与SD卡部署现在我们手里有了万能钥匙BOOT.BIN可以把它放到不同的“锁”存储介质里了。两种方式的操作和原理略有不同。4.1 固化到QSPI FlashQSPI Flash是焊在板上的NOR Flash容量通常从几兆到几十兆字节。固化后程序将永久保存上电即启动。操作步骤确保板子的启动模式跳线设置为QSPI启动模式通常是MIO[5:0]001010或类似具体查你的板子手册。在Vitis中确保你的FSBL工程是当前活跃工程。点击上方菜单栏的Xilinx - Program Flash。在弹出的对话框中Image File: 点击浏览选择我们刚才生成的BOOT.BIN文件。Flash Type: 选择qspi-x4-single或根据你的Flash芯片型号选择。大多数开发板用的都是qspi-x4-single单颗4线模式。点击Program。Vitis会通过JTAG先将一个小的Flash编程器下载到板载RAM然后通过它擦除Flash并将BOOT.BIN写入到Flash的起始扇区。编程完成后先关闭板子电源然后将启动模式跳线切回QSPI模式最后重新上电。你应该能看到PL程序自动加载并运行了。常见坑点“SPI speed fallback to 100kHz”警告这通常是因为在Vivado中配置Zynq核时没有正确勾选或启用Quad SPI控制器。回去检查2.1节的配置。编程成功但无法启动首先确认启动模式跳线绝对正确。其次检查Vivado中Zynq核的MIO Bank电压是否与板子实际电压匹配1.8V vs 3.3V。最后可能是Flash芯片型号特殊需要修改FSBL源码中的Flash驱动参数但这属于进阶问题多数开发板无需此操作。4.2 部署到SD卡SD卡方式极其灵活特别适合开发和调试阶段。你只需要把文件拷贝到卡里换卡就等于换程序。操作步骤准备一张FAT32格式的SD卡容量不限建议用小容量卡兼容性好。用读卡器连接到电脑。将我们生成的BOOT.BIN文件直接复制到SD卡的根目录。是的就这么简单不需要其他文件。安全弹出SD卡将其插入板子的SD卡槽。将板子的启动模式跳线设置为SD卡启动模式通常是MIO[5:0]001110。给板子上电PL程序便会从SD卡加载并运行。SD卡方式的优势与注意优势无需编程等待拷贝文件瞬间完成可随时更换不同版本程序进行A/B测试对于没有焊接QSPI Flash的早期原型板特别有用。注意SD卡需要是FAT32格式且BOOT.BIN必须在根目录。有些高速SDHC/SDXC卡可能存在兼容性问题如果启动失败可以换一张老式的、容量小的普通SD卡试试。4.3 如何选择项目中的实际考量了解了两种方式的操作在实际项目中该如何选择呢我通常会根据项目阶段和产品形态来决定研发调试阶段首选SD卡方式。每天甚至每小时都要迭代程序版本用SD卡拷贝比反复擦写Flash快得多也更能保护Flash寿命。你可以准备多张SD卡分别存放稳定版、测试版、演示版。小批量试产或现场升级SD卡依然是利器。给现场设备升级程序让客户插卡重启即可无需开盖、无需连接JTAG下载器安全又便捷。最终量产产品必须使用QSPI Flash。产品不可能带个SD卡槽和卡出去QSPI Flash焊死在板上抗震、可靠、成本固定。此时SD卡功能可以在硬件上保留方便售后升级但在Vivado配置中可以不勾选以节省引脚。“双重固化”策略我的习惯是在硬件设计上同时保留QSPI Flash和SD卡槽。在Vivado中把两个控制器都配置上。出厂时程序固化到QSPI Flash。同时我会随产品附赠一张SD卡里面存放着与Flash内同版本或最新版的BOOT.BIN文件。如果未来产品在现场需要升级而用户又不具备JTAG调试条件就可以指导用户通过SD卡来启动新程序或者由技术人员携带SD卡上门处理。这相当于为产品维护提供了双通道。5. 进阶当设计包含PS应用程序时上面的流程我们聚焦于“纯PL”固化这也是很多从传统FPGA转到Zynq的工程师最常遇到的场景。但Zynq的魅力在于软硬协同。如果你的设计不仅仅有PL逻辑还有在ARM核上运行的C/C应用程序比如跑了一个Linux系统或者裸机控制程序那么固化流程需要稍作调整。此时你的Vitis工作空间里至少会有两个工程一个依然是FSBL工程另一个是你的主应用程序工程例如一个Hello World或者自定义的ARM端程序。生成启动镜像BOOT.BIN的步骤和前面类似但在Create Boot Image时分区列表里会出现三个部分Partition 1: FSBL (bootloader).elfPartition 2: 硬件比特流文件 (.bit)Partition 3: 你的主应用程序 (.elf)你需要确保这三个文件都被正确添加。通常Vitis在创建Boot Image时会自动识别并添加当前活跃的应用程序工程的.elf文件。打包后的BOOT.BIN文件包含了完整的启动链PS上电后运行FSBLFSBL初始化硬件并加载PL比特流然后跳转到你的主应用程序开始执行。对于这种“PLPS”的完整系统双重固化策略依然适用。无论是烧写到QSPI Flash还是拷贝到SD卡这个包含了软件和硬件的BOOT.BIN文件都是唯一的部署件。这大大简化了系统发布和管理的复杂度。走完这一整套流程从Vivado的硬件设计到Vitis的软件集成与镜像打包再到最后的物理部署你应该对Zynq-7000的启动流程和固化机制有了更深刻的理解。这套方法在XC7Z010、XC7Z020等全系列Zynq-7000芯片上都是通用的。工具版本可能会更新但核心原理——PS引导、多阶段启动、Boot Image打包——是稳定的。下次再遇到掉电程序丢失的问题你完全可以淡定地告诉同事或客户“没事我们把它固化到Flash里就行。” 这份从容来自于对每一个配置步骤背后意义的清晰认知以及亲手实践过无数次的肌肉记忆。