ZYNQ XADC外部模拟输入测试方法与步骤详解

ZYNQ XADC外部模拟输入测试

简介

ZYNQ7000 SoC 的 XADC 模块除了可以测试片内温度以及片内电压以外,通过 XADC 内部的模拟多路复用器,它还支持最多 17 路外部模拟输入信号的测量,且支持单极、双极和差分等信号类型。
 XADC系统框图
从上图可以看出运行在PS上的软件可以通过两种方式与XADC模块通讯。

  1. 通过PS-XADC接口:PS互联总线的一个32位的APB从接口。
  2. 通过AXI XADC Core Logic访问,需要在vivado工程中添加。

本文测试使用的是第二种方式。
测试板原理图
根据测试板原理图印出来的引脚,本测试将测试XADC_VP/VN、XADC_VAUX0、XADC_VAUX8三路差分模拟输入信号。

Vivado工程创建

工程创建可参考网络教程或者正点原子相关教程,本文只讲述XADC相关的配置


双击XADC Wizard根据需求配置XADC Wizard,如下图





设置自动连线

点击Run Block Automation

完成后如下图

引出Vp_Vn、Vaux0、Vaux8引脚如下图:


完成后完整的设计如下图所示

生成顶层 HDL并创建HDL Wrapper

在左侧 Flow Navigator 导航栏中找到 RTL ANALYSIS,点击该选项中的“Open Elaborated Design”。然后在菜单栏中点击 Layout,在下拉列表中选择 I/O Planning 以打开 I/O Ports 窗口。我们将在 I/O Ports 窗口中对 XADC 引出的接口 VP_VN、VAUX0、VAUX8 进行管脚分配,如下图所示:

或者直接添加xdc约束文件:

set_property PACKAGE_PIN L14 [get_ports Vaux0_v_n]
set_property PACKAGE_PIN L15 [get_ports Vaux0_v_p]
set_property PACKAGE_PIN H13 [get_ports Vaux8_v_n]
set_property PACKAGE_PIN J13 [get_ports Vaux8_v_p]
set_property IOSTANDARD LVCMOS33 [get_ports Vp_Vn_v_n]
set_property IOSTANDARD LVCMOS33 [get_ports Vp_Vn_v_p]

最后在左侧 Flow Navigator 导航栏中找到 PROGRAM AND DEBUG,点击该选项中的“Generate Bitstream”,对设计进行综合、实现、并生成 Bitstream 文件。
在生成 Bitstream 之后,在菜单栏中选择 File > Export > Export hardware 导出硬件,并在弹出的对话框中,勾选“Include bitstream”。然后在菜单栏选择 File > Launch SDK,启动 SDK 软件。

创建SDK工程

创建一个Hello_world的工程后,替换helloworld.c中的内容为下面的代码。

#include "xsysmon.h"
#include "xparameters.h"
#include "xstatus.h"
#include "xil_exception.h"
#include "xil_printf.h"
#include "sleep.h"

#define VPVN
#define C_BASEADDR 0x43C00000			//Vivado AXI总线的地址

int main()
{
	u16 Vpvn,Vaux0,Vaux8;

	//采集通道选择,参考ug480以及pg091文档,0x300寄存器对应ug480中的0x40寄存器
#ifdef VPVN
	Xil_Out32(C_BASEADDR +  0x300 , 0x9103); //40 //0x9103:VPVN 0x9110:Vaux0 0x9118:Vaux8
#elif defined VAUX0
	Xil_Out32(C_BASEADDR +  0x300 , 0x9110);
#elif defined VAUX8
	Xil_Out32(C_BASEADDR +  0x300 , 0x9118);
#endif

	Xil_Out32(C_BASEADDR +  0x304 , 0x3F0F);//41
	Xil_Out32(C_BASEADDR +  0x308 , 0x0400);//42

#ifdef VPVN
	Xil_Out32(C_BASEADDR +  0x320 , 0x800); //48 //vpvn
#elif defined VAUX0
	Xil_Out32(C_BASEADDR +  0x324 , 0x01); //49 //Vaux0
#elif defined VAUX8
	Xil_Out32(C_BASEADDR +  0x324 , 0x100); //49 //Vaux8
#endif

	while(1)
	{
#ifdef VPVN
		Vpvn = Xil_In32(C_BASEADDR +  0x20C); //Vp Vn
		Vpvn = Vpvn >> 4;
		Vpvn = Vpvn*0.244;
		xil_printf("Vpvn = %03dmv\n\r",Vpvn);
#elif defined VAUX0
		Vaux0 = Xil_In32(C_BASEADDR +  0x240);//Vaux0
		Vaux0 = Vaux0 >> 4;
		Vaux0 = Vaux0*0.244;
		xil_printf("Vaux0 = %03dmv\n\r",Vaux0);
#elif defined VAUX8
		Vaux8 = Xil_In32(C_BASEADDR +  0x260);//Vaux8
		Vaux8 = Vaux8 >> 4;
		Vaux8 = Vaux8*0.244;
		xil_printf("Vaux8 = %03dmv\n\r",Vaux8);
#endif
		sleep(2);
	}

	return 0;
}

代码中C_BASEADDR的地址为VIVADO工程中添加AXI总线的基地址,如下图,此处不用修改,保持默认就可以。

编译工程并调试,由于包含了PL端的配置所以需要在debug选项的时候勾选program fpga,如下图

接入模拟输入源至对应的管脚,通过log可以看到采集到的电压,我使用的是正点原子开发板提供的xadc测试模块,可以通过旋转旋钮改变电阻的方式,从而使模拟电压输入产生变化,调试log如下图

文档参考

1:领航者ZYNQ之嵌入式SDK开发指南_V2.0.pdf
2:ug585-zynq-7000-TRM.pdf
3:ug480_7Series_XADC.pdf
4:pg091-xadc-wiz.pdf

物联沃分享整理
物联沃-IOTWORD物联网 » ZYNQ XADC外部模拟输入测试方法与步骤详解

发表评论