• 方案介绍
  • 相关推荐
申请入驻 产业图谱

AD7606 HDMI 波形显示 FPGA 设计 Verilog Vivado

07/10 13:38
43
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

名称:AD7606 HDMI 波形显示 FPGA 设计 Verilog Vivado

软件:Vivado

语言:Verilog

功能介绍

本设计实现 AD7606 模数转换器数据采集与 HDMI 视频显示输出,将 ADC 采集到的多通道数据在 FPGA 内部完成接口控制、数据缓存、波形绘制和视频时序输出,适合用于数据采集显示、示波显示原型、AD7606 接口学习以及 FPGA 视频显示综合实验。

顶层模块以 50MHz 系统时钟作为输入,连接 AD7606 的 data、busy、first_data、cs、rd、reset、convstab、os 等控制与数据接口,同时输出 HDMI TMDS 差分时钟和数据通道。工程中通过视频像素时钟、5 倍像素时钟以及 ADC 数据处理时钟配合工作,使采样数据可以进入显示链路并转换为 HDMI 输出。

显示部分包含颜色条、网格背景和波形显示相关逻辑,可将采集数据以图形方式叠加到视频画面中。对于需要学习“ADC采集 + FPGA缓存 + HDMI显示”完整链路的用户,本设计比单独的接口例程更适合作为综合参考。

运行环境

开发语言:Verilog

开发软件:Vivado

顶层模块:top

主要工程文件:ad7606_hdmi_test.xpr

主要源码模块:top.v、ad7606_if.v、ad7606_sample.v、wav_display.v、color_bar.v、grid_display.v、timing_gen_xy.v

主要 IP:video_pll、adc_pll、dpram1024x8、rgb2dvi 相关模块

设计思路

系统整体采用“ADC接口采集、数据缓存处理、视频图形生成、HDMI编码输出”的设计思路。AD7606 接口逻辑负责控制转换启动、片选、读使能、复位和过采样配置,并接收 16 位并行 ADC 数据;采样后的通道数据在 FPGA 内部转换为后续波形显示需要的数据格式。

视频侧通过 video_pll 产生像素时钟和 5 倍像素时钟,用于常规 RGB 视频时序和 TMDS/DVI 编码输出;ADC 侧通过 adc_pll 产生独立的数据处理时钟,使采样处理与视频显示能够按各自时钟域运行。顶层模块中保留了多路 AD 通道信号,包括 ad_ch1 到 ad_ch8,为多通道采样扩展和显示选择提供基础。

显示链路先生成基础视频时序与颜色数据,再通过网格显示和波形显示模块形成最终画面。grid_display 用于构建坐标网格类背景,wav_display 用于根据缓存数据绘制波形,最终由 rgb2dvi 将 RGB、同步和数据有效信号转换为 HDMI TMDS 差分输出。这样的结构层次清晰,便于分别调试 ADC 接口、视频时序和波形绘制逻辑。

模块结构

top:系统顶层,连接 AD7606 接口、PLL、视频显示链路和 HDMI 输出。

ad7606_if:AD7606 底层接口控制模块,处理转换、读取、片选、复位等控制时序。

ad7606_sample:AD7606 采样数据处理模块,输出各通道采样数据及有效标志。

color_bar:视频基础图像/测试图生成模块,输出 RGB、HS、VS、DE 信号。

grid_display:网格显示模块,用于生成显示背景或坐标参考。

wav_display:波形显示模块,根据 ADC 缓存数据生成波形 RGB 输出。

timing_gen_xy:视频坐标与时序辅助模块,用于产生显示位置相关信号。

video_pll:视频像素时钟与 5 倍像素时钟生成 IP。

adc_pll:ADC 数据处理时钟生成 IP。

dpram1024x8:双口 RAM IP,用于波形数据缓存。

开发板验证

工程配置了 AD7606 与 HDMI 相关管脚约束文件 ad7606_hdmi_test.xdc,并包含 Vivado 实现流程生成的 top.bit、时序报告、功耗报告、DRC 报告和布线后检查结果。约束中对外部 ADC 接口、系统时钟、复位和 HDMI TMDS 输出等信号进行了管脚分配,便于在对应 FPGA 硬件平台上进行下载验证与接口调试。

部分代码

以下展示顶层模块 top 的部分代码,完整源码请下载压缩包查看。

