当前位置:   article > 正文

xilinx 7系列FPGA之XADC的学习笔记_xilinx xadc

xilinx xadc
   Xilinx的7系列FPGA和Zynq器件在片上集成了模数转换器和相关的片上传感器(内置温度传感器和功耗传感器),可在系统设计中免去外置的ADC器件,有力地提高了系统的集成度,在7系列FPGA里,除了少数spartan系列的低端FPGA没有XADC外,其它所有的7系列FPGA里都有XADC模块。本文就这一新模块的使用进行简单介绍,希望对大家有所帮助,当然如有不当之处还请高手指正,以免误导大家,欢迎大家补充。
   其中的用户指导见xilinx的官网,具体见UG480:7 Series FPGAs and Zynq-7000 SoC XADC Dual 12-Bit 1 MSPS Analog-to-Digital  Converter。
   XADC包含2个通道的模拟差分输入、每个通道的采样率都为1MSPS,其功能模块如下图所示:   
   **1、功能框图**   ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200409105608751.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaWNoZW4wMDExMjI=,size_16,color_FFFFFF,t_70)
    从上图可以看出,XADC默认监测FPGA内的温度以及所有的电压,还可以接收来自FPGA专用模拟差分管教VP_0\VN_0的模拟差分信号,还可以接收FPGA其他普通数字\模拟混合管脚VAUXP\VAUXN[15:0]的16路模拟差分输入,因此XADC可以最多处理17路外部模拟信号。
	XADC的输出通过JTAG口可以直接被FPGA开发工具读取并实时监测,并且借助Xilinx CORE Generator还可以生成XADC的IP核,加载到FPGA逻辑代码里,随时供用户读取FPGA的温度、电压等信息。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、XADC Pinout Requirements模块管脚需求 在这里插入图片描述
所有的XADC模块的专用管脚都属于Bank0,所以都加上后缀_0,上图1-2表示了XADC的基本输入输出需求:上面有两种配置需求,左边使用的是Vccaux(1.8V)供电,并且使用外部的1.25V的参考源,使用外部参考源在精度和热漂移方面可以获得更好的性能,且使用一个磁珠用以隔离模拟地和数字地,以避免模拟和数字共地而把噪声带入模拟电路;右边使用的是片内的参考源,此时,VREFP脚必须按照图示连接到地。
下表列出了XADC Package的管脚在这里插入图片描述在这里插入图片描述在这里插入图片描述
注:XADC模块有一专用的支持差分输入的模拟通道输入引脚(VP/VN),另外还最多有16个辅助的模拟通道输入引脚(ADxP or ADxN,x为0到15),Kintex-7不支持辅助通道6,7,13,14,15。Zynq-7000 AP SoC器件由于封装不通可能不会支持所有的辅助通道,具体要查询封装文件。
3、基本使用方法
3.1 XADC模块的操作方式:
最基本的操作模式叫缺省模式,缺省模式下XADC模块专用于监视芯片上的供电电压和芯片温度,这时XADC模块并不需要用户对其进行配置。
另外一个为同步采样模式,按预定的步骤顺序采样两个外部的模拟输入信号,并把采样结果存储在状态寄存器内。

	单通道模式,在这种模式下,用户必须通过写控制寄存器40H的CH4到CH0比特来选择一个要采样的通道。另外控制寄存器40H的BU(analog input mode) 和ACQ(settling time )两个参数也必须设置。
	独立ADC模式,在这种模式下, ADC A是固定用来实现一个类似于缺省模式的“监控模式”,报警输出功能是有效的,用户必须设置正确的报警门限; ADC B只能用来测量外部的模拟输入。

	Single Pass 模式,在这种模式下,按用户选择的采样顺序序列顺序采样一遍后停止ADC。采样顺序序列是由用户写序列通道选择寄存器48H和49H 来设定的。
	Continuous Sequence 连续序列模式,这种模式和Single Pass 模式很相似,区别是采样完一遍后系统自动重新开始序列采样,故为连续采样。
	模式选择是由控制寄存器41H 的SEQ3到SEQ0比特决定,具体如下图示:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
3.2 XADC primitive
XADC模块的使用方法, 一是直接用FPGA JTAG专用接口访问, 这时XADC模块工作在缺省模式; 二是在设计中例化XADC模块,这是可以通过FPGA逻辑或ZYNQ器件的PS到ADC模块的专用接口访问。例化XADC模块有两种基本形式:一是ISE 和PlanAhead 环境下LogiCOREIP核的形式调用, 二是EDK环境下对LogiCOREIP核的调用。这两种调用方法相信对使用过XILINX 产品的朋友来说操作界面与步骤都很熟悉,这里就不赘述了,主要是想说明下XADC模块原语,以期对这模块有个基本的了解。下图是XADC模块的输入与输出端口的示意图:
在这里插入图片描述
其各个管脚的功能描述见下表:
在这里插入图片描述在这里插入图片描述
4、PCB设计要点:
模数转换器所能获得的精度和PCB设计关系很大,因为模数转换器是敏感的部件,它的模拟接口容易受到噪声的影响,下面就PCB设计时要注意的地方做一简单介绍。
1). 典型应用中VREFP 和 VREFN外接1.25V 参考电压,电压精度为± 0.2% ,并且在PCB上要尽可能的靠近VREFP 和VREFN引脚,并且按电源IC 要求使用合适的去耦电容。
2). 如果使用片内的参考电压, VREFP 和 VREFN引脚要通过一磁珠连到模拟地,以去除高频干扰。
注意隔离数字电源和模拟电源的磁珠应使噪声对模拟电源供应的波动小于1 LSB (250 uV),这在用12 比特测量时可以最小化噪声对精度的影响。作为一个通用原则,模拟地和数字地要分开,以减少噪声从地平面耦合过来的影响。
在这里插入图片描述
3). 尽量在每个引脚放一个100nF 的去耦电容, PCB上尽量靠近引脚。
4). 外接1.25V 参考电压接VREFP 和 VREFN引脚时, PCB上应该用紧密耦合的差分对形式布线,它们应该走线在同一层,使用最小间隔,可以用模拟电源和模拟地来隔离保护它。
Common Mode Noise Rejection
5). 外部模拟输入引脚采用差分输入形式可以有效地去除共模噪声,两个差分输入应该按紧密耦合的差分对形式布线,使用最小间隔,推荐在输入端应该放置抗混叠滤波器,这个抗混叠滤波器应该尽可能地靠近FPGA。
在这里插入图片描述
6).在单极性输入时,需要设置ADC为相应的工作模式,且需要配置一个共模电压,如下图所示:
Unipolar Input Signal Range
7).在双极性时,如下图:
Bipolar Input Signal Range
5、寄存器设置
在这里插入图片描述
以上为XADC设置的相关寄存器,0x40-0x43为配置寄存器,0x43-0x47为工厂保留测试寄存器,0x48-0x4f为通道选择寄存器;0x0-0x5f为alarm报警信号寄存器。

注意:The read/write operation is not valid or complete until the DRDY signal goes active.
This design assumes an external 50 MHz clock is used for DCLK, and the XADC isconfigured to monitor temperature, supply voltages, and activate alarms if safe limits are exceeded.

XADC #(
// Initializing the XADC Control Registers
.INIT_40(16’h9000),// Calibration coefficient averaging disabled
// averaging of 16 selected for external channels
.INIT_41(16’h2ef0), // Continuous Sequencer Mode, Disable unused ALMs,
// Enable calibration
.INIT_42(16’h0400),// Set DCLK divider to 4, ADC = 500Ksps, DCLK = 50MHz
.INIT_48(16’h4701),// Sequencer channel - enable Temp sensor, VCCINT, VCCAUX,
// VCCBRAM, and calibration
.INIT_49(16’h000f), // Sequencer channel - enable aux analog channels 0 - 3
.INIT_4A(16’h4700),// Averaging enabled for Temp sensor, VCCINT, VCCAUX,
// VCCBRAM
.INIT_4B(16’h0000),// No averaging on external channels
.INIT_4C(16’h0000),// Sequencer Bipolar selection
.INIT_4D(16’h0000),// Sequencer Bipolar selection
.INIT_4E(16’h0000),// Sequencer Acq time selection
.INIT_4F(16’h0000),// Sequencer Acq time selection
.INIT_50(16’hb5ed),// Temp upper alarm trigger 85°C
.INIT_51(16’h5999),// Vccint upper alarm limit 1.05V
.INIT_52(16’hA147),// Vccaux upper alarm limit 1.89V
.INIT_53(16’h0000),// OT upper alarm limit 125°C using automatic shutdown
.INIT_54(16’ha93a),// Temp lower alarm reset 60°C
.INIT_55(16’h5111),// Vccint lower alarm limit 0.95V
.INIT_56(16’h91Eb),// Vccaux lower alarm limit 1.71V
.INIT_57(16’hae4e),// OT lower alarm reset 70°C
.INIT_58(16’h5999),// VCCBRAM upper alarm limit 1.05V
.INIT_5C(16’h5111),// VCCBRAM lower alarm limit 0.95V
.SIM_MONITOR_FILE(“sensor_input.txt”)
// Analog Stimulus file. Analog input values for simulation
)

