基于FPGA多通道以太网实时同步采集系统 FPGA: Vivado工程 AD芯片:AD7606 传输协议:UDP 上位机开发软件:QT5.12 AD7606八通道同步采集,最高采样率200KHz,上位机发送指令开始采集,上位机通过千兆以太网udp进行数据传输 QT上位机软件:udp上位机接收数据实时绘制所采集的数据波形并且可以存储数据(.txt格式) 整个工程系统已验证
一、模块概述
在 AD7606 UDP FPGA 项目(基于 Vivado 2018.3 开发,目标器件为 xc7a35tfgg484-2)中,adcdatafifo模块是衔接 AD7606 ADC 数据采集与后续 UDP 数据传输的核心缓冲单元。其核心作用是解决 ADC 采集时钟与 UDP 传输时钟可能存在的异步问题,避免数据丢失或传输拥塞,同时实现 16 位采集数据到 32 位传输数据的格式转换,为后续以太网数据封装与发送提供适配的数据格式,是整个数据采集传输链路中保障数据完整性与时序稳定性的关键环节。
基于FPGA多通道以太网实时同步采集系统 FPGA: Vivado工程 AD芯片:AD7606 传输协议:UDP 上位机开发软件:QT5.12 AD7606八通道同步采集,最高采样率200KHz,上位机发送指令开始采集,上位机通过千兆以太网udp进行数据传输 QT上位机软件:udp上位机接收数据实时绘制所采集的数据波形并且可以存储数据(.txt格式) 整个工程系统已验证
该模块基于 Xilinx FIFO Generator IP 核(版本 v13.2.3)构建,生成的功能仿真网表文件为adcdatafifosimnetlist.v,仅用于功能验证,不可直接用于综合或比特流生成,也不支持 SDF 注释仿真。
二、核心功能与技术特性
(一)异步时钟域数据缓冲
模块采用异步 FIFO 架构,支持独立的写时钟(wrclk)和读时钟(rdclk),两者均配置为 100MHz(通过接口参数FREQ_HZ 100000000定义),可有效隔离 ADC 采集时序域与 UDP 传输时序域,解决跨时钟域数据传输中的亚稳态问题。
- 写时钟域:与 AD7606 ADC 采集时钟同步,负责将 16 位 ADC 原始数据写入 FIFO。
- 读时钟域:与 UDP 传输模块(如以太网 MAC 控制器)时钟同步,负责从 FIFO 中读取 32 位数据并传递给后续传输链路。
(二)数据位宽转换
模块实现了16 位输入到 32 位输出的数据位宽转换,适配不同模块的数据接口需求:
- 输入数据(
din):16 位宽,对应 AD7606 ADC 单次采集的原始数据(如单通道模拟量转换后的数字值)。 - 输出数据(
dout):32 位宽,将两个 16 位 ADC 数据拼接为一个 32 位数据(具体拼接顺序需结合顶层逻辑,通常为高 16 位和低 16 位组合),适配 UDP 数据包的 32 位数据总线宽度,减少数据传输次数,提升传输效率。
(三)FIFO 状态监控与控制
模块提供完整的 FIFO 状态信号,支持上层逻辑对 FIFO 读写过程进行精准控制,避免数据溢出或空读错误:
| 信号名称 | 方向 | 位宽 | 功能描述 |
|---|---|---|---|
full | 输出 | 1 位 | FIFO 写满状态指示,高电平表示 FIFO 已无法写入新数据,此时需暂停 ADC 数据写入,防止数据溢出 |
empty | 输出 | 1 位 | FIFO 读空状态指示,高电平表示 FIFO 内无数据可读取,此时需暂停 UDP 数据读取,防止空读 |
wrdatacount | 输出 | 14 位 | 写时钟域下 FIFO 内已存储的数据量,用于上层逻辑判断 FIFO 剩余空间,避免接近满状态时仍持续写入 |
rddatacount | 输出 | 13 位 | 读时钟域下 FIFO 内可读取的数据量,用于上层逻辑判断 FIFO 数据充足性,确保 UDP 传输模块有足够数据可发送 |
(四)跨时钟域数据同步
为确保异步时钟域下状态信号(如数据计数)的准确性,模块集成了XPMCDCGRAY 跨时钟域同步模块,采用格雷码编码实现数据同步:
- 格雷码特性:相邻数值仅一位二进制位变化,可有效避免二进制计数在跨时钟域传输时因多位同时变化导致的亚稳态问题。
- 同步流程:写时钟域的
wrdatacount和读时钟域的rddatacount先转换为格雷码,经两级寄存器同步到目标时钟域后,再转换回二进制码,确保状态信号在异步时钟域下的稳定性与准确性。
三、硬件资源与参数配置
(一)FIFO 存储配置
模块基于 Xilinx 7 系列 FPGA 的 Block RAM 资源构建,核心参数配置如下:
| 参数名称 | 配置值 | 功能说明 |
|---|---|---|
写深度(CWRDEPTH) | 16384 | 写时钟域下 FIFO 可存储的最大数据量(16 位数据),总存储容量为 16384×16bit = 32KB |
读深度(CRDDEPTH) | 8192 | 读时钟域下 FIFO 可读取的最大数据量(32 位数据),与写深度匹配(8192×32bit = 32KB) |
存储类型(CMEMORYTYPE) | 1 | 采用 Block RAM 存储(0 为分布式 RAM,1 为 Block RAM),适合大容量、高速度的缓冲场景 |
写响应 latency(CWRRESPONSE_LATENCY) | 1 | 写操作完成后,状态信号(如wrdatacount)更新的延迟周期,确保状态反馈的实时性 |
(二)时钟与复位配置
- 时钟相位(
PHASE):写时钟与读时钟相位均配置为 0.000,确保时钟信号无额外相位偏移,简化时序约束。 - 复位同步(
CENABLERST_SYNC):使能复位同步功能(配置为 1),通过同步寄存器将复位信号同步到目标时钟域,避免异步复位导致的逻辑不稳定。 - 复位类型:无独立读写复位(
CHASRDRST、CHASWRRST均为 0),采用全局复位信号,简化复位控制逻辑。
四、数据流程
(一)数据写入流程
- ADC 数据输入:AD7606 ADC 完成一次模拟量采集后,输出 16 位数字数据到
din接口。 - 写使能判断:上层逻辑检测
full信号,若为低电平(FIFO 未写满),则将wr_en信号置高,允许数据写入。 - 数据写入 FIFO:在
wrclk上升沿,16 位数据din被写入 FIFO 内部存储单元,同时wrdata_count自动加 1,反映当前 FIFO 内数据量变化。 - 写满保护:若
full信号为高电平(FIFO 已写满),上层逻辑需立即拉低wr_en,暂停数据写入,防止后续 ADC 数据丢失。
(二)数据读取流程
- UDP 传输请求:UDP 传输模块(如以太网发送逻辑)准备好接收数据时,向 FIFO 发送读请求。
- 读使能判断:上层逻辑检测
empty信号,若为低电平(FIFO 非空),则将rd_en信号置高,允许数据读取。 - 数据读取与格式转换:在
rdclk上升沿,FIFO 内的两个 16 位数据拼接为 32 位数据,通过dout接口输出到 UDP 传输模块,同时rddata_count自动减 1。 - 读空保护:若
empty信号为高电平(FIFO 已读空),上层逻辑需拉低rd_en,暂停数据读取,避免 UDP 模块读取无效数据。
五、关键子模块功能
(一)FIFO 核心实例(`decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_fifo_generator_v13_2_3`)
作为模块的核心,该子模块实现 FIFO 的数据存储、读写控制与状态生成:
- 集成 Block RAM 控制器,管理数据的写入、存储与读取。
- 生成
full、empty、wrdatacount、rddatacount等状态信号,反馈 FIFO 实时状态。 - 支持异步时钟域下的读写操作,通过内部时序逻辑隔离不同时钟域的干扰。
(二)跨时钟域同步模块(`xpm_cdc_gray`)
该模块解决异步时钟域下数据计数信号的同步问题,分为两个参数化实例:
- 14 位同步实例:用于
wrdatacount(14 位)从写时钟域同步到读时钟域。 - 13 位同步实例:用于
rddatacount(13 位)从读时钟域同步到写时钟域。
- 同步流程:输入二进制数据 → 格雷码编码 → 两级寄存器同步 → 格雷码解码 → 输出同步后的二进制数据。
- 关键特性:采用
ASYNC_REG属性标记同步寄存器,告知 Vivado 工具进行时序优化,降低亚稳态风险。
(三)Block RAM 控制模块(`blk_mem_gen_prim_wrapper` 系列)
基于 Xilinx 7 系列 FPGA 的RAMB36E1原语构建,实现 FIFO 的物理存储:
- 支持双端口操作(独立的读写端口),匹配异步 FIFO 的读写时钟需求。
- 配置读写宽度与深度,适配 16 位输入、32 位输出的位宽转换需求。
- 集成 ECC 错误校验功能(当前配置为禁用,
ENECCREAD、ENECCWRITE均为FALSE),可根据需求启用以提升数据存储可靠性。
六、模块接口与上层逻辑交互
(一)接口定义
| 接口名称 | 方向 | 位宽 | 交互模块 | 功能描述 |
|---|---|---|---|---|
wr_clk | 输入 | 1 位 | AD7606 采集模块 | 写时钟,与 ADC 采集时钟同步(100MHz) |
rd_clk | 输入 | 1 位 | UDP 传输模块 | 读时钟,与 UDP 传输时钟同步(100MHz) |
din | 输入 | 16 位 | AD7606 采集模块 | ADC 采集的 16 位原始数据 |
wr_en | 输入 | 1 位 | 上层控制逻辑 | FIFO 写使能,高电平允许数据写入 |
rd_en | 输入 | 1 位 | 上层控制逻辑 | FIFO 读使能,高电平允许数据读取 |
dout | 输出 | 32 位 | UDP 传输模块 | 32 位拼接数据,用于 UDP 数据包封装 |
full | 输出 | 1 位 | 上层控制逻辑 | FIFO 写满状态,用于暂停 ADC 数据写入 |
empty | 输出 | 1 位 | 上层控制逻辑 | FIFO 读空状态,用于暂停 UDP 数据读取 |
wrdatacount | 输出 | 14 位 | 上层控制逻辑 | 写时钟域数据计数,用于监控 FIFO 剩余空间 |
rddatacount | 输出 | 13 位 | 上层控制逻辑 | 读时钟域数据计数,用于监控 FIFO 可读取数据量 |
(二)与上层逻辑的交互逻辑
- AD7606 采集模块:
- 采集模块在每次完成 ADC 转换后,先检测full信号;
- 若full为低,置高wren并输出din数据,在wrclk上升沿完成写入;
- 若full为高,暂停采集或缓存数据(需结合 ADC 模块自身缓存能力),避免数据丢失。
- UDP 传输模块:
- 传输模块在准备发送数据包时,检测empty信号和rddatacount;
- 若empty为低且rddatacount满足 UDP 数据包长度需求(如至少 1 个 32 位数据),置高rden,在rdclk上升沿读取dout数据;
- 读取的数据经 UDP 协议封装后,通过以太网发送到上位机。
- 上层控制逻辑:
- 基于wrdatacount和rddatacount实现 FIFO 流量控制,例如当wrdatacount超过阈值时,提前降低 ADC 采集速率;
- 监控full和empty信号,当出现异常(如持续full或empty)时,触发告警或复位 FIFO,确保系统稳定运行。
七、仿真与验证要点
由于该模块为功能仿真网表,需通过 Vivado Simulator 进行功能验证,核心验证场景包括:
- 正常读写场景:配置 100MHz 读写时钟,持续写入 16 位数据,同时读取 32 位数据,验证数据完整性(拼接顺序正确)和状态信号(
full、empty、数据计数)的准确性。 - 写满保护场景:持续写入数据直至
full置高,验证此时wren无效,无数据溢出,且wrdata_count保持最大值(16383)。 - 读空保护场景:持续读取数据直至
empty置高,验证此时rden无效,无空读错误,且rddata_count保持最小值(0)。 - 异步时钟场景:调整读写时钟频率(如写时钟 100MHz、读时钟 125MHz),验证跨时钟域同步模块的有效性,确保数据计数信号无错误。
- 复位场景:触发全局复位,验证 FIFO 状态信号(
full低、empty高、数据计数 0)恢复正常,无残留数据。
八、总结与应用建议
adcdatafifo模块作为 AD7606 UDP FPGA 项目的数据缓冲核心,其核心价值在于解决异步时钟域数据传输问题与数据位宽适配,保障 ADC 采集数据的完整性与 UDP 传输的稳定性。在实际项目应用中,需注意以下几点:
- 时序约束:尽管模块为仿真网表,但实际项目中需对 FIFO 的读写时钟、数据信号进行时序约束,确保时钟抖动、建立/保持时间满足 FPGA 器件要求。
- 参数调整:若 ADC 采集速率或 UDP 传输速率变化,需重新配置 FIFO 读写深度(如提高采集速率时增大
CWRDEPTH),避免 FIFO 频繁满/空导致数据传输中断。 - 错误处理:上层逻辑需完善
full/empty异常处理机制,例如full持续高电平时,可暂停 ADC 采集并向上位机发送告警信息,便于问题定位。 - 性能优化:若需进一步提升传输效率,可结合 FIFO 的 “First Word Fall Through”(首字直通)模式,减少数据读取延迟,但需注意该模式对 FIFO 状态信号的影响。
通过合理配置与上层逻辑配合,该模块可稳定支撑 AD7606 ADC 数据的采集与 UDP 传输,为整个项目的可靠性提供关键保障。