FPGA使用XADC测量外部模拟输入电压

您所在的位置:网站首页 vddcrsoc电压 FPGA使用XADC测量外部模拟输入电压

FPGA使用XADC测量外部模拟输入电压

2024-07-07 06:22| 来源: 网络整理| 查看: 265

一、XADC简介 1.1、特性

Xilinx系列的FPGA中都包含了一个内置的XADC,我们可以通过这个XADC进行一些精度不高的外部模拟信号采样以及FPGA片内传感器信号采集。XADC的分辨率为12位,采样率为1MSPS。

1.2、结构框图 两片XADC,ADC A可用于片内传感器采集(温度、参考电源电压),也可用于外部模拟信号采集。ADC B只能用于外部模拟信号采集。1个专用模拟输入通道和16个复用模拟输入通道基准源可选:内部基准源和外部基准源对外接口DRP可通过JTAG或者FPGA内部逻辑进行控制 图1.1 XADC内部结构框图 1.3、XADC接口介绍 初始化接口: 图1.2 XADC初始化接口图 信号名方向功能描述di_in[15:0]inputDRP的输入数据总线。daddr_in[6:0]inputDRP的地址总线。den_ininputDPR的使能信号dwe_ininputDRP的写使能信号drdy_outoutputDRP的数据准备好信号do_out[15:0]outputDRP的输出数据总线dclk_ininputDRP的输入时钟reset_ininputXADC的复位信号,高电平有效vp_in/ vn_ininput专用模拟输入通道,可设计为差分模拟信号输入,当设计使用XADC功能但不用VP/VN时,应该将这两个引脚接地VAUXP[15:0]/VAUXN[15:0]input16个复用的模拟输入通道,可设计为差分模拟信号输入ot_outoutput过温报警输出信号channel_out[4:0]input通道选择输出信号。当前ADC转换的输入MUX通道选择,由该接口输出提供给用户查看。eoc_outoutputADC转换完成信号。当测量值被写入状态寄存器时,该信号在ADC完成转换之后拉高eos_outoutput时序结束信号。自动通道序列中,当最后一个通道的数据被写入状态寄存器时,该信号转为高电平。busy_outoutputADC忙信号。该信号在ADC转换时为一直为高电平。

寄存器接口: XADC一共有128个寄存器,前64个(00H ~ 3FH)为只读寄存器,后64个(40H~7FH)为可读写的控制寄存器。一般我们用前32个只读寄存器比较多。

1.3 XADC寄存器接口图

ADC通道选择寄存器: 可以看到ADC模拟通道选择的值与对应通道存放数据的状态寄存器的地址相同。

二、硬件电路 2.1、基准电源

XADC的所需要的基本外围电路如图所示。XADC的基准源可使用外步基准源来实现,基准源的电压为1.25V;也可以选择使用内部基准源,外围电路直接将VREFP和VREFN接地即可。

图2.1 基准电源外围电路 2.2、模拟输入通道

XADC模拟信号输入方式有单极性和双极性两种。XADC默认的方式为单极性输入,fpga片上所有传感器的工作模式为单极性输入。

单极性输入: 当使用单极性输入时,输入电压范围为0V ~ 1V,对应ADC编码范围为000h~FFFh,量化分辨率为1V / 212=244uV。 图2.2 单极性输入电压量化图

在单极性输入模式,Vp必须为正,Vn连接到模拟地或者共模信号。Vn连接到共模信号时,该信号电压范围应该为0V0.5V(即Vp与Vn的共模电压范围),由于Vp与Vn的差模电压范围为0V1V,所以在单极性输入模式下,Vp的输入电压最高可达1.5V。

图2.3 单极性输入电压范围图 双极性输入: 当使用双极性输入时,差分输入电压范围为-0.5V ~ +0.5V,XADC编码采用补码格式,对应编码范围为800h ~ FFFh、000h ~ 7FFh。量化分辨率为1V/212=244uV。 图2.4 双极性输入电压量化图 在双极性输入模式,Vp-Vn差分模拟输入电压的范围±0.5V,Vn的共模电压应该不超过0.5V。 图2.5 双极性输入电压范围图 2.3、外部模拟输入电路

模拟通道输入为高输入,数据手册上推荐电路由分压电路和滤波电路组成,通过分压和滤波之后输入到XADC的模拟信号电压值应该不超过1V。

图2.6 外部模拟输入电路图

图2.6中 R1与R2为分压电阻,R5用于与R1与R2的并联电阻匹配。R3、R4与C1构成抗混叠滤波器,建立时间计算参考手册ug480。

在这里插入图片描述

三、时序图 3.1、连续采样模式的时序图

主要有电压采集和电压转换两个阶段。

图3.1 连续采样模式的时序图 DRP时序图

主要用于XADC寄存器的数据读写。

当DEN为高电平时,信号DADDR[6:0]和信号DWE在DCLK的上升沿才会捕捉到,逻辑设计中通常将DEN仅维持一个DCLK时钟的高电平。当捕捉DWE为低电平时,表示读操作;捕捉DWE为高电平时,表示写操作。读操作时,DRDY拉高 表示DRP寄存器的数据已经放在总线DO[15:0]上了,用户可以直接读取;写操作时,DRDY拉高表示写的数据已经成功写入DRP寄存器里。在DRDY拉低之前,一个新的读写操作是不能进行的。 图3.2 DRP时序图 四、XADC的使用教程 4.1、目的

在ZYQN的pl端使用XADC,完成共6路模拟输入信号的电压采样。其中模拟输入通道包括1个Vp/Vn模拟输入通道和5个复用模拟输入通道VAUXP/VAUXN。

