关键词:XADC,PYNQ Z2, XADC IP核, PL
说明 : 不涉及xadc开发板,PCB设计, 如果需要了解xadc请看这里
开始使用
使用XADC IP核, 参考手册 PG910
Fig : BASIC
接口选择
接口可以选择AXI lite 或者DRP
axi lite接口一般是使用ps读取xadc的时候使用,将数据给ps处理
在PL端处理就选择DRP接口
时序模式
根据需求选择连续模式或者自己设置触发信号
连续模式ADC会一直工作, 这里选择持续采样模式
事件模式需要自己给触发信号,给CONVST or CONVSTCLK信号,且只能采集外部通道
startup channel select
Simultaneous Selection – This mode allows you to monitor two external channels simultaneously. For more information about this mode see the 7 Series FPGAs XADC User Guide (UG480)
Independent ADC – This mode allows you to run the XADC in independent mode. Here, the XADC independently monitors the externals channels and at the same time monitors the FPGA voltages and temperature.
根据自己需要多少个通道选择single channel 或者 channel sequencer, 这里单通道选择single channel,一般使用下面两种
DRP Timing Options
根据自己需要的采样率去进行时钟频率配置
Acquisition time : 需要几个clk能完成数据转换
在代码里的DCLK使用这里设置的时钟频率
axi stream
将采集数据使用axi stream给ps用的,并且设置fifo深度,这里不用
control port
可以选择复位选项
analogy sim file option
系统自带的用于仿真的用的,可以不予处理
Fig : ADC_Setup
sequencer mode : 表示排序模式,具体有何区别,手册没写,但是single channel不可以进行配置
channel avg : 可以进行选择16,64,256个数据进行取平均,在xadc内部进行,一般我们读取出来以后自己进行滤波
ADC / Supply Sensor Calibration
可以对adc和供电进行校正
外部通道多路复用选择器
应该是值第一个指向那个通道,我选择了VAUXP1 VAUXN1, 指向外部通道1
同时我将ADCB掉电了,不使用ADCB
Alarm
我没有使用任何报警信号,自己可以配置,设置阈值
Single channel
我选择的是单通道采集
如果不是单通道采集,而是多通道的会出现如下图
最后就配置完成了
复制voe模板如下
xadc_wiz_0 your_instance_name (
.di_in(di_in), // input wire [15 : 0] di_in
.daddr_in(daddr_in), // input wire [6 : 0] daddr_in
.den_in(den_in), // input wire den_in
.dwe_in(dwe_in), // input wire dwe_in
.drdy_out(drdy_out), // output wire drdy_out
.do_out(do_out), // output wire [15 : 0] do_out
.dclk_in(dclk_in), // input wire dclk_in
.reset_in(reset_in), // input wire reset_in
.vp_in(vp_in), // input wire vp_in
.vn_in(vn_in), // input wire vn_in
.vauxp1(vauxp1), // input wire vauxp1
.vauxn1(vauxn1), // input wire vauxn1
.channel_out(channel_out), // output wire [4 : 0] channel_out
.eoc_out(eoc_out), // output wire eoc_out
.alarm_out(alarm_out), // output wire alarm_out
.eos_out(eos_out), // output wire eos_out
.busy_out(busy_out) // output wire busy_out
);
根据自己需求进行信号选取
同时需要一个pll IP核得到30MHz信号
// port for xadc
xadc_wiz_0 xadc_inst (
.di_in (xadc_din ), // input wire [15 : 0] di_in
.daddr_in (addr ), // input wire [6 : 0] daddr_in
.den_in (xadc_en ), // input wire den_in
.dwe_in (xadc_wen ), // input wire dwe_in
.drdy_out (xadc_drdy ), // output wire drdy_out
.do_out (xadc_dout ), // output wire [15 : 0] do_out
.dclk_in (clk_30mhz ), // input wire dclk_in
.reset_in (rst_p ), // input wire reset_in
.vp_in ( ), // input wire vp_in
.vn_in ( ), // input wire vn_in
.vauxp1 (ch1_p ), // input wire vauxp1
.vauxn1 (ch1_n ), // input wire vauxn1
.channel_out( ), // output wire [4 : 0] channel_out
.eoc_out (xadc_eoc ), // output wire eoc_out
.alarm_out ( ), // output wire alarm_out
.eos_out ( ), // output wire eos_out
.busy_out (xadc_busy ) // output wire busy_out
);
模块输入输出端口信号为
module top(
input wire clk_125mhz ,
input wire rst_p ,
input wire ch1_p ,
input wire ch1_n ,
input wire key ,
output wire led
);
根据原理图
管脚应该为A0->E17, D18自动约束
将ch1_p, ch1_n进行管脚约束即可,io std 选择的是LVCOM33, vivado最后会识别出这个管脚是analogy pin.
三. ILA 数据抓取
将通道1接GND
将通道1接3.3V
code : https://github.com/tiruoQing/fpgas/blob/main/xadc/single_channel.v