高速 AD/DA 实验

目录

高速 AD/DA 实验

1、简介

1.1、AD9708 芯片

1.2、AD9280 芯片

2、实验任务

3、硬件设计

4、程序设计

4.1、AD/DA 顶层模块代码

4.2、创建一个 ILA IP 核

4.3、创建一个ROM IP核,将 .coe 文件保存到生成的 Rom IP 核中

4.4、DA 数据发送模块代码

4.5、AD 数据接收模块代码

5、下载验证

5.1、添加约束文件.xdc

5.2、板上下载验证


高速 AD/DA 实验

       ADC/DAC(Analog to Digital Converter/ Digital to Analog Converter,即模数转换器/数模转换器)是大多数系统中必不可少的组成部件,用于将连续的模拟信号转换成离散的数字信号,或者将离散的数字信号转换成连续的模拟信号,它们是连接模电电路和数字电路必不可少的桥梁。在很多场合下,ADC/DAC 的转换速度甚至直接决定了整个系统的运行速度。本章我们将使用高速 DA 芯片实现数模转换,产生正弦波模拟电压信号,并通过高速 AD 芯片将模拟信号转换成数字信号。

1、简介

           本章我们使用的 AD-DA 模块是正点原子推出的一款高速模数-数模转换模块(ATK_HS_AD_DA),高速 AD 转换芯片和高速 DA 转换芯片都是由 ADI 公司生产的,分别是 AD9280 AD9708

          ATK_HS_AD_DA 模块的硬件结构图如下图所示。

       由上可知,AD9708 芯片输出的是一对差分电流信号,为了防止受到噪声干扰,电路中接入了低通滤波器,然后通过高性能和高带宽的运放电路,实现差分变单端以及幅度调节等功能,使整个电路性能得到了最大限度的提升,最终输出的模拟电压范围是-5V~+5V

        AD9280 芯片的输入模拟电压转换范围是 0V~2V,所以电压输入端需要先经过电压衰减电路,使输入的-5V~+5V 之间的电压衰减到 0V~2V 之间,然后经过 AD9280 芯片将模拟电压信号转换成数字信号。

下面我们分别介绍下这两个芯片。

1.1、AD9708 芯片

        AD9708 是 ADI 公司(Analog DevicesInc.,亚德诺半导体技术有限公司)生产的 TxDAC 系列数模转换器,具有高性能、低功耗的特点。AD9708 的数模转换位数为 8 位,最大转换速度为 125MSPS(每秒采样百万次 Million Samples per Second)。

         AD9708 的内部功能框图如下图所示:

       AD9708 在时钟(CLOCK)的驱动下工作,内部集成了+1.2V 参考电压(+1.20V REF)、运算放大器、电流源(CURRENT SOURCE ARRAY)和锁存器(LATCHES)。两个电流输出端 IOUTA IOUTB 为一对差分电流,当输入数据为 0DB7~DB0=8’h00)时,IOUTA 的输出电流为 0,而 IOUTB 的输出电流达到最大,最大值的大小跟参考电压有关;当输入数据全为高点平(DB7~DB0=8’hff)时,IOUTA 的输出电流达到最大,最大值的大小跟参考电压有关,而 IOUTB 的输出电流为 0

        AD9708 必须在时钟的驱动下才能把数据写入片内的锁存器中,其触发方式为上升沿触发,AD9708 的时序图如下图所示:

       上图中的 DBO-DB7 CLOCK AD9708 8 位输入数据和为输入时钟,IOUTA IOUTB AD9708 输出的电流信号。由上图可知,数据在时钟的上升沿锁存,因此我们可以在时钟的下降沿发送数据。需要注意的是,CLOCK 的时钟频率越快,AD9708 的数模转换速度越快,AD9708 的时钟频率最快为 125Mhz

       IOUTA 和 IOUTB AD9708 输出的一对差分电流信号,通过外部电路低通滤波器与运放电路输出模拟电压信号,电压范围是-5V +5V 之间。当输入数据等于 0 时,AD9708 输出的电压值为 5V;当输入数据等于 255(8’hff)时,AD9708 输出的电压值为-5V

       AD9708 是一款数字信号转模拟信号的器件,内部没有集成 DDSDirect Digital Synthesizer,直接数字式频率合成器)的功能,但是可以通过控制 AD9708 的输入数据,使其模拟 DDS 的功能。例如,我们使用AD9708输出一个正弦波模拟电压信号,那么我们只需要将AD9708的输入数据按照正弦波的波形变化即可,下图为 AD9708 的输入数据和输出电压值按照正弦波变化的波形图。

       由上图可知,数据在 0 255 之间按照正弦波的波形变化,最终得到的电压也会按照正弦波波形变化,当输入数据重复按照正弦波的波形数据变化时,那么 AD9708 就可以持续不断的输出正弦波的模拟电压波形。需要注意的是,最终得到的 AD9708 的输出电压变化范围由其外部电路决定的,当输入数据为 0 时,AD9708 输出+5V 的电压;当输入数据为 255 时,AD9708 输出-5V 的电压。

       由此可以看出,只要输入的数据控制的得当,AD9708 可以输出任意波形的模拟电压信号,包括正弦波、方波、锯齿波、三角波等波形。

