【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.hqwc.cn/news/297174.html

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

相关文章

蓝桥小课堂-平方和【算法赛】

问题描述 蓝桥小课堂开课啦! 平方和公式是一种用于计算连续整数的平方和的数学公式。它可以帮助我们快速求解从 1 到 n 的整数的平方和,其中 n 是一个正整数。 平方和公式的表达式如下: 这个公式可以简化计算过程,避免逐个计算…

指标体系构建-03-交易型的数据指标体系

参考: 本文参考 1.接地气的陈老师的数据指标系列 2.科普 | 零售行业的数据指标体系及其含义、应用阶段 3.”人货场”模型搞懂没?数据分析大部分场景都能用! 4.一分钟读懂广告投放各计费CPM、CPC等(公式推导干货) 5.AA…

用友时空KSOA UploadImage任意文件上传漏洞

漏洞描述 用友时空 KSOA 是根据流通企业前沿的IT需求推出的统的IT基础架构,它可以让流通企业各个时期建立的 IT 系统之间彼此轻松对话。由于用友时空设备开放了文件上传功能,但未鉴权且上传的文件类型、大小、格式、路径等方面进行严格的限制和过滤&…

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。…

Linux安装及管理程序

一、Linux应用程序管理 1、应用程序与系统命令的关系 1.对比系统命令和应用程序的不同 位置: Linux中一切皆为文件 演示内部命令和外部命令 位置 应用程序位置 用途: 命令主要处理系统的基本操作(复制,配置) 应用程…

前端未死,顺势而生

随着人工智能和低代码的崛起,“前端已死”的声音逐渐兴起。前端已死?尊嘟假嘟?快来发表你的看法吧! 一、“前端已死”因何而来? 在开始讨论之前,首先要明确什么是“前端”。 所谓前端,主要涉及…

CentOS7.6安装Redis6.2.6

Redis安装说明 大多数企业都是基于Linux服务器部署项目,且Redis官方也没有提供Windows版本安装包。因此我们会基于Linux系统来安装Redis.此处选择Linux版本为CentOS 7.6 Redis的官方网站地址:https://redis.io/ 1.单机安装Redis 1.1.安装Redis依赖 …

Unity与Android交互(双端通信)

前言 最近小编开始做关于手部康复的项目,需要Android集成Unity,以Android为主,Unity为辅的开发;上一篇给大家分享了Unity嵌入Android的操作过程,所以今天想给大家分享一下双端通信的知识; 一. Android与Un…

mysql原理--连接查询的成本

1.准备工作 连接查询至少是要有两个表的,只有一个 single_table 表是不够的,所以为了故事的顺利发展,我们直接构造一个和 single_table 表一模一样的 single_table2 表。为了简便起见,我们把 single_table 表称为 s1 表&#xff0…

【动态规划】斐波那契数列模型

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 前言 算法原理 1.状态表示 是什么?dp表(一维数组…

[deepspeed]deepspeed安装和测试代码

deepspeed官方对linux系统支持非常好,安装流程较为简单,推荐使用linux系统使用deepspeed.deepspeed由于要使用大模型进行训练和推理,建议显存>24GB。windows上官方不直接支持,但是网上有安装whl文件,只能0.8.3这样老…

Go自定义PriorityQueue优先队列使用Heap堆

题目 分析 每次找最大的,pop出来 然后折半,再丢进去 go写法 go如果想用heap,要实现less\len\swap\push\pop 但可以偷懒,用sort.IntSlice,已经实现了less\len\swap 但由于目前是大根堆,要重写一下less 因此&#xff…