高速 AD/DA 实验

news2024/9/28 11:18:55

目录

高速 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 就可以了,如下图所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/671255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能基础实验报告

蒙特卡洛算法 目 录 蒙特卡洛算法 1 概述&#xff1a; 1 思考步骤: 1 应用&#xff1a; 1 特点: 2 参 考 资 料 3 概述&#xff1a; 蒙特卡罗法&#xff08;Monte Carlo method&#xff09;也称统计模拟法、统计试验法。是把概率现象作为研究对象的数值模拟方法。是按抽样调…

【操作系统】CPU调度

目录 1.什么叫调度 2.调度的目标 3.进程调度方式 4.闲逛进程 5.典型的调度算法 5.1先来先服务(FCFS)调度算法 5.2短作业优先(SJF) 调度算法 5.3优先级调度算法 5.4高响应比优先调度算法 5.5时间片轮转调度算法 5.6多级队列调度算法 5.7多级反馈队列调度算法(融合了前…

Qgis基本操作之图层符号化和标注实战

目录 前言 一、基础数据 1、公共预算收入数据简介 2、省份数据简介 二、地图标注 1、百强县公共预算收入地图标注 2、省信息标注 三、地图符号化 1、百强县公共预算收入符号化 2、省数据符号化 总结 前言 在之前的Qgis中进行Shp和Excel属性连接实现百强县公共预算空间分…

MATLAB 之 图形对象及其句柄和图形窗口与坐标轴

这里写目录标题 一、图形对象及其句柄1. 图形对象2. 图形对象句柄的使用3. 图形对象属性3.1 属性名与属性值3.2 属性的操作3.3 图形对象的公共属性 二、图形窗口与坐标轴1. 图形窗口对象2. 坐标轴对象 一、图形对象及其句柄 MATLAB 的图形系统是面向图形对象的。图形对象是 MA…

Redis新功能

Redis 新功能 ACL 参考官网&#xff1a;https://redis.io/topics/acl 基本介绍 1、Redis ACL 是Access Control List&#xff08;访问控制列表&#xff09;的缩写&#xff0c;该功能根据可以执行的命令和可以访问的键来限制某些连接 2、在Redis 5 版本之前&#xff0c;Red…

使用python做一个批量重命名文件的小工具

&#x1f6f4; 放松 端午放假前的下午&#x1f644; 没事儿可做&#xff0c;一个准备开始弄的项目里面有大量的图片&#xff0c;但是名字都乱七八糟的&#xff0c;作为一个稍微带点强迫症的人看不下去。 既然如此&#xff0c;想直接重命名&#xff0c;可是Windows的重命名效果…

《XrayGLM:基于VisualGLM-6B微调训练对X光胸片进行医学诊断》学习分享与本地项目微调部署实践

XrayGLM据说是首个会看胸部X光片的中文多模态医学大模型&#xff0c;我最近也是因为关注这个所以就找时间学习了一下&#xff0c;顺便把学习资料对应记录分享一下。 官方提供了开源的项目&#xff0c;地址在这里&#xff0c;如下所示&#xff1a; 最近&#xff0c;通用领域的大…

MySQL - 第6节 - MySQL表的增删查改

1.MySQL表的增删查改概述 • 表的增删查改简称CRUD&#xff1a;Create&#xff08;新增&#xff09;&#xff0c;Retrieve&#xff08;查找&#xff09;&#xff0c;Update&#xff08;修改&#xff09;&#xff0c;Delete&#xff08;删除&#xff09;。 • CRUD的操作对象是对…

抖音小店有哪些常见扣分原因?如何避免在抖音小店中被扣分?

抖音小店现在已经成为了很多商家的首选电商平台&#xff0c;但是在使用抖音小店的过程中&#xff0c;也会出现一些扣分的情况。接下来&#xff0c;四川不若与众将为大家介绍抖音小店扣分的原因和避免办法。 一、抖音小店扣分原因 1. 服务不到位&#xff1a;商家没有及时回复用户…

2023-01-06 VMWare桥接网络配置.md

VMWare16 桥接网络配置 一 环境清单 VMWare 16虚拟机&#xff1a;Centos7宿主机&#xff1a;Windows 10 二 配置过程 查看宿主机的IP相关信息 ipconfig -all 配置虚拟网络编辑器 2.1 打开VMware Workstation Pro&#xff0c;点击左上角编辑-->虚拟网络编辑器 2.2 点击更改配…

CRM商机管理:提升客户体验和销售效率

如何利用CRM系统提升商机管理&#xff1f; 花点时间思考一下你的企业管理商机的方法&#xff0c;是否有以下情况&#xff1a; ● 不知道渠道中的商机是否可行。 ● 不知道应该关注哪些商机。 ● 花了几个小时或几天的时间来跟进商机。 ● 不知道赢得商机与失去商机的比例。 如…

【Kafka】Suppressed: java.nio.file.AccessDeniedException问题的解决

【Kafka】Suppressed: java.nio.file.AccessDeniedException问题的解决 目录 前言 一、错误发生的原因 二、问题如何解决 前言 今天在运行kafka时&#xff0c;出现了如下图的报错Suppressed: java.nio.file.AccessDeniedException&#xff0c;怎么启动也启动不起来。那此问…

C/C++的命令执行分析

背景 最近发现一个命令执行风险&#xff1b; 一开始提供修复建议&#xff0c;是对特殊字符进行过滤&#xff0c;但是业务侧没有办法过滤&#xff0c;因为输入点是没有办法限制的&#xff0c;然后提供另一个方案是将用户的输入写到配置文件中&#xff0c;然后再进行操作&#x…

LeetCode24. 两两交换链表中的节点+19. 删除链表的倒数第 N 个结点

24. 两两交换链表中的节点 题目描述&#xff1a; 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 输入&#xff1a;head [1…

蓝牙 - 抓包工具BPA600介绍

BPA 600开箱后&#xff0c;先把天线(antenna)装在后面的SMA接口上。 SMA connectors: SMA&#xff08;SubMiniature version A&#xff09;连接器是在20世纪60年代开发的半精密同轴射频连接器&#xff0c;是一种用于同轴电缆的最小连接器接口&#xff0c;具有螺旋式耦合机制。…

复旦大学高校专区入驻飞桨AI Studio,优质教育资源等你来学!

近日&#xff0c;复旦大学高校专区在飞桨人工智能学习与实训社区AI Studio上线&#xff0c;双方将携手搭建人工智能教学实训平台专区&#xff0c;汇集优质教学实训资源&#xff0c;校企共同培育复合型 AI 人才&#xff0c;为国家输送高质量人才&#xff0c;促进国家智能化进程。…

【机器学习】Kullback-Leibler散度实现数据监控

https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence 一、说明 本篇叙述了KL 散度的数学、直觉和如何实际使用&#xff1b;以及它如何最好地用于过程监测。Kullback-Leibler 散度度量&#xff08;相对熵&#xff09;是信息论中的一种统计测量方法&#xff0c;通…

深入理解Dockerfile

一、是什么 Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明。把镜像比喻成一个软件那么DockerFile就相当于是软件的配置文件。具体的内容可参考[官方网站](Dockerfile reference | Docker Documentation。 二、能做什么 通…

密码学中的SM2

目录 概述 功能 密钥生成 基点G的生成 模数p 密钥生成过程 加解密 加密过程&#xff1a; 解密过程&#xff1a; 数字签名 概述 对第5步r的计算方式分析 对第6步s的计算方式分析 加密模式 优缺点 论文和研究方向推荐 论文 研究方向 概述 SM2是中国密码学算法…

qt 时间编程之时钟

这里写目录标题 开启time格式自动 QTIM打点 qtime qt的时间类 qtimer qt的定时类 头文件包含以及定义 #include<QTime> #include<QTimer>QTime * time; QTimer * timer;开启 右键槽 timer start&#xff08;50&#xff09; 到达50毫米的时候会触发 time out信号…