Zynq器件XADC模块包括2个12比特1 MIPS的模数转换器和相关的片上传感器,内置温度传感器和功耗传感器,可实时监测片内结温、各路电压数据,并可输出告警信号。
XADC模拟输入包括专用模拟输入VP/VN和16组复用模拟信号输入VAUX(15:0);XADC转换结果可以通过动态重配接口(DRP)或者JTAG接口输出;告警信号可通过ALM(7:0)输出,并有专用的温度告警信号OT。
XADC还包括几个支持测量芯片上电源电压和模具温度的片上传感器。ADC转换数据存储在称为状态寄存器的专用寄存器中。这些寄存器可以通过FPGA互连访问,使用一个16位同步读写端口,称为动态重新配置端口(DRP)。ADC转换数据也可以通过JTAG TAP访问,可以在配置之前(预配置),也可以在配置之后访问。对于JTAG TAP,用户不需要实例化XADC,因为它是一个专用接口,使用现有的FPGA JTAG基础结构。正如后面所讨论的,如果XADC没有在设计中实例化,则设备以预定义的模式(称为默认模式)运行,该模式监视芯片上的温度和电源电压。
具体的参考手册如下:
ug480:7Series_XADC.pdf
xapp795:driving-xadc.pdf
xapp554:xadc-layout-guidelines.pdf
xapp1203:post-proc-ip-zynq-xadc.pdf
xapp1183:zynq-xadc-axi.pdf
xapp1182:zynq_axi_xadc_mon.pdf
xapp1172:zynq_ps_xadc.pdf
pg019:axi_xadc.pdf
pg091:xadc-wiz.pdf
ug953:vivado-7series-libraries.pdf
ug585:Zynq-7000-TRM.pdf
本文采用vivado编译环境对XADC进行配置。
在对XADC进行寄存器配置之前,首先要在vivado中进行硬件电路的搭建,这部分内容可以通过建立block块完成,具体配置方法请参考https://blog.csdn.net/taowei1314520/article/details/83656386。本文借助外部VPVN测量端口,通过搭建惠斯顿电桥进行温度的测量(具体方法后面会详细介绍到),所以需要在搭建硬件电路时引出VPVN和配置XDC管脚约束。
在配置寄存器之前,首先要对两种寄存器进行解释说明。
控制寄存器:用于控制和确定处理器的操作模式以及当前执行任务的特性。
状态寄存器:用来存放两类信息,一类是体现当前指令执行结果的各种状态信息,另一类是存放控制信息。
1.配置控制寄存器Configuration register 0
通过写入C_BASEADDR + 0x300(基地址+偏移量)来定位到该寄存器的位置,下图为该寄存器的bit位对照图。
CAVG:这个比特位用于禁用计算校验系数的平均,使能为0,使能为1(平均固定在16个样本)。
AVG1、AVG0:这些位用于在单通道和序列模式下设置所选通道上的样本平均量。
MUX:这个比特位为外部多路复用,设置1即启动外部多路复用功能。(本文所采用的的VP/VN位专用PL端引脚,所以这里不进行多路复用)。
BU:这个比特位是进行单双极性的选择,双极性为1,单极性为0。本文采用的是模拟差分的输入方式,因为差分输入能够有效地降低干扰,实现数据更加稳定地传输。
EC:这个比特位用于为XADC采样模式,1为event-driven sampling mode,0为continuous sampling mode。
event-driven sampling mode:该工作模式下,采样瞬间和随后的转换过程由一个称谓转换开关的触发信号启动,当需要对采样的时刻进行精确控制时,采用该模式。在该模式下,DCLK必须始终存在。
continuous sampling mode:该工作模式下,ADC在当前转换周期结束时自动启动新的转换,adc持续对选定的模拟输入进行转换,模数转换过程由采集阶段和转换阶段两部分组成。
ACQ:在使用单通道模式时,该位用于将连续采样模式下的外部模拟输入的可用时间增加6次ADCCLK周期,如果没有设置ACQ位,则在收购的最后阶段允许使用4个ADCCLKs或150个ns。通过将此位设置为逻辑1,可以增加获取时间。
CH4~CH0:在单通道模式或外部多路复用模式下工作时,这些位用于选择ADC输入通道。
2. 配置控制寄存器Configuration register 1
通过写入C_BASEADDR + 0x304(基地址+偏移量)来定位到该寄存器的位置,下图为该寄存器的bit位对照图。
SEQ3~SEQ0:这些比特位用来使能通道序列。
Default mode:在这种操作模式下,XADC自动监控芯片上的传感器,并将结果存储在状态寄存器中。这两种adc都是在这种模式下校准的,所有传感器都使用平均16个样本。XADC在此模式下独立于任何其他控制寄存器设置操作。
Single Pass Mode:在这种操作模式下,序列操作一次通过序列通道寄存器,然后停止。
Continuous sequence mode:该模式相当于single pass mode的自动版,在一次操作结束后又会自动重新开始。
Simultaneous Sampling Mode:在该模式下,测序器通过8对辅助模拟输入通道自动进行同步采样和转换,这在需要保留两个信号之间的相位关系的应用程序中非常有用,大部分用于多路复用情况下。
Auxiliary analog channels 0 to 7 are assigned to ADC A and are nominated as A channels.
Auxiliary analog channels 8 to 15 are assigned to ADC B and are nominated as B channels
Independent ADC Mode:通常用于报警模式和监测模式,在这种模式下,警报输出使能,并且使用者必须正确地配置报警阈值。与默认的测序模式一样,平均值固定在16个采样点。
ALM6~ALM0:这些位用于禁用温度的单个警报输出,1为禁用报警输出。
CAL3~CAL0:这些位使校准系数应用于ADC和片上供应传感器测量,1为使能校准,0位不使能。
OT:这个位用于禁用温度过高信号。通过将此位设置为逻辑1来禁用警报。
3. 配置控制寄存器Configuration register 2
通过写入C_BASEADDR + 0x308(基地址+偏移量)来定位到该寄存器的位置,下图为该寄存器的bit位对照图。
CD7~CD0:这些位用于选择ADC的DRP时钟(DCLK)和低频率ADC时钟(ADCCLK)之间的分频比。
DRP:动态配置端口,可直接通过PL部分访问,也可以通过高级接口单元。
所有XADC计时同步到DRP时钟(DCLK)。ADCCLK是通过将DCLK在配置寄存器2中分频得到的。
PD1、PD0:XADC的中断位。通过设置PD1 = PD0 = 1,可以永久关闭整个XADC块。
4. 配置序列寄存器Sequence Register 0:首先写入C_BASEADDR + 0x320(基地址+偏移量)来定位到该寄存器的位置,再通过写bit位来选择序列通道,本文采用VPVN序列通道,所以给第12位置1(0000_1000_0000_0000),具体对应表如下。
5. 配置输出寄存器:通过写入C_BASEADDR + 0x20C(基地址+偏移量)来定位到该寄存器的位置,在专用模拟输入通道(Vp/Vn)上A/D转换的12位MSB验证结果存储在此寄存器中。
定义和一些计算所应用到的数据位数为16位(unsigned short),而我们所用到的只有12位,所以需要将数据进行右移4位来保证12位MSB验证结果能够完整的存储到寄存器中。
将ADC的外部模拟输入通道配置为双极时,它们可以容纳真正的差分和双极模拟信号类型。双极模式下ADC的输出编码是双极模式下的补码,用来表示VP上输入信号相对于VN的符号。设计代码转换发生在连续整数LSB值,也就是说,一个LSB、两个LSB、三个LSB等。伏特的LSB大小即1个数据位等于244uV。
本文采用PT100热电阻作为外部温度测量器件,通过搭建惠斯顿电桥,实现温度的采集。
1、将XADC在PL端的VPVN引脚直接接在电桥上,利用Pt100在不同温度下电阻值发生变化的原理,实现VP/VN电压差的改变,根据公式计算得出温度值,下图为惠斯顿电桥。
计算公式:
V = V P 0 − V N 0 V = VP0 - VN0 V=VP0−VN0
R p t = ( 13200 + 29000 V ) / ( 412.5 − 145 V ) Rpt = (13200 + 29000V)/(412.5 - 145V) Rpt=(13200+29000V)/(412.5−145V)
2、Pt100 是电阻式温度传感器,测温的本质其实是测量传感器的电阻,通常是将电阻的变化转换成电压或电流等模拟信号,再将模拟信号转换成数字信号,再由处理器换算出相应温度。
通过查找表或公式计算的方法,将电阻值转换为对应的温度值,以下给出“PT100温度-电压”对照表和各种类型的接线法。
a.二线制接法:如图4(a)所示,这种接法不考虑Pt100 电缆的导线电阻,将A/D 采样端与电流源的正极输出端接在一起,这种接法由于没有考虑测温电缆的电阻,因此只能适用于测温距离较近的场合。
b.三线制接法:如图4(b)所示,这种接法增加了用于A/D 采样的补偿线,三线制接法消除了连接导线电阻引起的测量误差,这种接法适用于中等测温距离的场合。
c.四线制接法:如图4©所示,这种接法不仅增加了A/D 采样补偿线,还加了一条A/D对地的补偿线,这样可以近一步的减小测量误差,可以用于测温距离较远的场合。如果只从精度上考虑,采用四线制接法效果最好。
调试完成后,接下来就是将程序固化到板子中,我大致介绍一下程序固化方法和启动流程。
一般在调试程序的过程中FPGA用的是JTAG模式,不需要片外配置芯片,是直接将我们编写的程序下载到FPGA的片内RAM中,掉电不保留数据。而固化的目的是使板卡掉电不丢失程序,通常在调试阶段需要多次启动,每次上电都重新下载程序是一件很麻烦的事情,所以将程序固化进去会方便很多,下面是固化程序的参考流程。
https://blog.csdn.net/wmyan/article/details/79292778
如果大家觉得步骤很复杂的话,我用框图的形式总结了一下,可能会清楚点。
通过UART串口输出,借助串口调试助手可以看到实时的温度数值,完成测试。
大致归纳一下XADC用到的基本知识(仅针对个人的学习笔记总结)。
1、轮询模式:CPU重复检查设备的状态寄存器,直到寄存器的值表明I/O操作已经完成。
2、多路复用器mux:能够接收多个信号,按每个信号可恢复方式合成单个输出信号。
3、XADC也需要参考电压,参考电压由芯片内部或外部决定。
4、VP/VN在多路复用通道外(XADC有17个通道),即PL引脚复用。
5、XADC模块的引脚封装均在BANK0中。
6、用VP/VN能够有效减小干扰,噪声相减则抵消。
7、VP-VN的电压输出范围是-0.5V ~ +0.5V,VP与VN相对于GNDADC电压必须大于0。
8、模拟信号通道在管脚配置时不需要加电压,数字信号通道在管脚配置时需要加电压,电压相当于一个标准(FPGA有1.8V 2.5V 3.3V),例如3.3V控制时,达到3.3V就相当于逻辑1,0V就相当于逻辑0。
9、掩码:是一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位。
10、状态寄存器只能查看工作状态(read only),控制寄存器可以配置(read and write)。
11、没有JTAG一般用Anolog-Input Mode(4Ch and 4Dh)配置。
通过实现利用XADC对温度的采集,我学习到了如何配置寄存器(直接用地址写寄存器的方式),学习到了什么是固化程序以及如何将程序固化到FPGA板卡中,这同时用到了vivado和sdk编译环境,理解了温度传感器的工作原理,最重要的是能够系统地对一项工程进行梳理,这对于学习FPGA有很大的帮助,希望以后能够通过学习和写博客的这种方式慢慢进步。