软件版本: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 概述
2 系统框图
3 AD9248产品介绍
3.1 硬件参数概述
3.2 引脚定义
3.2.1 SMA 引脚定义
3.2.2 AD9248芯片功能引脚定义
3.3 数据模式设置
4 硬件电路分析
5 程序源码
5.1 AD9248采集驱动
5.2 顶层模块调用程序
6 测试结果
6.1 硬件接线
6.2 测试结果
1 概述
本方案通过把DAQ9248采集到的数据,通过前面已经完成的示波器显示驱动进行在屏幕上显示ADC采集的波形数据。
2 系统框图
本方案中,把前面测试程序中的数据改为从ADC采集的数据
3 AD9248产品介绍
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 模式, 数据接口简单,下图为芯片引脚定义以及采样时序。。
非符合复合模式,一个数据通道采样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.1 AD9248采集驱动
AD9248为并行ADC,每一个时钟输出一个采样点,因此驱动不需要编写,直接通过时钟同步过来的数据。
5.2 顶层模块调用程序
`timescale 1ns / 1ns//仿真时间刻度/精度
module wave_test
(
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; //子卡上电
//上电延迟复位
reg [7:0] rst_cnt=0; //复位计数器
wire rstn = rst_cnt[7];//用高位复位
wire pclkx1,pclkx5,adc_clk,locked; //MMCM/PLL时钟信号
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;
assign S_rst = ~locked;
//PLL时钟管理IP 输出 pclkx1和pclkx5以及locked信号
pll U_pll(
.refclk ( I_sysclk ),//系统时钟输入
.reset ( !rst_cnt[7] ),
.lock ( locked ),//PLL LOCKED
.clk0_out ( pclkx1 ),//像素时钟
.clk1_out ( pclkx5 ),//HDMI IO的serdes 时钟 5倍的像素时钟
.clk2_out ( adc_clk )//100M时钟,给ADC采集用
);
always @(posedge I_sysclk)begin
if (rst_cnt[7])
rst_cnt <= rst_cnt;
else
rst_cnt <= rst_cnt+1'b1;
end
//ad9248 ip相关信号
assign O_ad9248_clka = adc_clk;
assign O_ad9248_clkb = adc_clk;
//hdmi 输出IP
hdmi_tx#(
//HDMI视频参数设置
.H_ActiveSize (1280), //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素
.H_SyncStart (1280+88), //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号
.H_SyncEnd (1280+88+44),//视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分
.H_FrameSize (1280+88+44+239), //视频时间参数,行视频信号,一行视频信号总计占用的时钟数
.V_ActiveSize (720),//视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
.V_SyncStart (720+4),//视频时间参数,场同步开始,即多少行数后开始产生场同步信号
.V_SyncEnd (720+4+5), //视频时间参数,场同步结束,多少行后停止产生长同步信号
.V_FrameSize (720+4+5+28), //视频时间参数,场视频信号,一帧视频信号总计占用的行数量
.VIDEO_VIC ( 16 ),
.VIDEO_TPG ( "Disable"),//设置disable,用户数据驱动HDMI接口,否则设置eable产生内部测试图形
.VIDEO_FORMAT ( "RGB444" )//设置输入数据格式为RGB格式
)u_hdmi_tx
(
.I_pixel_clk ( pclkx1 ),//像素时钟
.I_serial_clk ( pclkx5 ),//串行发送时钟
.I_rst ( S_rst ),//异步复位信号,高电平有效
//.I_video_in_user ( vtc_user ),//视频输入帧起始信号
//.I_video_in_valid ( vtc_de_valid ),//视频输入有效信号
//.I_video_in_last ( vtc_last ),//视频输入行结束信号
//.I_video_in_data ( video_hdmi_data ),//视频输入数据
.I_video_rgb_enable (1'b1 ),//是否使能RGB输入接口,设置1使能,否则采用stream video时序接口
.I_video_in_vs (vtc_vs ),//RGB 输入VS 帧同步
.I_video_in_de (vtc_de ),//RGB 输入de有效
.I_video_in_data (rgb_o), //视频输入数据
.O_hdmi_clk_p ( O_hdmi_clk_p ),//HDMI时钟通道
.O_hdmi_tx_p ( O_hdmi_tx_p )//HDMI数据通道
);
//此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)//绘制波形显示区域的有效区域
);
//例化波形显示器 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损坏)