资讯详情

【正点原子FPGA连载】第三十五章高速AD/DA实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

1)实验平台:正点原子新起点V2开发板 2)平台采购地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码 手册 视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)正点原子FPGA感兴趣的同学可以加群讨论:99424016 4)关注正点原子微信官方账号,获取最新信息更新 在这里插入图片描述

第三十五章高速AD/DA实验

ADC/DAC(Analog to Digital Converter/ Digital to Analog Converter,即模数转换器/数模转换器)是大多数系统的重要组成部分,用于将连续模拟信号转换为离散数字信号,或将离散数字信号转换为连续模拟信号,它们是连接模电路和数字电路的基本桥梁。在很多情况下,ADC/DAC的转换速度甚至直接决定了整个系统的运行速度。在很多情况下,ADC/DAC转换速度甚至直接决定了整个系统的运行速度。本章将使用高速DA芯片通过高速实现数模转换,产生正弦波模拟电压信号AD芯片将模拟信号转换为数字信号。 本章包括以下几个部分: 3434.1简介 34.2实验任务 34.3硬件设计 34.4程序设计 34.5下载验证

35.1简介 本章我们使用的AD-DA该模块是正点原子推出的高速模数转换模块(ATK_HS_AD_DA),高速AD转换芯片和高速DA转换芯片都是由的ADI分别由公司生产AD9280/3PA9280(两个芯片兼容)和AD9708。 ATK_HS_AD_DA如下图所示。

图 35.1.1 ATK_HS_AD_DA模块硬件结构图 由上可知,AD9708芯片输出一对差分电流信号。为了防止噪声干扰,低通滤波器连接到电路中,然后通过高性能、高带宽的输放电路实现差分变单端和振幅调节,最大限度地提高整个电路的性能。最终输出的模拟电压范围为-5V~ 5V。 AD9280芯片的输入模拟电压转换范围为0V2V,因此,电压输入端需要通过电压衰减电路输入-5V 5V电压衰减为0V~2V之间,然后经过AD9280芯片将模拟电压信号转换为数字信号。 让我们分别介绍这两个芯片。 AD9708芯片 AD9708是ADI公司(Analog Devices,Inc.,亚德诺半导体技术有限公司)生产TxDAC系列数模转换器具有高性能、低功耗的特点。AD9708数模转换位数为8位,最大转换速度为125MSPS(每秒采样百万次Million Samples per Second)。 AD内部功能框图如下图所示:

图 35.1.2 AD9708内部功能框图 AD9708在时钟(CLOCK)在工作的驱动下,内部集成 1.2V参考电压( 1.20V REF)、操作放大器和电流源(CURRENT SOURCE ARRAY)和存器(LATCHES)。两个电流输出端IOUTA和IOUTB当输入数据为0时,是一对差异电流(DB7DB0=8’h00)时,IOUTA输出电流为0,而IOUTB最大输出电流与参考电压有关;当输入数据全部为高点时(DB7DB0=8’hff)时,IOUTA输出电流最大,最大值与参考电压有关,IOUTB输出电流为0。 AD在时钟的驱动下,9708必须将数据写入电影中的锁定器中,其触发方式是上升沿触发,AD9708时序图如下图所示:

图 35.1.3 AD9708时序图 上图中的DBO-DB7和CLOCK是AD9708的8位输入数据和输入时钟,IOUTA和IOUTB为AD输出9708的电流信号。从上图可以看出,数据锁定在时钟的上升沿,因此我们可以在时钟的下降沿发送数据。需要注意的是,CLOCK时钟频率越快,AD9708数模转换速度越快,AD9708最快时钟频率为125Mhz。 IOUTA和IOUTB为AD9708输出的一对差分电流信号,通过外部电路低通滤波器与运放电路输出模拟电压信号,电压范围是-5V至 5V之间。当输入数据等于0时,AD9708输出的电压值为5V;当输入数据等于255(8)hff)时,AD9708输出的电压值为-5V。 AD9708是数字信号转模拟信号的装置,内部没有集成DDS(Direct Digital Synthesizer,直接数字频率合成器率合成器)的功能AD970808的输入数据DDS的功能。例如,我们使用它AD9708输出正弦波模拟电压信号,所以我们只需要AD9708的输入数据可以根据正弦波的波形变化,下图为AD根据正弦波变化的波形图,9708的输入数据和输出电压值。

