AD9268数据采集与UART发送 Verilog Quartus

名称:AD9268数据采集与UART发送 Verilog Quartus

软件:Quartus

语言:Verilog

开发板/平台:Cyclone IV FPGA开发板

功能介绍

这是一个基于 Verilog 和 Quartus 的 AD9268 数据采集与 UART 输出工程,面向 Cyclone IV FPGA 开发板使用。顶层模块接收 AD9268 A、B 两路 16 位数据和对应数据时钟,输出 ADC 采样时钟、SPI 配置信号、掉电及输出使能控制信号,并通过 UART_TX 将采集结果发送给上位机或串口工具。 系统采用 50MHz FPGA 时钟作为控制基准,通过 PLL 产生 125MHz ADC 采样时钟,再生成 1.25MHz SPI 配置时钟。AD9268 完成上电配置后,A 通道数据进入采集核心,数据宽度由 16 位截取为 8 位,经异步 FIFO 完成时钟域转换,最后按照 9600 波特率串行发送。工程同时配套 ADC 配置、UART 发送、数据控制、异步 FIFO、时钟生成和 PLL 等模块,适合学习高速 ADC 接口、跨时钟域缓存及 FPGA 串口输出的完整实现流程。

运行环境

开发环境为 Intel Quartus,设计语言为 Verilog,目标平台为 Cyclone IV FPGA 开发板。工程使用 50MHz 系统时钟,PLL 输出 125MHz ADC 采样时钟,SPI 配置时钟为 1.25MHz,UART 发送波特率设置为 9600。工程文件包含 Quartus 项目、时序约束、管脚分配、PLL 相关文件、Verilog 源码及 Testbench,可直接在相应 Quartus 工程环境中进行编译、仿真和下载验证。

设计思路

本设计围绕 AD9268 A 通道数据采集和串口传输展开。系统上电后,PLL 将 50MHz 系统时钟转换为 125MHz ADC 采样时钟,同时由分频模块生成 1.25MHz SPI 配置时钟。ADC_Config 模块通过 SPI 完成器件初始化,并以 ADC_CFG_DONE 标志配置结束;只有 PLL 锁定、外部复位释放且 ADC 配置完成后,后级采集链路才开始工作。 采样数据在 ADC_DCOA 时钟域接收,主功能核将 16 位 ADC 数据截取为 8 位有效数据,写入异步 FIFO,再在 50MHz 系统时钟域读取并交给 UART 发送模块。异步 FIFO 用于隔离 ADC 数据时钟域和串口控制时钟域,降低跨时钟域传输风险。参数中设置了 1024 点帧长度和 9600 波特率,便于将连续采样数据按固定节奏输出到外部串口设备。B 通道接口、过量程输入以及调试锁存口在顶层保留,方便后续扩展和观察。

模块结构

顶层模块 AD9268_TOP 负责系统时钟、复位、ADC 接口和各功能模块之间的连接。PLL 模块将 50MHz 输入时钟转换为 125MHz;Generate_1_25MHz 模块从 125MHz 生成 ADC SPI 配置所需的 1.25MHz 时钟;ADC_Config 模块通过 ADC_CSB、ADC_SCLK 和 ADC_SDIO 完成 AD9268 上电寄存器配置,并输出 ADC_CFG_DONE。 ad9268_uart_core 是采集发送主核,使用 ADC_DCOA 作为写入时钟、50MHz 作为读取时钟,将 ADC_INA 数据送入 async_fifo。data_ctrl 负责数据组织和帧控制,uart_tx 负责以设定波特率输出串行数据。SPI_Config、ADC_Config 和时钟生成模块共同完成 ADC 初始化与采样时序配合,测试平台覆盖主核、异步 FIFO、数据控制及 UART 发送等仿真对象。

开发板验证

工程提供了 Cyclone IV FPGA 开发板的管脚分配文件,可据此完成 AD9268 接口、采样时钟、SPI 配置信号和 UART_TX 输出的连接验证。顶层设计将 50MHz 系统时钟经 PLL 生成 125MHz ADC 采样时钟,并在 ADC 配置完成后启动采样与串口数据传输。

演示视频

配套演示视频展示了 AD9268 采集与 UART 输出工程的运行过程,可结合工程中的顶层连接和串口发送逻辑观察 ADC 配置完成后的数据传输流程。

仿真图/仿真说明/设计文档图片

配套设计文档包含工程文件说明、程序编译、RTL 结构图、管脚分配以及 Testbench 相关内容,并提供 ad9268_uart_core 整体仿真、异步 FIFO 仿真、数据控制仿真和 UART 发送仿真图示,用于查看配置完成、数据缓存、跨时钟域传输和串口发送过程。

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image1.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image10.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image11.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image12.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image13.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image14.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image15.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image2.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image3.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image4.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image5.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image6.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image7.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image8.png

