Vivado 下 AD9767 双通道正弦波产生例程

news2024/10/7 2:27:33

Vivado 下 AD9767 双通道正弦波产生例程

1、实验简介

本实验基于 Xinlinx 黑金  AX7A035 FPGA 开发板练习使用 AN9767 模块,实验中使用的模块是采用 ANALOG DEVICES 公司的 AD9767 芯 片,支持独立双通道、14 位、 125MSPS 的数模转换。在教程中介绍了利用该模块与 FPGA 开发板相连输出双通道 14 位的正弦波,然后通过示波器查看把输出的正弦波的波形。
AN9767 模块实物照片如下:

 

AN9767 双通道 DA 模块的详细参数:
  • DA 转换芯片:AD9767
  • 通道数:2 通道;
  • DA 转换位数:14bit
  •  DA 更新速率:125 MSPS
  • 输出电压范围:-5V~+5V
  • 模块 PCB 层数:4 层,独立的电源层和 GND 层;
  • 模块接口:40 2.54mm 间距排座,方向向下;
  • 工作温度:-40°~85° 模块使用芯片均满足工业级温度范围
  • 输出接口:2 BNC 模拟输出接口(用 BNC 线可以直接连接到示波器);

2、实验原理

2.1、AN9767 模块原理框图

AN9767 模块的原理设计框图如下:

2.2、AD9767 芯片简介

AD9767 是双端口、高速、双通道、 14 CMOS DAC, 芯片集成两个高品质 TxDAC+® 内核、一 个基准电压源和数字接口电路, 采用 48 引脚小型 LQFP 封装。器件提供出色的交流和直流性能,同 时支持最高 125 MSPS 的更新速率。 AD9767 的功能框图如下:

2.3、电流电压转换及放大

AD9767 的两路 DA 输出都为补码形式的电流输出 IoutA IoutB 。当 AD9767 数字输入为满量程时(DAC 的输入的 14 位数据都为高), IoutA 输出满量程的电流输出 20mA IoutB 输出的电流为 0mA 。具体的电流和 DAC 的数据的关系如下公式所示:

 

 下表为数字输入信号和各级运放输出后的电压对照表:

AD9767 芯片的数字接口可以通过芯片的模式管脚 (MODE) 来配置成双端口模式 (Dual) 或者交叉 (Interleaved)模式。在 AN9767 模块设计中, AD9767 芯片是工作在双端口模式,双通道的 DA 数字输入接口是独立分开的。双端口模式(Dual) 的数据时序图如下图所示:

 AD9767 芯片的 DA 数据通过时钟 CLK 和写信号 WRT 的上升沿输入到芯片进行 DA 转换。

3、程序设计

例程中提供了 AN9767 模块的 DA 测试程序,通过 AN9767 模块来实现正弦波信号的输出。正弦波测试程序是通过读取 FPGA 内部的一个 ROM 中存储的正弦波数据,然后把正弦波的数据输出到 AN9767 模块进行数模的转换,从而得到正弦波的模拟信号。正弦波测试程序的示意图如下:

3.1、生成 ROM 初始化文件

程序中我们会用到一个 ROM 用于存储 1024 14 位的正弦波数据 , 首先我们需要准备 ROM 的初始化文件( 如果是 ALTERA 开发板的话是 mif 文件,如果是 Xilinx 开发板的话是 coe 文件 ) 。以下为生成正弦波 ROM 数据文件的方法: 在软件工具及驱动文件夹下找到工具,其图标如下所示:

 1. 双击.exe 打开工具,打开界面如下:

 

 2. 可以根据需要自选波形,本例程中选择正弦波,数据长度 1024,数据位宽 14,其它默认:

 3. 点击保存按钮,将生成的数据文件保存到工程目录文件下(注意保存的文件类型):

 4. 保存后出现如下对话框表示保存成功,点击确定后关闭工具

.coe 文件保存到生成的 Rom IP 核中即可,在字符显示实验教程中已做介绍,这里不再重
复。

3.2、双通道正弦波发生程序

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/04/28 10:24:07
// Design Name: 
// Module Name: ad9767_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

//双通道14位 DA模块
//正弦波测试程序是通过读取 FPGA 内部的一个 ROM 中存储的正弦波数据,
//然后把正弦波的数据输出到 AN9767 模块进行数模的转换,从而得到正弦波的模拟信号。

