名称:AD9248 双通道采集驱动 Verilog Vivado
软件:Vivado
语言:Verilog
功能介绍
本设计实现 AD9248 双通道 ADC 的 FPGA 采集驱动,面向需要快速验证 AD9248 数据接口、采样时钟输出和在线数据观察的应用场景。工程使用 Verilog 编写,在 Vivado 环境下完成综合、实现和 bit 文件生成,可作为 ADC 前端采集板调试、双通道并行采样验证以及后续数据处理模块接入的基础工程。
核心功能包括为 AD9248 的 A/B 两个通道提供同源采样时钟,接收两路 14 位并行采样数据,并同步采集 ORA/ORB 溢出状态信号。设计中通过 `card_power_en` 输出使能前端采集卡电源,便于上电后直接进行 ADC 接口联调。
采集数据在 65MHz 时钟域下寄存一次后送入 ILA 在线逻辑分析仪,用户可以在 Vivado Hardware Manager 中直接观察 A 通道数据、B 通道数据以及对应的溢出标志状态。该结构适合用于硬件通路确认、ADC 输出数据稳定性观察和后续算法模块接入前的原始数据验证。
运行环境
开发语言:Verilog
开发软件:Vivado
顶层模块:ad9248_driver
主要 IP:clk_wiz_0 时钟 IP、ila_0 在线逻辑分析仪 IP
工程形态:Vivado FPGA 工程,已生成实现结果和 bit 文件。
设计思路
设计以 FPGA 系统时钟 `sysclk_i` 作为输入时钟,先通过 Vivado Clocking Wizard IP 生成 65MHz 时钟 `clk65m`。该时钟一方面输出到 `ad9248_clka` 和 `ad9248_clkb`,为 AD9248 的 A/B 两路通道提供采样驱动时钟;另一方面作为 FPGA 内部采样寄存和 ILA 观测的工作时钟,使外部 ADC 时序和内部数据捕获保持在同一时钟域内。
AD9248 的 A 通道数据 `ad9248_da[13:0]` 与 B 通道数据 `ad9248_db[13:0]` 在 `clk65m` 上升沿分别寄存到 `ad9248_da_r` 和 `ad9248_db_r`。这种一级寄存方式可以把 ADC 并行输出稳定地锁存到 FPGA 内部,为后续滤波、缓存、总线传输或显示处理提供清晰的数据入口。
调试部分采用 ILA 在线逻辑分析仪,将两路 14 位采样数据和两个溢出指示信号同时接入探针。调试时不需要额外编写串口或显示输出逻辑,即可在 Vivado 中查看实时采集波形和数值变化,适合 ADC 接口初次点亮、时钟频率确认、数据线连接检查以及输入信号变化观察。
模块结构
`ad9248_driver` 为顶层模块,接口包括 100MHz 系统时钟输入、AD9248 A/B 通道采样时钟输出、A/B 两路 14 位数据输入、ORA/ORB 溢出标志输入以及前端采集卡电源使能输出。
`clk_wiz_0` 用于由系统时钟产生 65MHz ADC 工作时钟,输出时钟同时连接到 AD9248 的 CLKA/CLKB 和内部采样逻辑。
`ila_0` 用于在线观察寄存后的 A/B 通道采样数据及 ORA/ORB 状态,便于在板级调试阶段直接查看 ADC 采集结果。
开发板验证
本设计带有管脚约束文件并配套开发板实物相关图片,Vivado 工程已完成实现流程并生成 bit 文件,可用于开发板上进行 AD9248 双通道采集链路验证。板级验证重点包括 65MHz 采样时钟输出、前端电源使能、A/B 两路并行数据采集以及 ILA 在线观察采样数据和溢出标志。
仿真图/仿真说明/设计文档图片
工程包含 Vivado 生成的 clk_wiz_0 与 ila_0 相关仿真脚本目录,可用于按 Vivado IP 流程进行参考验证。当前内容以板级在线调试和 ILA 观测为主。
部分代码
以下展示顶层模块 ad9248_driver 的部分代码,完整源码请下载压缩包查看。
module ad9248_driver( input wire sysclk_i,//100MHz output wire ad9248_clka, input wire ad9248_ora, input wire [13:0] ad9248_da, output wire ad9248_clkb, input wire ad9248_orb, input wire [13:0] ad9248_db, output wire card_power_en ); assign card_power_en = 1\'b1;//使能FEP电源 //使用PLL产生65M的时钟提供给AD9248使用 wire clk65m; clk_wiz_0 clk_wiz_ad( .clk_out1(clk65m), .clk_in1(sysclk_i) ); assign ad9248_clka = clk65m; assign ad9248_clkb = clk65m; reg [13:0] ad9248_da_r,ad9248_db_r; //对采集的数据寄存一次 always@(posedge clk65m)begin ad9248_da_r <= ad9248_da; ad9248_db_r <= ad9248_db; end //用ILA在线逻辑分析仪查看数据 ila_0 ila_db ( .clk(clk65m), .probe0(ad9248_da_r), .probe1(ad9248_ora), .probe2(ad9248_db_r), .probe3(ad9248_orb) ); endmodule
225