[X]关闭

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-25 ADC模块FEP-DAQ9248采集显示波形方案

文档创建者:FPGA课程
浏览次数:378
最后更新:2024-07-31
文档课程分类-安路-DR1
安路-DR1: FPSOC-DR1-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 1-FPGA基础入门实验
软件版本:Anlogic -TD5.9.1-DR1_ES1.1
操作系统:WIN10 64bit
硬件平台:适用安路(Anlogic)FPGA
实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板
板卡获取平台:https://milianke.tmall.com/
登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

1 概述
本方案通过把DAQ9248采集到的数据,通过前面已经完成的示波器显示驱动进行在屏幕上显示ADC采集的波形数据。
2 系统框图
2504661-20240731191837239-761107848.jpg
本方案中,把前面测试程序中的数据改为从ADC采集的数据
3 AD9248产品介绍
2504661-20240731191838014-809819376.jpg
DAQ_FMC3002是一款14bits双通道20/65MSPS ADC采集模块,该方案采用了ADI的AD9248芯片。
3.1 硬件参数概述
硬件参数
ADC 芯片
AD9248
DAC芯片
AD9767
采样精度
14bit
采样精度
14bit
IO 电平
1.8~3.3V可调
IO 电平
1.8~3.3V可调
模拟通道
2路
更新速率
0~125M
数字通道
2路
模拟通道
2路
输入电平
-5V~+5V
输出电平
-5V~+5V
采样频率
AD9248-65 0~65M
数字输出范围
0~16383
数据格式
偏移二进制(0~16383)
功耗
500MW
信噪比(SNR)
71.6 dBc
占用 IO 数量
33个GPIO
无杂散动态范围(SFDR)
80 dBc(至 Nyquist 频率,AD9248-65)

功耗
800MW

占用 IO 数量
35个GPIO



3.2 引脚定义3.2.1 SMA 引脚定义
引脚号
引脚名称
描述
PA
DAI
模拟输入通道 1
PB
DBI
模拟输入通道 2
TA
TriA
双向触发输入/输出 1
TB
TriB
双向触发输入/输出 2


