玩转Zynq连载39——[ex58] 基于Zynq的XADC采集控制实例

玩转Zynq连载39——[ex58] 基于Zynq的XADC采集控制实例

本帖最后由 ove学习使我快乐 于 2020-2-19 09:43 编辑

1 功能概述
Xilinx FPGA器件特有的XADC(Xilinx Analog-to-Digital Converter)模块创新性的将模拟信号处理混合到FPGA器件中,便于对板级模拟信号采集、处理以及对板级温度、电源电压的监控。

XADC功能如图所示,内部有专门的温度传感器和供电传感器,用于监控FPGA器件本身的工作状态,也提供了1个独立的模拟电压输入通道(VP_0/VN_0)和16个复用的模拟电压输入通道(VAUXP/VAUXN)。内部的2个ADC有12bit位宽和1MSPS采样速率,可以外接精密基准电压源作为参考电压,基本能够满足一般应用。此外,也有专门的控制接口可以和FPGA逻辑互连,便于编程控制。供电电压监控的电压输入范围是03V,模拟电压输入通道的电压输入范围是01V。

图 XADC功能框图

     集成XADC功能,需要例化XADC的IP核,然后通过访问XADC内部的寄存器实现模拟电压采集方式的设置,并读取转换后的模拟电压数据。XADC内部寄存器的映射如图所示。

图 XADC内部寄存器映射关系截图

     在Zynq中,XADC模块通过AXI GP总线连接到PS。XADC相当于重新被封装为一个标准的AXI总线外设,它的寄存器映射关系也有所变化。在xilinx官方文档pg091-xadc-wiz.pdf中可以看到重新映射的寄存器地址。



     关于Zynq的XADC应用,推荐大家参考xilinx下述3个文档。

pg091-xadc-wiz.pdf
ug480_7Series_XADC.pdf
ug585-Zynq-7000-TRM.pdf的Chapter 30 XADC Interface
本实例工程对应zstar_ex58。硬件上,XADC通过AXI接口连接到PS;PS编程读取XADC内部的温度和供电电压值,通过UART定时打印转换的最终温度和电压值。

2 电压换算关系
模拟电压值换算

     对于1个独立的模拟电压输入通道(VP_0/VN_0)和16个复用的模拟电压输入通道(VAUXP/VAUXN),它的输入范围是0~1V,参考电压1V。因此它读出的数据和实际电压值之间的换算关系如下:

     对于12bit的ADC值,Vactual = Vdigital/4096

     对于16bit的ADC值,Vactual = Vdigital/65536

温度值换算

     从XADC的温度传感器读出的温度值,通过以下公式可以换算为实际的摄氏温度:

     对于12bit的ADC值,Tactual = Tdigital*503.975/4096 – 273.15

对于16bit的ADC值,Tactual = Tdigital*503.975/65536 – 273.15

供电电压的换算公式

     对于XADC中供电传感器读取的供电电压值,其量程范围是0~3V,参考电压3V。所以读取的值与实际电压之间的换算关系如下:

     对于12bit的ADC值,Vactual = Vdigital*3/4096

     对于16bit的ADC值,Vactual = Vdigital*3/65536

3 XADC IP添加与配置
在zstar_ex56工程实例的基础上,下面我们看看如何对XADC IP进行添加和配置。在Block Design的Diagram页面空白处单击右键,如图所示,点击Add IP…。

     Search后输入关键词XADC,出现XADC Wizard IP,双击添加这个IP到Diagram中。



     和前面的操作一样,输入关键词axi interconnect,将AXI Interconnect IP也添加到Diagram中。



     新添加的2个IP模块如图所示。XADC无需多言,你懂得。这个AXI Interconnect的用处是将XADC的s_axi_lite接口转换到Zynq的AXI GP接口(AXI3),它相当于一个接口适配模块。

双击axi_interconnect_0组件,如图所示,弹出属性菜单中修改Number of Slave Interfaces和Number of Master Interfaces都为1。

双击xadc_wiz_0组件,弹出属性菜单中修改如下。

     ● 接口选项(Interface Options)选择AXI4Lite,通过AXI Interconnect可以连接Zynq。

     ● 时序模式(Timing Mode)选择Continuous Mode。

     ● 启动通道选择(Startup Channel Selection)勾选Channel Sequencer。

     ● 输入时钟频率(DCLK Frequency)输入100MHz。

     ● ADC转换率(ADC Conversion Rate)输入1000KSPS,即所支持的最高速率。

     ● 其它选项使用默认设置即可。



     ADC Setup页面配置如图所示。

序列模式(Sequencer Mode)选择Continuous Mode,即对ADC通道进行连续采集。
通道平均(Channel Averaging)选择16,即XADC内部做16个连续采样值的均值滤波后输出。
其它选项使用默认设置即可。

     Alarms页面如图所示,这里可以勾选需要进行监控的电压通道,并且可以设定报警闸值。



     Channel Sequencer页面需要勾选TEMPERATURE、VCCINT、VCCAUX、VCCBRAM、VCCPINT、VCCPAUX、VCCDDRO和VP/VN,表示开启这些通道的ADC转换功能。



     完成XADC的配置后,将axi_interconnect_0、xadc_wiz_0和processing_system7_0这3个模块连接如图所示。注意Vp_Vn是XADC的外部输入引脚,需要引出,若使用了XADC的16个复用通道,也一样要引出到顶层模块做引脚申明,并手动配置引脚号。



     在Address Editor中,点击Auto Assign Address,确认xadc_wiz_0已经分配了相应的地址空间如图所示。



     完成配置,生成新的PS系统后,更新顶层模块的接口,主要是XADC相关的几个新的接口,做相应连接(可以参考工程源码),然后重新编译整个Vivado工程。

