[X]关闭

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

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

​ 软件版本: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概述
本方案通过把DAQ7606采集到的数据,通过前面已经完成的示波器显示驱动进行在屏幕上显示ADC采集的波形数据。
关于DAQ7606的数据采集驱动设计可以阅读“18 SPI接口ADC采集驱动设计”
2系统框图
3f909b4b23114634b83cd30facabcbfe.jpg
本方案中,把前面测试程序中的数据改为从ADC采集的数据,之后在显示器上进行显示波形数据。
3程序源码
关于HDMI输出IP的部分这里不再介绍,VTC时序设计部分这里也不详细介绍。如果读者这些基础知识不清楚的,请阅读前面的实验。
3.1AD7606 SPI采集驱动
关于DAQ7606的数据采集驱动设计可以阅读“18 SPI接口ADC采集驱动设计”
3.2波形显示驱动
关于波形显示驱动设计可以阅读“18 SPI接口ADC采集驱动设计”
关于DAQ7606的数据采集驱动设计可以阅读“基于FPGA简易示波器显示驱动设计”
3.3顶层模块调用程序
  1. /**********************AD7606 ADC采集波形显示*************************
  2. *********************************************************************/

  3. `timescale 1ns / 1ns//仿真时间刻度/精度

  4. module ad7606_top
  5. (
  6. input           I_sysclk_p,
  7. input           I_sysclk_n,         //系统时钟输入   
  8. input           I_ad_busy,        //ad7606 忙标志位
  9. output          O_ad_cs,          //ad7606 CS信号输出,低电平SPI数据线输出AD7606寄存器数据
  10. output          O_ad_sclk,        //ad7606 SCLK时钟输出
  11. output          O_ad_rst,         //ad7606 复位输出
  12. output          O_ad_convsta,     //ad7606 A组通道转换
  13. output          O_ad_convstb,     //ad7606 B组通道转换
  14. output          O_ad_range,       //ad7606 模拟输入范围,设置1范围:±10V,设置0范围±5V
  15. input           I_ad_out_a,       //串行A组通道采集输入,V1,V2,V3,V4  
  16. input           I_ad_out_b,       //串行B组通道采集输入, V5,V6,V7,V8  
  17. output          O_card_power_en,    //子卡电源使能

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

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

  24. wire I_clk;
  25. IBUFGDS CLK_U(
  26. .I(I_sysclk_p),
  27. .IB(I_sysclk_n),
  28. .O(I_clk)
  29. );

  30. wire pclkx1,pclkx5,clk100M,locked; //MMCM/PLL时钟信号

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

  41. wire vtc_rstn,vtc_clk,vtc_vs,vtc_hs,vtc_de,vtc2_grid_de_o,vtc2_de_o;
  42. wire [23:0] rgb_o; //RGB颜色寄存器
  43. assign vtc_clk  = pclkx1;//像素时钟
  44. assign vtc_rstn = locked;//VTC复位信号

  45. //ad7606 ip相关信号
  46. wire ad_clk_i,ad_rst_i,ad_cap_en;
  47. wire [63:0] ad_out_a,ad_out_b;
  48. assign ad_clk_i      = clk100M; //ADC时钟
  49. assign ad_rst_i      = !locked; //ADC IP内部代码复位

  50. uispi7606 uispi7606_inst
  51. (
  52. .I_ad_clk(ad_clk_i),    //系统时钟输入               
  53. .I_ad_rst(ad_rst_i),    //系统复位输入
  54. .I_ad_busy(I_ad_busy),  //ad7606 忙标志位               
  55. .O_ad_cs(O_ad_cs),      //ad7606 CS信号输出,低电平SPI数据线输出AD7606寄存器数据
  56. .O_ad_sclk(O_ad_sclk),  //ad7606 SCLK时钟输出   
  57. .O_ad_rst(O_ad_rst),    //ad7606 复位输出        
  58. .O_ad_convsta(O_ad_convsta), //ad7606 A组通道转换     
  59. .O_ad_convstb(O_ad_convstb), //ad7606 B组通道转换  
  60. .O_ad_range(O_ad_range),     //ad7606 模拟输入范围,设置1范围:±10V,设置0范围±5V
  61. .I_O_ad_out_a(I_O_ad_out_a),     //串行A组通道采集输入,V1,V2,V3,V4  
  62. .I_O_ad_out_b(I_O_ad_out_b),     //串行B组通道采集输入, V5,V6,V7,V8  
  63. .O_ad_out_a(ad_out_a),         //A组通道采集有效数据输出
  64. .O_ad_out_b(ad_out_b),         //B组通道采集有效数据输出
  65. .O_ad_cap_en(ad_cap_en)        //采集完成使能
  66. );

  67. wire [15:0] ad_ch1 = ad_out_a[63:48];//ADC 通道1
  68. wire [15:0] ad_ch2 = ad_out_a[47:32];//ADC 通道2
  69. wire [15:0] ad_ch3 = ad_out_a[31:16];//ADC 通道3
  70. wire [15:0] ad_ch4 = ad_out_a[15: 0];//ADC 通道4
  71. wire [15:0] ad_ch5 = ad_out_b[63:48];//ADC 通道5
  72. wire [15:0] ad_ch6 = ad_out_b[47:32];//ADC 通道6
  73. wire [15:0] ad_ch7 = ad_out_b[31:16];//ADC 通道7
  74. wire [15:0] ad_ch8 = ad_out_b[15: 0];//ADC 通道8
  75. //例化 ILA IP 用于在线逻辑分仪观察ADC采样值
  76. ila_0 ila_debug
  77. (
  78. .clk(ad_clk_i), //系统时钟
  79. .probe0(ad_cap_en), //AD采集数据使能,ILA中使用capture功能,可以观察到更多有效数据
  80. .probe1(ad_ch1),//ADC 通道1
  81. .probe2(ad_ch2),//ADC 通道2
  82. .probe3(ad_ch3),//ADC 通道3
  83. .probe4(ad_ch4),//ADC 通道4
  84. .probe5(ad_ch5),//ADC 通道5
  85. .probe6(ad_ch6),//ADC 通道6
  86. .probe7(ad_ch7),//ADC 通道7
  87. .probe8(ad_ch8) //ADC 通道8                       
  88. );
  89.            
  90. //上电延迟复位
  91. reg [7:0]    rst_cnt=0; //复位计数器
  92. wire  rstn = rst_cnt[7];//用高位复位

  93. always @(posedge I_clk)begin
  94.     if (rst_cnt[7])
  95.         rst_cnt <=  rst_cnt;
  96.     else
  97.         rst_cnt <= rst_cnt+1'b1;
  98. end

  99. //例化HDMI 输出IP
  100. uihdmitx #
  101. (
  102. .FAMILY("7FAMILY")  //选择芯片所支持的系列"7FAMILY" "UFAMILY"            
  103. )
  104. uihdmitx_inst
  105. (
  106. .I_rstn(locked),//复位
  107. .I_hs(vtc_hs),//hs信号
  108. .I_vs(vtc_vs),//vs信号
  109. .I_de(vtc_de),//de信号
  110. .I_rgb({rgb_o}),//RGB数据
  111. .I_pclkx1(pclkx1),//像素时钟
  112. .I_pclkx2_5(1'b0),//2.5倍像素时钟,只有UFAMILY需要
  113. .I_pclkx5(pclkx5),//5倍像素时钟
  114. .O_hdmi_tx_clk_p(O_hdmi_clk_p),//HDMI时钟输出P端
  115. .O_hdmi_tx_clk_n(O_hdmi_clk_n),//HDMI时钟输出N端
  116. .O_hdmi_tx_p(O_hdmi_tx_p),//HDMI输出数据P端
  117. .O_hdmi_tx_n(O_hdmi_tx_n)//HDMI输出数据N端
  118. );

  119. //此VTC IP 用于产生绘制波形的有效区域,波形绘制区域大小未1024*600
  120. uivtc#
  121. (
  122. .H_ActiveSize(1280),          //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素
  123. .H_FrameSize(1280+88+44+239), //视频时间参数,行视频信号,一行视频信号总计占用的时钟数
  124. .H_SyncStart(1280+88),        //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号
  125. .H_SyncEnd(1280+88+44),       //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分
  126. .V_ActiveSize(720),           //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
  127. .V_FrameSize(720+4+5+28),     //视频时间参数,场视频信号,一帧视频信号总计占用的行数量
  128. .V_SyncStart(720+4),          //视频时间参数,场同步开始,即多少行数后开始产生场同步信号
  129. .V_SyncEnd (720+4+5),         //视频时间参数,场同步结束,即多少场数后停止产生场同步信号,之后就是场有效数据部分
  130. .H2_ActiveSize(1024),         //波形绘制区域行像素大小        
  131. .V2_ActiveSize(256)           //波形绘制区域场像素大小
  132. )
  133. uivtc_inst
  134. (
  135. .I_vtc_clk(vtc_clk),         //系统时钟
  136. .I_vtc_rstn(vtc_rstn),       //系统复位
  137. .I_vtc2_offset_x(128),         //X坐标相对屏幕的原始坐标的偏移
  138. .I_vtc2_offset_y(200),         //Y坐标相对屏幕的原始坐标的偏移
  139. .O_vtc_vs(vtc_vs),//场同步输出
  140. .O_vtc_hs(vtc_hs),//行同步输出
  141. .O_vtc_de(vtc_de),//视频数据有效
  142. .O_vtc2_de(vtc2_de_o)//绘制波形显示区域的有效区域
  143. );

  144. //测试数据产生,通过test_data产生测试数据,可以用于测试波形显示器的基本功能测试
  145. //reg [7:0]test_data =0;
  146. //always @(posedge vtc_clk)
  147. //  if(vtc2_de_o)
  148. //       test_data[7:0] = test_data + 1'b1;

  149. //例化波形显示器 IP,默认支持2个通道数据,可以扩展支持更多通道
  150. uiwave uiwave_inst
  151. (
  152. //波形1
  153. .I_wave1_clk(ad_clk_i),//系统时钟输入
  154. .I_wave1_data(ad_ch1[15:8]+8'h80),//ADC只显示高8bits 数据,其中8'h80是对有符号的ADC的计算偏移,把负数坐标转为对应的整数坐标
  155. .I_wave1_data_de(ad_cap_en),//ADC数据有效信号

  156. //波形2
  157. .I_wave2_clk(ad_clk_i),//系统时钟输入
  158. .I_wave2_data(ad_ch2[15:8]+8'h80),//ADC只显示高8bits 数据,其中8'h80是对有符号的ADC的计算偏移,把负数坐标转为对应的整数坐标
  159. .I_wave2_data_de(ad_cap_en),//ADC数据有效信号

  160. .I_vtc_rstn(vtc_rstn),//时序发生复位
  161. .I_vtc_clk (vtc_clk), //像素时钟
  162. .I_vtc_vs  (vtc_vs),  //场同步输出
  163. .I_vtc_de  (vtc2_de_o),//同步,绘制波形显示区域的有效区域
  164. .O_vtc_rgb(rgb_o)//同步RGB数据 绘制数据输出   
  165.    
  166. );

  167. endmodule
复制代码

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

8bc0cf2c90b34ebba2e2fe00db5841e9.jpg
cd8edb1ebfb54dd89cdca4e156c1c05a.jpg
4.2测试结果
030064f3e09a430eb4f38564f4572082.jpg




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

本版积分规则