【【FPGA 之 MicroBlaze XADC 实验】】

FPGA 之 MicroBlaze XADC 实验

Vivado IP 核提供了 XADC 软核,XADC 包含两个模数转换器(ADC),一个模拟多路复用器,片上温度和片上电压传感器等。我们可以利用这个模块监测芯片温度和供电电压,也可以用来测量外部的模拟电压信号。

7 系列的 XADC IP 核包括两个 12 位的模数转换器,转换速率可以达到 1MSPS(每秒一百万次采样)。它带有片上温度和电压传感器,可以测量芯片工作时的温度和供电电压。用户可以设置报警阈值,用来检测温度过高或者供电电压异常等事件。除此之外,通过 XADC IP 核内部的模拟多路复用器,它支持最多 17路外部模拟输入信号的测量,且支持单极、双极和差分等信号类型。
XADC内部结构
在这里插入图片描述

左边红框圈 1 的,共十七组差分信号,这些端口也可接收单端信号,其中一对 VP/N_0 为专用的模拟差分输入,其他 16 对为复用的,不使用时可作为普通的管脚。最上边红框 2,表明 XADC 模块也可采集片上传感器测量到的芯片温度、供电电压等信息;右边红框圈 3,是两个 12 位的模数转换器。XADC 采集转换后的数据存储在状态寄存器的专用寄存器内,可由 FPGA 内部动态配置端口(DRP----Dynamic Reconfiguration Port)的 16 位同步读/写端口访问;ADC 的转换数据也可以由 JTAG 访问,当使用这种方式时,并不需要直接去例化 XADC 模块,因为这是一个已经存在与 FPGA JTAG 结构的专用接口,此时因为没有在设计中直接例化 XADC 模块,故 XADC IP 核工作在一种预先定义好的模式即缺省模式,此模式下 XADC IP 核专用于监视芯片上的供电电压和芯片温度。以上是对 XADC IP 核的简介。

看了一圈XADC 没太看懂 但是 不重要 因为我是复制粘贴的 只要了解 大概怎么用的就好了

实验任务 : 本章的实验任务是通过 AXI 接口读取 XADC 测量的芯片温度、供电电压等信息,并通过串口打印出来。

我们研究一下这里的系统框图
在这里插入图片描述

CPU 通过 AXI 接口直接读取 XADC 模块采集的温度和电压数据,然后通过串口打印出来。
在这里插入图片描述

下面展示Block Design
在这里插入图片描述

下面 展示 完整的在 vitis 下的 C语言代码

