名称:XADC 数据采集 DA 输出 FPGA 设计 Verilog Vivado
软件:Vivado
语言:Verilog
功能介绍
本设计实现基于 XADC 的模拟量采集与 DA 数据输出控制,顶层模块为 AD_top。系统以 50MHz 时钟作为工作时钟,低电平复位输入 reset_n 经过反相后作为 XADC IP 的高电平复位信号,外部模拟输入通过 vauxp1、vauxn1 接入 XADC 辅助通道。 XADC 转换完成后,设计利用 eoc_out 触发下一次动态重读,并在 drdy_out 有效且通道号为 5'b1_0001 时锁存转换数据。输出数据取 XADC 转换结果 do_out[15:2],形成 14 位 AD_data,用于驱动后级 DA 数据端口。 DA 接口部分将 drdy_out 直接作为 da1_clk 与 da1_wrt 输出,使采样数据更新节拍与数据就绪信号保持同步,da1_data 输出当前锁存的 14 位采样值。整体结构适合学习 XADC IP 调用、模拟通道采样、采样数据位宽截取以及 FPGA 与外部 DA 接口的数据连接方式。
运行环境
开发语言:Verilog 开发软件:Vivado 顶层模块:AD_top 主要 IP:xadc_wiz_0 仿真文件:test.v 约束文件:xdac_pins.xdc
设计思路
设计核心是通过 Vivado 的 XADC Wizard IP 完成片上 ADC 采样,再由顶层逻辑对采样通道和数据有效信号进行判断。XADC IP 的 dclk_in 连接系统时钟 clk,reset_in 由外部低电平复位信号取反得到,vauxp1/vauxn1 作为实际采样输入端,vp_in/vn_in 在顶层中固定为 0。 在 XADC 读通道控制上,daddr_in 由 {2'b00, channel_out} 组成,den_in 连接 eoc_out,表示每次转换结束后发起下一次读操作;dwe_in 固定为 0,仅进行读取,不写入配置寄存器。channel_out 用于指示当前转换通道,drdy_out 用于指示 do_out 数据有效。 数据处理逻辑保持简洁:当 drdy_out 为 1 且 channel_out 等于 5'b1_0001 时,说明目标辅助通道数据有效,此时将 do_out 高 14 位写入 AD_data。非目标通道或数据未就绪时,AD_data 保持原值,避免输出端出现无效更新。 输出侧没有增加复杂缓存或协议转换,而是将数据就绪信号直接映射到 DA 时钟和写信号,14 位采样值同步输出到 da1_data。这种结构便于观察 XADC 采样到 DA 输出之间的完整数据路径,也方便在实际工程中继续扩展滤波、缩放、缓存或显示模块。
模块结构
AD_top:顶层模块,完成时钟复位、XADC IP 例化、通道判断、采样数据锁存以及 DA 接口输出。 xadc_wiz_0:Vivado XADC Wizard 生成的采样 IP,负责模拟辅助通道采样、通道号输出、转换完成指示和数据有效输出。 test:仿真测试模块,用于工程行为仿真参考。 glbl:Vivado 仿真全局模块。
开发板验证
工程包含实际管脚约束文件 xdac_pins.xdc,可用于开发板工程实现和引脚分配参考。实现结果中包含 AD_top.bit、布局布线、时序、功耗、IO、DRC 等 Vivado 实现报告,说明该设计已经按约束完成综合、实现与比特流生成流程。
演示视频
包含演示视频,可用于查看工程运行和实验现象参考。
演示视频请关注公众号后获取对应资料查看。
仿真图/仿真说明/设计文档图片
包含工程文件、程序文件、程序编译、RTL 图、管脚分配等设计文档图片内容,并包含 Vivado 仿真相关文件与 test.v 测试文件,可作为理解工程结构、编译流程、RTL 连接关系和引脚分配的参考。
部分代码
以下展示顶层模块AD_top的部分代码,完整代码可关注下方公众号卡片获取。
module AD_top( input clk,//50M input reset_n,//低电平复位--key1 input vauxp1, input vauxn1, output da1_clk,//DA时钟 output da1_wrt,//DA数据写信号 output [13:0] da1_data//输出的数据 ); wire vp_in;//AD接口P端 wire vn_in;//AD接口N端 wire eoc_out; wire [4 : 0] channel_out; wire drdy_out; wire [15 : 0] do_out; reg [13:0] AD_data;//输出的采样值962kps wire reset_in;//高电平复位 assign reset_in = ~reset_n; assign vp_in =0; assign vn_in =0; xadc_wiz_0 i_xadc_wiz_0 ( .di_in(16'b0), // input wire [15 : 0] di_in-- .daddr_in({2'b00,channel_out}), // input wire [6 : 0] daddr_in-- .den_in(eoc_out), // input wire den_in-- .dwe_in(1'b0), // input wire dwe_in-- .drdy_out(drdy_out), // output wire drdy_out-- .do_out(do_out), // output wire [15 : 0] do_out-- .dclk_in(clk), // input wire dclk_in-- .reset_in(reset_in), // input wire reset_in-- .vp_in(vp_in), // input wire vp_in-- .vn_in(vn_in), // input wire vn_in-- .vauxp1(vauxp1), // input wire vauxp1-- .vauxn1(vauxn1), // input wire vauxn1-- .channel_out(channel_out), // output wire [4 : 0] channel_out-- .eoc_out(eoc_out), // output wire eoc_out-- .alarm_out(), // output wire alarm_out-- .eos_out(), // output wire eos_out-- .busy_out() // output wire busy_out-- ); //输出的采样值962kps always@(posedge clk) begin if(drdy_out==1'b1 && channel_out==5'b1_0001) //1ADC地址为h11 AD_data<=do_out[15:2];//取高14位输出 else AD_data<=AD_data; end assign da1_clk=drdy_out;//DA时钟 assign da1_wrt=drdy_out;//DA数据写信号 assign da1_data=AD_data;//输出的数据 endmodule代码获取:点击下方公众号卡片