在了解完高速 DA 转换芯片后,接下来我们介绍下高速 AD 转换芯片 AD9280

1.2、AD9280 芯片

       AD9280 是 ADI 公司生产的一款单芯片、8 位、32MSPSMillion Samples Per Second,每秒采样百万次)模数转换器,具有高性能、低功耗的特点。

AD9280 的内部功能框图如下图所示:

         AD9280 在时钟(CLK)的驱动下工作,用于控制所有内部转换的周期;AD9280 内置片内采样保持放大器(SHA),同时采用多级差分流水线架构,保证了 32MSPS 的数据转换速率下全温度范围内无失码; AD9280 内部集成了可编程的基准源,根据系统需要也可以选择外部高精度基准满足系统的要求。

       AD9280 输出的数据以二进制格式表示,当输入的模拟电压超出量程时,会拉高 OTR(out-of-range)信号;当输入的模拟电压在量程范围内时,OTR 信号为低电平,因此可以通过 OTR 信号来判断输入的模拟电压是否在测量范围内。

AD9280 的时序图如下图所示:

 模拟信号转换成数字信号并不是当前周期就能转换完成,从采集模拟信号开始到输出数据需要经过 3个时钟周期。比如上图中在时钟 CLK 的上升沿沿采集的模拟电压信号 S1,经过 3 个时钟周期后(实际上再加上 25ns 的时间延时),输出转换后的数据 DATA1需要注意的是,AD9280 芯片的最大转换速度是 32MSPS,即输入的时钟最大频率为 32MHz。

       AD9280 支持输入的模拟电压范围是 0V 2V0V 对应输出的数字信号为 02V 对应输出的数字信号为 255AD9708 经外部电路后,输出的电压范围是-5V~+5V,因此在 AD9280 的模拟输入端增加电压衰减电路,使-5V~+5V 之间的电压转换成 0V 2V 之间。那么实际上对我们用户使用来说,AD9280 的模拟输入接口连接-5V 电压时,AD 输出的数据为 0;当 AD9280 的模拟输入接口连接+5V 电压时,AD 输出的数据为 255。【255 = 2^8 - 1 = 256 - 1】

       当 AD9280 模拟输入端接-5V +5V 之间变化的正弦波电压信号时,其转换后的数据也是成正弦波波形变化,转换波形如下图所示:

       由上图可知,输入的模拟电压范围在-5V 5V 之间,按照正弦波波形变化,最终得到的数据也是按照正弦波波形变化。

2、实验任务

       本节实验任务是使用 FPGA 开发板及高速 AD-DA 扩展模块(ATK_HS_AD_DA 模块)实现数模及模数的转换。首先 FPGA 产生正弦波变化的数字信号,经过 DA 芯片后转换成模拟信号,将 DA 的模拟电压输出端连接至 AD 的模拟电压输入端,AD 芯片将模拟信号转换成数字信号,然后通过 ILA 观察数字信号的波形是否按照正弦波波形变化。

