本次实验的目的,借助zynq的内嵌XADC(anolag-digital converter)来采集zynq内部的一些参数。
(1)创建vivado工程以及block design
(2)配置PS端(时钟与DDR),添加XADC ip(XADC无需任何配置)
run connection automation(自动连接)
(3)generation output products
(4)creat HDL wrapper
(5)生成bit文件
加载到SDK中
(6)创建一个新的工程,以及加入main.c
其中main.c 如下所示:
#include <stdio.h>
//#include "platform.h"
#include "xadcps.h"
#include "xil_types.h"
#define XPAR_AXI_XADC_0_DEVICE_ID 0
//void print(char *str);
static XAdcPs XADCMonInst;
int main()
{
XAdcPs_Config *ConfigPtr;
XAdcPs *XADCInstPtr = &XADCMonInst;
//指针实例,XADC的ps配置(使用结构体)
//status of initialisation
int Status_ADC;
//temperature readings
u32 TempRawData;
float TempData;
//Vcc Int readings 内部PL核心电压
u32 VccIntRawData;
float VccIntData;
//Vcc Aux readings 辅助PL电压
u32 VccAuxRawData;
float VccAuxData;
//Vbram readings PL BRAM电压
u32 VBramRawData;
float VBramData;
//VccPInt readings PS内部核心电压
u32 VccPIntRawData;
float VccPIntData;
//VccPAux readings PS辅助电压
u32 VccPAuxRawData;
float VccPAuxData;
//Vddr readings DDR RAM的工作电压
u32 VDDRRawData;
float VDDRData;
// init_platform();
//printf("Adam Edition MicroZed Using Vivado How To Printf \n\r");
printf("新年快乐~~!!!\n\r");
//XADC initilization
//XAdcPs_LookupConfig 是xilinx官方提供查找配置的函数
ConfigPtr = XAdcPs_LookupConfig(XPAR_AXI_XADC_0_DEVICE_ID);
if (ConfigPtr == NULL) {
return XST_FAILURE;
}
//XAdcPs_CfgInitialize 是xilinx官方初始化xadc的函数
Status_ADC = XAdcPs_CfgInitialize(XADCInstPtr,ConfigPtr,ConfigPtr->BaseAddress);
if(XST_SUCCESS != Status_ADC){
print("ADC INIT FAILED\n\r");
return XST_FAILURE;
}
//self test(自检)
Status_ADC = XAdcPs_SelfTest(XADCInstPtr);
if (Status_ADC != XST_SUCCESS) {
return XST_FAILURE;
}
//stop sequencer XAdcPs_SetSequencerMode设置采样模式
XAdcPs_SetSequencerMode(XADCInstPtr,XADCPS_SEQ_MODE_SINGCHAN);
//disable alarms XAdcPs_SetAlarmEnables设置采样值报警,直接关闭
XAdcPs_SetAlarmEnables(XADCInstPtr, 0x0);
//configure sequencer to just sample internal on chip parameters XAdcPs_SetSeqInputMode 设置输入模式
XAdcPs_SetSeqInputMode(XADCInstPtr, XADCPS_SEQ_MODE_SAFE);
//configure the channel enables we want to monitor XAdcPs_SetSeqChEnables 使能采样通道
XAdcPs_SetSeqChEnables(XADCInstPtr,XADCPS_CH_TEMP|XADCPS_CH_VCCINT|XADCPS_CH_VCCAUX|XADCPS_CH_VBRAM|XADCPS_CH_VCCPINT| XADCPS_CH_VCCPAUX|XADCPS_CH_VCCPDRO);
//死循环
while(1)
{
TempRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_TEMP);
TempData = XAdcPs_RawToTemperature(TempRawData);
printf("Raw Temp %lu Real Temp %f \n\r", TempRawData, TempData);
VccIntRawData= XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCINT);
VccIntData = XAdcPs_RawToVoltage(VccIntRawData);
printf("Raw VccInt %lu Real VccInt %f \n\r", VccIntRawData,VccIntData);
VccAuxRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCAUX);
VccAuxData = XAdcPs_RawToVoltage(VccAuxRawData);
printf("Raw VccAux %lu Real VccAux %f \n\r", VccAuxRawData,VccAuxData);
VBramRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VBRAM);
VBramData = XAdcPs_RawToVoltage(VBramRawData);
printf("Raw VccBram %lu Real VccBram %f \n\r", VBramRawData, VBramData);
VccPIntRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPINT);
VccPIntData = XAdcPs_RawToVoltage(VccPIntRawData);
printf("Raw VccPInt %lu Real VccPInt %f \n\r", VccPIntRawData, VccPIntData);
VccPAuxRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPAUX);
VccPAuxData = XAdcPs_RawToVoltage(VccPAuxRawData);
printf("Raw VccPAux %lu Real VccPAux %f \n\r", VccPAuxRawData, VccPAuxData);
VDDRRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_VCCPDRO);
VDDRData = XAdcPs_RawToVoltage(VDDRRawData);
printf("Raw VccDDR %lu Real VccDDR %f \n\r", VDDRRawData, VDDRData);
}
return 0;
}
(7)debug as->debug configuration,并设置系统调试
(8)打开系统自带的窗口调试助手,点击开始运行程序
注意需要连接USB-232