【【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.rhkb.cn/news/211004.html

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

相关文章

在AWS Lambda上部署标准FFmpeg工具——自定义层的方案

大纲 1 确定Lambda运行时环境1.1 Lambda系统、镜像、内核版本1.2 运行时1.2.1 Python1.2.2 Java 2 打包FFmpeg3 创建Lambda的Layer4 测试4.1 创建Lambda函数4.2 附加FFmpeg层4.3 添加测试代码4.4 运行测试 参考文献 FFmpeg被广泛应用于音/视频流处理领域。对于简单的需求&#…

sizeof()、strlen()、length()、size()的区别(笔记)

​ 上面的笔记有点简陋&#xff0c;可以看一下下面这个博主的&#xff1a; c/c中sizeof()、strlen()、length()、size()详解和区别_csize,sizeof,length_xuechanba的博客-CSDN博客

Linux Docker 图形化工具 Portainer远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 结束语 前言 Portainer是一个轻量级的容器管理工具&#xff0c;可以通过Web界面对Docker容器进行管理和监控。它提供了…

Kafka中的Topic

在Kafka中&#xff0c;Topic是消息的逻辑容器&#xff0c;用于组织和分类消息。本文将深入探讨Kafka Topic的各个方面&#xff0c;包括创建、配置、生产者和消费者&#xff0c;以及一些实际应用中的示例代码。 1. 介绍 在Kafka中&#xff0c;Topic是消息的逻辑通道&#xff0…

LeetCode-478. 在圆内随机生成点【几何 数学 拒绝采样 随机化】

LeetCode-478. 在圆内随机生成点【几何 数学 拒绝采样 随机化】 题目描述&#xff1a;解题思路一&#xff1a;一个最简单的方法就是在一个正方形内生成随机采样的点&#xff0c;然后拒绝不在内切圆中的采样点。解题思路二&#xff1a;具体思想是先生成一个0到r的随机数len&…

加强网站稳定性!学习如何进行高效压力测试!

前言 1、什么是压力测试&#xff1f; 软件压力测试是一种基本的质量保证行为&#xff0c;它是每个重要软件测试工作的一部分。 软件压力测试的基本思路很简单&#xff1a;不是在常规条件下运行手动或自动测试&#xff0c;而是在计算机数量较少或系统资源匮乏的条件下运行测试…

k8s之镜像拉取时使用secret

k8s之secret使用 一、说明二、secret使用2.1 secret类型2.2 创建secret2.3 配置secret 一、说明 从公司搭建的网站镜像仓库&#xff0c;使用k8s部署服务时拉取镜像失败&#xff0c;显示未授权&#xff1a; 需要在拉取镜像时添加认证信息. 关于secret信息,参考: https://www.…

AntDesignBlazor示例——创建项目

本示例是AntDesign Blazor的入门示例&#xff0c;在学习的同时分享出来&#xff0c;以供新手参考。 示例代码仓库&#xff1a;https://gitee.com/known/AntDesignDemo 1. 开发环境 VS2022 17.8.2.NET8AntDesign 0.16.2 2. 学习目标 创建新项目安装AntDesign组件包及使用方…

2D与3D图形的基本变换

1. 2d transformations 1.1缩放(Scaling) 其实这个转换非常简单&#xff0c;如图所示就是把x与y进行s倍的缩放&#xff0c;而我们图中的这个矩阵正好满足这一算法。 1.2镜像(Reflection) 这个镜像变换可以和上面的做类比&#xff0c;简单看一下就行。 1.3错切(Shearing) 当然…

《数据结构、算法与应用C++语言描述》-线索二叉树的定义与C++实现

_23Threaded BinaryTree 可编译运行代码见&#xff1a;GIithub::Data-Structures-Algorithms-and-Applications/_24Threaded_BinaryTree 线索二叉树定义 在普通二叉树中&#xff0c;有很多nullptr指针被浪费了&#xff0c;可以将其利用起来。 首先我们要来看看这空指针有多少…

单片机怎么实现真正的多线程?

单片机怎么实现真正的多线程? 不考虑多核情况时&#xff0c;CPU在一个时间点只能做一件事&#xff0c;因为切换的速度快所以看起来好像是同时执行多个线程而已。 实际上就是用定时器来做时基&#xff0c;以时间片的方式分别执行来实现的&#xff0c;只不过实现起来细节比较复…

C语言--每日选择题--Day37

第一题 1. 有以下说明语句&#xff1a;则下面引用形式错误的是&#xff08;&#xff09; struct Student {int num;double score; };struct Student stu[3] {{1001,80}, {1002,75}, {1003,91}} struct Student *p stu; A&#xff1a;p->num B&#xff1a;(p).num C&#…

LeetCode:2477. 到达首都的最少油耗(DFS C++、Java)

目录 2477. 到达首都的最少油耗 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 2477. 到达首都的最少油耗 题目描述&#xff1a; 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 到 n…

1-4节电池升降压充电IC解决方案

描述 MP2760是一款集成窄电压DC&#xff08;NVDC&#xff09;电源路径管理功能和USB On-the-Go(OTG)功能的升降压充电IC&#xff0c;兼容USB PD&#xff0c;适用于单节至4节串联的电池包应用。该芯片的充电输入电压范围广&#xff0c;可支持最高22V。 当启用电池放电模式&…

线性可分SVM摘记

线性可分SVM摘记 0. 线性可分1. 训练样本到分类面的距离2. 函数间隔和几何间隔、(硬)间隔最大化3. 支持向量 \qquad 线性可分的支持向量机是一种二分类模型&#xff0c;支持向量机通过核技巧可以成为非线性分类器。本文主要分析了线性可分的支持向量机模型&#xff0c;主要取自…

企业级SQL开发:如何审核发布到生产环境的SQL性能

自从上世纪 70 年代数据库开始普及以来&#xff0c;DBA 们就不停地遭遇各种各样的数据库管理难题&#xff0c;其中最为显著的&#xff0c;可能就是日常的开发任务中&#xff0c;研发人员们对于核心库进行变更带来的一系列风险。由于针对数据库的数据变更是一项非常常见的任务&a…

对抗生成网络-G与D的loss异常问题

我最近在**使用DCGAN训练个人的数据集**时&#xff0c;出现了D loss 下降趋于0&#xff0c;但是G loss 却不停上升。我总结了一下几点原因&#xff1a; 生成器损失为1或者大于1通常表明生成器的训练可能存在问题&#xff0c;这可能是由于训练不稳定、超参数设置不当或网络结构问…

基于阿里云服务网格流量泳道的全链路流量管理(一):严格模式流量泳道

作者&#xff1a;尹航 概述 灰度发布是一种常见的对新版本应用服务的发布手段&#xff0c;其特点在于能够将流量在服务的稳定版本和灰度版本之间时刻切换&#xff0c;以帮助我们用更加可靠的方式实现服务的升级。在流量比例切换的过程中&#xff0c;我们可以逐步验证新版本服…

【网络奇缘】- 如何自己动手做一个五类|以太网|RJ45|网络电缆

​ ​ &#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 本篇文章关于计算机网络的动手小实验---如何自己动手做一个网线&#xff0c; 也是为后面的物理层学习进…

C# WPF上位机开发(图形显示软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在实际应用中&#xff0c;有一种情况就是&#xff0c;我们需要经常对数据进行图形化显示&#xff0c;这样会比较直观一点。比如经济统计里面的同比…