//
//Two sine wave outputs: -10V ~ +10V
//
module ad9767_test
(
     //differential system clocks
     input               sys_clk_p,     // Differential input clock 200Mhz
     input               sys_clk_n,     // Differential input clock 200Mhz

     output              da1_clk,       //AD9767 CH1 clock
     output              da1_wrt,       //AD9767 CH1 enable
     output [13:0]       da1_data,      //AD9767 CH1 data output
     output              da2_clk,       //AD9767 CH2 clock
     output              da2_wrt,	     //AD9767 CH2 enable
     output [13:0]       da2_data       //AD9767 CH2 data output
);

reg  [9:0]           rom_addr;         //Store the ROM address of the DA data
wire [13:0]          rom_data;         //ROM data of DA 
wire                 clk_125M;         //clock for DA data processing

assign da1_clk  = clk_125M;
assign da1_wrt  = clk_125M;
assign da1_data = rom_data;

assign da2_clk  = clk_125M;
assign da2_wrt  = clk_125M;
assign da2_data = rom_data;

///*************************************************************************
//generate single end clock    //differential system clocks
//**************************************************************************/
//wire    sys_clk;  //single end clock 
//IBUFDS sys_clk_ibufgds
//(
//    .O          (sys_clk        ), //Differential clock converted to single terminal clock
//    .I          (sys_clk_p      ),
//    .IB         (sys_clk_n      )
//);

