本帖最后由 自恋狂vip 于 2015-12-22 16:40 编辑
参考文档:
总体概述 Xilinx 7系列的ADC是一个双12位分辨率的而且每秒一兆(MSPS, 1 Mega sample per second)采样速率的模数转换器,是一种通用的、高精度的模数转换器,双通道的ADC支持单极和差分输入工作模式,其最多可支持17路外部模拟输入通道。 下图为XADC的一个内部实现框图(详见Page14),从图中可以看出ADC分为12位的A和B两个,故称为双12位。其中ADC A可以对供电电压进行采样,供电电压包括VCCINT、VCCAUX、VCCBRAM,其中Zynq-7000系列的芯片还支持对VCCPINT、VCCPAUX和VCCO_DDR的采样,还包括温度的采样和外部模拟输入的采样。ADC B只能对外部模拟输入进行采样转换。 XADC内部包括16位的控制寄存器和状态寄存器,控制寄存器可以通过DRP(DynamicReconfiguration Port)进行读写操作,从而实现对XADC的初始化配置,而状态寄存器只能进行读取,ADC将采样转换后的值保存在对应的状态寄存器,通过DRP便可以将其读出,从而便可以用于FPGA外部的使用。 模拟输入管脚
XADC可以采样的外部模拟输入包括一对差分专用模拟输入信号端(Dedicated Analog)和16对差分辅助模拟输入信号端(Auxiliary Analog),其中16对模拟信号端在XADC中不被使用时,可以当做普通IO口来使用。辅助模拟输入信号在Vivado和ISE中使用是不同的:在ISE中辅助模拟输入不需要任何的用户定义约束(包括管脚位置约束和IO电平约束),而在Vivado里,辅助模拟输入管脚必须加管脚位置约束,而且必须选择合适的IO电平约束。有些辅助输入管脚对7系列的某些芯片是不支持的,可以通过原理图来查看哪些管脚可以使用,我们的开发板引出来比Zedboard更多的模拟输入端口:其中AD1、AD2、AD3、AD5、AD6、AD10、AD12、AD13都被引出了,下图为专用模拟通道和引出的辅助模拟通道中P端的管脚的对应关系。 XADC原语 XADC使用时,需要通过动态重配置端口(DRP)对其寄存器进行初始化,Xilinx公司提供XADC原语,我们需将其例化在顶层文件中,并将其中的寄存器值改为我们需要的工作状态的值就可以让其正常工作。
XADC的原语框图如下图所示(详见Page18)。 下面为XADC原语对应的管脚说明图(详见UG480 Page19)。 虽然管脚很多,但是我们需要掌握和修改的都是很少的,我们一般只需关心VAUXN,VAUXP,VP和VN等四种管脚。 采样模式 XADC的采样模式分为单极模式与双极模式,其中所有的片上采样转换都必须使用单极操作模式,用户只能对外部模拟输入信号端进行单极与双极的选择。
单极模式的模拟量程是0~1V,其对应的数字量程为0~4096(2^12),一个数字度量单位代表244uv(1V/4096),单极模式的模数转换如下图所示。 当使用双极模式可以采样差分信号,当输出为负电压时,读取到的是二进制的补码形式。其满量程为1V(差分输入,+500~ -500mv),其对应的数字量程为0~4096(2^12),一个数字度量单位代表244uV(1V/4096),双极模式的模数转换如下图所示。 初始化配置与读取
我们对XADC初始化配置,主要通过对控制寄存器进行写操作,对采样转换的电压信号通过读取状态寄存器来完成获取。下图为状态寄存器与控制寄存器框图(详见page36) XADC的例化中有寄存器的参数配置: 我们通过对地址为4Ch和4Dh的寄存器赋值0来选择单极模式(Unipolar Mode),对地址为49h的控制寄存器赋值16’h0101(0000_0001_0000_0001)来选择使用VAUXP[0]和VAUXP[8]两路辅助模拟输入,其代码如下所示。 XADC #(// Initializing the XADC Control Registers
//--- --------Configuration Registers (40h to 42h) ---------------------- .INIT_40(16'h9000),// averaging of 16 selected for external channels,continuous sampling mode // INIT_41 enablealarm: over-temperature,temperature,VCCINT,VCCAUX,all Calibration,VCCPINT,VCCPAUX,VCCO_DDR, .INIT_41(16'h2ef0),// Continuous Seq Mode, Disable unused ALMs, Enablecalibration .INIT_42(16'h0400),// Set DCLK divides 4
//------------Channel Sequencer Registers (48h to 4Fh) -----------------
//ADC ChannelSelection Registers (48h and 49h) .INIT_48(16'h4701),// CHSEL1 - enable Temp VCCINT, VCCAUX, VCCBRAM, andcalibration .INIT_49(16'h0101),// CHSEL2 - enable aux analog channels0&&8 ( 16'hc0c0 6&&7 VAUXP[6], VAUXN[6] VAUXP[7], VAUXN[7]) // ADC ChannelAveraging (4Ah and 4Bh) .INIT_4A(16'h0000),// SEQAVG1 disabled (sequencer_averaging) .INIT_4B(16'h0000),// SEQAVG2 disabled
通过对读写状态机的寄存器地址进行修改,便可以读取我们需要的通道的电压值,我们在MEASURED_AUX0通道选择读取寄存器地址为7’h1e,则对应读取辅助模拟通道为14通道的电压值,同理可修改MEASURED_AUX1、MEASURED_AUX2、MEASURED_AUX3的读取的状态寄存器的地址,从而可读取对应通道的电压值。下图为辅助模拟通道对应的状态寄存器地址图(详见page38)。 读写状态机的代码如下所示:
read_reg10 : begin daddr <= 7'h1e; //////////////MEASURED_AUX0 ---- 7'h1e ----VAUXP[14]&&VAUXN[14]///////////////////// den_reg <= 2'h2; // performing read state <= reg10_waitdrdy; end reg10_waitdrdy : if (drdy==1) begin MEASURED_AUX0 <= do_drp; state<= read_reg11; end elsebegin den_reg <= { 1'b0, den_reg[1] } ; dwe_reg <= { 1'b0, dwe_reg[1] } ; state<= state; end read_reg11 :begin daddr <= 7'h1f; //////////////MEASURED_AUX1 ---- VAUXP[15]&&VAUXN[15]///////////////////// den_reg<= 2'h2; // performing read state <= reg11_waitdrdy; end reg11_waitdrdy : if (drdy==1) begin MEASURED_AUX1 <= do_drp; state<= read_reg12; end elsebegin den_reg <= { 1'b0, den_reg[1] } ; dwe_reg <= { 1'b0, dwe_reg[1] } ; state<= state; end read_reg12 : begin daddr <= 7'h10; //////////////MEASURED_AUX2 ---- VAUXP[0]&&VAUXN[0]///////////////////// den_reg<= 2'h2; // performing read state <= reg12_waitdrdy; end reg12_waitdrdy: if (drdy==1) begin MEASURED_AUX2 <= do_drp; state<= read_reg13; end elsebegin den_reg <= { 1'b0, den_reg[1] } ; dwe_reg <= { 1'b0, dwe_reg[1] } ; state<= state; end read_reg13 :begin daddr <= 7'h18; //////////////MEASURED_AUX3 ---- VAUXP[8]&&VAUXN[8]///////////////////// den_reg<= 2'h2; // performing read state <= reg13_waitdrdy; end reg13_waitdrdy : if (drdy==1) begin MEASURED_AUX3 <= do_drp; state<=read_reg00; daddr <= 7'h00; end
为此,我们便可以读出不同通道下的电压值了。
|