XADC_INST ( // Connect up instance IO. See UG480 for port descriptions
.CONVST(GND_BIT), // not used
.CONVSTCLK(GND_BIT), // not used
.DADDR(DADDR_IN[6:0]),
.DCLK(DCLK_IN),
.DEN(DEN_IN),
.DI(DI_IN[15:0]),
.DWE(DWE_IN),
.RESET(RESET_IN),
.VAUXN(aux_channel_n[15:0]),
.VAUXP(aux_channel_p[15:0]),
.ALM(alm_int),
.BUSY(BUSY_OUT),
.CHANNEL(CHANNEL_OUT[4:0]),
.DO(DO_OUT[15:0]),
.DRDY(DRDY_OUT),
.EOC(EOC_OUT),
.EOS(EOS_OUT),
.JTAGBUSY(), // not used
.JTAGLOCKED(), // not used
.JTAGMODIFIED(), // not used
.OT(OT_OUT),
.MUXADDR(), // not used
.VP(VP_IN),
.VN(VN_IN)
);

6、XADC值的相关计算
6.1 ADC的计算公式:在这里插入图片描述
6.2 温度传感器的计算:
在这里插入图片描述
6.3 FPGA的电压检测
在这里插入图片描述
7、寄存器接口
在这里插入图片描述
8、使用XADC IP核
使用DRP接口采集6路模拟通道电压VP0,VP1,VP5,VP6,VP8,VP9和温度。
8.1、Basic设置
注意:Analog sim File Option中的Waveform Type要选择sin,不然仿真顶层文件会跟我的不一致!!!!
在这里插入图片描述
8.2、ADC Setup
在这里插入图片描述
8.3、Alarm
在这里插入图片描述
8.4、通道设置:6路模拟通道电压VP0,VP1,VP5,VP6,VP8,VP9和温度
在这里插入图片描述
IP的GUI界面相信大家都会配置,可是问题就是IP核生成了,我们如何为使用呢?还是老方法,IP核生成后,我们先去生成一个Example:
在这里插入图片描述
我们看到生成的IP核Example顶层接口是这样的,并没有看出来如何对IP的接口使用,没关系,别急
在这里插入图片描述
我们打开xadc_wiz_0_tb仿真顶层文件,
在这里插入图片描述
代码如下: (注意:在GUI界面仿真应该选择sin波形,否则仿真顶层代码不是这样)
在这里插入图片描述
在这里插入图片描述
从这个顶层代码基本就能知道接口怎么用了,我们把代码整合一下,去除不能综合的代码,整理后如下:
在这里插入图片描述
在这里插入图片描述
有tb文件整理过后的代码基本就能进行通道电压的数据采集了,其它通道以此类推。下面是我实际上板测试用debug抓到的数据,我用到的是4、5、6、7、13、14通道。
在这里插入图片描述
另外还需要注意的是,我们用户端得到得是ADC的code值,我们还需要将它换算成电压值。
总的来说XADC还是比较容易实现的,另外需要注意一点的是在ddr的IP核中mig_7series_0中有调用xdma选项,一般情况下不能同时使用多个xdma,否则编译会报错,提示例化了多个xdma!!!!!如果项目中有单独使用xdma且mig_7series_0也有使用的时候,在mig_7series_0中应该disable xdma,此时应该将单独使用xdma的IP中采集的温度数据送给mig_7series_0里面去。

[1].Xilinx UG480: 7 Series FPGAs and Zynq-7000 AllProgrammable SoC XADC Dual 12-Bit 1 MSPS Analog-to-Digital Converter User Guide
[2].Xilinx UG772: LogiCORE IP XADC Wizard User Guide
[3].Xilinx PG019: LogiCORE IP AXI XADC (v1.00.a) Product Guide
[4]. Xilinx UG585: Zynq-7000 All ProgrammableSoC Technical Reference Manual
[5].Xilinx XAPP554: XADC Layout Guidelines

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/899056
推荐阅读
相关标签
  

闽ICP备14008679号