/*************************************************************************
Generate the clock  required for DA
****************************************************************************/
PLL PLL_inst
(   
    // Clock in ports
//    .clk_in1        (sys_clk        ),  
    .clk_in1_p      (sys_clk_p      ),    // input clk_in1_p
    .clk_in1_n      (sys_clk_n      ),    // input clk_in1_n
    .clk_out1       (               ),    // output clk_out1 
    .clk_out2       (clk_125M       ),    // output clk_out2
    .reset          (1'b0           ),    // input reset
    .locked         (               )     // output locked
); 

/*************************************************************************
Generate the frequency of DA
****************************************************************************/
always @(negedge clk_125M) begin
     rom_addr <= rom_addr + 1'b1;   //一个正选波采样点为 1024,输出正选波频率:125/1024=122Khz
     // rom_addr <= rom_addr + 4;   //一个正选波采样点为 256,输出正选波频率:125/256=488Khz
     // rom_addr <= rom_addr + 128; //一个正选波采样点为 8,输出正选波频率:125/1024=15.6Mhz							
end 

/*************************************************************************
Read sine wave data in ROM
****************************************************************************/
ROM ROM_inst
(
    .clka           (clk_125M       ),   // input wire clka
    .ena            (da2_wrt        ),   // input wire ena
    .addra          (rom_addr       ),   // input wire [9 : 0] addra
    .douta          (rom_data       )    // output wire [13 : 0] douta
);

endmodule

//通过一个 PLL IP 来产生 125M 的 DA 输出时钟,
//然后就是循环读取存放在 ROM 中的 1024 个数据,并输出到通道 1 和通道 2 的 DA 数据线上。
//程序中可以通过地址的加 1,加 4, 或者加 128 来选择输出不同的频率的正弦波。

通过一个 PLL IP 来产生 125M 的 DA 输出时钟,然后就是循环读取存放在 ROM 中的 1024 个数据,并输出到通道 1 和通道 2 的 DA 数据线上。程序中可以通过地址的加 1,加 4, 或者加 128 来选择输出不同的频率的正弦波。

3.3、通过一个 PLL IP 来产生 125M 的 DA 输出时钟

通过一个 PLL IP 来产生 125M 的 DA 输出时钟,详细步骤见:vivado下PLL实验

3.4、FPGA 片内 ROM 读写

FPGA 片内 ROM 读写见: FPGA 片内 ROM 读写例程

3.5、添加约束文件.XDC

添加约束文件.XDC,详细步骤见:Vivado 下 LED 流水灯实验_OliverH-yishuihan的博客-CSDN博客中的 “4.3、添加 XDC管脚约束文件”

############## clock define#### //differential system clocks#####黑金-FPGA#####
create_clock -period 5.000 [get_ports sys_clk_p]
set_property PACKAGE_PIN R4 [get_ports sys_clk_p]
set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_p]
############### Reset key define##########################
#set_property PACKAGE_PIN F15 [get_ports rst_n]
#set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
############## output DAC 通道 1 数据 define##########################
set_property PACKAGE_PIN G21 [get_ports {da1_data[0]}]
set_property PACKAGE_PIN G22 [get_ports {da1_data[1]}]
set_property PACKAGE_PIN C22 [get_ports {da1_data[2]}]
set_property PACKAGE_PIN B22 [get_ports {da1_data[3]}]
set_property PACKAGE_PIN F19 [get_ports {da1_data[4]}]
set_property PACKAGE_PIN F20 [get_ports {da1_data[5]}]
set_property PACKAGE_PIN D20 [get_ports {da1_data[6]}]
set_property PACKAGE_PIN C20 [get_ports {da1_data[7]}]
set_property PACKAGE_PIN A18 [get_ports {da1_data[8]}]
set_property PACKAGE_PIN A19 [get_ports {da1_data[9]}]
set_property PACKAGE_PIN B20 [get_ports {da1_data[10]}]
set_property PACKAGE_PIN A20 [get_ports {da1_data[11]}]
set_property PACKAGE_PIN F18 [get_ports {da1_data[12]}]
set_property PACKAGE_PIN E18 [get_ports {da1_data[13]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[13]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[12]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[11]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[0]}]
############## DAC 通道 1 数据写时钟 define##########################
set_property IOSTANDARD LVCMOS33 [get_ports da1_clk]
set_property PACKAGE_PIN E19 [get_ports da1_clk]
#set_property -dict {PACKAGE_PIN E19 IOSTANDARD LVCMOS33} [get_ports da1_clk]
##############  DAC 通道 1 数据写信号 define##########################
set_property IOSTANDARD LVCMOS33 [get_ports da1_wrt]
set_property PACKAGE_PIN D19 [get_ports da1_wrt]
#set_property -dict {PACKAGE_PIN D19 IOSTANDARD LVCMOS33} [get_ports da1_wrt]
############## output DAC 通道 2 数据 define##########################
set_property PACKAGE_PIN C18 [get_ports {da2_data[0]}]
set_property PACKAGE_PIN C19 [get_ports {da2_data[1]}]
set_property PACKAGE_PIN B17 [get_ports {da2_data[2]}]
set_property PACKAGE_PIN B18 [get_ports {da2_data[3]}]
set_property PACKAGE_PIN D17 [get_ports {da2_data[4]}]
set_property PACKAGE_PIN C17 [get_ports {da2_data[5]}]
set_property PACKAGE_PIN A15 [get_ports {da2_data[6]}]
set_property PACKAGE_PIN A16 [get_ports {da2_data[7]}]
set_property PACKAGE_PIN B15 [get_ports {da2_data[8]}]
set_property PACKAGE_PIN B16 [get_ports {da2_data[9]}]
set_property PACKAGE_PIN A13 [get_ports {da2_data[10]}]
set_property PACKAGE_PIN A14 [get_ports {da2_data[11]}]
set_property PACKAGE_PIN E16 [get_ports {da2_data[12]}]
set_property PACKAGE_PIN D16 [get_ports {da2_data[13]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[13]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[12]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[11]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[0]}]
###############  DAC 通道 2 数据写时钟 define##########################
set_property PACKAGE_PIN C14 [get_ports da2_clk]
set_property IOSTANDARD LVCMOS33 [get_ports da2_clk]
##############  DAC 通道 2 数据写信号 define##########################
set_property PACKAGE_PIN C15 [get_ports da2_wrt]
set_property IOSTANDARD LVCMOS33 [get_ports da2_wrt]
#set_property -dict {PACKAGE_PIN C15 IOSTANDARD LVCMOS33} [get_ports da2_wrt]
#############SPI Configurate Setting##################
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property CONFIG_MODE SPIx4 [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]

4、实验现象

1 )将 AN9767 模块插入开发板, AX7A035 J11 AX7A100/AX7A200 J13 ,注意 1 脚对齐, 不要插错、插偏,不能带电操作。
2 用我们提供的 BNC 线 连接 AN9767 的输出到示波器 的输入如下图,然后开发板上电 , 下载程序就可以从示波器上观察从 DA 模块输出的模拟信号的波形了

 

 (3)示波器上看到的正弦波如下:

