【正点原子FPGA连载】第二十五章 双路高速AD实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

news2024/12/25 9:05:33

1)实验平台:正点原子MPSoC开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html

第二十五章 双路高速AD实验

ADC(Analog to Digital Converter即模数转换器)是大多数系统中必不可少的组成部件,用于将连续的模拟信号转换成离散的数字信号,它们是连接模电电路和数字电路必不可少的桥梁。在很多场合下,ADC的转换速度甚至直接决定了整个系统的运行速度。本章我们将使用双路高速AD模块采集外部模拟信号转换成数字信号,并在ILA中查看信号波形。
本章包括以下几个部分:
202525.1简介
25.2实验任务
25.3硬件设计
25.4软件设计
25.5下载验证

25.1简介

本章我们使用的高速双路AD模块是正点原子推出的一款高速双路模数转换模块(ATK_DUAL_HS_AD),高速AD转换芯片由恩瑞浦公司生产的,型号是3PA1030。
ATK_DUAL_HS_AD模块的硬件结构图如下图所示。
在这里插入图片描述

图 25.1.1 ATK_DUAL_HS_AD模块硬件结构图
3PA1030芯片的输入模拟电压转换范围是0V2V,所以电压输入端需要先经过电压衰减电路,使输入的-5V+5V之间的电压衰减到0V~2V之间,然后经过3PA1030芯片将模拟电压信号转换成数字信号。在这里插入图片描述

下面我们介绍下这个芯片。
3PA1030芯片
3PA1030是一款恩瑞浦推出的单电压芯片,10位,50 MSPS(Million Samples Per Second,每秒采样百万次)模数转换器,集成片上采样保持放大器和基准电压源。具有高性能低功耗的特点。
3PA1030的内部功能框图如下图所示:
在这里插入图片描述

图 25.1.2 3PA1030内部功能框图
3PA1030在时钟(CLK)的驱动下工作,3PA1030内置片内采样保持放大器(SHA),同时采用多级差分流水线架构,保证了50MSPS的数据转换速率下全温度范围内无失码;3PA1030内部集成了基准源,根据系统需要也可以选择外部高精度基准满足系统的要求。
3PA1030输出的数据以二进制格式表示,当输入的模拟电压超出量程时,会拉高OVR信号;当输入的模拟电压在量程范围内时,OVR信号为低电平,因此可以通过OVR信号来判断输入的模拟电压是否在测量范围内。另外3PA1030有一个OE信号,当该信号为高电平时3PA1030输出呈高阻态,低电平则可以正常输出。
3PA1030的时序图如下图所示:
在这里插入图片描述

图 25.1.3 3PA1030时序图
上图中,S1,S2,S3分别为三个采样点,可以看到,芯片在时钟的上升沿采样。需要注意的是,3PA1030芯片的最大转换速度是50MSPS,即输入的时钟最大频率为50MHz。
3PA1030支持输入的模拟电压范围是0V至2V,0V对应输出的数字信号为0,2V对应输出的数字信号为1023。而DA经外部电路后,输出的电压范围是-5V+5V,因此在3PA1030的模拟输入端增加电压衰减电路,使-5V+5V之间的电压转换成0V至2V之间。那么实际上对我们用户使用来说,当3PA1030的模拟输入接口连接-5V电压时,AD输出的数据为0;当3PA1030的模拟输入接口连接+5V电压时,AD输出的数据为1023。
当3PA1030模拟输入端接-5V至+5V之间变化的正弦波电压信号时,其转换后的数据也是成正弦波波形变化,转换波形如下图所示:
在这里插入图片描述

图 25.1.4 3PA1030正弦波模拟电压值(左)、数据(右)
由上图可知,输入的模拟电压范围在-5V至5V之间,按照正弦波波形变化,最终得到的数据也是按照正弦波波形变化。
25.2实验任务
本节实验任务是使用DFZU2EG/4EV MPSoC开发板及双路AD扩展模块(ATK_DUAL_HS_AD模块)实现双路模数的转换,并在ILA中查看波形。本实验我们模拟输入源来自信号发生器,一个是正弦波,频率1Mhz,幅值9V;另一个是三角波,频率1Mhz,幅值5V。两路模拟信号分别接在双路AD模块的模拟信输入端。
25.3硬件设计
ATK_DUAL_HS_AD模块电路主要包括扩展口,AD芯片,电源电路模块和低通滤波器,衰减电路。下面是扩展口电源电路部分。
在这里插入图片描述

