赞
踩
ZYNQ7000 SoC 的 XADC 模块除了可以测试片内温度以及片内电压以外,通过 XADC 内部的模拟多路复用器,它还支持最多 17 路外部模拟输入信号的测量,且支持单极、双极和差分等信号类型。
从上图可以看出运行在PS上的软件可以通过两种方式与XADC模块通讯。
本文测试使用的是第二种方式。
根据测试板原理图印出来的引脚,本测试将测试XADC_VP/VN、XADC_VAUX0、XADC_VAUX8三路差分模拟输入信号。
工程创建可参考网络教程或者正点原子相关教程,本文只讲述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 软件。
创建一个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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。