(4)我们可以把程序中的地址修改成+4 的方式,如下修改,这样一个正弦波的输出的点为 256 个,输出的正弦波的频率会提高 4 倍:

程序修改后,重新下载 FPGA 后,正弦波的频率变高,示波器显示的波形如下:

 

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

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

相关文章

金币商城功能迭代. 使用版本号解决数据的并发修改问题

前言. 公司的商城模块嵌在微信公众号里面, 商城里面除了少量的现金业务, 大头在金币业务里面, 商城本来就是用来增加客户粘度的, 金币是客户通过某些行为免费获得如注册, 绑定,推荐等 需求. 金币方面之前的设计: 1.金币只有一个流水表,消费为负,获取为正 2.并且…

github上有什么好的node.js的项目?

前言 可以参考一下下面的nodejs相关的项目&#xff0c;希望对你的学习有所帮助&#xff0c;废话少说&#xff0c;让我们直接进入正题 1、 NodeBB Star: 13.3k 一个基于Node.js的现代化社区论坛软件&#xff0c;具有快速、可扩展、易于使用和灵活的特点。它支持多种数据库&am…

驱动开发:通过应用堆实现多次通信

在前面的文章《驱动开发&#xff1a;运用MDL映射实现多次通信》LyShark教大家使用MDL的方式灵活的实现了内核态多次输出结构体的效果&#xff0c;但是此种方法并不推荐大家使用原因很简单首先内核空间比较宝贵&#xff0c;其次内核里面不能分配太大且每次传出的结构体最大不能超…

jvm之GC

写在前面 本文一起看下GC相关的内容。 1&#xff1a;GC基础内容 1.1&#xff1a;为什么要有GC 内存资源的稀缺性&#xff0c;以及内存管理的复杂性&#xff0c;决定了需要有垃圾回收器这样的角色来帮助我们管理内存资源&#xff0c;避免手动管理带来的内存不能得到正常释放…

普源DS1102Z-E示波器,100MHz带宽

DS1000Z-E系列数字示波器是RIGOL基于主流需求而设计的&#xff0c;电商专供款高性能经济型数字示波器,具备100MHz带宽和1GSa/s采样率&#xff0c;搭载RIGOL独创的UltraVision技术平台&#xff0c;更深的储存&#xff08;标配达24 Mpts&#xff09;&#xff0c;高达30,000 wfms/…

解决基于kvm的win10虚拟机只识别2个cpu的问题

在使用kvmqemu创建win10虚拟机的时候&#xff0c;发现尽管我在virt manager里面指定了72个vcpu&#xff0c;但是win10里面只识别2个cpu核心的现象。 如图所示&#xff1a; 虚拟系统管理器里面当时是这样设置的&#xff1a; 这个时候&#xff0c;对应的xml文件内&#xff0c;关…

【深度学习】离线安装Python及相关第三方库

如果对方电脑无法联网。 那么需要在可以联网的电脑上进行如下操作&#xff0c;随后将整个文件包传输到对方电脑&#xff0c;实现环境配置。 Python 先给离线电脑安装Python初始环境 https://www.python.org/downloads/ 这里我选择下载了Python3.7.8 https://www.python.org…

如何用python在微信公众号上添加自己的ChatGPT

由于之前chatgpt的火热&#xff0c;现在很多微信公众号都接入了chatgpt的接口&#xff0c;来给自家公众号增添一丝乐趣&#xff0c;下面我以自己的经验&#xff0c;用python在微信公众上添加自己的chatGPT&#xff0c;先看下方成果图 三步曲 申请自己的公众号部署服务接入chat…

如何用国产DBDesginer软件进行数据库建模设计?

我们在开发软件系统之前都需要进行数据结构的建模设计&#xff0c;传统的都是通过PowerDesiger等国外的软件或直接Excel来进行数据库表结构设计&#xff0c;今天来了解一下如何使用国产软件来进行数据库建模设计 1、首先是注册DBDesigner用户&#xff08; http://dbdesigner.n…

用蹩脚英语在StackOverflow上飞奔:如何在一个RestApi接口中调用另一个RestApi文件接口发送上传文件请求

