uisrc 发表于 2023-12-29 19:19:34

2-3-32 基于FPGA的ADC模块FEP-DAQ7606采集显示波形方案

软件版本:VIVADO2021.1操作系统:WIN10 64bit硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1 概述本方案通过把DAQ7606采集到的数据,通过前面已经完成的示波器显示驱动进行在屏幕上显示ADC采集的波形数据。关于DAQ7606的数据采集驱动设计可以阅读"18 SPI接口ADC采集驱动设计"2 系统框图本方案中,把前面测试程序中的数据改为从ADC采集的数据,之后在显示器上进行显示波形数据。3 程序源码关于HDMI输出IP的部分这里不再介绍,VTC时序设计部分这里也不详细介绍。如果读者这些基础知识不清楚的,请阅读前面的实验。3.1 AD7606 SPI采集驱动关于DAQ7606的数据采集驱动设计可以阅读"18 SPI接口ADC采集驱动设计"3.2 波形显示驱动关于波形显示驱动设计可以阅读"18 SPI接口ADC采集驱动设计"关于DAQ7606的数据采集驱动设计可以阅读"基于FPGA简易示波器显示驱动设计"3.3 顶层模块调用程序
/**********************AD7606 ADC采集波形显示**********************************************************************************************/`timescale 1ns / 1ns//仿真时间刻度/精度
module ad7606_top(input         I_sysclk,         //系统时钟输入input         I_ad_busy,      //ad7606 忙标志位output          O_ad_cs,          //ad7606 CS信号输出,低电平SPI数据线输出AD7606寄存器数据output          O_ad_sclk,      //ad7606 SCLK时钟输出output          O_ad_rst,         //ad7606 复位输出output          O_ad_convsta,   //ad7606 A组通道转换output          O_ad_convstb,   //ad7606 B组通道转换output          O_ad_range,       //ad7606 模拟输入范围,设置1范围:±10V,设置0范围±5Vinput         I_O_ad_out_a,       //串行A组通道采集输入,V1,V2,V3,V4input         I_O_ad_out_b,       //串行B组通道采集输入, V5,V6,V7,V8output          O_card_power_en,    //子卡电源使能
output          O_hdmi_clk_p,       //HDMI时钟输出 P端output          O_hdmi_clk_n,       //HDMI时钟输出 N端output     O_hdmi_tx_p,      //HDMI数据输出 P端output     O_hdmi_tx_n         //HDMI数据输出 N端);
assign O_card_power_en = 1'b1; //子卡上电
wire pclkx1,pclkx5,clk100M,locked; //MMCM/PLL时钟信号
//例化MMCM/PLL IPclk_wiz_1 clk_hdmi_pll_inst(.clk_in1(I_sysclk),.reset(!rst_cnt),.locked(locked),.clk_out1(pclkx1),//像素时钟.clk_out2(pclkx5),//HDMI输出5倍像素时钟.clk_out3(clk100M)//100M时钟,给ADC采集用);
wire vtc_rstn,vtc_clk,vtc_vs,vtc_hs,vtc_de,vtc2_grid_de_o,vtc2_de_o;wire rgb_o; //RGB颜色寄存器assign vtc_clk= pclkx1;//像素时钟assign vtc_rstn = locked;//VTC复位信号
//ad7606 ip相关信号wire ad_clk_i,ad_rst_i,ad_cap_en;wire ad_out_a,ad_out_b;assign ad_clk_i      = clk100M; //ADC时钟assign ad_rst_i      = !locked; //ADC IP内部代码复位
uispi7606 uispi7606_inst(.I_ad_clk(ad_clk_i),    //系统时钟输入            .I_ad_rst(ad_rst_i),    //系统复位输入.I_ad_busy(I_ad_busy),//ad7606 忙标志位            .O_ad_cs(O_ad_cs),      //ad7606 CS信号输出,低电平SPI数据线输出AD7606寄存器数据.O_ad_sclk(O_ad_sclk),//ad7606 SCLK时钟输出    .O_ad_rst(O_ad_rst),    //ad7606 复位输出      .O_ad_convsta(O_ad_convsta), //ad7606 A组通道转换    .O_ad_convstb(O_ad_convstb), //ad7606 B组通道转换.O_ad_range(O_ad_range),   //ad7606 模拟输入范围,设置1范围:±10V,设置0范围±5V.I_O_ad_out_a(I_O_ad_out_a),   //串行A组通道采集输入,V1,V2,V3,V4.I_O_ad_out_b(I_O_ad_out_b),   //串行B组通道采集输入, V5,V6,V7,V8.O_ad_out_a(ad_out_a),         //A组通道采集有效数据输出.O_ad_out_b(ad_out_b),         //B组通道采集有效数据输出.O_ad_cap_en(ad_cap_en)      //采集完成使能 );
wire ad_ch1 = ad_out_a;//ADC 通道1wire ad_ch2 = ad_out_a;//ADC 通道2wire ad_ch3 = ad_out_a;//ADC 通道3wire ad_ch4 = ad_out_a;//ADC 通道4wire ad_ch5 = ad_out_b;//ADC 通道5wire ad_ch6 = ad_out_b;//ADC 通道6wire ad_ch7 = ad_out_b;//ADC 通道7wire ad_ch8 = ad_out_b;//ADC 通道8
//例化 ILA IP 用于在线逻辑分仪观察ADC采样值ila_0 ila_debug(.clk(ad_clk_i), //系统时钟.probe0(ad_cap_en), //AD采集数据使能,ILA中使用capture功能,可以观察到更多有效数据.probe1(ad_ch1),//ADC 通道1.probe2(ad_ch2),//ADC 通道2.probe3(ad_ch3),//ADC 通道3.probe4(ad_ch4),//ADC 通道4.probe5(ad_ch5),//ADC 通道5.probe6(ad_ch6),//ADC 通道6.probe7(ad_ch7),//ADC 通道7.probe8(ad_ch8) //ADC 通道8                      );
//上电延迟复位reg     rst_cnt=0; //复位计数器wirerstn = rst_cnt;//用高位复位
always @(posedge I_sysclk)begin    if (rst_cnt)      rst_cnt <=rst_cnt;    else      rst_cnt <= rst_cnt+1'b1;End
//例化HDMI 输出IPuihdmitx #(.FAMILY("7FAMILY")//选择芯片所支持的系列"7FAMILY" "UFAMILY"            )uihdmitx_inst(.I_rstn(locked),//复位.I_hs(vtc_hs),//hs信号.I_vs(vtc_vs),//vs信号.I_de(vtc_de),//de信号.I_rgb({rgb_o}),//RGB数据.I_pclkx1(pclkx1),//像素时钟.I_pclkx2_5(1'b0),//2.5倍像素时钟,只有UFAMILY需要.I_pclkx5(pclkx5),//5倍像素时钟.O_hdmi_tx_clk_p(O_hdmi_clk_p),//HDMI时钟输出P端.O_hdmi_tx_clk_n(O_hdmi_clk_n),//HDMI时钟输出N端.O_hdmi_tx_p(O_hdmi_tx_p),//HDMI输出数据P端.O_hdmi_tx_n(O_hdmi_tx_n)//HDMI输出数据N端);
//此VTC IP 用于产生绘制波形的有效区域,波形绘制区域大小未1024*600uivtc#(.H_ActiveSize(1280),          //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素.H_FrameSize(1280+88+44+239), //视频时间参数,行视频信号,一行视频信号总计占用的时钟数.H_SyncStart(1280+88),      //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号.H_SyncEnd(1280+88+44),    //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分.V_ActiveSize(720),         //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize.V_FrameSize(720+4+5+28),   //视频时间参数,场视频信号,一帧视频信号总计占用的行数量.V_SyncStart(720+4),          //视频时间参数,场同步开始,即多少行数后开始产生场同步信号.V_SyncEnd (720+4+5),      //视频时间参数,场同步结束,即多少场数后停止产生场同步信号,之后就是场有效数据部分.H2_ActiveSize(1024),         //波形绘制区域行像素大小      .V2_ActiveSize(256)         //波形绘制区域场像素大小)uivtc_inst(.I_vtc_clk(vtc_clk),         //系统时钟.I_vtc_rstn(vtc_rstn),       //系统复位.I_vtc2_offset_x(128),         //X坐标相对屏幕的原始坐标的偏移.I_vtc2_offset_y(200),         //Y坐标相对屏幕的原始坐标的偏移.O_vtc_vs(vtc_vs),//场同步输出.O_vtc_hs(vtc_hs),//行同步输出.O_vtc_de(vtc_de),//视频数据有效.O_vtc2_de(vtc2_de_o)//绘制波形显示区域的有效区域);
//测试数据产生,通过test_data产生测试数据,可以用于测试波形显示器的基本功能测试//reg test_data =0;//always @(posedge vtc_clk)//if(vtc2_de_o)//       test_data = test_data + 1'b1;
//例化波形显示器 IP,默认支持2个通道数据,可以扩展支持更多通道uiwave uiwave_inst(//波形1.I_wave1_clk(ad_clk_i),//系统时钟输入.I_wave1_data(ad_ch1+8'h80),//ADC只显示高8bits 数据,其中8'h80是对有符号的ADC的计算偏移,把负数坐标转为对应的整数坐标.I_wave1_data_de(ad_cap_en),//ADC数据有效信号
//波形2.I_wave2_clk(ad_clk_i),//系统时钟输入.I_wave2_data(ad_ch2+8'h80),//ADC只显示高8bits 数据,其中8'h80是对有符号的ADC的计算偏移,把负数坐标转为对应的整数坐标.I_wave2_data_de(ad_cap_en),//ADC数据有效信号.I_vtc_rstn(vtc_rstn),//时序发生复位.I_vtc_clk (vtc_clk), //像素时钟.I_vtc_vs(vtc_vs),//场同步输出.I_vtc_de(vtc2_de_o),//同步,绘制波形显示区域的有效区域.O_vtc_rgb(rgb_o)//同步RGB数据 绘制数据输出
);
endmodule


4 测试结果4.1 硬件接线(该教程为通用型教程,教程中仅展示一款示例开发板的连接方式,具体连接方式以所购买的开发板型号以及结合配套代码管脚约束为准。)我们使用米联客3V3的FEP-DAQ7606子卡。请确保下载器和开发板已经正确连接,并且开发板已经上电。(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)4.2 测试结果
页: [1]
查看完整版本: 2-3-32 基于FPGA的ADC模块FEP-DAQ7606采集显示波形方案