【ZYNQ】ZYNQ7000 XADC 及其驱动示例

XADC 简介

ZYNQ SoC 的 XADC 模块包括两个 12 位的模数转换器,转换速率可以达到 1MSPS(每秒一百万次采样)。它带有片上温度和电压传感器,可以测量芯片工作时的温度和供电电压。

在 7 系列的 FPGA 中,XADC 提供了 JTAG 和 DRP(dynamic reconfiguration port)接口,用于访问其内部的状态和控制寄存器。在 ZYNQ-7000 SoC 器件中,XADC 增加了一个 PS-XADC 接口,用于 PS 中的软件控制 XADC 模块。

XADC 模块的系统框图如下所示:

在这里插入图片描述

在图中 PL-JTAG 接口可以用于开发工具(Vivado)控制 XADC 模块,包括读取芯片温度信息等。而运行在 PS 中的软件则可以通过两种方式与 XADC 进行通信:

  • 1、 通过 PS-XADC 接口,此时不需要对 PL 进行编程配置;
  • 2、 通过 PS 到 PL 的 AXI Master 接口(M_AXI_GP),此时需要在 PL 中调用 AXI XADC IP 核。

在使用 PS 控制 XADC 时,如果对应用的性能要求较高,则推荐第二种方式,它使用的是一个并行的数据路径(DRP 接口)。而 PS-XADC 接口同 PL-JTAG 接口一样,使用的是串行的数据路径,相对较慢。不过使用 PS-XADC 接口不占用 PL 的资源,也不需要对 PL 进行编程,只需要对 PL 部分供电即可。

需要注意的是,PL-JTAG 接口与 PS-XADC 接口不能同时使用。而 XADC 可以在 PL-JTAG 接口(或PS-XADC 接口)与 DRP 接口之间进行仲裁。

硬件设计

XADC 为硬核模块,不需要对 PL 进行配置。PS 端只需完成 UART、DDR 等基础配置就可以。

在这里插入图片描述

软件设计

本实验通过 PS-XADC 接口实现,创建基础 SDK 工程即可,添加源代码:

  • xadc.h
/*** Copyright (c) 2022-2023,HelloAlpha* * Change Logs:* Date           Author       Notes*/
#ifndef __XADC_H__
#define __XADC_H__#define USING_XADC#ifdef USING_XADC
#include "xparameters.h"
#include "xadcps.h"#define XADC_DEVICE_ID	XPAR_XADCPS_0_DEVICE_IDstruct Xadc_Data
{float temp;     // Temperaturefloat vccint;   // PL kernel voltagefloat vccaux;   // PL auxiliary voltagefloat vccbram;  // PL BRAM voltagefloat vccpint;  // PS kernel voltagefloat vccpaux;  // PS auxiliary voltagefloat vccpdro;  // PS DDR voltageuint16_t raw_temp;uint16_t raw_vccint;uint16_t raw_vccaux;uint16_t raw_vccbram;uint16_t raw_vccpint;uint16_t raw_vccpaux;uint16_t raw_vccpdro;
};typedef struct Xadc_Data XadcData_t;int XadcPs_Init(XAdcPs *XadcInstancePtr, uint16_t DeviceId);
void XadcPs_GetData(XAdcPs *XadcInstancePtr, XadcData_t *XadcData);#endif
#endif
  • xadc.c
/*** Copyright (c) 2022-2023,HelloAlpha* * Change Logs:* Date           Author       Notes*/
#include "xadc.h"#ifdef USING_XADC
int XadcPs_Init(XAdcPs *XadcInstancePtr, uint16_t DeviceId)
{int Status;XAdcPs_Config *XadcConfigPtr;XadcConfigPtr = XAdcPs_LookupConfig(DeviceId);if (NULL == XadcConfigPtr) {return XST_FAILURE;}Status = XAdcPs_CfgInitialize(XadcInstancePtr, XadcConfigPtr, XadcConfigPtr->BaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}XAdcPs_SetSequencerMode(XadcInstancePtr, XADCPS_SEQ_MODE_SAFE);return Status;
}void XadcPs_GetData(XAdcPs *XadcInstancePtr, XadcData_t *XadcData)
{XadcData->raw_temp = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_TEMP);XadcData->temp = XAdcPs_RawToTemperature(XadcData->raw_temp);XadcData->raw_vccint = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VCCINT);XadcData->vccint = XAdcPs_RawToVoltage(XadcData->raw_vccint);XadcData->raw_vccaux = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VCCAUX);XadcData->vccaux = XAdcPs_RawToVoltage(XadcData->raw_vccaux);XadcData->raw_vccbram = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VBRAM);XadcData->vccbram = XAdcPs_RawToVoltage(XadcData->raw_vccbram);XadcData->raw_vccpint = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VCCPINT);XadcData->vccpint = XAdcPs_RawToVoltage(XadcData->raw_vccpint);XadcData->raw_vccpaux = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VCCPAUX);XadcData->vccpaux = XAdcPs_RawToVoltage(XadcData->raw_vccpaux);XadcData->raw_vccpdro = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VCCPDRO);XadcData->vccpdro = XAdcPs_RawToVoltage(XadcData->raw_vccpdro);
}
#endif
  • app_xadc.c