3.2.2 AD9248芯片功能引脚定义
AD9248 工作于LVCMOS 模式,数据接口简单,下图为芯片引脚定义以及采样时序。。
2504661-20240731191838670-1362670547.jpg
非符合复合模式,一个数据通道采样1个模拟通道,采用LVCMOS SDR数据时序
2504661-20240731191839123-360693565.jpg
复合模式,一个数据通道采样2个模拟通道,采用LVCMOS DDR数据时序,这种工作模式下当MUX_SELECT 为逻辑高时,通道A数据被定向到通道A 输出总线,通道B数据被定向到通道B输出总线。当MUX_SELECT为逻辑低电平时,通道数据取反,即通道A数据导向通道B输出总线,通道B数据导向通道A输出总线。通过切换MUX_SELECT位,复用数据可在任一输出数据端口上使用。
2504661-20240731191839636-636106016.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.1 AD9248采集驱动
AD9248为并行ADC,每一个时钟输出一个采样点,因此驱动不需要编写,直接通过时钟同步过来的数据。
5.2 顶层模块调用程序
  1. `timescale 1ns / 1ns//仿真时间刻度/精度

  2. module wave_test
  3. (
  4. input           I_sysclk,         //系统时钟输入  
  5. output          O_ad9248_clka,      //A通道时钟输出   
  6. input           I_ad9248_ora,      
  7. input  [13:0]   I_ad9248_da,        //A通道数据输入

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

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

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

  18. //上电延迟复位
  19. reg [7:0]    rst_cnt=0; //复位计数器
  20. wire  rstn = rst_cnt[7];//用高位复位
  21. wire pclkx1,pclkx5,adc_clk,locked; //MMCM/PLL时钟信号   

  22. wire vtc_rstn,vtc_clk,vtc_vs,vtc_hs,vtc_de,vtc2_grid_de_o,vtc2_de_o;
  23. wire [23:0] rgb_o; //RGB颜色寄存器

  24. assign vtc_clk  = pclkx1;//像素时钟
  25. assign vtc_rstn = locked;
  26. assign S_rst = ~locked;

  27. //PLL时钟管理IP 输出 pclkx1和pclkx5以及locked信号
  28. pll U_pll(
  29. .refclk   ( I_sysclk    ),//系统时钟输入
  30. .reset    ( !rst_cnt[7] ),
  31. .lock     ( locked      ),//PLL LOCKED
  32. .clk0_out ( pclkx1      ),//像素时钟
  33. .clk1_out ( pclkx5      ),//HDMI IO的serdes 时钟 5倍的像素时钟
  34. .clk2_out ( adc_clk     )//100M时钟,给ADC采集用
  35. );

  36. always @(posedge I_sysclk)begin
  37.     if (rst_cnt[7])
  38.         rst_cnt <=  rst_cnt;
  39.     else
  40.         rst_cnt <= rst_cnt+1'b1;
  41. end

  42. //ad9248 ip相关信号
  43. assign O_ad9248_clka = adc_clk;
  44. assign O_ad9248_clkb = adc_clk;

  45. //hdmi 输出IP
  46. hdmi_tx#(
  47. //HDMI视频参数设置      
  48. .H_ActiveSize       (1280), //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素
  49. .H_SyncStart        (1280+88), //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号
  50. .H_SyncEnd          (1280+88+44),//视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分
  51. .H_FrameSize        (1280+88+44+239), //视频时间参数,行视频信号,一行视频信号总计占用的时钟数

  52. .V_ActiveSize       (720),//视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
  53. .V_SyncStart        (720+4),//视频时间参数,场同步开始,即多少行数后开始产生场同步信号
  54. .V_SyncEnd          (720+4+5), //视频时间参数,场同步结束,多少行后停止产生长同步信号  
  55. .V_FrameSize        (720+4+5+28),  //视频时间参数,场视频信号,一帧视频信号总计占用的行数量               
  56.      
  57. .VIDEO_VIC          ( 16       ),
  58. .VIDEO_TPG          ( "Disable"),//设置disable,用户数据驱动HDMI接口,否则设置eable产生内部测试图形
  59. .VIDEO_FORMAT       ( "RGB444" )//设置输入数据格式为RGB格式
  60. )u_hdmi_tx
  61. (
  62. .I_pixel_clk        ( pclkx1           ),//像素时钟
  63. .I_serial_clk       ( pclkx5           ),//串行发送时钟
  64. .I_rst              ( S_rst              ),//异步复位信号,高电平有效

  65. //.I_video_in_user    ( vtc_user         ),//视频输入帧起始信号
  66. //.I_video_in_valid   ( vtc_de_valid     ),//视频输入有效信号
  67. //.I_video_in_last    ( vtc_last         ),//视频输入行结束信号
  68. //.I_video_in_data    ( video_hdmi_data  ),//视频输入数据

  69. .I_video_rgb_enable (1'b1               ),//是否使能RGB输入接口,设置1使能,否则采用stream video时序接口  
  70. .I_video_in_vs      (vtc_vs            ),//RGB 输入VS 帧同步
  71. .I_video_in_de      (vtc_de       ),//RGB 输入de有效
  72. .I_video_in_data    (rgb_o), //视频输入数据     

  73. .O_hdmi_clk_p       ( O_hdmi_clk_p       ),//HDMI时钟通道
  74. .O_hdmi_tx_p        ( O_hdmi_tx_p        )//HDMI数据通道
  75. );

  76. //此VTC IP 用于产生绘制波形的有效区域,波形绘制区域大小未1024*600
  77. uivtc#
  78. (
  79. .H_ActiveSize(1280),          //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素
  80. .H_FrameSize(1280+88+44+239), //视频时间参数,行视频信号,一行视频信号总计占用的时钟数
  81. .H_SyncStart(1280+88),        //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号
  82. .H_SyncEnd(1280+88+44),       //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分
  83. .V_ActiveSize(720),           //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
  84. .V_FrameSize(720+4+5+28),     //视频时间参数,场视频信号,一帧视频信号总计占用的行数量
  85. .V_SyncStart(720+4),          //视频时间参数,场同步开始,即多少行数后开始产生场同步信号
  86. .V_SyncEnd (720+4+5),         //视频时间参数,场同步结束,即多少场数后停止产生场同步信号,之后就是场有效数据部分
  87. .H2_ActiveSize(1024),         //波形绘制区域行像素大小        
  88. .V2_ActiveSize(256)           //波形绘制区域场像素大小
  89. )
  90. uivtc_inst
  91. (
  92. .I_vtc_clk(vtc_clk),         //系统时钟
  93. .I_vtc_rstn(vtc_rstn),       //系统复位
  94. .I_vtc2_offset_x(128),         //X坐标相对屏幕的原始坐标的偏移
  95. .I_vtc2_offset_y(200),         //Y坐标相对屏幕的原始坐标的偏移
  96. .O_vtc_vs(vtc_vs),//场同步输出
  97. .O_vtc_hs(vtc_hs),//行同步输出
  98. .O_vtc_de(vtc_de),//视频数据有效
  99. .O_vtc2_de(vtc2_de_o)//绘制波形显示区域的有效区域
  100. );

  101. //例化波形显示器 IP,默认支持2个通道数据,可以扩展支持更多通道
  102. uiwave uiwave_inst
  103. (
  104. //波形1
  105. .I_wave1_clk(O_ad9248_clka),//系统时钟输入
  106. .I_wave1_data(I_ad9248_da[13:6]),//ADC只显示高8bits 数据
  107. .I_wave1_data_de(1'b1),//ADC数据有效信号

  108. //波形2
  109. .I_wave2_clk(O_ad9248_clkb),//系统时钟输入
  110. .I_wave2_data(I_ad9248_db[13:6]),//ADC只显示高8bits 数据
  111. .I_wave2_data_de(1'b1),//ADC数据有效信号

  112. .I_vtc_rstn(vtc_rstn),//时序发生复位
  113. .I_vtc_clk (vtc_clk), //像素时钟
  114. .I_vtc_vs  (vtc_vs),  //场同步输出
  115. .I_vtc_de  (vtc2_de_o),//同步,绘制波形显示区域的有效区域
  116. .O_vtc_rgb(rgb_o)//同步RGB数据 绘制数据输出     
  117.    
  118. );

  119. endmodule
复制代码
6 测试结果
6.1 硬件接线
(该教程为通用型教程,教程中仅展示一款示例开发板的连接方式,具体连接方式以所购买的开发板型号以及结合配套代码管脚约束为准。)
请确保下载器和开发板已经正确连接,并且开发板已经上电。(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)
2504661-20240731191840729-491567875.jpg
2504661-20240731191841930-881062070.jpg
6.2 测试结果
2504661-20240731191842608-1042806334.jpg


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

本版积分规则