#include "xsysmon.h"
#include "xparameters.h"
#include "xstatus.h"
#include "stdio.h"
#include "sleep.h"
//XADC ID
#define SYSMON_DEVICE_ID XPAR_SYSMON_0_DEVICE_ID
static XSysMon SysMonInst; //XADC 驱动实例
int SysMonFractionToInt(float FloatNum);
int main(void){
XSysMon_Config *ConfigPtr;
u32 TempRawData; //温度 原始数据
u32 VccAuxRawData; //辅助电压 原始数据
u32 VccIntRawData; //内核电压 原始数据
u32 VccBRAMdata; //BRAM 电压 原始数据
float TempData; //温度
float VccAuxData; //辅助电压
float VccIntData; //内核电压
float VBRAM; //BRAM 电压
float MaxData; //最大值
float MinData; //最小值
//初始化 XADC 器件
ConfigPtr = XSysMon_LookupConfig(SYSMON_DEVICE_ID);
if (ConfigPtr == NULL) {
return XST_FAILURE;
}
XSysMon_CfgInitialize(&SysMonInst, ConfigPtr, ConfigPtr->BaseAddress);
//默认安全模式
XSysMon_SetSequencerMode(&SysMonInst, XSM_SEQ_MODE_SAFE);
//使能的相应的通道
XSysMon_SetSeqChEnables(&SysMonInst,XSM_SEQ_CH_TEMP| //温度
XSM_SEQ_CH_VCCINT | //内核电压
XSM_SEQ_CH_VCCAUX| //辅助电压
XSM_SEQ_CH_VBRAM //BRAM 电压
);
//设置为循环模式
XSysMon_SetSequencerMode(&SysMonInst,XSM_SEQ_MODE_CONTINPASS);
while(1){
//读取温度
TempRawData = XSysMon_GetAdcData(&SysMonInst, XSM_CH_TEMP);
TempData = XSysMon_RawToTemperature(TempRawData);
xil_printf("\r\nThe Current Temperature is %0d.%03d Centigrades.\r\n",
(int)(TempData), SysMonFractionToInt(TempData));
//读取最大温度
TempRawData = XSysMon_GetMinMaxMeasurement(&SysMonInst, XSM_MAX_TEMP);
MaxData = XSysMon_RawToTemperature(TempRawData);
xil_printf("The Maximum Temperature is %0d.%03d Centigrades. \r\n",
(int)(MaxData), SysMonFractionToInt(MaxData));
//读取最小温度
TempRawData = XSysMon_GetMinMaxMeasurement(&SysMonInst, XSM_MIN_TEMP);
MinData = XSysMon_RawToTemperature(TempRawData);
xil_printf("The Minimum Temperature is %0d.%03d Centigrades. \r\n",
(int)(MinData), SysMonFractionToInt(MinData));
//读取核心电压
VccIntRawData = XSysMon_GetAdcData(&SysMonInst, XSM_CH_VCCINT);
VccIntData = XSysMon_RawToVoltage(VccIntRawData);
xil_printf("The Current VCCINT is %0d.%03d Volts. \r\n",
(int)(VccIntData), SysMonFractionToInt(VccIntData));
//读取辅助器电
VccAuxRawData = XSysMon_GetAdcData(&SysMonInst,XSM_CH_VCCAUX );
VccAuxData = XSysMon_RawToVoltage(VccAuxRawData);
xil_printf("The Current VCCAUX is %0d.%03d Volts. \r\n",
(int)(VccAuxData), SysMonFractionToInt(VccAuxData));
//读取 BRAM 电压
VccBRAMdata = XSysMon_GetAdcData(&SysMonInst,XSM_CH_VCCAUX );
VBRAM = XSysMon_RawToVoltage(VccBRAMdata);
xil_printf("The Current VBRAM is %0d.%03d Volts. \r\n",
(int)(VBRAM), SysMonFractionToInt(VBRAM));
sleep(1);
}
return 0;
}
int SysMonFractionToInt(float FloatNum)
{
float Temp;
Temp = FloatNum;
if (FloatNum < 0) {
Temp = -(FloatNum);
}
//将浮点数线束部分扩大 1000 倍,以便打印
return( ((int)((Temp -(float)((int)Temp)) * (1000.0f))));
}

下面对C语言代码进行细致的分析
我从完整的c语言开始分析 希望能有所感悟

就当是我们自己在做这个东西
按照惯例 写下我们的头文件
在这里插入图片描述

#include "xparameters.h"
#include "stdio.h"

这是给我们印象最深的两项了
对此我们先搁置 一下
处理下面的事项
在这里插入图片描述

下一步按照惯例设定 XDC的ID 序号 来自 xparameters
在这里插入图片描述

然后我们想我们使用xdc 添加一个xdc驱动实例
它前缀设置了static 静态变量的形式
XSysMon 来自 一个新的.h 文件 头文件内记得加入
在这里插入图片描述

这个结构体的意思是

typedef struct {
XSysMon_Config Config;    /< XSysMon_Config of current device */u32  IsReady;        /< Device is initialized and ready  */
u32  Mask;        /**< Store the previously written value
in CONVST register */
} XSysMon;

驱动程序的实例数据。用户需要分配一个变量
*用于系统中的每个系统监视器/ADC设备。指向的指针
*然后将这种类型的变量传递给驱动程序API函数。
*/

下面一句话是声明函数 我们不看 进入主函数
在这里插入图片描述

我们会发现 其实 这个 XSysMon_Config 是来自于 XSysMon.h的 是 上面显示的结构体的一部分

