Zynq SoC 监控自身电源电压和片上工作温度的能力是值得深讨的,我们可以在系统调试期间使用这种能力来验证初始电源电压和工作温度。然后,我们可以定期检查以确保这些参数在我们设计的整个测试和操作过程中保持在目标操作范围内。我们还可以在系统运行期间使用此功能作为一种预测,以确定 Zynq SoC 的环境是否存在导致故障的问题(例如,缓慢漂移的电源)。
Zynq SoC 有许多可屏蔽中断,如果警报参数超出用户定义的最大或最小参数设置,它们可以中断两个片上 ARM Cortex-A9 MPCore 处理器。XADC 有自己的专用中断,由 IRQ 39 上的两个处理器共享,正如 Zynq TRM(技术参考手册-http://www.xilinx.com/support...)的摘录所示:
这些报警参数可以在 Vivado 中的 XADC 配置期间进行设置,如下所示:
它们还可以在执行软件期间使用提供的 xadc_ps.h 函数进行设置。例如:
XAdcPs_SetAlarmThreshold(XADCInstPtr, XADCPS_ATR_TEMP_LOWER,(TempRawData));
XADC 提供许多警报输出信号,这些信号可以连接到在 Zynq SoC 的 PL(可编程逻辑)中实现的其他逻辑模块。如果发生警报,就会触发这些逻辑模块启动。它们还可以驱动外部指示灯(例如 LED),这些指示灯可以位于前面板上以显示设备状态。这对于在系统风扇故障等情况下提供温度的视觉警告特别有用。
这些警报(总共有七个,请参见上面的 TRM 中的表格)可以使用带有适当参数的函数调用来启用,由 xadcps_hw.h 提供。如果需要多个报警,则将它们组合在一起。
XAdcPs_SetAlarmEnables(XADCInstPtr,XADCPS_CFR1_ALM_TEMP_MASK);
一旦我们启用了报警,我们也使用适当的函数调用启用中断,同样使用 xadcps_hw.h 提供的函数。要一次启用多个中断,或将它们组合在一起:
XAdcPs_IntrEnable(XADCInstPtr,XADCPS_INTX_ALM0_MASK);
考虑到这一点,我们开始在 Vivado 中创建一个简单的项目,其中包括Zynq PS通过 AXI 接口连接到 XADC 。对于此示例,我没有使用任何外部模拟输入,但使用了设备的内部温度测量,它是 Zynq XADC 的一部分。
软件将 XADC 配置为在温度高于或低于初始加电读数上下几度时发出中断。实际上,我们不希望对工作温度有如此严格的公差。然而,这是一个很好的演示 XADC 中断的应用程序,因为 Zynq SoC 正常运行期间的自热会触发中断。代码链接:
https://gitee.com/openfpga/zynq-chronicles/blob/master/main_part43.c
https://github.com/suisuisi/zynq_guide/blob/main/main_part43.c
它分为三个功能:
- 第一部分在 Zynq SoC 上配置通用中断控制器,以便我们可以使用 XADC 中断作为中断服务程序的一部分。在发出 XADC 中断时调用它。
- 第二部分配置 XADC,将定时器设置为安全模式,并在读取温度之前禁用所有警报。然后,它会根据刚刚读取的值分配温度上限和下限警报。设置了这些值后,该函数将设置温度警报并启用温度中断。
- 第三部分是温度中断发生时会调用的中断服务程序。该例程将清除中断状态寄存器,禁止更多中断发生,并读取中断发生时的温度。温度读数可能不会高于中断温度,因为它会波动并且我们没有打开温度平均。
当我构建示例代码并生成启动映像时,我在 ZYNQ 板上运行了几分钟后观察到以下结果:
如图所见,中断被触发。状态更新后的数字“513”(十进制)是 XADC 中断状态寄存器中的值。
XADC 在系统和 FPGA 设计人员的工具箱中都是非常强大的工具。这个简单的例子展示了我们如何将它用于保护板子运行。在更关键的应用程序中,我们还可以将其用作防篡改策略的一部分。
原文:OpenFPGA
作者:碎碎思
相关文章推荐
更多FPGA技术干货请关注FPGA 的逻辑技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。