ZYNQ学习之旅--PS

    技术2022-07-10  179

    目录标题

    简介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核即可。

    软件设计

    /* * main.c */ #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; }
    Processed: 0.022, SQL: 9