名称: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 // ... 以下代码略,完整源码请下载压缩包查看
43