ZYNQ之高速AD/DA验证实验

article/2025/9/24 1:58:01

文章目录

  • 前言
  • 一、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 / 1psmodule 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) beginif(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) beginif(rst_n == 1'b0)rd_addr <= 8'd0;else beginif(freq_cnt == FREQ_ADJ) beginrd_addr <= rd_addr + 8'd1;end    end            
endendmodule

再新建名为ad_wave_rec.v的文件并写入如下代码。

//本代码来自正点原子
module ad_wave_rec(input                 clk         ,  //时钟input                 rst_n       ,  //复位信号,低电平有效input         [7:0]   ad_data     ,  //AD输入数据//模拟输入电压超出量程标志(本次试验未用到)input                 ad_otr      ,  //0:在量程范围 1:超出量程output   reg          ad_clk         //AD(AD9280)驱动时钟,最大支持32Mhz时钟
);//时钟分频(2分频,时钟频率为25Mhz),产生AD时钟
always @(posedge clk or negedge rst_n) beginif(rst_n == 1'b0)ad_clk <= 1'b0;else ad_clk <= ~ad_clk; 
end    endmodule

到这里,本实验的测试代码就添加完成了。
一开始打算使用PLL来输出ad和da的时钟,但是在程序中应用时出错了,报错信息如下。

INFO: [Labtools 27-1434] Device xc7z020 (JTAG device index = 1) is programmed with a design that has no supported debug core(s) in it.
WARNING: [Labtools 27-3361] The debug hub core was not detected.
Resolution:

  1. Make sure the clock connected to the debug hub (dbg_hub) core is a free running clock and is active.
  2. Make sure the BSCAN_SWITCH_USER_MASK device property in Vivado Hardware Manager reflects the user scan chain setting in the design and refresh the device. To determine the user scan chain setting in the design, open the implemented design and use ‘get_property C_USER_SCAN_CHAIN [get_debug_cores dbg_hub]’.
    For more details on setting the scan chain property, consult the Vivado Debug and Programming User Guide (UG908).
    WARNING: [Labtools 27-3413] Dropping logic core with cellname:‘ila_0’ at location ‘uuid_D7F66BBC62045AEA8C9B20B797086963’ from probes file, since it cannot be found on the programmed device.

出现这个问题的原因是在ILA中使用了通过PLL生成的时钟。
所以就添加了另外两个模块da_wave_send和ad_wave_rec,这两个模块中主要还是对时钟的设置。da_wave_send中将时钟进行了翻转,同时设置读ROM的地址;ad_wave_rec中将系统时钟进行二分频,得到25MHz时钟,即ad_clk。


五、管脚分配

ADDA模块——AN108的34针排布的原理图如下。
在这里插入图片描述
黑金开发板的J11扩展口原理图如下。
在这里插入图片描述
其中,J11扩展口所对应的引脚号如下表所示。

J11管脚信号名称ZYNQ引脚名ZYNQ引脚号
PIN1GND--
PIN2+5V--
PIN3EX_IO2_1NIO_L6N_T0_35F17
PIN4EX_IO2_1PIO_L6P_T0_35F16
PIN5EX_IO2_2NIO_L15N_T2_35F20
PIN6EX_IO2_2PIO_L15P_T2_35F19
PIN7EX_IO2_3NIO_L18N_T2_35G20
PIN8EX_IO2_3PIO_L18P_T2_35G19
PIN9EX_IO2_4NIO_L14N_T2_35H18
PIN10EX_IO2_4PIO_L14P_T2_35J18
PIN11EX_IO2_5NIO_L9N_T1_35L20
PIN12EX_IO2_5PIO_L9P_T1_35L19
PIN13EX_IO2_6NIO_L7N_T1_35M20
PIN14EX_IO2_6PIO_L7P_T1_35M19
PIN15EX_IO2_7NIO_L12N_T1_35K18
PIN16EX_IO2_7PIO_L12P_T1_35K17
PIN17EX_IO2_8NIO_L10N_T1_35J19
PIN18EX_IO2_8PIO_L10P_T1_35K19
PIN19EX_IO2_9NIO_L17N_T2_35H20
PIN20EX_IO2_9PIO_L17P_T2_35J20
PIN21EX_IO2_10NIO_L11N_T1_35L17
PIN22EX_IO2_10PIO_L11P_T1_35L16
PIN23EX_IO2_11NIO_L8N_T1_35M18
PIN24EX_IO2_11PIO_L8P_T1_35M17
PIN25EX_IO2_12NIO_L4N_T0_35D20
PIN26EX_IO2_12PIO_L4P_T0_35D19
PIN27EX_IO2_13NIO_L5N_T0_35E19
PIN28EX_IO2_13PIO_L5P_T0_35E18
PIN29EX_IO2_14NIO_L16N_T2_35G18
PIN30EX_IO2_14PIO_L16P_T2_35G17
PIN31EX_IO2_15NIO_L13N_T2_35H17
PIN32EX_IO2_15PIO_L13P_T2_35H16
PIN33EX_IO2_16NIO_L19N_T3_35G15
PIN34EX_IO2_16PIO_L19P_T3_35H15
PIN35EX_IO2_17NIO_L20N_T3_35J14
PIN36EX_IO2_17PIO_L20P_T3_35K14
PIN37GND--
PIN38GND--
PIN39+3.3V--
PIN40+3.3V--

具体的引脚分配见下表。

名称引脚号
sys_clkU18
da_clkF20
da_0M20
da_1L19
da_2L20
da_3J18
da_4H18
da_5G19
da_6G20
da_7F19
ad_clkG18
ad_0L17
ad_1L16
ad_2M18
ad_3M17
ad_4D20
ad_5D19
ad_6E19
ad_7E18

根据上面表中的对应关系,打开管脚配置页面依次设置即可。
在这里插入图片描述


六、连接开发板测试

连接开发板,点击Generate Bitstream生成比特流文件,将其下载到开发板上,在ILA窗口运行后得到如下图所示的正弦波。
在这里插入图片描述
由上图可以看到,输入的ad_data数据是正弦波的波形,说明该实验验证成功了。
如果设置的ILA采样深度太小,得到的波形就是这样的。
在这里插入图片描述
所以在ILA中设置采样深度时要设置合理,设置的太大,需要耗费的资源也越多。
在这里插入图片描述
按理说这里的数模转换波形需要用示波器测量,具体的测量方法是将示波器带夹子的一端连接开发板的GND端(开发板上任意的GND均可),然后将示波器另一端探针接到DA通道上,这里由于条件限制就利用ILA代替了示波器,其输出也是正弦波。


总结

以上就是ZYNQ之高速AD/DA验证实验的所有内容了,该实验与ROM读写测试实验有一定的相似之处,同时也是在其基础上进行更复杂的实验,本实验需要注意的是ADDA模块在插入开发板时不要插反,同时在管脚分配时也要注意不要出错。
本文参考资料:
正点原子–course_s1_ZYNQ那些事儿-FPGA实验篇V1.06.pdf
ALINX黑金AX7020开发板用户手册V2.2.pdf
领航者ZYNQ之FPGA开发指南_V2.0 .pdf


http://chatgpt.dhexx.cn/article/DWrKYjdw.shtml

相关文章

ZYNQ - 嵌入式Linux开发 -10- ZYNQ启动流程分析

FSBL启动准备工作 在静态情况下&#xff0c;Boot.BIN启动文件存放在SD卡或QSPI等存储介质中&#xff0c;然后Boot.BIN文件中已经包含了FSBL代码&#xff0c;也就是说FSBL代码已经集成在了Boot.BIN文件中&#xff0c;所以FSBL代码也是存放在Boot .BIN文件中。 如果要启动FSBL代…

初识ZYNQ结构

本文介绍了zynq的结构&#xff0c;简述了PS中的APU。 处理器系统 所有的 Zynq 芯片都有相同的基本架构。作为处理器系统的基础&#xff0c;所有的芯片都包含了一颗双核 ARM Cortex-A9 处理器。这是一颗 “ 硬 ” 处理器 —— 它是芯片上专用而且优化过的硅片元件。 作为比较…

zynq中断

在zynq中选择中断信号后&#xff1a; 只能看到一个[0:0]的向量&#xff0c;完全无法对应中断号&#xff1a; 且属性栏目没有配置选项&#xff0c;一般可以看到有些连接图如下&#xff1a; 如果看成最低位的话就是61,那么其它中断号怎么使用呢&#xff1a;查到的资料如下&#x…

ZYNQ基础知识

1.ZYNQ介绍 全称为Zynq-7000 All Programmable Soc 1.Zynq是赛灵思&#xff08;Xilinx&#xff09;推出的新一代全可编程片上系统&#xff0c;将处理器的软件可编程性和FPGA的硬件可编程性完美结合。具有较强的系统性能、灵活性与可扩展性。 2.旨在为视频监控、汽车驾驶员辅助…

一、ZYNQ简介

1 ZYNQ简介 &#xff08;1&#xff09;ZYNQ简介 ​ ZYNQ全称Zynq-7000 All Programmable SoC&#xff0c;是赛灵思公司&#xff08;Xilinx&#xff09;推出的新一代全可编程片上系统&#xff08;&#xff08;APSoC&#xff09;&#xff08;全可编程指的是硬件和软件都可以编程…

ZYNQ简介

目录 1.ZYNQ简介 2.片上系统&#xff0c;板上系统&#xff0c;可编程片上系统&#xff0c;全可编程上系统 &#xff08;1&#xff09;板上系统 &#xff08;2&#xff09;片上系统&#xff08;SOC&#xff09; &#xff08;3&#xff09;可编程片上系统&#xff08;SOPC&a…

【ZYNQ】从入门到秃头01 初识ZYNQ(PS和PL之间连接)

文章目录 从嵌入式Linux到ZYNQZYNQ简介PL简介常用的可编程逻辑器件&#xff1a;PL结构 PS简介AXIAXI4 StreamAXI4 ZYNQ芯片开发流程的简介学习ZYNQ要具备哪些技能 从嵌入式Linux到ZYNQ 之前的学习领域一直是ARM&#xff0c;从STM32到NXP iMX6&#xff0c; 从裸机开发到Linux操…

css-输入框和文本域样式调整

输入框去掉选中后的边框变化效果 选中后边框变化&#xff1a; 去掉变化效果方法&#xff1a;添加css属性- - - outline: none; 文本域去掉右下角拖拽图样 默认文本域右下角有个拖拽的图样&#xff0c;将鼠标移动到右下角可以进行拖拽实现放大缩小&#xff1a; 代码示例&#x…

HTML5-列表框、文本域和文件域

<!--下拉框&#xff0c;列表框selected 默认选择--><p>国家&#xff1a;<select name"列表名称" ><option value"china">中国</option><option value"us">美国</option><option value"eth&qu…

【多行文本输入框--文本域】(html,css)

<style>textarea{width: 300px;height: 300px;resize: none;/* resize:重新设置大小&#xff0c;vertical,horizontal,both,none */} </style> <body><div>多行文本输入框--文本域</div><div><!-- placeholder--提示文字 --><!--…

JTextArea:文本域组件

文本域与文本框的最大区别就是文本域允许用户输入多行文本信息。在 Swing 中使用 JTextArea 类实现一个文本域&#xff0c;其常用构造方法如下。 JTextArea()&#xff1a;创建一个默认的文本域。JTextArea(int rows,int columns)&#xff1a;创建一个具有指定行数和列数的文本…

html文本域

<!DOCTYPE <!DOCTYPE html><html><head><meta charset"utf-8"/><title>文本域</title></head><body>用户留言:<br/><form action"mailto:minriqq.com" name"invest" method"p…

文本域textarea

文本域 CreateTime--2017年5月23日15:12:08Author:Marydon 二、文本域 &#xff08;一&#xff09;语法 <textarea></textarea> &#xff08;二&#xff09;用法介绍 2.2.1 页面展示 内容一定要写在标签体内&#xff0c;即&#xff1a; <textarea>页面要展示…

textarea文本域,多行文本输入

当用户需要在表单中输入大段文字时&#xff0c;需要用到文本输入域。 语法&#xff1a; <textarea rows"行数" cols"列数">默认出现文本</textarea> 注意&#xff1a; rows,cols这两个属性可用css样式的width和height来代替&#xff1a;co…

为文本域(textarea)中的个别字体设置不同的样式

文章目录 将textarea文本域用可编辑的div来代替相关JavaScript代码效果显示参考链接 将textarea文本域用可编辑的div来代替 将contenteditable设置为true后可将div模拟成textarea <div id"" class"" contenteditable"true"></div>…

Vue3文本域(Textarea)

APIs 参数说明类型默认值必传width文本域宽度string | number‘100%’falseallowClear可以点击清除图标删除内容booleanfalsefalseautoSize自适应内容高度boolean | {minRows?: number, maxRows?: number}falsefalsedisabled是否禁用booleanfalsefalsemaxlength最大长度numb…

HTML 文本框输入框 列表文本框和文本域 等等

初识表单和get提交 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录注册</title> </head> <body><!--表单form action: 表单提交的位置&#xff0c;可以是网站&#xff0c;也…

LayUI富文本域使用案例

LayUI富文本域是一款轻量级的富文本编辑器&#xff0c;页面设计比较简约。之前写项目时因为用的是LayUI框架&#xff0c;所以富文本域当时就用的LayUI富文本编辑器&#xff0c;这里整理一下。 先来看一下效果图&#xff0c;页面效果图。 访问效果图&#xff1a; 首先需要引入L…

文本域(可输入多行文本)

1&#xff09;和文本、密码输入框一样&#xff0c;文本域的代码也是在<form></form>标签内部的。 语法如下&#xff1a; <textarea rows"行数" cols"列数">文本</textarea>如&#xff1a; <!DOCTYPE HTML> <html> <…

文本域、标签、密码域、文本区、滚动窗格——文本输入

文本域 将文本域添加到窗口的常用办法就是将它添加到面板或者其他的容器中&#xff1a; JPanel panel new JPanel(); JTextField textField new JTextField("Default input", 20); panel.add(textField);上面的代码添加一个文本域&#xff0c;同时传递“Default …