4嵌入式软件编程
参考文档《玩转Zynq-工具篇:导出PS硬件配置和新建SDK工程.pdf》导出PS硬件工程,并打开EDK新建一个HelloWorld的模板工程。

     重新编辑helloworld.c源码如下。在系统初始化(init_platform)后,依次读取XADC的温度采样值并转成实际温度值打印、读取XADC的VCCINT采样值并转成实际电压值打印、读取XADC的VCCAUX采样值并转成实际电压值打印、读取XADC的VP/VN采样值并转成实际电压值打印、读取XADC的VBRAM采样值并转成实际电压值打印。每隔5s做一次读取打印操作。

#include <stdio.h>

#include “platform.h”

#include “xil_printf.h”

#include “sleep.h”

#include “xil_io.h”

#define XPAR_AXI_GP0_BASEADDR 0x43c00000

#define XPAR_XADC_TEMPERATURE 0x200

#define XPAR_XADC_VCCINT 0x204

#define XPAR_XADC_VCCAUX 0x208

#define XPAR_XADC_VPVN 0x20c

#define XPAR_XADC_VBRAM 0x218

int main()

{

     u32 temp;

     float voltage;

init_platform();

printf(“XADC TEST\n\r”);

while(1)

{

printf("\n\r");

     temp = Xil_In32(XPAR_AXI_GP0_BASEADDR + XPAR_XADC_TEMPERATURE);

     temp = temp*503.975/65535 - 273.15;

printf(“Temperature is %d degree\n\r”,temp);

    voltage = Xil_In32(XPAR_AXI_GP0_BASEADDR + XPAR_XADC_VCCINT);

     voltage = voltage/65536*3;

printf(“VCCINT is %f\n\r”,voltage);

    voltage = Xil_In32(XPAR_AXI_GP0_BASEADDR + XPAR_XADC_VCCAUX);

     voltage = voltage/65536*3;

printf(“VCCAUX is %f\n\r”,voltage);

    voltage = Xil_In32(XPAR_AXI_GP0_BASEADDR + XPAR_XADC_VPVN);

     voltage = voltage/65536;

printf(“VPVN is %f\n\r”,voltage);

    voltage = Xil_In32(XPAR_AXI_GP0_BASEADDR + XPAR_XADC_VBRAM);

     voltage = voltage/65536*3;

printf(“VBRAM is %f\n\r”,voltage);

     sleep(5);

}

cleanup_platform();

return 0;

}

5 板级调试
在Zstar板子上,设置跳线帽P3为JTAG模式,即PIN2-3短接。

     连接好串口线(USB线连接PC的USB端口和Zstar板的UART接口)和Xilinx下载线(下载器连接PC的USB端口和Zstar板的JTAG插座)。使用5V电源给板子供电。

     接着参考《玩转Zynq-工具篇:SDK在线运行裸跑程序.pdf》将zstar.bit文件和helloworld.elf文件烧录到Zynq中运行起来。

     打开Putty,并设置好串口,可以看到如图缩回,每隔5s不断的打印采样到的当前温度和电压值。温度传感器在FPGA器件内部,因此采样到的Temperature值达到了52°C。

此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于FPGA 在高速数据采集方面有单片机和DSP 无法比拟的优势, FPGA 具有时钟频率高,内部延时小, 全部控制逻辑由硬件完成, 速度快,效率高,组成形式灵活等特点。因此,本文研究并开发了一个基于FPGA 的数据采集系统。FPGA 的IO 口可以自由定义,没有固定总线限制更加灵活变通。本文中所提出的数据采集系统设计方案,就是利用FPGA 作为整个数据采集系统的核心来对系统时序和各逻辑模块进行控制。依靠FPGA 强大的功能基础,以FPGA 作为桥梁合理的连接了ADC、显示器件以及其他外围电路,最终实现了课题的要求,达到了数据采集的目的。     传统的数据采集系统,通常采用单片机或DSP作为主要控制模块,控制ADC,存储器和其他外围电路的工作。随着数据采集对速度性能的要求越来越高, 传统采集系统的弊端就越来越明显。单片机的时钟频率较低且需用软件实现数据采集, 这使得采集速度和效率降低,此外软件运行时间在整个采样时间中也占很大比例,而FPGA 有单片机无法比拟的优势。FPGA 时钟频率高内部时延小, 全部控制逻辑由硬件完成, 速度快,效率高。数字信号处理是以数字形式对信号进行采集, 变换,滤波估值,增强,压缩,识别等处理,从而得到符合需要的信号形式。而信号的处理目有两种方式:使用信号处理器DSP 通过软件编程实现;应用FPGA 实现。利用软件编程虽然有很大的灵活性,但DSP 所有指令的执行时间均为单周期, 而且受到串行指令流的限制每个时钟周期所有的操作数有限难以实现高速大规模运算。现在大容量,高速度的FPGA 采用硬件描述语言VHDL 实现整个系统,允许设计人员利用并行处理技术实现高速信号处理算法并只需单个处理器就能通过模块化设计实现所期望的性能, 很好的解决了上述矛盾。趋势:随着便携式设备需求的增长,对FPGA 的低压,低功耗的要求日益迫切,芯片向大规模系统芯片靠近,力求在大规模应用中取代ASIC,位增强市场竞争力,各大厂商都在积极推广其知识产权和核心库,动态课重构技术的发展将带来系统设计方法的转变。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值