【【FPGA 之 MicroBlaze XADC 实验】】

news/2025/2/13 21:38:37/

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.ppmy.cn/news/1257974.html

相关文章

Promise 和 Async/Await 到底有啥区别?

在 JavaScript 中&#xff0c;promise 和 async/await 是处理异步操作的两种不同方式。但它们是密切相关的。 promise 是最终导致异步操作完成或失败的对象。承诺可以处于以下三种状态之一&#xff1a;挂起、已履行或拒绝。异步操作完成后&#xff0c;承诺要么以值实现&#x…

QtCreator调试时遇到中文时会卡住

参考帖子&#xff1a; https://bbs.csdn.net/topics/604917742 例如&#xff1a; 1.代码中有中文 btn->setText("开始"); 2.注释中有中文 btn->setText("strart"); // 开始

每日一练 | 华为认证真题练习Day142

1、路由器的主要功能&#xff0c;以下说法错误的是&#xff1f;&#xff08;多选&#xff09; A. 通过多种协议建立路由表 B. 根据路由表指导数据转发 C. 根据收到数据包的源IP地址进行转发 D. 实现相同网段设备之间相互通信 2、管理员发现无法通过TFTP传输文件到华为AR200…

Hive_Spark_left()函数

在SQL中&#xff0c;LEFT()函数是一个字符串函数&#xff0c;用于从一个字符串的左侧开始提取指定数量的字符。这个函数通常接受两个参数&#xff1a; 第一个参数是要从中提取字符的字符串。 第二个参数指定要提取的字符数。 语法如下&#xff1a; LEFT(string_expression,…

Apache Hive3.1.3 遇到DATE_FORMAT转换2021年12月格式的问题

比如&#xff1a;需要将时间2021-12-28 00:00:00转换成2021-12的格式&#xff0c;用date_format会将2021-12转换成2022-12的问题。 解决方法&#xff1a; 方式一&#xff1a;大写的‘Y’换成‘y’ 方式二&#xff1a;字符串截取&#xff0c;substr 本博主推荐方式一&#xf…

TensoRF: Tensorial Radiance Fields

TensoRF: Tensorial Radiance Fields TensoRF是ECCV2022一个非常有特色的工作。作者在三维场景表示中引入张量分解的技术&#xff0c;将4D张量分解成多个低秩的张量分量&#xff0c;实现更好的重建质量、更快的重建速度、更小的模型体积。 文章目录 TensoRF: Tensorial Radian…

【Classic Chinese】

Classic Culture Poetry Poetry 偈一 唐 . 惠能 菩提本无树&#xff0c;明镜亦非台&#xff1b;本来无一物&#xff0c;何处惹尘埃&#xff1f;

vue创建项目,使用可视化界面安装插件

安装项目&#xff1a; vue create vue-app 选择默认配置就行&#xff0c;也可以按需选择自定义配置 vue ui通过可视化管理项目 通过可视化安装全家桶插件