目录
双路高速 AD 实验
1、简介
3PA1030 芯片
2、实验任务
3、程序设计
3.1、hs_dual_ad 模块代码
clk_wiz IP 核 的添加方法
ILA IP 核(集成逻辑分析器:Integrated Logic Analyzer,ILA)
4、硬件设计
4.1、添加.xdc约束文件
5、下载验证
双路高速 AD 实验
ADC(Analog to Digital Converter 即模数转换器)是大多数系统中必不可少的组成部件,用于将连续的模拟信号转换成离散的数字信号,它们是连接模电电路和数字电路必不可少的桥梁。在很多场合下,ADC的转换速度甚至直接决定了整个系统的运行速度。本章我们将使用双路高速 AD 模块采集外部模拟信号转换成数字信号,并在 ILA 中查看信号波形。
1、简介
本章我们使用的高速双路 AD 模块是正点原子推出的一款高速双路模数转换模块(ATK_DUAL_HS_AD),高速 AD 转换芯片由恩瑞浦公司生产的,型号是 3PA1030。
ATK_DUAL_HS_AD 模块的硬件结构图如下图所示。
3PA1030 芯片的输入模拟电压转换范围是 0V~2V,所以电压输入端需要先经过电压衰减电路,使输入的-5V~+5V 之间的电压衰减到 0V~2V 之间,然后经过 3PA1030 芯片将模拟电压信号转换成数字信号。
下面我们介绍下这个芯片。
3PA1030 芯片
3PA1030 是一款恩瑞浦推出的单电压芯片,10 位,50 MSPS(Million Samples Per Second,每秒采样百万次)模数转换器,集成片上采样保持放大器和基准电压源。具有高性能低功耗的特点。
3PA1030 的内部功能框图如下图所示:
3PA1030 在时钟(CLK)的驱动下工作,3PA1030 内置片内采样保持放大器(SHA),同时采用多级差分流水线架构,保证了 50MSPS 的数据转换速率下全温度范围内无失码;3PA1030 内部集成了基准源,根据系统需要也可以选择外部高精度基准满足系统的要求。
3PA1030 输出的数据以二进制格式表示,当输入的模拟电压超出量程时,会拉高 OVR 信号;当输入的模拟电压在量程范围内时,OVR 信号为低电平,因此可以通过 OVR 信号来判断输入的模拟电压是否在测量范围内。另外 3PA1030 有一个 OE 信号,当该信号为高电平时 3PA1030 输出呈高阻态,低电平则可以正常输出。
3PA1030 的时序图如下图所示:
上图中,S1,S2,S3 分别为三个采样点,可以看到,芯片在时钟的上升沿采样。需要注意的是,3PA1030 芯片的最大转换速度是 50MSPS,即输入的时钟最大频率为 50MHz。
3PA1030 支持输入的模拟电压范围是 0V 至 2V,0V 对应输出的数字信号为 0,2V 对应输出的数字信号为 1023。而 DA 经外部电路后,输出的电压范围是-5V~+5V,因此在 3PA1030 的模拟输入端增加电压衰减电路,使-5V~+5V 之间的电压转换成 0V 至 2V 之间。那么实际上对我们用户使用来说,当 3PA1030 的模拟 输入接口连接-5V 电压时,AD 输出的数据为 0;当 3PA1030 的模拟输入接口连接+5V 电压时,AD 输出的数据为 1023。
当 3PA1030 模拟输入端接-5V 至+5V 之间变化的正弦波电压信号时,其转换后的数据也是成正弦波波形变化,转换波形如下图所示:
由上图可知,输入的模拟电压范围在-5V 至 5V 之间,按照正弦波波形变化,最终得到的数据也是按照正弦波波形变化。
2、实验任务
本节实验任务是使用达芬奇 Pro 开发板及双路 AD 扩展模块(ATK_DUAL_HS_AD 模块)实现双路模数的转换,并在 ILA 中查看波形。本实验我们模拟输入源来自信号发生器,一个是正弦波,频率 1Mhz,幅值 9V;另一个是三角波,频率 1Mhz,幅值 5V。两路模拟信号分别接在双路 AD 模块的模拟信输入端。
3、程序设计
根据本章的实验任务,高速双路 AD 模块同时采集两路外部模拟信号,在模块内部实现模数转换,将转换后的数字信号传给 FPGA 管脚,FPGA 内部逻辑分析仪通过抓取数据将外部的模型信号呈现出来。
图 28.4.1 是根据本章实验任务画出的系统框图。我们事先准备两路模拟信号源,本实验我们使用信号发生器产生模拟输入源。接到双路 AD 芯片的信号输入端,在双路 AD 内部实现 AD 转换,将转换后的信号送给 FPGA,在这里,FPGA 只需要给 AD 芯片输出驱动时钟信号(AD_CLK)和使能信号(AD_OE),AD 芯片便可完成模拟采集并转换成数字信号。
高速双路 AD 实验的系统框图如图 28.4.1 所示:
顶层模块的原理图如下图所示:
本实验我们只用了一个模块(hs_dual_ad),用来产生 AD 芯片所需的驱动时钟和输出使能。同时在模块例化了一个 ILA,用来观察采集到的模拟信号的波形。
3.1、hs_dual_ad 模块代码
hs_dual_ad 模块的代码如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/05/17 15:49:04
// Design Name:
// Module Name: hs_dual_ad
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
//ADC(Analog to Digital Converter 即模数转换器)是大多数系统中必不可少的组成部件,
//用于将连续的模拟信号转换成离散的数字信号,它们是连接模电电路和数字电路必不可少的桥梁。
//在很多场合下,ADC的转换速度甚至直接决定了整个系统的运行速度。
//本章我们将使用双路高速 AD 模块采集外部模拟信号转换成数字信号,并在 ILA 中查看信号波形。
//*********************实验任务:双路高速AD实验****************************
//本节实验任务是使用达芬奇 Pro 开发板及双路 AD 扩展模块(ATK_DUAL_HS_AD 模块)实现双路模数的转换,
//并在 ILA 中查看波形。本实验我们模拟输入源来自信号发生器,一个是正弦波,频率 1Mhz,幅值 9V;
//另一个是三角波,频率 1Mhz,幅值 5V。两路模拟信号分别接在双路 AD 模块的模拟信输入端。
module hs_dual_ad(
input sys_clk, //50Mhz系统时钟(达芬奇Pro开发板)
//AD0
input [9:0] ad0_data, //AD0 数据
input ad0_otr, //输入电压超过量程标志
output ad0_clk, //AD0 采样时钟
output ad0_oe, //AD0 输出使能
//AD1
input [9:0] ad1_data, //AD1 数据
input ad1_otr, //输入电压超过量程标志
output ad1_clk, //AD1 采样时钟
output ad1_oe //AD1 输出使能
);
//wire define
wire clk_out1;
wire clk_out2;
//**********************************************************
//** main code
//**********************************************************
assign ad0_oe = 1'b0;
assign ad1_oe = 1'b0;
assign ad0_clk = ~clk_out1;
assign ad1_clk = ~clk_out1;
clk_wiz_0 u_clk_wiz_0(
//clock out ports
.clk_out1 (clk_out1), //output clk_out1
//Status and control signals
.clk_out2 (clk_out2), //output clk_out2
.reset (1'b0), //input reset
.locked (locked), //output locked
//clock in ports
.clk_in1 (sys_clk) //input clk_inl
);
ila_0 u_ila_0(
.clk (clk_out1), //input wire clk
.probe0 (ad1_otr), //input wire [0:0] probe0
.probe1 (ad0_data), //input wire [9:0] probe1
.probe2 (ad0_otr), //input wire [0:0] probe0
.probe3 (ad1_data) //input wire [9:0] probe1
);
endmodule
代码第 53 到 54 行产生双路 AD 的两个输出使能信号,ad0_oe 和 ad1_oe,请注意,它们是低电平有效,所以我们直接赋值 0。55 行到 56 行,产生驱动 AD 芯片的时钟,ad0_clk 和 ad1_clk,他们都是由 clk_out1 取反得来,取反其实就是相移 180°。其中 clk_out1 由时钟模块产生,大小是 50M。
clk_wiz IP 核 的添加方法
clk_wiz IP 核 的添加方法,可参考:
DDS 信号发生器实验_OliverH-yishuihan的博客-CSDN博客 中的 “3.2、clk_wiz IP 核”。
ILA IP 核(集成逻辑分析器:Integrated Logic Analyzer,ILA)
ILA IP 核 的添加方法,可参考:
DDS 信号发生器实验_OliverH-yishuihan的博客-CSDN博客 中的 “3.3、ILA IP 核(集成逻辑分析器:Integrated Logic Analyzer,ILA)”。
4、硬件设计
ATK_DUAL_HS_AD 模块电路主要包括扩展口,AD 芯片,电源电路模块和低通滤波器,衰减电路。下面是扩展口电源电路部分。
由上图可知,双路 AD 模块使用到的管脚连接道路 JP1 上,这些管脚包括十位的数据,时钟以及电源等信号。U2 用于将 5V 电压转成 VCC+(2.8V)供 U1 使用,U1 将 VCC+转成了 VCC-(-2.8V),±2.8V 电压供双电源运放 TPH2501 使用。U3 负责将 5V 电压转成 VCC(3.3V)。
衰减电路原理图如下图所示。
上下两个电路是一样的,我们以上面的电路为例。上图中输入的模拟信号 IN1(V1)经过衰减电路后得到 AD_IN1(VO)信号,两个模拟电压信号之间的关系是 VO=VI/5+1,即当 VI=5V 时,VO=2V;VI=-5V 时,VO=0V。
ATK_DUAL_HS_AD 模块的实物图如下图所示。
4.1、添加.xdc约束文件
本实验中,各端口信号的管脚分配如下表所示。
对应的 hs_dual_ad.xdc 约束语句,具体如下所示:
######## 时钟 引脚约束 ####################达芬奇Pro#############
create_clock -period 20.000 -name sys_clk [get_ports sys_clk]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN R4} [get_ports sys_clk]
#ad_data0
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN E16} [get_ports {ad0_data[0]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN D14} [get_ports {ad0_data[2]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN B21} [get_ports {ad0_data[4]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN B22} [get_ports {ad0_data[6]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN D20} [get_ports {ad0_data[8]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN B20} [get_ports ad0_otr]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN C18} [get_ports ad0_clk]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN D16} [get_ports {ad0_data[1]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN D15} [get_ports {ad0_data[3]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN A21} [get_ports {ad0_data[5]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN C22} [get_ports {ad0_data[7]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN C20} [get_ports {ad0_data[9]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN A20} [get_ports {ad0_oe}]
#ad_data1
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN B15} [get_ports {ad1_data[0]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN C14} [get_ports {ad1_data[2]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN C13} [get_ports {ad1_data[4]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN AB18} [get_ports {ad1_data[6]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN U18} [get_ports {ad1_data[8]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN W17} [get_ports ad1_otr]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN P16} [get_ports ad1_clk]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN B16} [get_ports {ad1_data[1]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN C15} [get_ports {ad1_data[3]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN B13} [get_ports {ad1_data[5]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN AA18} [get_ports {ad1_data[7]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN U17} [get_ports {ad1_data[9]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN V17} [get_ports {ad1_oe}]
5、下载验证
将高速双路 AD 模块插入达芬奇 Pro 开发板 J3 扩展口,连接时注意扩展口电源引脚方向和开发板电源引脚方向一致,然后将下载器一端连接电脑,另一端与开发板上对应端口连接,最后连接电源线并打开电源开关。
达芬奇 Pro 开发板硬件连接实物图如下图所示:
将工程生成的比特流文件下载到 FPGA 中后, 连接后在 ILA 中观察 ad_data 数据的变化,观察到的波形如下图所示。
由上图可知,输入的 ad_data 数据分别为三角波和正弦波,频率和幅值与信号发生器发的设定相一致,说明双路高速 AD 实验验证成功。
另外,在这里介绍一下如何将数据设置成波形图显示。首先选中 ILA 波形图中的 ad_data,右键选择 Waveform Style,然后选择 Analog 即可。如果要切换成数据显示的话,同样选中 ad_data,右键选择 Waveform Style,然后选择 Digital 就可以了,如下图所示: