在Zynq SoC内部使用XADC可以极大提高系统集成度,而且实现起来非常简单直观。
赛灵思Zynq®-7000 All Programmable SoC配套提供一个带有2个12位模数转换器(ADC)的XADC模块。这两个ADC的采样率可高达每秒百万次采样(1MSPS),具有理想的500kHz有效输入信号带宽(辅助输入端信号带宽为250kHz)。XADC多路复用17个输入信号并测量一系列内部电压与温度。如果您的设计无法为外部信号提供足够的模拟输入引脚,那么应对XADC加以配置,以驱动外部模拟多路复用器并按照要求的顺序对所有输入进行排序。
XADC能够实现单极或双极测量,因此器件的输入均为差分输入。17个差分输入被划分为一个专用对(称为VP/VN)和16个辅助输入(可以是模拟或数字I/O,被称为VAUXP和VAUXN)。有效输入信号带宽视所用的差分输入类型而定,如果使用专用对,则信号带宽为500kHz,如果使用辅助输入,则信号带宽为250kHz。
XADC的混合信号性能非常好,根据数据手册显示,其具有60dB的最低信噪比(SNR)和70dB的总谐波失真(THD)。根据器件所处温度范围(-55ºC至125ºC或-40ºC至100ºC)的不同,XADC的分辨率可以是10位或12位。这样根据下面的等式计算得出的XADC有效位数是9.67。
ENOB = (SNR–1.76/6.02)
XADC具有16、64和256个采样的平均计算法可供用户选择,用以降低输入端噪声。用户还可以为每个所测量的内部器件参数设置最大和最小告警等级。
XADCXADC适合哪些应用?
设计人员可将这种ADC用于从简单的板载参数(电压、电流和温度)内务处理遥测,到对触摸传感器、马达控制或简单的无线通信协议的支持等一系列应用。此外,还可以将其用在军事或其他重要系统中,以检测设备篡改。
XADC的重要优势之一是用来监控一系列系统内部参数,验证设计方案的良好程度。此外,为了简化设计初期的验证工作,您可以在基于Zynq-7000 All Programmable SoC的系统中使用XADC来测量由片上温度传感器记录的温度以及后续的其他参数。
硬件实现
要想使用XADC,首先需要打开包含Zynq SoC实现方案的PlanAhead™项目(如果您不知道如何操作,请参考《赛灵思中国通讯》第47期的封面专题文章)。选择您所创建的处理器子系统,并双击打开Xilinx Platform Studio (XPS)。您可以在XPS中修改处理系统。
XPS打开后,选择项目窗口左侧的IP Catalog标签,并选择模拟菜单下的AXI XADC。这时会出现提示,问您是否要向设计中添加IP。点击是,显示IP配置窗口,如图1所示。这里没有太多需要配置的内容,除非您想对复杂的AXI总线接口进行优化。
用户标签是主要的操控区域。您可以通过该标签为处理器添加中断,启用温度总线。您可以将启用后的温度总线连接至储存器接口生成器(Memory Interface Generator),用以提供影响时序的温度信息。在ISim中仿真XADC时使用的是仿真监视文件。
如果您对XADC的配置比较满意,就可以关闭IP配置窗口,同时XADC将被添加到处理系统中。如果您点击System Assembly查看器的地址标签,就会看到分配给XADC的地址范围,然后通过勾选来锁定地址范围。
下一步是设置连接到XADC的外部端口数。在默认情况下,XADC可支持1个外部多路复用器、16个辅助模拟输入、8个告警输出和1个转换开始,如图2所示。
必要时您可以移除这些端口,只为ADC保留专用的模拟输入Vp和Vn,以及连接监视器的内部信道。例如,ZedBoard只能在信道0和8上支持两个辅助模拟输入,同时提供四个XADC专用的GPIO。您可以根据需要将这些GPIO连接到告警输出或多路复用器输出。可在XPS内选择下拉菜单中的“不连接外部端口”选项来断开外部I/O。
如果您希望使一些辅助输入仍处于连接状态(例如添加两个ZedBoard输入),可在系统内部保留VAUXP和VAUXN信道,同时在RTL设计的顶层只连接信道0和信道8。如果希望连接辅助输入但移除其他外部端口,需要右击特定的I/O,然后选择“无连接”选项,如图3所示。
外部连接设置好后,运行设计规则检查(DRC)。如果DRC未显示任何错误,即可退出XPS并返回到PlanAhead中,并在此生成比特流。如果您查看一下综合结果,就会发现资源列表中已含有XADC。
编写软件
硬件设计已经完成,此时您需要将硬件再次导入到软件开发套件(SDK)中,以便升级板支持包。在PlanAhead中选择文件->导出->导出硬件到SDK选项。这时会出现提示,警告我们将覆盖已有的硬件定义。点击“是”并覆盖。
如果SDK打开,您会收到一个提示介绍硬件规范文件的变更情况。如果SDK没有打开,那么会在下次打开的时候收到此提示。
点击SDK提示中的“是”选项,硬件定义就会被更新,同时您的项目将被重建。假设设计没有错误,那么您将开始执行代码修改工作。
打开system.xml或xparameters.h文件,您不仅会看到设计中所有其他外设的地址范围,还能看到刚刚添加到XPS内的XADC的地址范围。
打开system.mss文件会显示板支持包(BSP)的整体细节。这里我们真正感兴趣的是外设驱动程序,此处您可以看到xai_adc_0(或您在XPS中对XADC的任意命名)。接下来,您会看到用于打开文档和实例的热链接。
为了缩短开发时间,赛灵思在报头文件中提供了一系列驱动程序,便于我们使用这些器件。您需要在代码中访问这些驱动程序。为此需要添加BSP更新过程中所生成的以下报头文件。
#include "xadcps.h"
该文件包含对于XADC寄存器、采样平均选项、信道顺序选项和省电模式等内容的定义。另外还包含一系列可在系统中使用的类型定义、宏命令和函数。
集中在一起
举一个简单的实例:我将读取系统的内部温度和电压参数,并通过RS232链路将它们输出。
在编写代码时首先要做的是查询将要进行初始化的XADC的配置,这里要用到XAdcPs_Config类型的指针。利用XAdcPs_LookupConfig()函数调用以及从更新的xparameters.h文件中获得的器件ID将配置信息(器件ID和XADC的基地址)存储在指针内。初始化流程的下一步是使用此前获取并存储在配置指针中的信息,该步骤需要一个XAdcPs类型的指针。
Status_ADC = XAdcPs_CfgInitialize (XADCInstPtr,ConfigPtr,ConfigPtr->BaseAddress)
我将配置指针命名为ConfigPtr,将实例化指针命名为XADCInstPtr。XADC的初始化完成后,按照实例要求对其进行配置。以下是配置流程:
1. 采用XAdcPs_SelfTest()函数运行自测试,以确认器件没有问题。
2. 利用XAdcPs_SetSequencerMode()函数将定序器设置为单通道,从而停止定序器当前操作。
3. 利用XAdcPs_SetAlarmEnables()函数禁用所有告警。
4. 利用XAdcPs_SetSeqInputMode()函数重启定序器并让其按我所要求的顺序排序。
5. 利用XAdcPs_SetSeqChEnables()函数配置信道,使之能根据我的要求采样。
完成以上步骤后就可以使用ADC并从XADC接收数据。只需调用XAdcPs_GetAdcData()函数即可从XADC读取采样。对于内部温度和电压参数,然后我使用两个提供的宏命令(XAdcPs_原始ToTemperature()和XAdcPs_原始ToVoltage())将原始的XADC数值转换为实际的温度或电压值。
实际值和原始数据随后都通过RS232链路输出。图4给出了仅器件温度进行采样的初始结果。
当我将采样范围扩大至内部电源轨和温度时,会返回如下结果:
• 原始温度40696, 实际温度39.805603
• 原始VccInt 21677, 实际VccInt 0.992294
• 原始VccAux 39431, 实际VccAux 1.805008
• 原始VccBram 21691, 实际VccBram 0.992935
• 原始VccPInt 21649, 实际VccPInt 0.991013
• 原始VccPAux 39402, 实际VccPAux 1.803680
• 原始VccDDR 32014, 实际VccDDR 1.465485
所有这些参数都在Zynq SoC运行可接受的限值内,但需要Zynq SoC在实验室条件下工作。
正如您所看到的,在Zynq SoC中实现和使用模拟混合信号非常简单直观。XADC可以提高All Programmable系统的集成度和功能性。
评论
查看更多