深入解析ZYNQ 7系列FPGA:从硬件管脚到软件控制的复位系统全景

张开发
2026/4/17 18:46:58 15 分钟阅读

分享文章

深入解析ZYNQ 7系列FPGA:从硬件管脚到软件控制的复位系统全景
1. ZYNQ 7系列FPGA复位系统概述第一次接触ZYNQ 7系列FPGA的复位系统时我被它复杂的层次结构弄得晕头转向。后来在实际项目中踩过几次坑才明白这套复位系统就像一座精心设计的金字塔每一层都有明确的职责范围。最底层是硬件级的电源复位往上依次是系统级复位、软件控制复位最上层则是各种功能模块的局部复位。ZYNQ的复位系统之所以设计得如此复杂是因为它要同时兼顾PL可编程逻辑和PS处理系统两大模块的协同工作。我遇到过最头疼的情况是PL部分莫名其妙地死机了但PS还在正常运行。这时候如果对整个芯片进行硬复位正在处理的重要数据就会丢失。后来学会了灵活运用不同层级的复位信号问题就迎刃而解了。2. 硬件复位管脚详解2.1 PROGRAM_B管脚PL的专属重启键PROGRAM_B管脚就像PL部分的重启按钮。我在调试PL逻辑时经常用到它特别是当PL代码烧写后出现异常时。这个管脚有几个关键特性需要注意只影响PL部分对PS完全没影响下降沿触发典型电路设计会加RC延迟我常用10kΩ电阻和0.1μF电容初始化完成后INIT_B管脚会从输出变为开漏状态实际项目中我遇到过一个坑有次PROGRAM_B信号受到干扰导致PL频繁复位后来在硬件上加了个 Schmitt触发器就解决了。这里要特别注意PROGRAM_B有效期间PL的所有输出都会变成高阻态如果外围电路没做好处理就可能出现总线冲突。2.2 PS_POR_B管脚芯片的总开关这个管脚堪称ZYNQ的命门它复位时整个芯片就像刚上电一样。我在设计电源时序时特别关注它因为必须等所有电源稳定VCCPINT、VCCPAUX、VCCPLL等才能释放通常连接电源管理芯片的PGPower Good信号内部有毛刺滤波电路但外部建议再加RC滤波有次项目中出现系统随机重启最后发现是PS_POR_B电路上的电容值选小了导致电源轻微波动就触发复位。改大电容值后问题消失这个教训让我明白这个管脚的电路设计必须格外谨慎。2.3 PS_SRST_B管脚调试神器这个管脚是我调试时的好帮手它有个特别有用的特性复位时不会影响调试环境。具体来说保持断点和调试配置不变会清除所有内存内容包括OCM不重新采样启动模式引脚我经常在调试驱动代码时使用它比直接断电重启方便多了。不过要注意如果不用这个功能必须将该管脚上拉到VCC否则可能引起意外复位。3. 软件可控复位机制3.1 PSS_RST_CTRL寄存器软件控制的复位开关这个寄存器就像是复位系统的软件接口通过它可以触发系统软复位SOFT_RST位控制各个子系统的复位状态查询当前复位状态我在开发Bootloader时经常用到它。比如系统启动时发现DDR初始化失败就可以通过写SOFT_RST位让系统重新初始化。这里有个技巧写寄存器前最好先关闭中断否则可能引发不可预知的问题。3.2 看门狗复位系统的安全卫士ZYNQ的看门狗设计得很灵活包含三种类型ARM核专属看门狗AWDT0/AWDT1系统级看门狗SWDT私有看门狗我在设计高可靠性系统时通常会这样配置// 看门狗初始化示例 XWdtPs_Config *ConfigPtr; ConfigPtr XWdtPs_LookupConfig(XPAR_XWDTPS_0_DEVICE_ID); XWdtPs_CfgInitialize(WdtInstance, ConfigPtr, ConfigPtr-BaseAddr); // 设置超时时间比如5秒 XWdtPs_SetTimeoutValue(WdtInstance, 0x17D78400); // 启用看门狗 XWdtPs_Enable(WdtInstance);特别注意看门狗超时后的复位行为可以通过寄存器配置可以只复位单个ARM核也可以复位整个系统。4. 调试相关复位机制4.1 JTAG调试复位通过JTAG接口可以触发两种复位调试系统复位相当于PS_SRST_B的效果调试逻辑复位只复位调试相关逻辑我在用Xilinx SDK调试时发现有时候程序跑飞后普通的复位不管用但通过JTAG发送调试复位就能恢复。这里要注意的是JTAG的TRST信号在ZYNQ上是不支持的需要通过特定的TMS序列来触发复位。4.2 多核调试时的复位策略当系统中有多个ARM核时复位策略就变得复杂了。我的经验是主核负责协调整个复位过程复位前要通过核间通信IPI通知其他核对于关键外设最好在复位前手动保存状态曾经有个项目因为没处理好多核复位顺序导致DMA操作中途被中断造成了数据损坏。后来增加了复位前的握手协议才解决。5. 复位系统的实际应用技巧5.1 复位时序设计可靠的复位时序对系统稳定性至关重要。我通常这样做电源稳定后保持PS_POR_B低电平至少100msPROGRAM_B信号要比PS_POR_B晚释放重要外设的复位信号要适当延迟可以用下面的伪代码作为参考// 复位时序生成示例 always (posedge clk) begin if (!por_b) begin pl_reset_cnt 0; sys_reset 1; end else if (pl_reset_cnt 10) begin pl_reset_cnt pl_reset_cnt 1; sys_reset 1; end else begin sys_reset 0; end end5.2 复位状态监测为了快速定位复位原因我建议实现以下功能在OCM中保留上次复位的状态信息读取PSS_RST_STAT寄存器记录复位原因对意外复位进行日志记录比如可以这样实现void record_reset_reason(void) { u32 rst_status Xil_In32(PSS_RST_STAT); u32 *reset_log (u32*)OCM_RESET_LOG_ADDR; reset_log[0] rst_status; reset_log[1] Xil_In32(WDT_STS_REG); reset_log[2] get_timestamp(); }5.3 复位相关常见问题排查根据我的经验最常见的复位问题包括电源噪声导致意外复位解决方案加强电源滤波检查PCB布局看门狗超时复位检查喂狗间隔确认没有死循环程序跑飞触发异常复位检查栈溢出数组越界等问题有次客户反映系统随机复位最后发现是电源模块的负载调整率不达标在PL全速运行时电压跌落触发了复位。这类问题最好用示波器监控各路电源的纹波和动态响应。

更多文章