3、硬件设计

        ATK_HS_AD_DA 模块由 DA 转换芯片(AD9708)和 AD 转换芯片(AD9280)组成。AD9708 的原理图如下图所示。

       由上图可知,AD9708 输出的一对差分电流信号先经过滤波器,再经过运放电路得到一个单端的模拟电压信号。图中右侧的 W1 为滑动变阻器,可以调节输出的电压范围,推荐通过调节滑动变阻器,使输出的电压范围在-5V +5V 之间,从而达到 AD 转换芯片的最大转换范围。

AD9280 的原理图如下图所示。

       上图中输入的模拟信号 SMA_INVI)经过衰减电路后得到 AD_IN2VO)信号,两个模拟电压信号之间的关系是 VO=VI/5+1,即当 VI=5V 时,VO=2VVI=-5V 时,VO=0V

ATK_HS_AD_DA 模块的实物图如下图所示。

4、程序设计

       根据本章的实验任务,FPGA 需要连续输出正弦波波形的数据,才能使 AD9708 连续输出正弦波波形的模拟电压,如果通过编写代码使用三角函数公式运算的方式输出正弦波数据,那么程序设计会变得非常复杂。在工程应用中,一般将正弦波波形数据存储在 RAM 或者 ROM 中,由于本次实验并不需要写数据到RAM 中,因此我们将正弦波波形数据存储在只读的 ROM 中,直接读取 ROM 中的数据发送给 DA 转换芯片即可。

        图 26.4.1 是根据本章实验任务画出的系统框图。ROM 里面事先存储好了正弦波波形的数据,DA 数据发送模块从 ROM 中读取数据,将数据和时钟送到 AD9708 的输入数据端口和输入时钟端口;AD 数据接收模块给 AD9280 输出驱动时钟信号和使能信号,并采集 AD9280 输出模数转换完成的数据。

高速 AD/DA 实验的系统框图如图 26.4.1 所示:

        FPGA 顶层模块(hs_ad_da)例化了以下三个模块:DA 数据发送模块(da_wave_send)、ROM 波形存储模块(rom_256x8b)和 AD 数据接收模块(ad_wave_rec)。

       DA 数据发送模块(da_wave_send)DA 数据发送模块输出读 ROM 地址,将输入的 ROM 数据发送至DA 转换芯片的数据端口。

       ROM 波形存储模块(rom_256x8b)ROM 波形存储模块由 Vivado 软件自带的 Block Memory Generator IP 核实现,其存储的波形数据可以使用波形转存储文件的上位机来生成.coe 文件。

        AD 数据接收模块(ad_wave_rec):AD 数据接收模块输出 AD 转换芯片的驱动时钟和使能信号,随后接收 AD 转换完成的数据。

4.1、AD/DA 顶层模块代码

顶层模块的代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/16 15:15:12
// Design Name: 
// Module Name: hs_ad_da
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
//ADC/DAC(Analog to Digital Converter/ Digital to Analog Converter,即模数转换器/数模转换器)
//
//实验任务:高速AD/DA实验
//本节实验任务是使用 FPGA 开发板及高速 AD-DA 扩展模块(ATK_HS_AD_DA 模块)实现数模及模数的转换。
//首先 FPGA 产生正弦波变化的数字信号,经过 DA 芯片后转换成模拟信号,
//将 DA 的模拟电压输出端连接至 AD 的模拟电压输入端,AD 芯片将模拟信号转换成数字信号,
//然后通过 ILA 观察数字信号的波形是否按照正弦波波形变化。


module hs_ad_da(
     input            sys_clk,     //50Mhz系统时钟(达芬奇Pro开发板)
     input            sys_rst_n,   //系统复位,低电平有效
     //DA 芯片接口
     output            da_clk,      //DA(AD9708)驱动时钟,最大支持125Mhz时钟(达芬奇Pro开发板)
     output   [7:0]    da_data,     //输出给DA的数据    
     //AD芯片接口
     input    [7:0]    ad_data,      //AD输入数据   
     //模拟输入电压超出量程标志(本次试验未用到)
     input             ad_otr,       //0:在量程范围; 1:超出量程
     output            ad_clk        //AD(AD9280)驱动时钟,最大支持32Mhz(达芬奇Pro开发板)
    );

//wire define
wire   [7:0]      rd_addr;    //ROM 读地址
wire   [7:0]      rd_data;    //ROM 读出的数据