上班摸鱼、下班干活&#xff0c;日常埋坑、加班填坑——这是我的搬砖&#xff0c;亦是在座的各位&#xff01; 昨天在StackOverflow上面闲逛&#xff0c;突然看到一个国际友人提出了一个问题&#xff0c;他发出了好久都没有人来回答&#xff0c;本着在下为人处世乐善好施、广结…

视频flv怎么转换成mp4格式?

视频flv怎么转换成mp4格式&#xff1f;关于视频格式转换这个问题&#xff0c;小编发现&#xff0c;就算不是从事视频编辑的朋友也有可能经常会遇到这种转换操作&#xff0c;为什么会这样呢&#xff1f;原因主要是因为视频格式的种类真的非常多&#xff0c;多到我们数不清&#…

软件测试之自动化测试

目录 一、初试自动化测试 1.自动化测试的分类&#xff08;简单了解&#xff09; 2.如何实施自动化单元测试 二、selenium 介绍&#xff08;重点内容&#xff09; 1.工作原理 2.Selenium 环境搭建 2.1 Chrome java 2.2 常见问题及解决方案 1.元素的定位 1.1 CSS 定位…

sonarqube分析仓库

sonarqube可以有多种方式分析仓库 使用GitlabCI 设置项目编码 添加环境变量 创建或修改配置文件 sonarqube-check:image: name: sonarsource/sonar-scanner-cli:latestentrypoint: [""]variables:SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defi…

GE H201Ci-1 单通道变压器控制单元

HYDRAN 201Ci-1一个标准模拟输出通道控制器非隔离&#xff0c;跳线可配置为0-l mA 一个遥控电子控制器或4-20 mA&#xff08;最大输出10 V&#xff09;、0-1 V或0-10 V&#xff1b;0-2000 ppm范围 HYDRANR 201Ti智能变送器&#xff1b;它提供网络通信能力 第二个可选模拟输出加…

基于Web的智慧产业园区3D可视化运营管理平台

改革开放以来&#xff0c;园区逐渐成为地区招商引资、储备人才的重要途径。我国社会、经济处于快速发展阶段&#xff0c;园区正向着智慧化、创、科技化转变。 建设背景 在人类的历史发展过程中&#xff0c;随着5G、人工智能、云计算、物联网、GIS等新一轮信息技术的迅速发展&…

Jenkins流水线整合k8s实现代码自动集成和部署

一、前置条件 1、安装好k8s集群 这里先要搭建好一个K8s集群&#xff0c;笔者这边就采用使用了一个一主一丛的k8s集群&#xff0c;k8s集群的版本使用1.19.5版本&#xff0c;服务器的配置&#xff1a;2核4G&#xff0c;操作系统: CentOS Linux release 7.9.2009 (Core) 主机名…

Rabbitmq 下载与安装

文章目录 说明1、下载Erlan2、下载对应的rabbitmq 说明 Rabbitmq依赖于Erlan 对应版本查看&#xff1a;https://www.rabbitmq.com/which-erlang.html 这里版本使用&#xff1a; Rabbitmq 3.9.11 Erlan 24.1.7 1、下载Erlan https://www.erlang.org/patches/otp-24.1.7 安装完…

matlab代码复现:室内定位、无线传感器网路定位、估计优化滤波等探讨及技术支持

室内外定位导航、无线传感器网路定位、估计优化滤波等探讨及技术支持 博主主要擅长以下几个方面&#xff0c;探讨、技术支持、代码复现等问题欢迎联系&#xff0c;也可以站内私信 weixin: ZB823618313&#xff08;备注来意&#xff09; 1. 估计\滤波\融合 1 各种参数估计算法…

ChatGPT智能聊天系统1.0.3版本发布啦~

ChatGPT智能聊天系统1.0.3版本啦&#xff01;主要更新内容如下&#xff1a; 新增功能 获取微信昵称 支付宝支付 PC端允许退出登录 PC端创作和技能支持关键词搜索 分享记录添加今日分享统计 邀请记录添加今日邀请和今日发放统计 细节优化 模型对话框去掉快递发送功能 后…

bioinformatics2022 | Sc2Mol+:使用VAE和Transformer的两阶段基于骨架的分子生成

原文标题&#xff1a;Sc2Mol&#xff1a;a scaffold-based two-step molecule generator with variational autoencoder and transformer 论文地址&#xff1a;Sc2Mol: a scaffold-based two-step molecule generator with variational autoencoder and transformer | Bioinfo…