typedef struct {
u16  DeviceId;        /< Unique ID of device */UINTPTR  BaseAddress;    /< Device base address */
int  IncludeInterrupt;     /< Supports Interrupt driven mode */u8   IpType;        /< 1 - System Management */
/**< 0 - XADC/System Monoitor */
} XSysMon_Config;

接下来进行初始化
在这里插入图片描述

其实真正的初始化是 第35行的这句话
但是我们看看30行这句话
XSysMon_LookupConfig 这个函数 后面带有ID 就是先查找这个XDC ID是否存在 然后它下面马上跟了一句 不存在return 什么 就是这样

OK 我们接下来看35行的函数
XSysMon_CfgInitialize 从名字上我们就可以看出是初始化XDC的意思 具体分析下 用到了什么参数
我们索引进去会得到这样的原函数

int XSysMon_CfgInitialize(XSysMon *InstancePtr, XSysMon_Config *ConfigPtr,UINTPTR EffectiveAddr)

InstancePtr is a pointer to the XSysMon instance. 第一句是指向实例的指针
就是我们在上面定义的 驱动示例
下一句是ConfigPtr指向XSysMon设备配置结构。 指向了我们在主函数定义的结构体
第三句指的是 设备的基地址 正好来自于我们的上一个结构体中的内容

初始化完毕之后 我们设定进入安全模式
在这里插入图片描述

大概懂了

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

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

相关文章

【五分钟】熟练使用np.interp函数函数(干货!!!)

引言 np.interp函数可对一维数组进行线性插值。具体来说&#xff0c;如果已知xp和yp&#xff0c;并且xp和yp具有确定的对应关系(比如ypsin(xp))&#xff0c;那么对于新的一维数组x&#xff0c;可通过np.interp函数得到数组y&#xff0c;y是基于 xp和yp的映射关系 通过【线性插…

Spring之AOP理解与应用

1. AOP的认识 面向切面编程&#xff1a;基于OOP基础之上新的编程思想&#xff0c;OOP面向的主要对象是类&#xff0c;而AOP面向的主要对象是切面&#xff0c;在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点&#xff0c;AOP提供了非常强…

面了一个测试工程师要求月薪26K,总感觉他背了很多面试题

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

Nacos 安装下载

Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在国内受欢迎程度较高。 1、Windows安装 开发阶段采用单机安装即可 1.1 下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nac…

uniapp到底用什么ui框架最合适-关于uni-app的ui库、ui框架、ui组件

文章目录 直接看答案关于uni-app的ui库、ui框架、ui组件组件的概念扩展组件的选择uni ui如何使用uni ui 综上&#xff0c;官方对组件的使用建议是&#xff1a;附录&#xff1a;其他全端兼容ui库参考文章&#xff1a; 直接看答案 如果想自己纯手写&#xff0c;直接用内置组件。…

it统一运维平台怎么样?有可以推荐的品牌吗?

随着互联网化&#xff0c;随着信息化的不断发展&#xff0c;企业IT系统的规模和复杂性也在日益增加。在这个背景下&#xff0c;IT统一运维平台就应用而生了。它以一种全面、集成的方式管理企业IT资源&#xff0c;从而提高效率、降低成本、改善服务&#xff0c;为企业提供更快更…

「词令」2023年12月5日支付宝蚂蚁庄园今日问题答案是什么?12.5蚂蚁庄园今日问题正确答案

问题&#xff1a;我国哪个城市有“四面荷花三面柳&#xff0c;一城山色半城湖”的美誉&#xff1f; 选项&#xff1a;A、济南 B、泉州 答案&#xff1a;济南 解析&#xff1a;一城山色&#xff1a;千佛山在城南&#xff0c;为附近最高的山&#xff0c;全城人都能看到它苍翠的…

Linux last命令教程:如何查看用户的登录和注销历史(附案例详解和注意事项)

Linux last命令介绍 last命令在Linux中用于显示自文件/var/log/wtmp创建以来所有用户的登录和注销列表。可以给出一个或多个用户名作为参数&#xff0c;以显示他们的登录&#xff08;和注销&#xff09;时间和主机名。 Linux last命令适用的Linux版本 last命令在大多数Linux…

Comprehension from Chaos: Towards Informed Consent for Private Computation