AD9268数据采集与UART发送 Verilog Quartus 设计文档图片 image9.png

部分代码

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

module AD9268_TOP(
	input			CLK_50M,    // 板上的 50MHz 系统时钟
	input			RST_N,      // 外部复位,低有效

	input	[15:0]	ADC_INA,    // AD9268 A 通道 16bit 数据
	input	[15:0]	ADC_INB,    // AD9268 B 通道 16bit 数据
	output			ADC_CLK,    // 提供给 ADC 的采样时钟

	input			ADC_DCOA,   // A 通道数据时钟
	input			ADC_DCOB,   // B 通道数据时钟

	input			ADC_ORA,    // A 通道过量程标志,目前未使用
	input			ADC_ORB,    // B 通道过量程标志,目前未使用

	output			ADC_PDWN,   // ADC 掉电控制,这里固定为正常工作
	output			ADC_OEB,    // ADC 输出使能,这里固定为输出有效

	output			ADC_CSB,    // ADC SPI 片选
	output			ADC_SCLK,   // ADC SPI 时钟
	output			ADC_SDIO,   // ADC SPI 数据

	output			UART_TX     // 串口发送输出

//	output	reg [15:0]	CHA_DATA, // 锁存后的 A 通道数据,便于调试观察
//	output	reg [15:0]	CHB_DATA  // 锁存后的 B 通道数据,便于调试观察
);

// 125MHz:给 ADC 当采样时钟
wire CLK_125M;

// 1.25MHz:给 SPI 配置模块使用,速度更慢、更稳
wire CLK_1_25M;

// PLL 锁定信号
wire LOCKED;

// ADC 配置完成信号
wire ADC_CFG_DONE;

// FPGA 内部总复位
// 只有当外部复位释放,并且 PLL 已经锁定时,内部逻辑才真正开始工作
wire FPGA_RST = LOCKED & RST_N;

// ADC 相关控制脚固定值
assign ADC_CLK  = CLK_125M;
assign ADC_PDWN = 1'b0;
assign ADC_OEB  = 1'b0;

// ------------------------------------------------
// PLL:把 50MHz 倍频成 125MHz
// ------------------------------------------------
PLL u_PLL(
	.inclk0		( CLK_50M	),
	.c0			( CLK_125M	),
	.locked		( LOCKED	)
);

// ------------------------------------------------
// 把 125MHz 再分成 1.25MHz
// 用于 SPI 配置 ADC,没必要跑得很快
// ------------------------------------------------
Generate_1_25MHz u_generate_1_25mhz(
	.clk_125m_i	( CLK_125M	),
	.rst_n_i	( FPGA_RST	),
	.clk_1_25m	( CLK_1_25M	)
);

// ------------------------------------------------
// ADC 上电配置模块
// 配置完成后,done_o 拉高
// ------------------------------------------------
ADC_Config u_ADC_Config(
	.clk_i		( CLK_1_25M	),
	.rst_n_i	( FPGA_RST	),
	.csb_o		( ADC_CSB	),
	.sclk_o		( ADC_SCLK	),
	.sdio_o		( ADC_SDIO	),
	.done_o		( ADC_CFG_DONE )
);

// ------------------------------------------------
// 主功能核:
// A通道采样 -> 截高8位 -> 异步FIFO -> UART发送
//
// 这里把复位条件再加上 ADC_CFG_DONE,
// 目的就是“等 ADC 确认配置完成后,再开始正式采样和上传”。
// ------------------------------------------------
ad9268_uart_core #(
	.ADC_WIDTH		( 16		),
	.FIFO_DATA_WIDTH( 8			),
	.FIFO_ADDR_WIDTH( 10		),
	.FRAME_SAMPLES	( 1024		),
	.CLK_FREQ_HZ	( 50000000	),
	.BAUD_RATE		( 9600		)
) u_ad9268_uart_core (
	.wr_clk		( ADC_DCOA	),
	.rd_clk		( CLK_50M	),
	.rst_n		( FPGA_RST & ADC_CFG_DONE ),
	.adc_data	( ADC_INA	),
	.uart_tx	( UART_TX	)
);

// ------------------------------------------------
// 用 A 通道数据时钟把 A 通道数据锁存下来
// 这部分主要是为了保留原例程中的调试观测口
// ------------------------------------------------
//always @(posedge ADC_DCOA or negedge FPGA_RST) begin
//	if(!FPGA_RST) begin
//		CHA_DATA <= 16'd0;
//	end
//	else begin
//		CHA_DATA <= ADC_INA;
//	end
//end

// ------------------------------------------------
// 用 B 通道数据时钟把 B 通道数据锁存下来
// 虽然本次 UART 不使用 B 通道,但保留这个逻辑不影响功能
// ------------------------------------------------
//always @(posedge ADC_DCOB or negedge FPGA_RST) begin
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » AD9268数据采集与UART发送 Verilog Quartus

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员