图 35.1.4 AD9708正弦波数据(左),电压值(右) 从上图可以看出,数据在0到255之间根据正弦波的波形变化,最终电压也会根据正弦波波形变化。当输入数据根据正弦波的波形数据重复变化时,AD9708可连续输出正弦波的模拟电压波形。需要注意的是,最终得到的是AD当输入数据为0时,9708的输出电压变化范围由其外部电路决定,AD9708输出 5V当输入数据为255时,AD9708输出-5V的电压。 由此可见,只要输入的数据控制得当,AD9708可波形的模拟电压信号,包括正弦波、方波、锯齿波、三角波等。 了解高速DA转换芯片后,我们将介绍高速公路AD转换芯片AD9280。 AD9280芯片 AD9280是ADI公司生产的单芯片,8位,32MSPS(Million Samples Per Second,模数转换器具有高性能、低功耗的特点。 AD内部功能框图如下图所示:

图 35.1.5 AD9280内部功能框图 AD9280在时钟(CLK)控制所有内部转换的周期;AD9280内置片采样保持放大器(SHA),同时采用多级差分流水线架构,保证32MSPS全温度范围内的数据转换率无失码;AD可编程基准源集成在9280内部,外部高精度基准也可根据系统需要选择满足系统要求。 AD当输入的模拟电压超过量程时,9280输出的数据以二进制格式表示OTR(out-of-range)当输入的模拟电压在范围内时,OTR信号为低电平,可通过OTR判断输入的模拟电压是否在测量范围内。 AD9280时序图如下图所示:

图 35.1.6 AD9280时序图 将模拟信号转换为数字信号需要三个时钟。比如上图中的时钟CLK模拟电压信号沿压信号上升S1.三个时钟周期后(实际上加25ns时间延迟),输出转换后的数据DATA1。需要注意的是,AD9280芯片的最大转换速度是32MSPS,即输入时钟的最大频率为32MHz。 AD9280支持输入的模拟电压范围为0V至2V,0V对应输出的数字信号为0,2V对应输出的数字信号为255。AD9708经外部电路后,输出电压范围为-5V 5V,因此在AD9280模拟输入端增加电压衰减电路,使-5V 5V之间的电压转换为0V至2V之间。所以实际上,对于我们的用户来说,当AD9280模拟输入接口连接-5V电压时,AD输出数据为0;当AD模拟输入接口连接9280 5V电压时,AD输出数据为255。 当A9280模拟输入端接-5V至+5V之间变化的正弦波电压信号时,其转换后的数据也是成正弦波波形变化,转换波形如下图所示:

图 35.1.7 AD9280正弦波模拟电压值(左)、数据(右) 由上图可知,输入的模拟电压范围在-5V至5V之间,按照正弦波波形变化,最终得到的数据也是按照正弦波波形变化。 35.2实验任务 本节实验任务是使用新起点开发板及高速AD-DA扩展模块(ATK_HS_AD_DA模块)实现数模及模数的转换。首先FPGA产生正弦波变化的数字信号,经过DA芯片后转换成模拟信号,将DA的模拟电压输出端连接至AD的模拟电压输入端,AD芯片将模拟信号转换成数字信号,然后通过ILA观察数字信号的波形是否按照正弦波波形变化。 35.3硬件设计 ATK_HS_AD_DA模块由DA转换芯片(AD9708)和AD转换芯片(AD9280)组成。AD9708的原理图如下图所示。

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

图 35.3.2 AD9280原理图 上图中输入的模拟信号SMA_IN(VI)经过衰减电路后得到AD_IN2(VO)信号,两个模拟电压信号之间的关系是VO=VI/5+1,即当VI=5V时,VO=2V;VI=-5V时,VO=0V。 ATK_HS_AD_DA模块的实物图如下图所示。

图 35.3.3 ATK-HS-AD-DA模块实物图 本实验中,各端口信号的管脚分配如下表所示。 表 35.3.1 高速AD-DA转换实验管脚分配

对应的TCL约束语句如下所示:

set_location_assignment PIN_M2 -to sys_clk
set_location_assignment PIN_M1 -to sys_rst_n
set_location_assignment PIN_T11 -to da_data[0]
set_location_assignment PIN_R10 -to da_data[1]
set_location_assignment PIN_G2 -to da_data[2]
set_location_assignment PIN_R11 -to da_data[3]
set_location_assignment PIN_T13 -to da_data[4]
set_location_assignment PIN_R12 -to da_data[5]
set_location_assignment PIN_T14 -to da_data[6]
set_location_assignment PIN_R13 -to da_data[7]
set_location_assignment PIN_N6 -to da_clk
set_location_assignment PIN_M8 -to ad_clk
set_location_assignment PIN_P8 -to ad_data[7]
set_location_assignment PIN_N8 -to ad_data[6]
set_location_assignment PIN_L9 -to ad_data[5]
set_location_assignment PIN_K9 -to ad_data[4]
set_location_assignment PIN_M9 -to ad_data[3]
set_location_assignment PIN_L10 -to ad_data[2]
set_location_assignment PIN_P9 -to ad_data[1]
set_location_assignment PIN_N9 -to ad_data[0]
set_location_assignment PIN_P6 -to ad_otr

35.4程序设计 根据本章的实验任务,FPGA需要连续输出正弦波波形的数据,才能使AD9708连续输出正弦波波形的模拟电压,如果通过编写代码使用三角函数公式运算的方式输出正弦波数据,那么程序设计会变得非常复杂。在工程应用中,一般将正弦波波形数据存储在RAM或者ROM中,由于本次实验并不需要写数据到RAM中,因此我们将正弦波波形数据存储在只读的ROM中,直接读取ROM中的数据发送给DA转换芯片即可。 图 35.4.1是根据本章实验任务画出的系统框图。ROM里面事先存储好了正弦波波形的数据,DA数据发送模块从ROM中读取数据,将数据和时钟送到AD9708的输入数据端口和输入时钟端口;AD数据接收模块给AD9280输出驱动时钟信号和使能信号,并采集AD9280输出模数转换完成的数据。 高速AD/DA实验的系统框图如图 35.4.1所示:

图 35.4.1 高速AD/DA系统框图 顶层模块的原理图如下图所示:

图 35.4.2 顶层模块原理图 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转换完成的数据。 顶层模块的代码如下:

1   module hs_ad_da(
2       input                 sys_clk     ,  //系统时钟
3       input                 sys_rst_n   ,  //系统复位,低电平有效
4       //DA芯片接口
5       output                da_clk      ,  //DA(AD9708)驱动时钟,最大支持125Mhz时钟
6       output    [7:0]       da_data     ,  //输出给DA的数据
7       //AD芯片接口
8       input     [7:0]       ad_data     ,  //AD输入数据
9       //模拟输入电压超出量程标志(本次试验未用到)
10      input                 ad_otr      ,  //0:在量程范围 1:超出量程
11      output                ad_clk         //AD(AD9280)驱动时钟,最大支持32Mhz时钟 
12  );
13  
14  //wire define 
15  wire      [7:0]    rd_addr;              //ROM读地址
16  wire      [7:0]    rd_data;              //ROM读出的数据
17  //*****************************************************
18  //** main code
19  //*****************************************************
20  
21  //DA数据发送
22  da_wave_send u_da_wave_send(
23      .clk         (sys_clk), 
24      .rst_n       (sys_rst_n),
25      .rd_data     (rd_data),
26      .rd_addr     (rd_addr),
27      .da_clk      (da_clk),  
28      .da_data     (da_data)
29      );
30  
31  //ROM存储波形
32  rom_256x8b  u_rom_256x8b(
33      .address    (rd_addr),
34      .clock      (sys_clk),
35      .q          (rd_data)
36      );
37  
38  //AD数据接收
39  ad_wave_rec u_ad_wave_rec(
40      .clk         (sys_clk),
41      .rst_n       (sys_rst_n),
42      .ad_data     (ad_data),
43      .ad_otr      (ad_otr),
44      .ad_clk      (ad_clk)
45      );    
46  
47  endmodule

DA数据发送模块输出的读ROM地址(rd_addr)连接至ROM模块的地址输入端,ROM模块输出的数据(rd_data)连接至DA数据发送模块的数据输入端,从而完成了从ROM中读取数据的功能。 在代码的第32行至第36行例化了ROM IP核,我们在前面说过,ROM中存储的波形数据可以使用上位机波形转MIF软件或者Matlab软件生成,在这里我们介绍一个简单易用的波形转MIF工具的使用方法,该工具位于开发板所随附的资料“6_软件资料/1_软件/WaveToMif”目录下,双击“WaveToMif_V1.0.exe”运行软件。 接下来我们对MIF文件进行设置,直接使用默认的设置即可,点击“一键生成”按钮,在弹出的界面中选择MIF文件的存放路径并输入文件名。WaveToMif转换过程中的软件界面如图 35.4.3所示:

图 35.4.3 WaveToMif软件界面 生成的MIF文件打开界面如下图所示:

图 35.4.4 MIF文件打开界面 工程中创建了一个单端口ROM,在调用ROM IP核时,需要设置ROM位宽为8bit,深度为256,如图 35.4.5所示。

图 35.4.5 配置ROM位宽及深度 此外,为了保证ROM的读使能信号拉高到有效数据输出之间仅存在一个时钟周期的延时,需要取消寄存端口输出,如图 35.4.6红色方框所示。

图 35.4.6 取消寄存端口输出 最后,在“Mem Init”页点击“Browse”按钮,选择前面生成的初始化文件“dds_256x8b_wave.mif”,如图 35.4.7所示。注意需要将该MIF文件置于工程目录下,本工程中的MIF文件位于hs_ad_da/doc/文件夹下。

图 35.4.7 选择存储器初始化文件 DA数据发送模块的代码如下:

1   module da_wave_send(
2       input                 clk         ,  //时钟
3       input                 rst_n       ,  //复位信号,低电平有效
4       
5       input        [7:0]    rd_data     ,  //ROM读出的数据
6       output  reg  [7:0]    rd_addr     ,  //读ROM地址
7       //DA芯片接口
8       output                da_clk      ,  //DA(AD9708)驱动时钟,最大支持125Mhz时钟
9       output       [7:0]    da_data        //输出给DA的数据 
10      );
11  
12  //parameter
13  //频率调节控制
14  parameter  FREQ_ADJ = 8'd0;  //频率调节,FREQ_ADJ的越大,最终输出的频率越低,范围0~255
15  
16  //reg define
17  reg    [7:0]    freq_cnt  ;  //频率调节计数器
18  
19  //*****************************************************
20  //** main code
21  //*****************************************************
22  
23  //数据rd_data是在clk的上升沿更新的,所以DA芯片在clk的下降沿锁存数据是稳定的时刻
24  //而DA实际上在da_clk的上升沿锁存数据,所以时钟取反,这样clk的下降沿相当于da_clk的上升沿
25  assign  da_clk = ~clk;       
26  assign  da_data = rd_data;   //将读到的ROM数据赋值给DA数据端口
27  
28  //频率调节计数器
29  always @(posedge clk or negedge rst_n) begin
30      if(rst_n == 1'b0)
31          freq_cnt <= 8'd0;
32      else if(freq_cnt == FREQ_ADJ)    
33          freq_cnt <= 8'd0;
34      else         
35          freq_cnt <= freq_cnt + 8'd1;
36  end
37  
38  //读ROM地址
39  always @(posedge clk or negedge rst_n) begin
40      if(rst_n == 1'b0)
41          rd_addr <= 8'd0;
42      else begin
43          if(freq_cnt == FREQ_ADJ) begin
44              rd_addr <= rd_addr + 8'd1;
45          end    
46      end            
47  end
48  
49  endmodule

在代码的第14行定义了一个参数FREQ_ADJ(频率调节),可以通过控制频率调节参数的大小来控制最终输出正弦波的频率大小,频率调节参数的值越小,正弦波频率越大。频率调节参数调节正弦波频率的方法是通过控制读ROM的速度实现的,频率调节参数越小,freq_cnt计数到频率调节参数值的时间越短,读ROM数据的速度越快,那么正弦波输出频率也就越高;反过来,频率调节参数越大,freq_cnt计数到频率调节参数值的时间越长,读ROM数据的速度越慢,那么正弦波输出频率也就越低。由于freq_cnt计数器的位宽为8位,计数范围是0255,所以频率调节参数FREQ_ADJ支持的调节范围是0255,可通过修改freq_cnt计数器的位宽来修改FREQ_ADJ支持的调节范围。 WaveToMif软件设置ROM深度为256,倍频系数为1,而输入时钟为50Mhz,那么一个完整的正弦波周期长度为25620ns = 5120ns,当FREQ_ADJ的值为0时,即正弦波的最快输出频率为1s/5120ns(1s = 1000000000ns) ≈ 195.3Khz。如果把FREQ_ADJ的值设置为5时,一个完整的正弦波周期长度为5120ns(5+1) = 30720ns,频率约为32.55KHz。也可以在WaveToMif软件设置中增加倍频系数或者增加AD的驱动时钟来提高正弦波输出频率。 AD数据接收模块的代码如下:

1   module ad_wave_rec(
2       input                 clk         ,  //时钟
3       input                 rst_n       ,  //复位信号,低电平有效
4       
5       input         [7:0]   ad_data     ,  //AD输入数据
6       //模拟输入电压超出量程标志(本次试验未用到)
7       input                 ad_otr      ,  //0:在量程范围 1:超出量程
8       output   reg          ad_clk         //AD(AD9280)驱动时钟,最大支持32Mhz时钟
9       );
10  
11  //*****************************************************
12  //** main code 
13  //*****************************************************
14  
15  //时钟分频(2分频,时钟频率为25Mhz),产生AD时钟
16  always @(posedge clk or negedge rst_n) begin
17      if(rst_n == 1'b0)
18          ad_clk <= 1'b0;
19      else 
20          ad_clk <= ~ad_clk; 
21  end    
22  
23  endmodule

由于AD转换芯片支持的最大时钟频率为32Mhz,而FPGA的系统时钟频率为50Mhz,所以需要先对时钟进行分频,将分频后的时钟作为AD转换芯片的驱动时钟(分频计数见代码的第16行至第21行)。 图 35.4.8为AD数据接收模块采集到的SignalTap波形图,从图中可以看出,ad_otr信号固定为低电平,ad_data(输入的ad数据)为正弦波变化的波形,说明数据采集正确。

图 35.4.8 AD数据接收模块采集到的SignalTap波形图 在这里介绍一下如何将数据设置成波形图显示,首先选中SignalTap波形图中的ad_data,右键选择Bus Display Format,然后选择Unsigned Line Chart即可。如果要切换成数据显示的话,同样选中ad_data,右键选择Bus Display Format,然后选择Unsigned Decimal就可以了,如下图所示:

图 35.4.9 SignalTap波形显示设置界面 35.5下载验证 首先将ATK-HS-ADDA模块插入开发板的P6扩展口位置,插入的时候注意扩展口电源引脚方向和开发板电源引脚方向一致,然后将下载器一端连接电脑,另一端与开发板上对应端口连接,最后连接电源线并打开电源开关。 开发板硬件连接实物图如图 35.5.1所示:

图 35.5.1开发板硬件连接实物图 接下来我们下载程序,验证高速AD-DA功能。程序下载完成后,接下来我们使用示波器测量DA输出通道的波形。首先将示波器带夹子的一端连接到开发板的GND位置(可使用杜邦线连接至开发板扩展IO的GND管脚),然后将另一端探针插入高速AD-DA模块DA通道中间的金属圆圈内,如图 35.5.2所示;或者直接测试高速AD-DA模块的TP引脚也可以,如图图 35.5.3所示。

图 35.5.2 DA测量孔位

图 35.5.3 DA模拟电压测试点(TP) 此时观察示波器可以看到正弦波的波形,如果观察不到波形,可以旋转ATK-HS-ADDA模块上的旋钮来调节输出的模拟电压幅值,也可以尝试按下示波器的“AUTO”,再次观察示波器波形,示波器的显示界面如图 35.5.4所示:

图 35.5.4 示波器显示界面 观察到正弦波波形后,说明DA已经正确输出模拟电压波形了,接下来我们来验证AD的功能,首先使用两头都是公头的杜邦线,将DA输出通道和AD输入通道连接起来,杜邦线连接图如图 35.5.5所示。 连接然后使用SignalTap观察ad_data数据的变化(鼠标右击d_wave_recad_data->“Bus_Display_Format”->“signed Line Chart”,数据即可以波形的形式展示出来)。这里需要注意的是,采样时钟使用AD数据接收模块的sample_clk时钟,使用其它时钟可能会造成数据采集错误,观察到的SignalTap波形如图 35.5.6所示。

图 35.5.5 AD-DA通道杜邦线连接图

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

标签: avul5da1风速变送器8p8孔连接器简易式db9pin公头连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台