图 25.3.1 扩展口及电源电路
由上图可知,双路AD模块使用到的管脚连接道路P4扩展口上,这些管脚包括十位的数据,时钟以及电源等信号。U2用于将5V电压转成VCC+(2.8V)供U1使用,U1将VCC+转成了VCC-(-2.8V),±2.8V电压供双电源运放TPH2501使用。U3负责将5V电压转成VCC(3.3V)。
衰减电路原理图如下图所示。
在这里插入图片描述

图 25.3.2 3PA1030原理图
上下两个电路是一样的,我们以上面的电路为例。上图中输入的模拟信号IN1(V1)经过衰减电路后得到AD_IN1(VO)信号,两个模拟电压信号之间的关系是VO=VI/5+1,即当VI=5V时,VO=2V;VI=-5V时,VO=0V。
ATK_DUAL_HS_AD模块的实物图如下图所示。
在这里插入图片描述

图 25.3.3 ATK_DUAL_HS_AD模块实物图
本实验中,各端口信号的管脚分配如下表所示。
表 25.3.1双路高速AD转换实验管脚分配
在这里插入图片描述

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

#IO管脚约束
#时钟周期约束
create_clock -name sys_clk_p -period 10.000 [get_ports sys_clk_p]
#时钟
set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_p]
set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_n]
set_property PACKAGE_PIN AE5 [get_ports sys_clk_p]
set_property PACKAGE_PIN AF5 [get_ports sys_clk_n]
#复位
set_property -dict {PACKAGE_PIN AH11 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]

