Xilinx 7系列FPGA全系内置了一个ADC,称为XADC。这个XADC内部是两个1Mbps的ADC,可以采集模拟信号转为数字信号送给FPGA内部使用。XADC内部可以直接获取芯片结温和FPGA的若干供电电压(7系列不包括VCCO),用于监控FPGA内部状况。同时提供了17对差分管脚,其中一对专用的模拟差分输入,16对复用的模拟差分输入,不使用的时候可以作为普通的User I/O。
XADC的原语主要输入由DRP端口,控制和时钟端口,外部模拟端口,输出会有报警信号可通过ALM(7:0)输出,并有专用的温度告警信号OT。如下图所示。
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)
);
例如2423 (977h) = 25°C。
例如VCCINT = 1V 则地址01H上得到的值为 1/3 x 4096 = 1365 = 555h。
下图是配合DDR读出的温度值。
JTAG读取结果如下图