XADC采集外部信号实时显示在RGB屏幕中
概述
XADC在Xilinx7系列器件上可用。The XADC is available in all Artix-7, Kintex-7, Virte-7, and Zynq-7000 SoC devices.
XADC需要例化使用,但是如果使用JTAG访问的话,就不需要例化,直接在Vivado软件中就可以直接访问XADC的各项数据,包括芯片温度、电压等数据。The XADC also includes several on-chip sensors that support measurement of the on-chip power supply voltages and die temperature. The ADC conversion data is stored in dedicated registers called status registers. These registers are accessible through the FPGA interconnect using a 16-bit synchronous read and write port called the dynamic reconfiguration port (DRP).也可以通过DRP进行访问XADC的数据寄存器。
XADC有一个专用的模拟输入对(Vp_Vn),在外部使用两个引脚。此外还有16个辅助模拟输入可用,这些辅助模拟输入在平时是作为数字I/O口使用的。(相当于单片机的管脚复用)
此外,在Vivado中,调用XADC是需要自行进行管脚位置约束的,使用ISE则不需要。(但是在Vivado管脚约束的GUI界面处,Vp_Vn引脚是会有提示对应哪个I/O口的)。
这里同样指出,使用JTAG访问XADC时,是不需要例化的。
DI[15:0] | DRP输入数据总线 |
---|---|
DO[15:0] | DRP输出数据总线 |
DADDR[6:0] | DRP地址总线 |
DEN | DRP使能信号 |
DWE | DRP写使能 |
DCLK | DRP时钟输入 |
DRDY | DRP数据就绪信号 |
RESET | XADC控制逻辑的异步复位信号。 |
CONVST | 转换起始输入。 |
CONVSTCLK | 转换开始时钟输入。 |
VP , VN | 专用模拟输入引脚,提供差分模拟输入。 |
VAUXP[15:0], VAUXN[15:0] | 十六个辅助模拟输入对 |
ALM[0] | 温度传感器报警输出 |
ALM[1] | VCCINT传感器报警输出 |
ALM[2] | VCCAUX传感器报警输出。 |
ALM[3] | VCCBRAM传感器报警输出 |
ALM[4] | VCCPINT传感器报警输出 |
ALM[5] | 传感器报警输出 |
ALM[6] | VCCO_DDR传感器报警输出 |
ALM[7] | 总线ALM的逻辑OR[6:0]。可用于标记任何警报的发生。 |
OT | 超温报警输出 |
MUXADDR[4:0] | 这些输出用于外部多路复用器模式。它们指示要转换的序列中的下一个信道的地址。 |
CHANNEL[4:0] | 通道选择输出。ADC转换结束输出数据时,输出的为哪个通道(管脚)的数据 |
EOC | 转换结束信号。当测量值写入状态寄存器时,该信号在ADC转换结束时转变为高电平有效 |
EOS | 序列结束信号。当通道序列中最后一个通道的测量数据被写入状态寄存器时,该信号转变为有效高电平 |
BUSY | ADC忙音。该信号在ADC转换期间转换为高电平。在ADC或传感器校准期间,该信号还会在较长时间内转换为高电平 |
JTAGLOCKED | 表示JTAG接口发出了DRP端口锁定请求。该信号还用于指示DRP已准备好接入(当低电平时)。 |
JTAGMODIFIED | 用于指示发生了对DRP的JTAG写入 |
JTAGBUSY | 用于指示JTAG DRP事务正在进行中 |
XADC的两种模式
Unipolar Mode(单极模式)
此时VP应该接正,VN接地,测量范围为0~1V,分辨率为244uV,输入0V时,输出000h,输入1V时,输出FFFh。
Bipolar Mode(双极模式)
此时VP00.5V,VN测量范围为-0.50V。
上述为只读的状态寄存器及其地址,ADC读取到的各个通道的数据都存储在相应地址中,值得注意的是,前边的 CHANNEL[4:0]通道选择输出。ADC转换结束输出数据时,输出的为哪个通道(管脚)的数据 与这里的地址是一样的,也就是说可以直接将CHANNEL[4:0]与DRP的DADDR[6:0]相连接,这样读取的数据与ADC测量的数据时对应的。
简单来说就是,当EOC/EOS高电平之后,表示ADC数据转换完成,并且已经存储的相应的寄存器上,同时的CHANNEL也会输出ADC转换的相应的通道地址。这时就可以通过DRP来访问相关寄存器。使能DRP(DEN),将ADC寄存器地址发送DADDR地址总线上,DRP开始读取相应寄存器中的数据,当DRDY高电平时,表示寄存器地址读取完成,DO输出的为有效数据。
相关的代码就不放了,因为主要参考的是FPGA使用XADC测量外部模拟输入电压这篇文章的代码。大家有兴趣的可以去看看,他写的比我详细的多。
JTAG访问XADC
可以在此处,点开XADC就可以在不用例化的情况下访问相关数据。
工程源码
我把XADC读取外部数据,并且显示在RGB屏幕的源码已经上传在百度网盘中,大家有需要的自取即可。
链接: https://pan.baidu.com/s/1IH_9_BDwL3NJpeCsp5KrSg?pwd=2w5p 提取码: 2w5p 复制这段内容后打开百度网盘手机App,操作更方便哦
基于正点原子达芬奇开发板,其他的开发板需要更改相关的引脚约束。
正点原子代码问题
正点原子中的部分代码直接使用了除法,而在FPGA中,使用除法则会造成大量逻辑资源的浪费,所以建议大家尽量不要在FPGA中直接使用除法。
可以看到,使用除法会消耗大量的逻辑资源,并且可能造成时序问题。
参考文献
[1] 正点原子. 达芬奇之FPGA开发指南
[2] 野火. FPGA+Verilog开发实战指南——基于Xilinx+Spartan6
[3] 子疯叶.FPGA使用XADC测量外部模拟输入电压CSDN(https://blog.csdn.net/qq_56016739/article/details/131905117)