目录标题
简介BD设计软件设计
简介
在ZYNQ的PL端有一个数模混合模块——XADC,它是一个硬核。XADC包含两个模数转换器(ADC), 一个模拟多路复用器,片上温度和片上电压传感器等。我们可以利用这个模块监测芯片温度和供电电压,也可以用来测量外部的模拟电压信号。 ZYNQ SoC 的 XADC 模块包括两个 12 位的模数转换器,转换速率可以达到 1MSPS(每秒一百万次采 样)。它带有片上温度和电压传感器,可以测量芯片工作时的温度和供电电压。用户可以设置报警阈值,用来检测温度过高或者供电电压异常等事件。除此之外,通过 XADC 内部的模拟多路复用器,它还支持最多17 路外部模拟输入信号的测量,且支持单极、双极和差分等信号类型。在 7 系列的 FPGA 中,XADC 提供了 JTAG 和 DRP(dynamic reconfiguration port)接口,用于访问其内部的状态和控制寄存器。在 ZYNQ-7000 SoC 器件中,XADC 增加了一个 PS-XADC 接口,用于 PS 中的软 件控制 XADC 模块。 XADC 模块的系统框图如下所示: 在图 中 PL-JTAG 接口可以用于开发工具(Vivado)控制 XADC 模块,包括读取芯片温度信息等。而运行在 PS 中的软件则可以通过两种方式与 XADC 进行通信: 1、 通过 PS-XADC 接口,此时不需要对 PL 进行编程配置; 2、 通过 PS 到 PL 的 AXI Master 接口(M_AXI_GP),此时需要在 PL 中调用 AXI XADC IP 核。 在使用 PS 控制 XADC 时,如果对应用的性能要求较高,则推荐第二种方式,它使用的是一个并行的数 据路径(DRP 接口)。而 PS-XADC 接口同 PL-JTAG 接口一样,使用的是串行的数据路径,相对较慢。不过使用 PS-XADC 接口不占用 PL 的资源,也不需要对 PL 进行编程,只需要对 PL 部分供电即可。需要注意的是,PL-JTAG 接口与 PS-XADC 接口不能同时使用。而 XADC 可以在 PL-JTAG 接口(或 PS-XADC 接口)与 DRP 接口之间进行仲裁。
BD设计
配置ZYNQ核即可。
软件设计
#include <xparameters.h>
#include <xadcps.h>
#include <stdio.h>
#include <xil_types.h>
#include <xil_printf.h>
#include <sleep.h>
#define XADC_ID XPAR_PS7_XADC_0_DEVICE_ID
XAdcPs xadc_InstancePtr
;
XAdcPs_Config
*xadc_config
;
u16 temp
;
float temprature
;
u16 vcc
;
float vcc_
;
int main()
{
int status
;
xadc_config
= XAdcPs_LookupConfig(XADC_ID
);
status
= XAdcPs_CfgInitialize(&xadc_InstancePtr
,xadc_config
,xadc_config
->BaseAddress
);
if(status
!=XST_SUCCESS
){
print("failed\n");
return XST_FAILURE
;
}
status
= XAdcPs_SelfTest(&xadc_InstancePtr
);
if(status
!=XST_SUCCESS
){
print("failed\n");
return XST_FAILURE
;
}
print("selftest success\n");
XAdcPs_SetSequencerMode(&xadc_InstancePtr
, XADCPS_SEQ_MODE_SAFE
);
while(1){
temp
= XAdcPs_GetAdcData(&xadc_InstancePtr
, XADCPS_CH_TEMP
);
temprature
= XAdcPs_RawToTemperature(temp
);
printf("temperature is %.04f c\n",temprature
);
vcc
= XAdcPs_GetAdcData(&xadc_InstancePtr
, XADCPS_CH_VCCINT
);
vcc_
= XAdcPs_RawToVoltage(vcc
);
printf("vcc is %.04f v\n",vcc_
);
sleep(2);
}
return 0;
}