#ad_data0
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN D10} [get_ports {ad0_data[0]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN E10} [get_ports {ad0_data[2]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN B10} [get_ports {ad0_data[4]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN C11} [get_ports {ad0_data[6]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN A11} [get_ports {ad0_data[8]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN A12} [get_ports ad0_otr]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN A15} [get_ports ad0_clk]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN D11} [get_ports {ad0_data[1]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN E12} [get_ports {ad0_data[3]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN A10} [get_ports {ad0_data[5]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN B11} [get_ports {ad0_data[7]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN C12} [get_ports {ad0_data[9]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN D12} [get_ports {ad0_oe}]
#ad_data1
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN B15} [get_ports {ad1_data[0]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN A13} [get_ports {ad1_data[2]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN B13} [get_ports {ad1_data[4]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN D14} [get_ports {ad1_data[6]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN D15} [get_ports {ad1_data[8]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN F13} [get_ports ad1_otr]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN G13} [get_ports ad1_clk]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN B14} [get_ports {ad1_data[1]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN C13} [get_ports {ad1_data[3]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN C14} [get_ports {ad1_data[5]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN E13} [get_ports {ad1_data[7]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN E14} [get_ports {ad1_data[9]}]
set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN E15} [get_ports {ad1_oe}]

25.4软件设计
根据本章的实验任务,高速双路AD模块同时采集两路外部模拟信号,在模块内部实现模数转换,将转换后的数字信号传给FPGA管脚,FPGA内部逻辑分析仪通过抓取数据将外部的模拟信号呈现出来。
图 25.4.1是根据本章实验任务画出的系统框图。我们事先准备两路模拟信号源,本实验我们使用信号发生器产生模拟输入源。接到双路AD芯片的信号输入端,在双路AD内部实现AD转换,将转换后的信号送给FPGA,在这里,FPGA只需要给AD芯片输出驱动时钟信号(AD_CLK)和使能信号(AD_OE),AD芯片便可完成模拟采集并转换成数字信号。
高速双路AD实验的系统框图如图 25.4.1所示:
在这里插入图片描述

图 25.4.1 双路AD系统框图
顶层模块的原理图如下图所示:
在这里插入图片描述

图 25.4.2 顶层模块原理图
通过对原理图的分析,我们可以将代码分成两个模块,一个是clk_wiz_0模块用来生成对应的时钟去驱动AD外设模块,一个用来例化ila IP核。所以这么一分析我们的代码结构还是非常简单的。我们给出顶层模块代码如下所示:

1  module hs_dual_ad(
2      input                 sys_clk_p    ,   //系统时钟
3      input                 sys_clk_n    ,   //系统时钟
4      //AD0
5      input     [9:0]       ad0_data     ,   //AD0数据
6      input                 ad0_otr      ,   //输入电压超过量程标志
7      output                ad0_clk      ,   //AD0采样时钟
8      output                ad0_oe       ,   //AD0输出使能
9      //AD1
10     input     [9:0]       ad1_data     ,   //AD1数据
11     input                 ad1_otr      ,   //输入电压超过量程标志
12     output                ad1_clk      ,   //AD1采样时钟  
13     output                ad1_oe           //AD1输出使能
14     );
15      
16 //wire define
17 wire clk_out1;
18 
19 //*****************************************************
20 //**                    main code
21 //*****************************************************  
22 
23 assign  ad0_oe =  1'b0;
24 assign  ad1_oe =  1'b0;
25 assign  ad0_clk = ~clk_out1;
26 assign  ad1_clk = ~clk_out1;
27 
28 clk_wiz_0 u_clk_wiz_0
29    (
30     // Clock out ports
31     .clk_out1     (clk_out1 ),    // output clk_out1
32     // Status and control signals
33     .reset        (1'b0     ),    // input reset
34     .locked       (locked   ),    // output locked
35    // Clock in ports
36     .clk_in1_p    (sys_clk_p),    // input clk_in1_p
37     .clk_in1_n    (sys_clk_n)     // input clk_in1_n
38     );    
39     
40 ila_0 u_ila_0 (
41    .clk       (clk_out1),    // input wire clk
42    .probe0    (ad1_otr ),    // input wire [0:0]  probe0  
43    .probe1    (ad0_data),    // input wire [9:0]  probe1
44    .probe2    (ad0_otr ),    // input wire [0:0]  probe0  
45    .probe3    (ad1_data)     // input wire [9:0]  probe1
46 );
47 
48 endmodule

代码第23到24行产生双路AD的两个输出使能信号,ad0_oe和ad1_oe,请注意,它们是低电平有效,所以我们直接赋值0。25行到26行,产生驱动AD芯片的时钟,ad0_clk和ad1_clk,他们都是由clk_out1取反得来,取反其实就是相移180°,这是为了在ila采集数据时采集到数据中间,使采到的数据更正确。其中clk_out1由时钟模块产生,大小是50M。
25.5下载验证
将高速双路AD模块插入DFZU2EG/4EV MPSoC开发板J19扩展口,连接时注意扩展口电源引脚方向和开发板电源引脚方向一致,然后将下载器一端连接电脑,另一端与开发板上对应端口连接,最后连接电源线后拨动开关按键给开发板上电。
DFZU2EG/4EV MPSoC开发板硬件连接实物图如下图所示:
在这里插入图片描述

图 25.5.1 DFZU2EG/4EV MPSoC开发板硬件连接实物图
使用SMA转BNC线将信号发生器与AD模块如图 25.5.1所示进行连接。
将工程生成的比特流文件下载到FPGA中,运行程序后在ILA中观察ad_data数据的变化,观察到的波形如下图所示。
在这里插入图片描述

图 25.5.2 AD数据接收模块采集到的ILA波形图
由上图可知,输入的ad_data数据分别为三角波和正弦波,频率和幅值与信号发生器发的设定相一致,说明AD-DA实验验证成功。
另外,在这里介绍一下如何将数据设置成波形图显示。首先选中ILA波形图中的ad_data,右键选择Waveform Style,然后选择Analog即可。如果要切换成数据显示的话,同样选中ad_data,右键选择Waveform Style,然后选择Digital就可以了,如下图所示:
在这里插入图片描述

图 25.5.3 ILA波形显示设置界面

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

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

相关文章

干货 | 读懂这篇文,玩游戏还会卡顿?

玩游戏的时候最怕的就是卡顿。排位赛的紧急关头,明明马上就能上一段位,却因为卡顿导致给对方送人头。还把对手送上了王者。引起队友骂声一片。作为测试工程师的你,可以忍? 卡顿测试也是专项测试里的一种,更多精彩测试内…

【学习笔记】深度学习入门:基于Python的理论与实现-Python入门与感知机

CONTENTS一、Python入门1.1 NumPy1.2 Matplotlib二、感知机2.1 感知机是什么2.2 简单逻辑电路2.3 感知机的实现2.4 感知机的局限性2.5 多层感知机一、Python入门 1.1 NumPy 在深度学习的实现中,经常出现数组和矩阵的计算。NumPy的数组类(numpy.array&a…

C语言函数调用的过程图解深入剖析

希望是美好的,也许是人间至善,而美好的事物永不消逝。——《肖申克的救赎》 目录 1、什么是函数栈帧? 2、理解函数栈帧能解决什么问题 3、函数栈帧是什么 3.1什么是栈? 3.2认识寄存器和汇编指令 4、函数调用的整个过程 5、…

LBA逻辑区块地址

现在很多硬盘采用同密度盘片,意味着内外磁道上的扇区数量不同,扇区数量增加,容量增加,3D很难定位寻址,出现了新的寻址模式:LBA(Logical Block Addressing)。在LBA地址中,地址不再表示实际硬盘的…

Mysql 并发多版本控制MVCC

什么是MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 一般情况下我们使用mysql数据库的…

Prometheus 采集vCenter7监控数据

前提要求 安装docker,docker-compose创建vmware_exporter目录 mkdir -p /vmware_exporter 创建基于docker部署vmware_exporter脚本 VSPHERE_HOST: "vCenter 管理地址" VSPHERE_IGNORE_SSL: "True" VSPHERE_USER: "administratorvsphere…

[附源码]计算机毕业设计springboot求职招聘网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

信创平台:查询CPU,内存等命令

信创平台:海光、鲲鹏服务器查询CPU,内存等命令 #1、查看操作系统(统信操作系统) 海光查询操作系统: cat /etc/os-release查看操作系统 cat /etc/os-version查看操作系统版本 鲲鹏查询操作系统:cat /etc/system-release Kylin Linux Adva…

Python图像处理【3】Python图像处理库应用

Python图像处理库应用0. 前言1. 将 RGB 图像转换为灰度图像算法1.1 算法原理3.2 算法实现2. 使用 PIL 库计算图像差异2.1 算法原理2.2 算法实现3. 使用 Scikit-image 转换图像色彩空间3.1 将 RGB 图像转换至 HSV 色彩空间3.2 将 RGB 图像转换至 YUV 色彩空间4. 用 OpenCV 调整图…

html学习笔记

1.在idea里右键创建html文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body></body> </html>在谷歌浏览器中输入chrome://version可以看…

【学习笔记】深度学习入门:基于Python的理论与实现-误差反向传播法

CONTENTS五、误差反向传播法5.1 计算图5.2 链式法则5.3 反向传播5.4 简单层的实现5.5 激活函数层的实现5.6 Affine/Softmax层的实现5.7 误差反向传播法的实现五、误差反向传播法 5.1 计算图 先引入一个很简单的问题&#xff1a;在超市买了222个100100100元一个的苹果&#xf…

[附源码]JAVA毕业设计个人饮食营养管理信息系统(系统+LW)

[附源码]JAVA毕业设计个人饮食营养管理信息系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 …

云原生|kubernetes|kubernetes集群使用私有镜像仓库拉取镜像(harbor或者官方的registry私有镜像仓库)

前言&#xff1a; 在实际的生产中&#xff0c;我们可能会有许多的由开发制作的docker镜像&#xff0c;这也就造成使用这些镜像需要打包成tar文件&#xff0c;然后上传到服务器内然后在导入并使用&#xff0c;但&#xff0c;kubernetes节点很多&#xff0c;有时候并不是明确的要…

13.前端笔记-CSS-盒子样式应用(圆角、阴影)

1、圆角边框 border-radius属性&#xff0c;用于设置元素的外边框圆角 原理&#xff1a;(椭)圆和矩形的两条边相切&#xff08;圆的半径就是length&#xff09;&#xff0c;形成圆角效果 属性&#xff1a; border-top-left-radius;左上 border-top-right-radius:右上 border…

B-神经网络模型复杂度分析

B-神经网络模型复杂度分析 前言一&#xff0c;模型计算量分析 卷积层 FLOPs 计算全连接层的 FLOPs 计算二&#xff0c;模型参数量分析 卷积层参数量BN 层参数量全连接层参数量三&#xff0c;模型内存访问代价计算 卷积层 MAC 计算四&#xff0c;一些概念 双精度、单精度和半精…

数苹果-第12届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第91讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

【Android】Fragment使用

使用Fragment 我们可以把页面结构划分成几块&#xff0c;每块使用一个Fragment来管理。这样我们可以更加方便的在运行过程中动态地更新Activity中的用户界面&#xff0c;日后迭代更新、维护也是更加方便。 Fragment并不能单独使用&#xff0c;他需要嵌套在Activity 中使用&…

Redis最佳实践(上)

引言 尽管 redis 是一款非常优秀的 NoSQL 数据库&#xff0c;但更重要的是&#xff0c;作为使用者我们应该学会在不同的场景中如何更好的使用它&#xff0c;更大的发挥它的价值。主要可以从这四个方面进行优化&#xff1a;Redis键值设计、批处理优化、服务端优化、集群配置优化…

某些设置由你的组织来管理

今天莫名其妙Windows更新出现&#xff1a;*某些设置由你的组织来管理 我们来看看如何恢复吧。 根据上面的图片我们可以知道&#xff0c; 可查看配置的更新策略&#xff1a; 可以看到设备设置的策略有下面几个&#xff1a; 解决方案 这个时候我们就要进入设置更改那些策略即…

Java企业微信对接(二)微信端回调到企业端

准备工作 先下载demo 下载完成后的目录,把这些类之间copy到工程里面就行,都是封装好的加密算法 回调配置 什么时候需要回调 在集成企业微信与内部系统时,我们往往需要搭建一个回调服务。回调服务,可以实现: 自定义丰富的服务行为。比如,用户向应用发消息时,识别消…