/*** Copyright (c) 2022-2023,HelloAlpha* * Change Logs:* Date           Author       Notes*/
#include "xadc.h"#ifdef USING_XADC
#include "stdio.h"
#define kprintf printf/*** xil_printf does not support printing floating point numbers
*/static XAdcPs Xadc;
static XadcData_t xadc_data;int xadc_read_data(void)
{XadcPs_GetData(&Xadc, &xadc_data);kprintf("On Chip Temperature:  %f C    \r\n", xadc_data.temp);kprintf("PL Kernel Voltage:     %f V    \r\n", xadc_data.vccint);kprintf("PL Auxiliary Voltage:  %f V    \r\n", xadc_data.vccaux);kprintf("PL BRAM Voltage:       %f V    \r\n", xadc_data.vccbram);kprintf("PS Kernel Voltage:     %f V    \r\n", xadc_data.vccpint);kprintf("PS Auxiliary Voltage:  %f V    \r\n", xadc_data.vccpaux);kprintf("PS DDR Voltage:        %f V    \r\n", xadc_data.vccpdro);return 0;
}int app_xadc_init(void)
{int Status = XST_SUCCESS;Status = XadcPs_Init(&Xadc, XADC_DEVICE_ID);if (Status != XST_SUCCESS) {return XST_FAILURE;}return Status;
}
#endif

更多 ZYNQ 相关源码也可以在这里 Github ZYNQ-SPACE 找到。

主函数种首先调用 app_xadc_init() 对 XADC 初始化,需要读取时调用 xadc_read_data() 即可。

验证

  • 测试平台:黑金ZYNQ7035
  • 开发工具:Vivado2017.4
  • 实验现象:

在这里插入图片描述

参考资料

  • UG585
  • 正点原子 ZYNQ 领航者
  • 黑金 ZYNQ7035

更多内容

  • CSDN博客:@Hello阿尔法
  • 哔哩哔哩:@Hello阿尔法
  • 知乎:@Hello阿尔法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

30. MVC设计模式

JavaEE 开发流程 ↓MVC的概念 MVC是Model-View-Controller的简称,即模型-视图-控制器。 MVC是一种设计模式,它把应用程序分成三个核心模块:模型、视图、控制器,它们各自处理自己的任务。 模型(model) 模型是应用程序的主体部分…

Android模拟器的安装和adb连接

一、前置说明 APP 自动化可以使用真机进行测试,也可以使用模拟器来模拟安卓设备。我们可以根据个人喜好安装模拟器,个人推荐安装两款模拟器:网易 MuMu 模拟器、夜神模拟器。 MuMu模拟器可以支持 Android 12 版本,优点是&#xf…

【Hive_04】分区分桶表以及文件格式

1、分区表1.1 分区表基本语法(1)创建分区表(2)分区表读写数据(3)分区表基本操作 1.2 二级分区1.3 动态分区 2、分桶表2.1 分桶表的基本语法2.2 分桶排序表 3、文件格式与压缩3.1 Hadoop压缩概述3.2 Hive文件…

Android Studio各种Gradle常见报错问题及解决方案

大家好,我是咕噜铁蛋!在开发Android应用程序时,我们可能会遇到各种Gradle错误。这些错误可能来自不同的原因,例如依赖项问题、配置错误、版本冲突等。今天我通过搜索整理了一下,在这篇文章中,我将分享一些常…

HTML---网页布局

目录 文章目录 一.常见的网页布局 二.标准文档流 标准文档流常见标签 三.display属性 四.float属性 总结 一.常见网页布局 二.标准文档流 标准文档流常见标签 标准文档流的组成 块级元素<div>、<p>、<h1>-<h6>、<ul>、<ol>等内联元素<…

国内chatGPT3.5升级到chatGPT4.0的教程

1、准备一个3.5的账号 2、准备一个美元虚拟信用卡 这里默认您是有账号的 1、注册办理卡 2、按图片步骤就可以开卡成功 3、卡片cvc在卡中心cvc安全码里面 4、登录ChatGPT 第三步:升级 Plus 完成了上面步骤 小白朋友连账号都么有的&#xff0c;可以使用谷歌邮箱直接在open…