module top
(
input                            sys_clk,                 //system clock 50Mhz on board
input                            rst_n,                   //reset ,low active
input[15:0]                      ad7606_data,             //ad7606 data
input                            ad7606_busy,             //ad7606 busy
input                            ad7606_first_data,       //ad7606 first data
output[2:0]                      ad7606_os,               //ad7606
output                           ad7606_cs,               //ad7606 AD cs
output                           ad7606_rd,               //ad7606 AD data read
output                           ad7606_reset,            //ad7606 AD reset
output                           ad7606_convstab,         //ad7606 AD convert start
//hdmi output        
output                           tmds_clk_p,              //HDMI differential clock positive
output                           tmds_clk_n,              //HDMI differential clock negative
output [2:0]                     tmds_data_n,             //HDMI differential data negative
output [2:0]                     tmds_data_p,             //HDMI differential data positive
output [0:0]                     HDMI_OEN                 //HDMI out enable
);
wire                            video_clk;               //pixel clock
wire                            video_clk5x;             //5x PixelClk
wire                            video_hs;                //horizontal synchronization
wire                            video_vs;                //vertical synchronization
wire                            video_de;                //video valid
wire[7:0]                       video_r;                 //video red data
wire[7:0]                       video_g;                 //video green data
wire[7:0]                       video_b;                 //video blue data

wire                            hdmi_hs;                 //hdmi horizontal synchronization
wire                            hdmi_vs;                 //hdmi vertical synchronization
wire                            hdmi_de;                 //hdmi data valid
wire[7:0]                       hdmi_r;                  //hdmi red data
wire[7:0]                       hdmi_g;                  //hdmi green data
wire[7:0]                       hdmi_b;                  //hdmi blue data


wire                            grid_hs;                 //grid horizontal synchronization
wire                            grid_vs;                 //grid vertical synchronization
wire                            grid_de;                 //grid data valid
wire[7:0]                       grid_r;                  //grid red data
wire[7:0]                       grid_g;                  //grid green data
wire[7:0]                       grid_b;                  //grid blue data

wire                            wave0_hs;                //wave 0 horizontal synchronization            
wire                            wave0_vs;                //wave 0 vertical synchronization
wire                            wave0_de;                //wave 0 data valid
wire[7:0]                       wave0_r;                 //wave 0 red data
wire[7:0]                       wave0_g;                 //wave 0 green data
wire[7:0]                       wave0_b;                 //wave 0 blue data

wire                            wave1_hs;                //wave 1 horizontal synchronization
wire                            wave1_vs;                //wave 1 vertical synchronization
wire                            wave1_de;                //wave 1 data valid
wire[7:0]                       wave1_r;                 //wave 1 red data
wire[7:0]                       wave1_g;                 //wave 1 green data
wire[7:0]                       wave1_b;                 //wave 1 blue data

wire                            adc_clk;                 //ADC data processing clock
wire                            adc0_buf_wr;             //ADC channel 0 write buf enable
wire[10:0]                      adc0_buf_addr;           //ADC channel 0 write buf address
wire[7:0]                       adc0_buf_data;           //ADC channel 0 buf data
wire                            adc1_buf_wr;             //ADC channel 1 write buf enable       
wire[10:0]                      adc1_buf_addr;           //ADC channel 1 write buf address
wire[7:0]                       adc1_buf_data;           //ADC channel 1 data 
wire                            ad_data_valid;           //ADC data valid
wire signed[15:0]               ad_ch1;                  //AD channel 1 data
wire signed[15:0]               ad_ch2;                  //AD channel 2 data
wire signed[15:0]               ad_ch3;                  //AD channel 3 data 
wire signed[15:0]               ad_ch4;                  //AD channel 4 data 
wire signed[15:0]               ad_ch5;                  //AD channel 5 data 
wire signed[15:0]               ad_ch6;                  //AD channel 6 data 
wire signed[15:0]               ad_ch7;                  //AD channel 7 data 
wire signed[15:0]               ad_ch8;                  //AD channel 8 data 
assign hdmi_hs = wave1_hs;
assign hdmi_vs = wave1_vs;
assign hdmi_de = wave1_de;
assign hdmi_r  = wave1_r;
assign hdmi_g  = wave1_g;
assign hdmi_b  = wave1_b;

assign HDMI_OEN = 1\'b1;
/*************************************************************************
Generate the pixel clock and 5x pixel clock required for the video
****************************************************************************/
video_pll video_pll_m0
(
.clk_in1                        (sys_clk                  ),
.clk_out1                       (video_clk                ),
.clk_out2                       (video_clk5x              ),
.reset                          (1\'b0                     ),
.locked                         (                         )
);
/*************************************************************************
Generate the  clock required for the AD data processing
****************************************************************************/
adc_pll adc_pll_m0
(
.clk_in1                        (sys_clk                  ),
.clk_out1                       (adc_clk                  ),
.reset                          (1\'b0                     ),
.locked                         (                         )
);
/*************************************************************************
Call color bar generation module
****************************************************************************/
color_bar color_bar_m0
(
.clk                            (video_clk                ),
.rst                            (~rst_n                   ),
.hs                             (video_hs                 ),
.vs                             (video_vs                 ),
.de                             (video_de                 ),
.rgb_r                          (video_r                  ),
.rgb_g                          (video_g                  ),
.rgb_b                          (video_b                  )
);
/*************************************************************************
RGB to DVI conversion module
****************************************************************************/
rgb2dvi
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

相关推荐