目录 笔记后续的研究方向摘要引言 Comprehension from Chaos: Towards Informed Consent for Private Computation CCS 2023 笔记 本文探讨了用户对私有计算的理解和期望&#xff0c;其中包括多方计算和私有查询执行等技术。该研究进行了 22 次半结构化访谈&#xff0c;以调查…

14、SQL注入——HTTP文件头注入

文章目录 一、HTTP Header概述1.1 HTTP工作原理1.2 HTTP报文类型1.3 较重要的HTTP Header内容 二、HTTP Header注入2.1 HTTP Header注入的前提条件2.2 常见的HTTP Header注入类型 一、HTTP Header概述 1.1 HTTP工作原理 1.2 HTTP报文类型 &#xff08;1&#xff09;请求报文 …

软件设计模式原则(五)接口隔离原则

顾名思义&#xff0c;该原则说的是&#xff1a;客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。 一.定义 核心思想&#xff1a; 使用多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖性应当是建立在最小的接口上的。一个接口…

博客文章SEO:提升博客排名和吸引更多读者的方法来啦!

互联网发展到现在&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;一直发挥着不可替代的作用。搜索引擎的流量往往更加定向&#xff0c;来自搜索引擎的流量转化率更高&#xff0c;可以帮助企业更好地实现销售和推广目标。因此&#xff0c;通过合理的SEO策略&#xff0c;你…

市场调研:中国南美白对虾养殖面积达到17.75万公顷

南美白对虾(学名:Litopenaeus Vannamei )是对虾科、滨对虾属动物。成体最长达23厘米&#xff0c;甲壳较薄&#xff0c;正常体色为青蓝色或浅青灰色&#xff0c;全身不具斑纹。步足常呈白垩状&#xff0c;故有白肢虾之称。南美白对虾额角尖端的长度不超出第1触角柄的2节&#xf…

从浅入深掌握进阶结构体(C语言)

前言 这一期我们将继续讲解结构体的知识&#xff0c;还没有看过上一期的小伙伴一定要赶紧去学习哦。 上一期&#xff0c;冲鸭&#xff01; 那么话不多说我们开始今天的学习吧&#xff01; 文章目录 1,结构体的自引用2,匿名结构体3,位段4,结构体的传参5,尾声 1,结构体的自引用 …

基因组注释流程

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 详细教程请访问&#xff1a; 组学分析流程 本期分析流程 Hisat2-SamtoolsTrinity_GG_denovoPASA … 本期教程文章 题目&#xff1a;Genomic insights into local adaptation and future climate-induced vu…

FastAPI与BaseModel

from typing import Optionalfrom fastapi import FastAPI from pydantic import BaseModel #当一个模型属性具有默认值时&#xff0c;它不是必需的。否则它是一个必需属性。将默认值设为 None 可使其成为可选属性 app FastAPI() class Item(BaseModel):name:str #没有初始值都…

linux 安装 Apache 服务 并部署网站

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 写在前面 哈喽大家我是网络豆&#xff0c;本章将会…

数据结构—二叉树

文章目录 10.二叉树(1).二叉树的基本概念(2).遍历#1.前序遍历#2.中序遍历#3.后序遍历#4.非递归中序遍历 (3).中序前/后序建树#1.中序前序遍历建树#2.中序后序遍历建树 (4).递归和二叉树基本操作#1.求树高#2.求结点数#3.求叶子结点数#4.复制树#5.判断两棵树是否相等 (5).特殊二叉…

零信任组件和实施

零信任是一种安全标准&#xff0c;其功能遵循“从不信任&#xff0c;始终验证”的原则&#xff0c;并确保没有用户或设备受信任&#xff0c;无论他们是在组织网络内部还是外部。简而言之&#xff0c;零信任模型消除了信任组织安全边界内任何内容的概念&#xff0c;而是倡导严格…

操作系统复习总结——文件管理

&#x1f525;博客主页&#xff1a;真的睡不醒 &#x1f680;系列专栏&#xff1a;深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发 &#x1f498;每日语录&#xff1a;但愿每次回忆&#xff0c;对生活都不感到负疚。 &#x1f389;感谢大家点赞…