房顶漏水啦【算法赛】

问题描述 小蓝家的房顶是一个边长为 n 的正方形&#xff0c;可以看成是由 nn 个边长为 1 的小正方形格子组成。 从上到下第 i 行、从左到右第 j 列的格子用 (i,j) 表示。 小蓝的家由于年久失修&#xff0c;导致房顶有一些地方漏水。总共有 m 处漏水的地方&#xff0c;我们用…

K8s攻击案例:Privileged特权容器导致节点沦陷

01、概述 特权容器&#xff08;Privileged Container&#xff09;是一种比较特殊的容器&#xff0c;在K8s中运行特权容器&#xff0c;需要将 Privileged 设为 true &#xff0c;容器可以执行几乎所有可以直接在主机上执行的操作。 基于此&#xff0c;利用容器的特权配置可以获取…

Vue 实现响应式布局

实现响应式布局是工作中必不可少 客户需要 若是使用vue element ui 的方式实现 浏览器宽度为760的情况 浏览器宽度为360的情况 手机上的显示的情况 一、对于屏幕尺寸的定义 element UI参照Bootstrap的解决方案提供了五种屏幕大小尺寸&#xff1a;xs、sm、md、lg 和 xl。并对…

Vue+ElementUI+nodejs学生宿舍报修管理系统68ozj

本站是一个B/S模式系统&#xff0c;采用vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得学生宿舍信息管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中…

实用干货:公司规定所有接口都用 POST请求,为什么?

大家好&#xff0c;我是大澈&#xff01; 本文约1000字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

在k8s中使用Helm安装harbor并将Chart推送到私有仓库harbor

使用Helm安装harbor并将Chart推送到私有仓库harbor 注意&#xff1a;如果你的harbor是之前docker-compose安装的&#xff0c;还需要额外做一个动作&#xff0c;让它支持chart docker-compose stop ./install.sh --with-chartmuseum1&#xff09;下载harbor的chart包 Harbor的…

「数据结构」二叉树2

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;初阶数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 文章目录 &#x1f349;前言&#x1f349;链式结构&#x1f349;遍历二叉树&#x1f34c;前序遍历&#x1f34c;中序遍历&#x…

MySQL升级版本(Linux环境)

摘要 由于我们在做部署的时候会部署MySQL&#xff0c;但是版本可能各种各样&#xff0c;而且我们服务器会定期的进行漏洞扫描&#xff0c;因此我们在遇到MySQL的相关漏洞时&#xff0c;一般漏洞报告中会提示出解决方案&#xff0c;一般来时就是升级软件的版本&#xff0c;因此…

C# WPF上位机开发(从demo编写到项目开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 C# WPF编程&#xff0c;特别是控件部分&#xff0c;其实学起来特别快。只是后面多了多线程、锁、数据库、网络这部分稍微复杂一点&#xff0c;不过…

CAD制图

CAD制图 二维到三维 文章目录 CAD制图前言一、CAD制图二、机械设计三、二维图纸四、三维图纸总结前言 CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。 一、CAD制图 CAD(Computer-Aided Design)是利用计算机技术辅助进行设计…

欠采样对二维相位展开的影响

1.前言 如前所述&#xff0c;相位展开器通过计算两个连续样本之间的差来检测图像中包裹的存在。如果这个差值大于π或小于-π&#xff0c;则相位展开器认为在这个位置存在包裹。这可能是真正的相位包络&#xff0c;也可能是由噪声或采样不足引起的伪包络。 对欠采样的相位图像…

【自营版】物流系统+取件员收件员/运营级快递系统小程序源码

后端php前端原生小程序 mysql数据库 主要功能&#xff1a; 寄快递 查快递 多门店 市内取送 取件员中心在线接单 提前预约 也可 立即下单 门店入住 取件员入住

交叉熵损失(Cross-Entropy loss)

在处理机器学习或深度学习问题时&#xff0c;损失/成本函数用于在训练期间优化模型。目标几乎总是最小化损失函数。损失越低&#xff0c;模型越好。交叉熵损失是最重要的成本函数。它用于优化分类。对交叉熵的理解取决于对 Softmax 激活函数的理解。 一、softmax激活函数 激活…

屏幕颜色吸取器

前言 屏幕颜色吸取器。 前端工程师的福音&#xff0c;获取全屏幕上所有位置的颜色。 运行在window上的软件 屏幕颜色吸取器 前言1 下载解压2 使用 1 下载解压 下载地址&#xff1a;https://download.csdn.net/download/qq_44850489/11943229 下载下来之后解压 如下图&#…