[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA基础篇连载-33 ADC模块FEP-DAQ9248采集

文档创建者:FPGA课程
浏览次数:251
最后更新:2024-09-07
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 1-FPGA基础入门实验
本帖最后由 FPGA课程 于 2024-9-7 14:38 编辑

​ 软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!



1概述
本方案通过把DAQ9248采集到的数据,通过前面已经完成的示波器显示驱动进行在屏幕上显示ADC采集的波形数据。
2系统框图
f0f9e867dcfa475b8486fb2243765979.jpg
本方案中,把前面测试程序中的数据改为从ADC采集的数据
3AD9248产品介绍
a39407d8b6cb4cfc8b8141203f602d72.jpg
FEP-CARD-DAQ9248是一款14bits双通道20/65MSPS ADC采集模块,该方案采用了ADI的AD9248芯片,具有1.8V IO和3.3V IO接口2个版本。
3.1 硬件参数概述
                        
FEP-CARD-DAQ9248 硬件参数
                        
                        
ADC 芯片
                        
                        
AD9248
                        
                        
采样精度
                        
                        
14bit
                        
                        
IO 电平
                        
                        
1.8V 或者 3.3V 可选
                        
                        
采样频率
                        
                        
AD9248-20 0~20M
                        
                        
AD9248-65 0~65M
                        
                        
模拟通道
                        
                        
2个
                        
                        
触发 IO
                        
                        
2个
                        
                        
输入电平
                        
                        
-2.5V~+2.5V
                        
                        
数据格式
                        
                        
偏移二进制(0~16383)
                        
                        
信噪比(SNR)
                        
                        
71.6 dBc
                        
                        
无杂散动态范围(SFDR)
                        
                        
80 dBc (至Nyquist频率,AD9248-65)
                        
                        
功耗
                        
                        
800MW
                        
                        
占用 IO 数量
                        
                        
35个GPIO
                        
3.2 引脚定义3.2.1SMA 引脚定义
                        
引脚号
                        
                        
引脚名称
                        
                        
描述
                        
                        
PA
                        
                        
DAI
                        
                        
模拟输入通道 1
                        
                        
PB
                        
                        
DBI
                        
                        
模拟输入通道 2
                        
                        
TA
                        
                        
TriA
                        
                        
双向触发输入/输出 1
                        
                        
TB
                        
                        
TriB
                        
                        
双向触发输入/输出 2
                        
3.2.2AD9248芯片功能引脚定义
AD9248 工作于 LVCMOS 模式, 数据接口简单,下图为芯片引脚定义以及采样时序。。
62955a08e52641999bd6177ee616d749.jpg
非符合复合模式,一个数据通道采样1个模拟通道,采用 LVCMOS SDR数据时序
53b906a906104c77966ed3aca0adb744.jpg
复合模式,一个数据通道采样2个模拟通道,采用LVCMOS DDR数据时序,这种工作模式下当MUX_SELECT  为逻辑高时,通道A数据被定向到通道 A 输出总线,通道B数据被定向到通道B输出总线。当MUX_SELECT为逻辑低电平时,通道数据取反,即通道A数据导向通道B输出总线,通道B数据导向通道A输出总线。通过切换 MUX_SELECT位,复用数据可在任一输出数据端口上使用。
f79b78e99b9b4590bd929909f83a0bed.jpg
3.3 数据模式设置
AD9248 可以通过配置 DFS 实现数据格式的设置
                        
DFS 脚电平
                        
                        
数据模式
                        
                        
低电平
                        
                        
偏移二进制和并行 LVCMOS SDR
                        
                        
高电平
                        
                        
二进制补码和并行 LVCMOS SDR
                        
4硬件电路分析
硬件接口和子卡模块请阅读“附录 1”
配套工程的 FPGA PIN 脚定义路径为 fpga_prj/uisrc/04_pin/ fpga_pin.xdc。
5程序源码
关于HDMI输出IP的部分这里不再介绍,VTC时序设计部分这里也不详细介绍。如果读者这些基础知识不清楚的,请阅读前面的实验。
5.1AD9248采集驱动
AD9248为并行ADC,每一个时钟输出一个采样点,因此驱动不需要编写,直接通过时钟同步过来的数据。
5.2顶层模块调用程序
  1. /**********************AD9248 ADC采集波形显示*************************
  2. *********************************************************************/

  3. `timescale 1ns / 1ns//仿真时间刻度/精度
  4. module ad9248_top
  5. (
  6. input           I_sysclk_p,
  7. input           I_sysclk_n,         //系统时钟输入   
  8. output          O_ad9248_clka,      //A通道时钟输出   
  9. input           I_ad9248_ora,      
  10. input  [13:0]   I_ad9248_da,        //A通道数据输入

  11. output          O_ad9248_clkb,      //B通道时钟输出  
  12. input           I_ad9248_orb,
  13. input  [13:0]   I_ad9248_db,        //B通道数据输入
  14. output          O_card_power_en,    //子卡电源使能

  15. output          O_hdmi_clk_p,       //HDMI时钟输出 P端
  16. output          O_hdmi_clk_n,       //HDMI时钟输出 N端
  17. output [2:0]    O_hdmi_tx_p,        //HDMI数据输出 P端
  18. output [2:0]    O_hdmi_tx_n         //HDMI数据输出 N端
  19. );

  20. assign O_card_power_en = 1'b1; //子卡上电

  21. wire I_clk;
  22. IBUFGDS CLK_U(
  23. .I(I_sysclk_p),
  24. .IB(I_sysclk_n),
  25. .O(I_clk)
  26. );
  27. wire pclkx1,pclkx5,adc_clk,locked; //MMCM/PLL时钟信号

  28. assign O_ad9248_clka = adc_clk;
  29. assign O_ad9248_clkb = adc_clk;

  30. //例化MMCM/PLL IP
  31. clk_wiz_1 clk_hdmi_pll_inst
  32. (
  33. .clk_in1(I_clk),
  34. .reset(!rst_cnt[7]),
  35. .locked(locked),
  36. .clk_out1(pclkx1),//像素时钟
  37. .clk_out2(pclkx5),//HDMI输出5倍像素时钟
  38. .clk_out3(adc_clk)//给ADC采集用
  39. );

  40. wire vtc_rstn,vtc_clk,vtc_vs,vtc_hs,vtc_de,vtc2_grid_de_o,vtc2_de_o;
  41. wire [23:0] rgb_o; //RGB颜色寄存器
  42. assign vtc_clk  = pclkx1;//像素时钟
  43. assign vtc_rstn = locked;//VTC复位信号
  44.       
  45. //上电延迟复位
  46. reg [7:0]    rst_cnt=0; //复位计数器
  47. wire  rstn = rst_cnt[7];//用高位复位

  48. always @(posedge I_clk)begin
  49.     if (rst_cnt[7])
  50.         rst_cnt <=  rst_cnt;
  51.     else
  52.         rst_cnt <= rst_cnt+1'b1;
  53. end
  54. //例化HDMI 输出IP
  55. uihdmitx #
  56. (
  57. .FAMILY("7FAMILY")  //选择芯片所支持的系列"7FAMILY" "UFAMILY"            
  58. )
  59. uihdmitx_inst
  60. (
  61. .I_rstn(locked),//复位
  62. .I_hs(vtc_hs),//hs信号
  63. .I_vs(vtc_vs),//vs信号
  64. .I_de(vtc_de),//de信号
  65. .I_rgb({rgb_o}),//RGB数据
  66. .I_pclkx1(pclkx1),//像素时钟
  67. .I_pclkx2_5(1'b0),//2.5倍像素时钟,只有UFAMILY需要
  68. .I_pclkx5(pclkx5),//5倍像素时钟
  69. .O_hdmi_tx_clk_p(O_hdmi_clk_p),//HDMI时钟输出P端
  70. .O_hdmi_tx_clk_n(O_hdmi_clk_n),//HDMI时钟输出N端
  71. .O_hdmi_tx_p(O_hdmi_tx_p),//HDMI输出数据P端
  72. .O_hdmi_tx_n(O_hdmi_tx_n)//HDMI输出数据N端
  73. );
  74. //此VTC IP 用于产生绘制波形的有效区域,波形绘制区域大小未1024*600
  75. uivtc#
  76. (
  77. .H_ActiveSize(1280),          //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素
  78. .H_FrameSize(1280+88+44+239), //视频时间参数,行视频信号,一行视频信号总计占用的时钟数
  79. .H_SyncStart(1280+88),        //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号
  80. .H_SyncEnd(1280+88+44),    //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分
  81. .V_ActiveSize(720),           //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
  82. .V_FrameSize(720+4+5+28),     //视频时间参数,场视频信号,一帧视频信号总计占用的行数量
  83. .V_SyncStart(720+4),          //视频时间参数,场同步开始,即多少行数后开始产生场同步信号
  84. .V_SyncEnd (720+4+5),        //视频时间参数,场同步结束,即多少场数后停止产生场同步信号,之后就是场有效数据部分
  85. .H2_ActiveSize(1024),         //波形绘制区域行像素大小        
  86. .V2_ActiveSize(256)           //波形绘制区域场像素大小
  87. )
  88. uivtc_inst
  89. (
  90. .I_vtc_clk(vtc_clk),         //系统时钟
  91. .I_vtc_rstn(vtc_rstn),       //系统复位
  92. .I_vtc2_offset_x(128),         //X坐标相对屏幕的原始坐标的偏移
  93. .I_vtc2_offset_y(200),         //Y坐标相对屏幕的原始坐标的偏移
  94. .O_vtc_vs(vtc_vs),//场同步输出
  95. .O_vtc_hs(vtc_hs),//行同步输出
  96. .O_vtc_de(vtc_de),//视频数据有效
  97. .O_vtc2_de(vtc2_de_o)//绘制波形显示区域的有效区域
  98. );

  99. ila_0 ila_dbg (
  100. .clk(adc_clk), // input wire clk
  101. .probe0({I_ad9248_db,I_ad9248_da}) // input wire [1:0] probe0
  102. );
  103. //测试数据产生,通过test_data产生测试数据,可以用于测试波形显示器的基本功能测试
  104. //reg [7:0]test_data =0;
  105. //always @(posedge vtc_clk)
  106. //  if(vtc2_de_o)
  107. //       test_data[7:0] = test_data + 1'b1;

  108. //例化波形显示器 IP,默认支持2个通道数据,可以扩展支持更多通道
  109. uiwave uiwave_inst
  110. (
  111. //波形1
  112. .I_wave1_clk(O_ad9248_clka),//系统时钟输入
  113. .I_wave1_data(I_ad9248_da[13:6]),//ADC只显示高8bits 数据
  114. .I_wave1_data_de(1'b1),//ADC数据有效信号
  115. //波形2
  116. .I_wave2_clk(O_ad9248_clkb),//系统时钟输入
  117. .I_wave2_data(I_ad9248_db[13:6]),//ADC只显示高8bits 数据
  118. .I_wave2_data_de(1'b1),//ADC数据有效信号

  119. .I_vtc_rstn(vtc_rstn),//时序发生复位
  120. .I_vtc_clk (vtc_clk), //像素时钟
  121. .I_vtc_vs  (vtc_vs),  //场同步输出
  122. .I_vtc_de  (vtc2_de_o),//同步,绘制波形显示区域的有效区域
  123. .O_vtc_rgb(rgb_o)//同步RGB数据 绘制数据输出   
  124. );
  125. endmodule
复制代码

6测试结果
6.1硬件接线
(该教程为通用型教程,教程中仅展示一款示例开发板的连接方式,具体连接方式以所购买的开发板型号以及结合配套代码管脚约束为准。)
本实验注意采我们的cep跳线帽跳线1.8V,采用1.8V的FEP-CARD-DAQ9248子卡。请确保下载器和开发板已经正确连接,另外需要把核心板上的2P模式开关设置到JTAG模式,即ON ON,并且开发板已经上电。(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)
4b259295c5b247148e5631e188b0c827.jpg
506bac9a4bd440a9bdba8075f20ea1b8.jpg
6.2测试结果
e12ea785392d40cbbdfbb8c63addf217.jpg





您需要登录后才可以回帖 登录 | 立即注册

本版积分规则