//*********************************************************
//**   main   code
//*********************************************************

//DA 数据发送
da_wave_send u_da_wave_send(
     .clk            (sys_clk       ),
     .rst_n          (sys_rst_n     ),
     .rd_data        (rd_data       ),
     .rd_addr        (rd_addr       ),
     .da_clk         (da_clk        ),
     .da_data        (da_data       )
    );

//ROM 存储波形
rom_256x8b  u_rom_256x8b(
     .clka         (sys_clk),   //input wire clka
     .addra        (ra_addr),   //input wire [7:0] addra
     .douta        (rd_data)    //output wire [7:0] douta
     );

//AD 接收数据
ad_wave_rec u_ad_wave_rec(
      .clk          (sys_clk),
      .rst_n        (sys_rst_n),
      .ad_data      (ad_data),
      .ad_otr       (ad_otr),
      .ad_clk       (ad_clk)
     );

//ILA 采集AD数据
ila_0  ila_0(
   .clk       (ad_clk),    //input wire clk
   .probe0    (ad_otr),    //input wire [0:0] probe0
   .probe1    (ad_data)    //input wire [7:0] probe1
);

endmodule

//DA 数据发送模块输出的读 ROM 地址(rd_addr)连接至 ROM 模块的地址输入端,
//ROM 模块输出的数据(rd_data)连接至 DA 数据发送模块的数据输入端,
//从而完成了从 ROM 中读取数据的功能。

       DA 数据发送模块输出的读 ROM 地址(rd_addr)连接至 ROM 模块的地址输入端,ROM 模块输出的数据(rd_data)连接至 DA 数据发送模块的数据输入端,从而完成了从 ROM 中读取数据的功能。

       在代码的第 65 至 70 行例化了 ROM 模块,由 Block Memory Generator IP 核配置生成。

       代码的第 81 行例化了一个 ILA IP 核,用于捕获 ad_otr ad_data 的数据。

    需要注意的是,ILA 的采 样时钟必须使用 ad_clk,否则数据可能采集错误。

4.2、创建一个 ​​​​​​​ILA IP 核

ILA IP 核的配置如下图所示:

我们把探针数量设置为 2,并且把采样深度设置为 4096探针宽度的设置如下图所示:

       我们将两个探针的位宽设置成 1 8,分别对应 ad_otr ad_data 的位宽,设置完成后点击“OK”按钮即可。

       我们在前面说过,ROM 中存储的波形数据可以使用上位机波形转 COE 软件生成,在这里我们介绍一个简单易用的波形转 COE 工具的使用方法,该工具位于开发板所随附的资料“6_软件资料/1_软件 /WaveToMem”目录下,双击“WaveToMem_V1.2.exe”运行软件。

接下来我们对软件进行设置,如图 26.4.5 所示,这里对软件界面做个简单的介绍。

  1. 位宽:波形数据的位宽。由于 ATK_HS_AD_DA 模块的 DA 芯片数据位宽为 8 位,因此这里保持默认,即设置成 8 位。
  2. 深度:一个波形周期包含了多少个数据量。这里保持默认,即设置成 256。需要说明的是,在用 Block Memory Generator IP 核生成 ROM 时,配置 ROM 的宽度和深度和上位机设置的位宽和深度保持一致。
  3. 波形频率设置:对波形倍频,倍数值越大,最终生成的波形频率越快(频率太高,可能导致波形失真), 这里保持默认,即设置成 1 位。
  4. 波形类型:软件支持将正弦波、方波、锯齿波和三角波的波形转换成存储波形格式的文件。
  5. 生成文件:软件支持将波形转换成 COEVivado 软件支持的存储格式)和 MIFQuartus 软件支持的存储格式)格式文件,这里保持默认,即选中 COE 文件格式。

       然后点击“一键生成”按钮,在弹出的界面中选择 COE 文件的存放路径并输入文件名,这里将 COE 文件保存在工程的 doc 文件夹下。WaveToMem 转换过程中的软件界面如下图所示:

使用 Notepad++代码编辑器打开生成的 COE 文件后如下图所示:

4.3、创建一个ROM IP核,将 .coe 文件保存到生成的 Rom IP 核中

       工程中创建了一个单端口 ROM,并命名为“rom_256x8b”,在调用 Block Memory Generator IP 核时, “Basic”选项也配置如下图所示:

         我们将其接口类型设置为“Native”、Memory Type 设置为“Single Port ROM”,即单端口 ROM “Port A Options”选项页的配置页面如下图所示:

       我们将 PortA 的位宽设置为 8,深度设置为 256,以存储上位机生成的 256 个数据。此外,将使能引脚的类型设置为“Always Enabled”,即 ROM 一直处于使能的状态。

接下来配置“Other Options”选项页,加载刚才生成的.coe 文件,如下图所示:

最后点击 “OK” 按钮完成 IP 核的配置。

4.4、DA 数据发送模块代码

DA 数据发送模块的代码如下:
`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/16 16:38:32
// Design Name: 
// Module Name: da_wave_send
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


//DA 数据发送模块的代码
module da_wave_send(
     input               clk,       //50Mhz系统时钟(达芬奇Pro开发板)
     input               rst_n,     //复位信号,低电平有效
     
     input       [7:0]   rd_data,    //ROM 读出的数据
     output reg  [7:0]   rd_addr,    //读 ROM地址
     // DA芯片接口
     output              da_clk,      //DA(AD9708)驱动时钟,最大支持125Mhz时钟(达芬奇Pro开发板)
     output      [7:0]   da_data      //输出给DA的数据
    );

//parameter
//频率调节控制
parameter  FREQ_ADJ = 8'D5;  //频率调节,FREQ_ADJ的越大,最终输出的频率越低,范围0~255

//reg define
reg   [7:0]     freq_cnt;    //频率调节计数器

//*******************************************************
//**       main  code
//*******************************************************

//数据rd_data是在clk的上升沿更新的,所以DA芯片在clk的下降沿锁存数据是稳定的时刻
//而DA实际上在da_clk的上升沿锁存数据,所以时钟取反,这样clk的下降沿相当于da_clk的上升沿
assign da_clk = ~clk;
assign da_data = rd_data;   //将读到的ROM数据赋值给DA数据端口

//频率调节计数器
always @(posedge clk or negedge rst_n) begin
    if(rst_n==1'b0)
        freq_cnt <= 8'd0;
    else if(freq_cnt==FREQ_ADJ)
        freq_cnt <= 8'd0;
    else
        freq_cnt <= freq_cnt + 8'd1;
end

//读ROM地址
always @(posedge clk or negedge rst_n) begin
     if(rst_n==1'b0)
          rd_addr <= 8'd0;
     else begin
          if(freq_cnt==FREQ_ADJ) begin
               rd_addr <= rd_addr + 8'd1;
          end
     end
end

endmodule

       在代码的第 37 行定义了一个参数 FREQ_ADJ(频率调节),可以通过控制频率调节参数的大小来控制最终输出正弦波的频率大小,频率调节参数的值越小,正弦波频率越大。频率调节参数调节正弦波频率的方法是通过控制读 ROM 的速度实现的,频率调节参数越小,freq_cnt 计数到频率调节参数值的时间越短, 读 ROM 数据的速度越快,那么正弦波输出频率也就越高;反过来,频率调节参数越大,freq_cnt 计数到频率调节参数值的时间越长,读 ROM 数据的速度越慢,那么正弦波输出频率也就越低。由于 freq_cnt 计数器的位宽为 8 位,计数范围是 0~255,所以频率调节参数 FREQ_ADJ 支持的调节范围是 0~255可通过修改 freq_cnt 计数器的位宽来修改 FREQ_ADJ 支持的调节范围。

       WaveToMem 软件设置 ROM 深度为 256,倍频系数为 1,而输入时钟为 50Mhz,那么一个完整的正弦波周期长度为 256*20ns = 5120ns,当 FREQ_ADJ 的值为 0 时,即正弦波的最快输出频率为 1s/5120ns(1s = 1000000000ns) ≈ 195.3Khz。当我们把 FREQ_ADJ 的值设置为 5 时,一个完整的正弦波周期长度为 5120ns*(5+1) = 30720ns,频率约为 32.55KHz。也可以在 WaveToMem 软件设置中增加倍频系数或者增加 AD 的驱动时钟来提高正弦波输出频率。

4.5、AD 数据接收模块代码

AD 数据接收模块的代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/16 17:06:37
// Design Name: 
// Module Name: ad_wave_rec
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module ad_wave_rec(
     input               clk,        //50Mhz系统时钟(达芬奇Pro开发板)
     input               rst_n,      //复位信号,低电平有效
     
     input    [7:0]      ad_data,     //AD输入数据
     //模拟输入电压超出量程标志(本次试验未用到)
     input               ad_otr,      //0:在量程范围; 1:超出量程
     output  reg         ad_clk       //AD(TLC5510)驱动时钟,最大支持20Mhz时钟(达芬奇Pro开发板) 
    );

//*****************************************
//**  main   code
//******************************************

//时钟分频(2分频,时钟频率为25Mhz),产生AD时钟(50Mhz系统时钟,达芬奇Pro开发板)
always @(posedge clk or negedge rst_n) begin
     if(rst_n==1'b0)
         ad_clk <=1'b0;
     else
         ad_clk <= ~ad_clk;
end

endmodule

       由于 AD 转换芯片支持的最大时钟频率为 32Mhz,而 FPGA 的系统时钟频率为 50Mhz,所以需要先对时钟进行分频,将分频后的时钟作为 AD 转换芯片的驱动时钟(分频计数见代码的第 37 行至第 43 行)。

        需要说明的是,AD 数据接收模块没有对输入的 ad_otr(输入的模拟电压超出量程指示)和 ad_dataAD 输入的数据)做任何处理,这两个信号是在 ILA 中观察信号的变化的。

5、下载验证

5.1、添加约束文件.xdc

本实验中,各端口信号的管脚分配如下表所示:高速AD-DA转换实验管脚分配:

约束文件 hs_ad_da.xdc 的具体内容如下:

######## 时钟 引脚约束 #################### #############
create_clock -period 20.000 -name sys_clk [get_ports sys_clk]
set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS15} [get_ports sys_clk]
############### reset key define##########################
set_property -dict {PACKAGE_PIN U7 IOSTANDARD LVCMOS15} [get_ports sys_rst_n]
############### output DA define##########################
set_property -dict {PACKAGE_PIN C19 IOSTANDARD LVCMOS33} [get_ports {da_data[7]}]
set_property -dict {PACKAGE_PIN C18 IOSTANDARD LVCMOS33} [get_ports {da_data[6]}]
set_property -dict {PACKAGE_PIN B16 IOSTANDARD LVCMOS33} [get_ports {da_data[5]}]
set_property -dict {PACKAGE_PIN B15 IOSTANDARD LVCMOS33} [get_ports {da_data[4]}]
set_property -dict {PACKAGE_PIN C15 IOSTANDARD LVCMOS33} [get_ports {da_data[3]}]
set_property -dict {PACKAGE_PIN C14 IOSTANDARD LVCMOS33} [get_ports {da_data[2]}]
set_property -dict {PACKAGE_PIN B13 IOSTANDARD LVCMOS33} [get_ports {da_data[1]}]
set_property -dict {PACKAGE_PIN C13 IOSTANDARD LVCMOS33} [get_ports {da_data[0]}]
############### output DA(AD9708)驱动时钟 define##########################
set_property -dict {PACKAGE_PIN B20 IOSTANDARD LVCMOS33} [get_ports da_clk]
############### input AD define##########################
set_property -dict {PACKAGE_PIN B22 IOSTANDARD LVCMOS33} [get_ports {ad_data[7]}]
set_property -dict {PACKAGE_PIN C22 IOSTANDARD LVCMOS33} [get_ports {ad_data[6]}]
set_property -dict {PACKAGE_PIN B21 IOSTANDARD LVCMOS33} [get_ports {ad_data[5]}]
set_property -dict {PACKAGE_PIN A21 IOSTANDARD LVCMOS33} [get_ports {ad_data[4]}]
set_property -dict {PACKAGE_PIN D14 IOSTANDARD LVCMOS33} [get_ports {ad_data[3]}]
set_property -dict {PACKAGE_PIN D15 IOSTANDARD LVCMOS33} [get_ports {ad_data[2]}]
set_property -dict {PACKAGE_PIN E16 IOSTANDARD LVCMOS33} [get_ports {ad_data[1]}]
set_property -dict {PACKAGE_PIN D16 IOSTANDARD LVCMOS33} [get_ports {ad_data[0]}]
############### output AD(AD9280)驱动时钟 define##########################
set_property -dict {PACKAGE_PIN D20 IOSTANDARD LVCMOS33} [get_ports ad_clk]
############### input 模拟电压超出量程标志 define##########################
set_property -dict {PACKAGE_PIN C20 IOSTANDARD LVCMOS33} [get_ports ad_otr]

添加约束文件.xdc 的详细步骤见: Vivado 下 LED 流水灯实验_OliverH-yishuihan的博客-CSDN博客 中的 “4.3、添加 XDC管脚约束文件

5.2、板上下载验证

       将高速 AD-DA 模块插入达芬奇 Pro 开发板 J3 扩展口,连接时注意扩展口电源引脚方向和开发板电源引脚方向一致,然后将下载器一端连接电脑,另一端与开发板上对应端口连接,最后连接电源线并打开电源开关。

       将工程生成的比特流文件下载到 FPGA 中后,然后使用示波器测量 DA 输出通道的波形。首先将示波器带夹子的一端连接到开发板的 GND 位置(可使用杜邦线连接至开发板上的任一的 GND 管脚),然后将另一端探针插入高速 AD-DA 模块的 DA 通道中间的金属圆圈内(注意将红色的保护套拿掉),如图 5.2 所示。

       此时观察示波器可以看到正弦波的波形,如果观察不到波形,可查看示波器设置是否正确,可以尝试按下示波器的“AUTO”,再次观察示波器波形。示波器的显示界面如下图所示:

       观察到正弦波波形后,说明 DA 已经正确输出模拟电压波形了,接下来我们来验证 AD 的功能,首先使用两头都是公头的杜邦线,将 DA 输出通道和 AD 输入通道连接起来,杜邦线连接图下图所示。

       连接后在 ILA 中观察 ad_data 数据的变化,观察到的波形如下图所示。

       由上图可知,输入的 ad_data 数据为正弦波变化的波形,说明 AD-DA 实验验证成功。

       另外,在这里介绍一下如何将数据设置成波形图显示。首先选中 ILA 波形图中的 ad_data,右键选择 Waveform Style,然后选择 Analog 即可。如果要切换成数据显示的话,同样选中 ad_data,右键选择 Waveform Style,然后选择 Digital 就可以了,如下图所示:

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于HAL库中的ADC单通道采集AD(模拟转换值),以下是步骤: 1. 配置ADC外设 首先,需要配置ADC外设。这包括设置ADC时钟,分辨率,采样时间等。可以使用HAL库提供的函数进行配置,例如: ```c hadc.Instance = ADCx; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.ScanConvMode = DISABLE; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.NbrOfDiscConversion = 0; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.NbrOfConversion = 1; hadc.Init.DMAContinuousRequests = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc) != HAL_OK) { /* Initialization Error */ Error_Handler(); } ``` 2. 配置ADC转换触发源 接下来,需要配置ADC的转换触发源。在这个例子中,我们使用软件触发转换。可以使用HAL库提供的函数进行配置,例如: ```c ADC_ChannelConfTypeDef sConfig; sConfig.Channel = ADC_CHANNEL_x; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_xCYCLES; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { /* Channel Configuration Error */ Error_Handler(); } /* 启动ADC转换 */ if (HAL_ADC_Start(&hadc) != HAL_OK) { /* Start Conversation Error */ Error_Handler(); } ``` 3. 获取AD值 最后,需要获取AD值。可以使用HAL库提供的函数进行获取,例如: ```c uint32_t ADC_value = 0; if (HAL_ADC_PollForConversion(&hadc, 100) == HAL_OK) { ADC_value = HAL_ADC_GetValue(&hadc); } ``` 以上就是使用HAL库进行ADC单通道采集AD的步骤。需要注意的是,以上代码仅供参考,具体的实现可能因为硬件配置和需求不同而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值