当前位置:   article > 正文

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

vivado 正弦信号

目录

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

1、实验简介

2、实验原理

2.1、AN9767 模块原理框图

2.2、AD9767 芯片简介

2.3、电流电压转换及放大

3、程序设计

3.1、生成 ROM 初始化文件

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

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

3.4、将 .coe 文件保存到生成的 Rom IP 核中

3.5、添加约束文件.XDC

4、实验现象


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 核中即可。 将 .coe 文件保存到生成的 Rom IP 核中,详细步骤见: Vivado 下 IP核 之ROM 读写_OliverH-yishuihan的博客-CSDN博客

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

  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2023/04/28 10:24:07
  7. // Design Name:
  8. // Module Name: ad9767_test
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. //双通道14位 DA模块
  22. //正弦波测试程序是通过读取 FPGA 内部的一个 ROM 中存储的正弦波数据,
  23. //然后把正弦波的数据输出到 AN9767 模块进行数模的转换,从而得到正弦波的模拟信号。
  24. //
  25. //Two sine wave outputs: -10V ~ +10V
  26. //
  27. module ad9767_test
  28. (
  29. //differential system clocks
  30. input sys_clk_p, // Differential input clock 200Mhz
  31. input sys_clk_n, // Differential input clock 200Mhz
  32. output da1_clk, //AD9767 CH1 clock
  33. output da1_wrt, //AD9767 CH1 enable
  34. output [13:0] da1_data, //AD9767 CH1 data output
  35. output da2_clk, //AD9767 CH2 clock
  36. output da2_wrt, //AD9767 CH2 enable
  37. output [13:0] da2_data //AD9767 CH2 data output
  38. );
  39. reg [9:0] rom_addr; //Store the ROM address of the DA data
  40. wire [13:0] rom_data; //ROM data of DA
  41. wire clk_125M; //clock for DA data processing
  42. assign da1_clk = clk_125M;
  43. assign da1_wrt = clk_125M;
  44. assign da1_data = rom_data;
  45. assign da2_clk = clk_125M;
  46. assign da2_wrt = clk_125M;
  47. assign da2_data = rom_data;
  48. ///*************************************************************************
  49. //generate single end clock //differential system clocks
  50. //**************************************************************************/
  51. //wire sys_clk; //single end clock
  52. //IBUFDS sys_clk_ibufgds
  53. //(
  54. // .O (sys_clk ), //Differential clock converted to single terminal clock
  55. // .I (sys_clk_p ),
  56. // .IB (sys_clk_n )
  57. //);
  58. /*************************************************************************
  59. Generate the clock required for DA
  60. ****************************************************************************/
  61. PLL PLL_inst
  62. (
  63. // Clock in ports
  64. // .clk_in1 (sys_clk ),
  65. .clk_in1_p (sys_clk_p ), // input clk_in1_p
  66. .clk_in1_n (sys_clk_n ), // input clk_in1_n
  67. .clk_out1 ( ), // output clk_out1
  68. .clk_out2 (clk_125M ), // output clk_out2
  69. .reset (1'b0 ), // input reset
  70. .locked ( ) // output locked
  71. );
  72. /*************************************************************************
  73. Generate the frequency of DA
  74. ****************************************************************************/
  75. always @(negedge clk_125M) begin
  76. rom_addr <= rom_addr + 1'b1; //一个正选波采样点为 1024,输出正选波频率:125/1024=122Khz
  77. // rom_addr <= rom_addr + 4; //一个正选波采样点为 256,输出正选波频率:125/256=488Khz
  78. // rom_addr <= rom_addr + 128; //一个正选波采样点为 8,输出正选波频率:125/1024=15.6Mhz
  79. end
  80. /*************************************************************************
  81. Read sine wave data in ROM
  82. ****************************************************************************/
  83. ROM ROM_inst
  84. (
  85. .clka (clk_125M ), // input wire clka
  86. .ena (da2_wrt ), // input wire ena
  87. .addra (rom_addr ), // input wire [9 : 0] addra
  88. .douta (rom_data ) // output wire [13 : 0] douta
  89. );
  90. endmodule
  91. //通过一个 PLL IP 来产生 125M 的 DA 输出时钟,
  92. //然后就是循环读取存放在 ROM 中的 1024 个数据,并输出到通道 1 和通道 2 的 DA 数据线上。
  93. //程序中可以通过地址的加 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 下 IP核之 PLL实验_OliverH-yishuihan的博客-CSDN博客

3.4、.coe 文件保存到生成的 Rom IP 核中

.coe 文件保存到生成的 Rom IP 核中,详细步骤见: Vivado 下 IP核 之ROM 读写_OliverH-yishuihan的博客-CSDN博客

3.5、添加约束文件.XDC

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

  1. ############## clock define#### //differential system clocks#####黑金-FPGA#####
  2. create_clock -period 5.000 [get_ports sys_clk_p]
  3. set_property PACKAGE_PIN R4 [get_ports sys_clk_p]
  4. set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_p]
  5. ############### Reset key define##########################
  6. #set_property PACKAGE_PIN F15 [get_ports rst_n]
  7. #set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
  8. ############## output DAC 通道 1 数据 define##########################
  9. set_property PACKAGE_PIN G21 [get_ports {da1_data[0]}]
  10. set_property PACKAGE_PIN G22 [get_ports {da1_data[1]}]
  11. set_property PACKAGE_PIN C22 [get_ports {da1_data[2]}]
  12. set_property PACKAGE_PIN B22 [get_ports {da1_data[3]}]
  13. set_property PACKAGE_PIN F19 [get_ports {da1_data[4]}]
  14. set_property PACKAGE_PIN F20 [get_ports {da1_data[5]}]
  15. set_property PACKAGE_PIN D20 [get_ports {da1_data[6]}]
  16. set_property PACKAGE_PIN C20 [get_ports {da1_data[7]}]
  17. set_property PACKAGE_PIN A18 [get_ports {da1_data[8]}]
  18. set_property PACKAGE_PIN A19 [get_ports {da1_data[9]}]
  19. set_property PACKAGE_PIN B20 [get_ports {da1_data[10]}]
  20. set_property PACKAGE_PIN A20 [get_ports {da1_data[11]}]
  21. set_property PACKAGE_PIN F18 [get_ports {da1_data[12]}]
  22. set_property PACKAGE_PIN E18 [get_ports {da1_data[13]}]
  23. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[13]}]
  24. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[12]}]
  25. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[11]}]
  26. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[10]}]
  27. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[9]}]
  28. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[8]}]
  29. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[7]}]
  30. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[6]}]
  31. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[5]}]
  32. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[4]}]
  33. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[3]}]
  34. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[2]}]
  35. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[1]}]
  36. set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[0]}]
  37. ############## DAC 通道 1 数据写时钟 define##########################
  38. set_property IOSTANDARD LVCMOS33 [get_ports da1_clk]
  39. set_property PACKAGE_PIN E19 [get_ports da1_clk]
  40. #set_property -dict {PACKAGE_PIN E19 IOSTANDARD LVCMOS33} [get_ports da1_clk]
  41. ############## DAC 通道 1 数据写信号 define##########################
  42. set_property IOSTANDARD LVCMOS33 [get_ports da1_wrt]
  43. set_property PACKAGE_PIN D19 [get_ports da1_wrt]
  44. #set_property -dict {PACKAGE_PIN D19 IOSTANDARD LVCMOS33} [get_ports da1_wrt]
  45. ############## output DAC 通道 2 数据 define##########################
  46. set_property PACKAGE_PIN C18 [get_ports {da2_data[0]}]
  47. set_property PACKAGE_PIN C19 [get_ports {da2_data[1]}]
  48. set_property PACKAGE_PIN B17 [get_ports {da2_data[2]}]
  49. set_property PACKAGE_PIN B18 [get_ports {da2_data[3]}]
  50. set_property PACKAGE_PIN D17 [get_ports {da2_data[4]}]
  51. set_property PACKAGE_PIN C17 [get_ports {da2_data[5]}]
  52. set_property PACKAGE_PIN A15 [get_ports {da2_data[6]}]
  53. set_property PACKAGE_PIN A16 [get_ports {da2_data[7]}]
  54. set_property PACKAGE_PIN B15 [get_ports {da2_data[8]}]
  55. set_property PACKAGE_PIN B16 [get_ports {da2_data[9]}]
  56. set_property PACKAGE_PIN A13 [get_ports {da2_data[10]}]
  57. set_property PACKAGE_PIN A14 [get_ports {da2_data[11]}]
  58. set_property PACKAGE_PIN E16 [get_ports {da2_data[12]}]
  59. set_property PACKAGE_PIN D16 [get_ports {da2_data[13]}]
  60. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[13]}]
  61. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[12]}]
  62. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[11]}]
  63. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[10]}]
  64. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[9]}]
  65. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[8]}]
  66. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[7]}]
  67. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[6]}]
  68. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[5]}]
  69. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[4]}]
  70. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[3]}]
  71. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[2]}]
  72. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[1]}]
  73. set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[0]}]
  74. ############### DAC 通道 2 数据写时钟 define##########################
  75. set_property PACKAGE_PIN C14 [get_ports da2_clk]
  76. set_property IOSTANDARD LVCMOS33 [get_ports da2_clk]
  77. ############## DAC 通道 2 数据写信号 define##########################
  78. set_property PACKAGE_PIN C15 [get_ports da2_wrt]
  79. set_property IOSTANDARD LVCMOS33 [get_ports da2_wrt]
  80. #set_property -dict {PACKAGE_PIN C15 IOSTANDARD LVCMOS33} [get_ports da2_wrt]
  81. #############SPI Configurate Setting##################
  82. set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
  83. set_property CONFIG_MODE SPIx4 [current_design]
  84. 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 后,正弦波的频率变高,示波器显示的波形如下:

工程源码: Vivado下AD9767双通道正弦波产生例程资源-CSDN文库

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号