赞
踩
Xilinx系列的FPGA中都包含了一个内置的XADC,我们可以通过这个XADC进行一些精度不高的外部模拟信号采样以及FPGA片内传感器信号采集。XADC的分辨率为12位,采样率为1MSPS。
信号名 | 方向 | 功能描述 |
---|---|---|
di_in[15:0] | input | DRP的输入数据总线。 |
daddr_in[6:0] | input | DRP的地址总线。 |
den_in | input | DPR的使能信号 |
dwe_in | input | DRP的写使能信号 |
drdy_out | output | DRP的数据准备好信号 |
do_out[15:0] | output | DRP的输出数据总线 |
dclk_in | input | DRP的输入时钟 |
reset_in | input | XADC的复位信号,高电平有效 |
vp_in/ vn_in | input | 专用模拟输入通道,可设计为差分模拟信号输入,当设计使用XADC功能但不用VP/VN时,应该将这两个引脚接地 |
VAUXP[15:0]/VAUXN[15:0] | input | 16个复用的模拟输入通道,可设计为差分模拟信号输入 |
ot_out | output | 过温报警输出信号 |
channel_out[4:0] | input | 通道选择输出信号。当前ADC转换的输入MUX通道选择,由该接口输出提供给用户查看。 |
eoc_out | output | ADC转换完成信号。当测量值被写入状态寄存器时,该信号在ADC完成转换之后拉高 |
eos_out | output | 时序结束信号。自动通道序列中,当最后一个通道的数据被写入状态寄存器时,该信号转为高电平。 |
busy_out | output | ADC忙信号。该信号在ADC转换时为一直为高电平。 |
寄存器接口:
XADC一共有128个寄存器,前64个(00H ~ 3FH)为只读寄存器,后64个(40H~7FH)为可读写的控制寄存器。一般我们用前32个只读寄存器比较多。
ADC通道选择寄存器:
可以看到ADC模拟通道选择的值与对应通道存放数据的状态寄存器的地址相同。
XADC的所需要的基本外围电路如图所示。XADC的基准源可使用外步基准源来实现,基准源的电压为1.25V;也可以选择使用内部基准源,外围电路直接将VREFP和VREFN接地即可。
XADC模拟信号输入方式有单极性和双极性两种。XADC默认的方式为单极性输入,fpga片上所有传感器的工作模式为单极性输入。
在单极性输入模式,Vp必须为正,Vn连接到模拟地或者共模信号。Vn连接到共模信号时,该信号电压范围应该为0V0.5V(即Vp与Vn的共模电压范围),由于Vp与Vn的差模电压范围为0V1V,所以在单极性输入模式下,Vp的输入电压最高可达1.5V。
模拟通道输入为高输入,数据手册上推荐电路由分压电路和滤波电路组成,通过分压和滤波之后输入到XADC的模拟信号电压值应该不超过1V。
图2.6中 R1与R2为分压电阻,R5用于与R1与R2的并联电阻匹配。R3、R4与C1构成抗混叠滤波器,建立时间计算参考手册ug480。
主要有电压采集和电压转换两个阶段。
主要用于XADC寄存器的数据读写。
在ZYQN的pl端使用XADC,完成共6路模拟输入信号的电压采样。其中模拟输入通道包括1个Vp/Vn模拟输入通道和5个复用模拟输入通道VAUXP/VAUXN。
Alarms界面
若不是用检测警告功能,该界面可以全部取消勾选。
Channel Sequencer界面
选择需要初始化的通道即可。这里使用的模拟通道为Vp/Vn、vauxp0/vauxn0、vauxp2/vauxn2、vauxp3/vauxn3、vauxp10/vauxn10、vauxp11/vauxn11。
Summary界面
`timescale 1ns / 1ps
///
// Create Date: 2023/07/18 16:36:43
module top(
//时钟
input pl_clk,
//模拟输入
input vp_in,
input vn_in,
input vauxp0,
input vauxn0,
input vauxp2,
input vauxn2,
input vauxp3,
input vauxn3,
input vauxp10,
input vauxn10,
input vauxp11,
input vauxn11
);
wire den_in;
wire dwe_in;
wire drdy_out; //数据有效输出
wire [15:0] di_in, do_out; //数据输入 数据输出
wire [6:0] daddr_in; //寄存器地址
wire [4:0] channel_out; // 通道选择输出
wire eoc_out; // 转换完成信号
wire eos_out; // 时序结束信号
wire alarm_out;
wire busy_out;
wire rst_n;
//模拟通道读取的ADC值
wire [11:0] vpvnData;
wire [11:0] vaux0Data, vaux2Data,vaux3Data,vaux10Data,vaux11Data;
//XADC IP例化
xadc_wiz_0 inst_xadc_wiz_0 (
.dclk_in(pl_clk), // input wire dclk_in
.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(0), // input wire dwe_in 仅用到读操作,故一直设置为零
.drdy_out(drdy_out), // output wire drdy_out
.do_out(do_out), // output wire [15 : 0] do_out
.reset_in(0), // input wire reset_in 不用复位功能
.vp_in(vp_in), // input wire vp_in
.vn_in(vn_in), // input wire vn_in
.vauxp0(vauxp0), // input wire vauxp0
.vauxn0(vauxn0), // input wire vauxn0
.vauxp2(vauxp2), // input wire vauxp2
.vauxn2(vauxn2), // input wire vauxn2
.vauxp3(vauxp3), // input wire vauxp3
.vauxn3(vauxn3), // input wire vauxn3
.vauxp10(vauxp10), // input wire vauxp10
.vauxn10(vauxn10), // input wire vauxn10
.vauxp11(vauxp11), // input wire vauxp11
.vauxn11(vauxn11), // input wire vauxn11
.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
);
//对DRP接口操作,完成XADC寄存器数据的读取
xadc_capture inst_xadc_capture(
.dclk(pl_clk),
.rst_n(1), //不用复位功能
.di_in(di_in),
.daddr_in(daddr_in),
.den_in(den_in),
.dwe_in(dwe_in),
.drdy_out(drdy_out),
.eoc_out(eoc_out),
.do_out(do_out),
.channel_out(channel_out),
.xadc_vpvn_data(vpvnData),
.xadc_vaux0_data(vaux0Data),
.xadc_vaux2_data(vaux2Data),
.xadc_vaux3_data(vaux3Data),
.xadc_vaux10_data(vaux10Data),
.xadc_vaux11_data(vaux11Data)
);
endmodule
`timescale 1ns / 1ps
///
// Create Date: 2023/07/18 16:36:13
module xadc_capture(
input dclk,
input rst_n,
//XADC IP 接口
output reg[15:0]di_in, // 写入xadc总线上的数据
output reg[6:0] daddr_in, // 读取xadc寄存器地址
output reg den_in, // 控制使能
output reg dwe_in, // 写使能
input drdy_out, // 数据有效输出
input eoc_out,
input [15:0] do_out, // 读取xadc总线上的数据
input [4:0] channel_out, // 通道选择输出
//内部逻辑接口
output reg[11:0] xadc_vpvn_data, //XADC 读出的 Vp/Vn 采样数据
output reg[11:0] xadc_vaux0_data, //XADC 读出的 vaux0 采样数据
output reg[11:0] xadc_vaux2_data, //XADC 读出的 vaux2 采样数据
output reg[11:0] xadc_vaux3_data, //XADC 读出的 vaux3 采样数据
output reg[11:0] xadc_vaux10_data, //XADC 读出的 vaux10 采样数据
output reg[11:0] xadc_vaux11_data //XADC 读出的 vaux11 采样数据
);
///
//产生 XADC 读时序
always @(posedge dclk or negedge rst_n) begin
if(!rst_n) begin
den_in <= 1'b0;
dwe_in <= 1'b0;
daddr_in <= 7'd0;
di_in <= 7'd0;
end
else if(eoc_out) begin
daddr_in <= {2'b00, channel_out}; //XADC 数据读取寄存器地址 直接连接到通道选择输出channel_out[4:0]
den_in <= 1'b1; //产生den_in一个时钟周期的高电平
end
else begin
daddr_in <= 7'd0;
den_in <= 1'b0;
end
end
///
//读 XADC 输出数据
always @(posedge dclk or negedge rst_n) begin
if(!rst_n) begin
xadc_vpvn_data <= 0;
xadc_vaux0_data <= 0;
xadc_vaux2_data <= 0;
xadc_vaux3_data <= 0;
xadc_vaux10_data <= 0;
xadc_vaux11_data <= 0;
end
else if(drdy_out) begin
case(channel_out[4:0])
5'h03: begin
xadc_vpvn_data <= do_out[15:4];
end
5'h10: begin
xadc_vaux0_data <= do_out[15:4];
end
5'h12: begin
xadc_vaux2_data <= do_out[15:4];
end
5'h13: begin
xadc_vaux3_data <= do_out[15:4];
end
5'h1a: begin
xadc_vaux10_data <= do_out[15:4];
end
5'h1b: begin
xadc_vaux11_data <= do_out[15:4];
end
default: begin
end
endcase
end
end
endmodule
#时钟物理约束
set_property PACKAGE_PIN AD20 [get_ports pl_clk]
set_property IOSTANDARD LVCMOS33 [get_ports pl_clk]
#时钟周期约束
create_clock -name clk -period 10 [get_ports pl_clk ]
提示: 当使用复用模拟通道时(VAUXP[15:0]和VAUXN[15:0]),在fpga逻辑设计中不需要对相应的引脚进行约束,只用在顶层模块中调用IP例化模块,并连接到顶层的信号输入即可,这样该引脚就可以作为模拟输入通道。在约束文件中仅对时钟进行了约束。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。