4.2、IP核设置 Basic界面 选择DRP接口,读写时序比较简单。continuous mode 意味着按照设定 ADC 采样率进行采样,event mode 意味着自行控制 ADC 采样率,但是不可超过设定的最大 ADC 采样率;通道选择为 channel sequencer,即多通道采样时按照指定的通道顺序进行扫描采样,通道号定义参考上文通道选择。通道序列时钟设置 ADC Setup界面 1.序列器模式选择 continuous 模式,会一直循环采样,通道平均次数可按实际情况来,实际采样率=ADC 设定采样率/平均次数。 2.采样数据平均次数。

Alarms界面 若不是用检测警告功能,该界面可以全部取消勾选。

Channel Sequencer界面 选择需要初始化的通道即可。这里使用的模拟通道为Vp/Vn、vauxp0/vauxn0、vauxp2/vauxn2、vauxp3/vauxn3、vauxp10/vauxn10、vauxp11/vauxn11。

Summary界面

4.3、逻辑设计 top.v ------顶层文件 `timescale 1ns / 1ps /// // Create Date: 2023/07/18 16:36:43 module top( //时钟 input pl_clk, //模拟输入 input vp_in, input vn_in, input vauxp0, input vauxn0, input vauxp2, input vauxn2, input vauxp3, input vauxn3, input vauxp10, input vauxn10, input vauxp11, input vauxn11 ); wire den_in; wire dwe_in; wire drdy_out; //数据有效输出 wire [15:0] di_in, do_out; //数据输入 数据输出 wire [6:0] daddr_in; //寄存器地址 wire [4:0] channel_out; // 通道选择输出 wire eoc_out; // 转换完成信号 wire eos_out; // 时序结束信号 wire alarm_out; wire busy_out; wire rst_n; //模拟通道读取的ADC值 wire [11:0] vpvnData; wire [11:0] vaux0Data, vaux2Data,vaux3Data,vaux10Data,vaux11Data; //XADC IP例化 xadc_wiz_0 inst_xadc_wiz_0 ( .dclk_in(pl_clk), // input wire dclk_in .di_in(di_in), // input wire [15 : 0] di_in .daddr_in(daddr_in), // input wire [6 : 0] daddr_in .den_in(den_in), // input wire den_in .dwe_in(0), // input wire dwe_in 仅用到读操作,故一直设置为零 .drdy_out(drdy_out), // output wire drdy_out .do_out(do_out), // output wire [15 : 0] do_out .reset_in(0), // input wire reset_in 不用复位功能 .vp_in(vp_in), // input wire vp_in .vn_in(vn_in), // input wire vn_in .vauxp0(vauxp0), // input wire vauxp0 .vauxn0(vauxn0), // input wire vauxn0 .vauxp2(vauxp2), // input wire vauxp2 .vauxn2(vauxn2), // input wire vauxn2 .vauxp3(vauxp3), // input wire vauxp3 .vauxn3(vauxn3), // input wire vauxn3 .vauxp10(vauxp10), // input wire vauxp10 .vauxn10(vauxn10), // input wire vauxn10 .vauxp11(vauxp11), // input wire vauxp11 .vauxn11(vauxn11), // input wire vauxn11 .channel_out(channel_out), // output wire [4 : 0] channel_out .eoc_out(eoc_out), // output wire eoc_out .alarm_out(alarm_out), // output wire alarm_out .eos_out(eos_out), // output wire eos_out .busy_out(busy_out) // output wire busy_out ); //对DRP接口操作,完成XADC寄存器数据的读取 xadc_capture inst_xadc_capture( .dclk(pl_clk), .rst_n(1), //不用复位功能 .di_in(di_in), .daddr_in(daddr_in), .den_in(den_in), .dwe_in(dwe_in), .drdy_out(drdy_out), .eoc_out(eoc_out), .do_out(do_out), .channel_out(channel_out), .xadc_vpvn_data(vpvnData), .xadc_vaux0_data(vaux0Data), .xadc_vaux2_data(vaux2Data), .xadc_vaux3_data(vaux3Data), .xadc_vaux10_data(vaux10Data), .xadc_vaux11_data(vaux11Data) ); endmodule xadc_capture.v ------XADC的寄存器数据读取操作 `timescale 1ns / 1ps /// // Create Date: 2023/07/18 16:36:13 module xadc_capture( input dclk, input rst_n, //XADC IP 接口 output reg[15:0]di_in, // 写入xadc总线上的数据 output reg[6:0] daddr_in, // 读取xadc寄存器地址 output reg den_in, // 控制使能 output reg dwe_in, // 写使能 input drdy_out, // 数据有效输出 input eoc_out, input [15:0] do_out, // 读取xadc总线上的数据 input [4:0] channel_out, // 通道选择输出 //内部逻辑接口 output reg[11:0] xadc_vpvn_data, //XADC 读出的 Vp/Vn 采样数据 output reg[11:0] xadc_vaux0_data, //XADC 读出的 vaux0 采样数据 output reg[11:0] xadc_vaux2_data, //XADC 读出的 vaux2 采样数据 output reg[11:0] xadc_vaux3_data, //XADC 读出的 vaux3 采样数据 output reg[11:0] xadc_vaux10_data, //XADC 读出的 vaux10 采样数据 output reg[11:0] xadc_vaux11_data //XADC 读出的 vaux11 采样数据 ); /// //产生 XADC 读时序 always @(posedge dclk or negedge rst_n) begin if(!rst_n) begin den_in


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3