ZYNQ之高速AD/DA验证实验 |
您所在的位置:网站首页 › 奥迪车哪年进入中国市场的 › ZYNQ之高速AD/DA验证实验 |
文章目录
前言一、ADDA模块介绍二、添加ROM IP核三、添加ILA IP核四、编写测试程序五、管脚分配六、连接开发板测试总结
前言
本实验是高速AD/DA验证实验,将使用高速DA芯片实现数模转换,产生正弦波模拟电压信号,并通过高速AD芯片将模拟信号转换成数字信号。本实验用到的硬件是黑金AX7020开发板和与其配套的ADDA模块——AN108。 一、ADDA模块介绍本实验中使用的ADDA模块型号为AN108,该模块如下图所示。 其中,ADC的最大采样率为32MHz,精度为8位,DAC的最大采样率为125MHz,精度也为8位。 该ADDA模块不管是AD IN口还是DA OUT口都是通过BNC接口与外界连接的。 AN108的硬件结构图如下图所示。 DA电路由高速DA芯片AD9708、7阶巴特沃斯低通滤波器、幅度调节电路和信号输出接口组成。高速DA芯片AD9708是8位,125MSPS的DA转换芯片,内置1.2V参考电压,差分电流输出。AD9708芯片差分输出以后,为了防止噪声干扰,电路中接入了7阶巴特沃斯低通滤波器,其带宽为40MHz。在滤波器之后,连接了2片高性能的145MHz带宽的运放AD8056,以实现差分变单端、幅度调节等功能,从而使得整个电路性能得到最大限度的提升,幅度调节使用的是5K的电位器,因此最终的输出范围是-5V—5V,即10Vpp。 需要注意的是,由于电路器的精度不是很精确,最终的输出有一定误差,有可能波形幅度不能达到10Vpp,也有可能出现波形削顶等问题,这些都属正常情况。 AD电路由高速AD芯片AD9280、衰减电路和信号输入接口组成。高速DA芯片AD9280是8位,32MSPS的AD转换芯片。在信号进入芯片AD9280之前,使用一片AD8056芯片构建衰减电路,接口的输入范围是-5V至5V,通过衰减电路以后,输入范围满足AD芯片的输入范围,即0~2V,相应的转换公式如下。 黑金7020开发板与ADDA模块的连接如下图所示,开发板排针的1脚2脚和39脚40脚都在开发板上标出来了,ADDA模块的1脚2脚也在ADDA模块上标注出来了,由于AN108是34脚,而开发板的排针是40脚,因此要注意不要插反,先将ADDA模块的1脚2脚和开发板的1脚2脚口对齐,再依次从上至下插入即可。 二、添加ROM IP核这部分的细节可以参考博文:ZYNQ之FPGA 片内ROM读写测试实验。 首先创建一个名为adda_test的工程,新工程汇总的界面如下图所示,点击Finish即可完成创建。 在本次实验中,将正弦波的波形数据存储在ROM中,这是因为实验中并不需要写数据(如果需要,就要用RAM),然后通过读取ROM中的数据,继而发送给DA转换芯片即可。 首先打开波形数据生成器,选择数据长度为256,数据位宽为8,选择正弦波生成,然后点击保存。 将该文件最好保存在工程目录下,选择保存的格式为.coe。 如果没有波形数据生成器,可以点此下载。 接着来创建ROM IP核,将其命名为rom_256x8b,各栏目的设置如下图所示。 Basic栏目设置。 Port A Options栏目设置。 Other Options栏目下,选择加载初始文件,就是上面保存的.coe文件。 三、添加ILA IP核ILA下各栏目的设置如下图所示。 这里设置两个探针,分别用来监测ad的数据和da的数据。 探针位数的设置如下图所示。 四、编写测试程序新建名为adda_test的Verilog文件,依次按照下图中标注的序号进行即可。 在新建好的adda_test.v文件中写入如下代码。 //本代码来自正点原子 `timescale 1ns / 1ps module adda_test( input sys_clk , //系统时钟 input sys_rst_n , //系统复位,低电平有效 //DA芯片接口 output da_clk , //DA(AD9708)驱动时钟,最大支持125Mhz时钟 output [7:0] da_data , //输出给DA的数据 //AD芯片接口 input [7:0] ad_data , //AD输入数据 //模拟输入电压超出量程标志(本次试验未用到) //input ad_otr , //0:在量程范围 1:超出量程 output ad_clk //AD(AD9280)驱动时钟,最大支持32Mhz时钟 ); //wire define wire [7:0] rd_addr; //ROM读地址 wire [7:0] rd_data; //ROM读出的数据 //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 (rd_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 (da_data), // input wire [7:0] probe0 .probe1 (ad_data) // input wire [7:0] probe0 ); endmodule同样的方法新建名为da_wave_send.v的文件并写入如下代码。 //本代码来自正点原子 module da_wave_send( input clk , //时钟 input rst_n , //复位信号,低电平有效 input [7:0] rd_data, //ROM读出的数据 output reg [7:0] rd_addr, //读ROM地址 //DA芯片接口 output da_clk , //DA(AD9708)驱动时钟,最大支持125Mhz时钟 output [7:0] da_data //输出给DA的数据 ); //parameter 频率调节控制 parameter FREQ_ADJ = 8'd5; //频率调节,FREQ_ADJ的值越大,最终输出的频率越低,范围0~255 //reg define reg [7:0] freq_cnt ; //频率调节计数器 //数据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 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |