10 ADC模块FEP-DAQ9248采集显示波形方案

发布时间 2023-12-27 19:28:51作者: 米联客(milianke)

软件版本:VIVADO2021.1

操作系统:WIN10 64bit

硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA

登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!

1概述

本方案通过把DAQ9248采集到的数据,通过示波器显示驱动进行在屏幕上显示ADC采集的波形数据。

2系统框图

3产品介绍

FEP-DAQ002-14-20M-65M-2是一款14bits双通道20/65MSPS ADC采集模块,该方案采用了ADI的AD9248芯片,具有1.8V IO和3.3V IO接口2个版本。

3.1 硬件参数概述

 

FEP-DAQ002-14-20M-2/ FEP-DAQ002-14-65M-2

ADC 芯片

AD9248

采样精度

14bit

-3db带宽

145M(前置运放带宽决定)

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 数量

35GPIO

3.2 引脚定义

3.2.1 SMA 引脚定义

引脚号

引脚名称

描述

PA

DAI

模拟输入通道 1

PB

DBI

模拟输入通道 2

TA

TriA

双向触发输入/输出 1

TB

TriB

双向触发输入/输出 2

3.2.2 AD9248芯片功能引脚定义

AD9248 工作于 LVCMOS 模式, 数据接口简单,下图为芯片引脚定义以及采样时序。。

非符合复合模式,一个数据通道采样1个模拟通道,采用 LVCMOS SDR数据时序

复合模式,一个数据通道采样2个模拟通道,采用LVCMOS DDR数据时序,这种工作模式下当MUX_SELECT 为逻辑高时,通道A数据被定向到通道 A 输出总线,通道B数据被定向到通道B输出总线。当MUX_SELECT为逻辑低电平时,通道数据取反,即通道A数据导向通道B输出总线,通道B数据导向通道A输出总线。通过切换 MUX_SELECT位,复用数据可在任一输出数据端口上使用。

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 波形显示驱动

关于波形显示驱动设计可以阅读前课内容。

5.3顶层模块调用程序

/**********************AD9248 ADC采集波形显示*************************

*********************************************************************/

 

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

 

module ad9248_top

(

input           I_sysclk,         //系统时钟输入  

output          O_ad9248_clka,      //A通道时钟输出  

input           I_ad9248_ora,      

input  [13:0]   I_ad9248_da,        //A通道数据输入

 

output          O_ad9248_clkb,      //B通道时钟输出  

input           I_ad9248_orb,

input  [13:0]   I_ad9248_db,        //B通道数据输入

output          O_card_power_en,    //子卡电源使能

 

output          O_hdmi_clk_p,       //HDMI时钟输出 P

output          O_hdmi_clk_n,       //HDMI时钟输出 N

output [2:0]    O_hdmi_tx_p,        //HDMI数据输出 P

output [2:0]    O_hdmi_tx_n         //HDMI数据输出 N

);

 

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

 

wire pclkx1,pclkx5,adc_clk,locked; //MMCM/PLL时钟信号

 

assign O_ad9248_clka = adc_clk;

assign O_ad9248_clkb = adc_clk;

 

//例化MMCM/PLL IP

clk_wiz_1 clk_hdmi_pll_inst

(

.clk_in1(I_sysclk),

.reset(!rst_cnt[7]),

.locked(locked),

.clk_out1(pclkx1),//像素时钟

.clk_out2(pclkx5),//HDMI输出5倍像素时钟

.clk_out3(adc_clk)//ADC采集用

);

 

wire vtc_rstn,vtc_clk,vtc_vs,vtc_hs,vtc_de,vtc2_grid_de_o,vtc2_de_o;

wire [23:0] rgb_o; //RGB颜色寄存器

assign vtc_clk  = pclkx1;//像素时钟

assign vtc_rstn = locked;//VTC复位信号

       

//上电延迟复位

reg [7:0]    rst_cnt=0; //复位计数器

wire  rstn = rst_cnt[7];//用高位复位

 

always @(posedge I_sysclk)begin

    if (rst_cnt[7])

        rst_cnt <=  rst_cnt;

    else

        rst_cnt <= rst_cnt+1'b1;

end

 

//例化HDMI 输出IP

uihdmitx #

(

.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*600

uivtc#

(

.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)//绘制波形显示区域的有效区域

);

 

ila_0 ila_dbg (

.clk(adc_clk), // input wire clk

.probe0({I_ad9248_db,I_ad9248_da}) // input wire [1:0] probe0

);

 

//测试数据产生,通过test_data产生测试数据,可以用于测试波形显示器的基本功能测试

//reg [7:0]test_data =0;

//always @(posedge vtc_clk)

//  if(vtc2_de_o)

//       test_data[7:0] = test_data + 1'b1;

 

//例化波形显示器 IP,默认支持2个通道数据,可以扩展支持更多通道

uiwave uiwave_inst

(

//波形1

.I_wave1_clk(O_ad9248_clka),//系统时钟输入

.I_wave1_data(I_ad9248_da[13:6]),//ADC只显示高8bits 数据

.I_wave1_data_de(1'b1),//ADC数据有效信号

 

//波形2

.I_wave2_clk(O_ad9248_clkb),//系统时钟输入

.I_wave2_data(I_ad9248_db[13:6]),//ADC只显示高8bits 数据

.I_wave2_data_de(1'b1),//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

6测试结果

6.1硬件接线

请确保下载器和开发板已经正确连接,并且开发板已经上电(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)

6.2测试结果