![在这里插入图片描述](https://img-blog.csdnimg.cn/dd52357779354b1caeb8d0b78bcab406.png)
上图所示,XADC 属于 PL部分的资源
XADC是一种硬逻辑实现,位于PL功率域。PS- xadc接口是PS的一部分,可以被PS APU访问,而不需要对PL进行编程。PL必须上电才能配置PS-XADC接口、使用PL- jtag或DRP接口以及操作XADC。
![在这里插入图片描述](https://img-blog.csdnimg.cn/3869f9c7995e4218b9d350f20d9e660c.png)
上面的机构图能够很清楚的表达XADC的互联结构和接口。
PS有两个接口可以访问XADC,一个是CPU通过APB ARM 的高速外设总线访问PS-XADC接口通过串行数据访问XADC。一个是AXI GP,必须通过AXI XADC IP Core访问,MISC高速接口。
JTAG和ABP接口公用通道,对XADC进行访问。
XADC可以采集的信号有内部温度传感器,内部电压信号。通过PL PIN接入的外部电压信号,PL PIN的指定需要PL 侧的配置(引脚分配就会产生Bitstream文件)。
![在这里插入图片描述](https://img-blog.csdnimg.cn/307c100b04b44b96806360235128962b.png)
XADC内部框图,有两个ADC 转换器,通过多路复用器采集不同端口的电压。
芯片硅片温度传感器和内部电源都连接到了ADC A上。ADC A/B通过复用器连接到外部模拟输入。
转换结果都存储在 Status Registers 中,64*16bit,通过DRP接口只读。
控制寄存器是可读可写通过DRP接口访问。
所有XADC专用引脚都位于BANK 0中 _0后缀的引脚
只要是ADC就必须关注参考电压。![在这里插入图片描述](https://img-blog.csdnimg.cn/7fab6583316f4ab4baa8aed7fe597947.png)
Vccadc 是ADC转换器内核的供电电源,使用Vccaux 1.8v供电。
参考电压的供给可以选择片外,1.25V供电,精度和温度偏移的性能可以做到很好。
右图是使用内部参考电压,需要把Vrefp接地。
UG480 P16 介绍了ADC相关引脚的说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/2ac5e36a7fe4499ba996acc70e300539.png)
电源和地主要是ADC转换器的供电引脚,就算没有使用XADC也应该确保连接上1.8和地。
![在这里插入图片描述](https://img-blog.csdnimg.cn/0579aa14ac6d4214bccfc475d80e1682.png)
参考电压如上图所示
Xilinx 官方开发板ZC702
参考电压通过REF3012基准电压芯片提供。
![在这里插入图片描述](https://img-blog.csdnimg.cn/8d646aec9a4e4cc9b7ad1581e15732c4.png)
模拟电压输入引脚如下所示![在这里插入图片描述](https://img-blog.csdnimg.cn/36d0f8a036374589bb7c2f294efbaa18.png)
ZC702
![在这里插入图片描述](https://img-blog.csdnimg.cn/6b21dbdd809541449d81d10ee2527807.png)
采样模式 有很多种,大体和MCU 片载ADC一样。
在开发XADC前,梳理一偏基本思路
1.XADC同普通ADC一样只是具有特殊的接口
2.XADC供电电源和参考电压按照UG480 进行配置
3.了解硬件电路板上,XADC的电路连接情况。
然后开始XADC的软件开发
![在这里插入图片描述](https://img-blog.csdnimg.cn/def2e2f7813b4d04a3c6f89027eb12de.png)
如前所述,不需要在设计中实例化XADC来访问片上监视功能。但是,如果XADC在设计中没有实例化,那么访问该信息的唯一方法是通过JTAG测试访问端口(TAP)。为了允许从FPGA逻辑访问状态寄存器(测量结果),必须实例化XADC
XADC 实验
![在这里插入图片描述](https://img-blog.csdnimg.cn/195b1fd6e37b4e8188ffb1ec0e399d67.png)
main函数部分
int main(void)
{
int Status;
Status = XAdcPolledPrintfExample(XADC_DEVICE_ID);
if (Status != XST_SUCCESS) {
xil_printf("adcps polled printf Example Failed\r\n");
return XST_FAILURE;
}
xil_printf("Successfully ran adcps polled printf Example\r\n");
return XST_SUCCESS;
}
获取XADC实体地址 XAdcInstPtr
ConfigPtr = XAdcPs_LookupConfig(XAdcDeviceId);
if (ConfigPtr == NULL) {
return XST_FAILURE;
}
XAdcPs_CfgInitialize(XAdcInstPtr, ConfigPtr,
ConfigPtr->BaseAddress);
Status = XAdcPs_SelfTest(XAdcInstPtr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
设置ADC的采样工作模式
XAdcPs_SetSequencerMode(XAdcInstPtr, XADCPS_SEQ_MODE_SAFE);
#define XADCPS_SEQ_MODE_SAFE 0
#define XADCPS_SEQ_MODE_ONEPASS 1
#define XADCPS_SEQ_MODE_CONTINPASS 2
#define XADCPS_SEQ_MODE_SINGCHAN 3
#define XADCPS_SEQ_MODE_SIMUL_SAMPLING 4
#define XADCPS_SEQ_MODE_INDEPENDENT 8
获取通道ADC值,下面看到有内部通道,还有外部16~31 通道
TempRawData = XAdcPs_GetAdcData(XAdcInstPtr, XADCPS_CH_TEMP);
#define XADCPS_CH_TEMP 0x0
#define XADCPS_CH_VCCINT 0x1
#define XADCPS_CH_VCCAUX 0x2
#define XADCPS_CH_VPVN 0x3
#define XADCPS_CH_VREFP 0x4
#define XADCPS_CH_VREFN 0x5
#define XADCPS_CH_VBRAM 0x6
#define XADCPS_CH_SUPPLY_CALIB 0x07
#define XADCPS_CH_ADC_CALIB 0x08
#define XADCPS_CH_GAINERR_CALIB 0x09
#define XADCPS_CH_VCCPINT 0x0D
#define XADCPS_CH_VCCPAUX 0x0E
#define XADCPS_CH_VCCPDRO 0x0F
#define XADCPS_CH_AUX_MIN 16
#define XADCPS_CH_AUX_MAX 31
后面的部分没有什么好讲解的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)