名称:AD7606 八通道采集串口输出 FPGA 设计 Verilog Quartus
软件:Quartus
语言:Verilog
开发板/平台:Cyclone IV FPGA开发板
功能介绍
本设计实现 AD7606 八通道 ADC 采集与串口输出功能,顶层模块为 ad706_test,使用 50MHz 系统时钟和低有效复位信号,完成 AD7606 控制接口、采样数据接收、电压换算以及 UART 数据发送等逻辑。设计面向 FPGA 数据采集应用,可用于学习 AD7606 并行接口时序控制、多通道采样数据组织和串口上传流程。
AD7606 接口部分包含 ad_data、ad_busy、first_data 等输入信号,以及 ad_os、ad_cs、ad_rd、ad_reset、ad_convstab 等控制输出信号。FPGA 通过转换启动、片选、读使能和复位控制完成 ADC 数据读取,并输出 8 路 16bit 采样结果。
采样数据进入电压转换模块后,被转换为各通道对应的 BCD 电压数据,同时提供每一路的正负号标志。随后 UART 模块将 8 路电压结果按串口方式发送,便于上位机或串口调试工具查看采集结果。整体结构清晰,适合在现有工程基础上扩展显示、存储、通信协议或进一步的数据处理功能。
运行环境
开发语言:Verilog
开发软件:Quartus
工程顶层:ad706_test
目标平台:Cyclone IV FPGA开发板
主要接口:AD7606 并行采样接口、UART 串口发送接口
设计思路
设计采用分层模块化结构,将 AD7606 时序控制、电压换算和串口发送拆分为独立模块,顶层 ad706_test 负责各模块之间的数据连接和控制信号组织。这样可以降低多通道 ADC 采集系统的调试难度,也方便单独修改采样控制、数值转换或串口输出格式。
AD7606 模块负责面向芯片的底层控制逻辑。它根据 busy 和 first_data 等反馈信号协调转换启动与数据读取过程,将外部 16bit 并行采样数据整理为 ch1 至 ch8 共 8 路通道数据输出。过采样倍率选择信号 ad_os 也在该接口模块中统一输出,便于根据实际采样需求配置 AD7606 工作方式。
volt_cal 模块承担采样值到电压显示数据的转换工作。顶层将 8 路原始采样值送入该模块,输出 ch1_dec 至 ch8_dec 的 20bit 电压数据,以及 ch1_sig 至 ch8_sig 的符号标志。该结构适合后续对接数码管、LCD、串口帧格式或其他显示通信模块。
UART 模块负责把换算后的多通道电压结果发送出去。顶层为 UART 提供 50MHz 时钟、复位信号、8 路 BCD 电压数据和符号标志,最终通过 tx 输出串口数据。整体数据路径为“AD7606 采样读取 -> 电压换算 -> UART 输出”,逻辑链路明确,便于进行工程移植和二次开发。
模块结构
顶层模块:ad706_test
主要模块包括:
ad7606:AD7606 采样控制与 8 路数据读取模块,输出 ch1 到 ch8 的 16bit 采样数据。
volt_cal:电压转换模块,将 8 路 ADC 原始数据转换为对应的 BCD 电压数据,并输出正负号标志。
uart:串口发送控制模块,接收各通道电压数据并通过 tx 输出。
uarttx:UART 发送底层模块。
bcd:BCD 数值转换相关模块。
clkdiv:时钟分频相关模块。
开发板验证
工程包含 Quartus 管脚约束与分配文件,可用于 Cyclone IV FPGA开发板的硬件验证。AD7606 数据线、控制线以及 UART 收发接口均通过工程约束进行 FPGA 管脚分配,适合结合开发板和 AD7606 模块进行实际采集测试。
仿真图/仿真说明/设计文档图片
工程包含 Quartus 编译输出文件以及 ModelSim 仿真相关生成文件,可作为综合、时序和仿真流程参考。未包含单独的波形截图说明。
部分代码
以下展示顶层模块 ad706_test 的部分代码,完整源码请下载压缩包查看。
module ad706_test(
input clk, //50mhz
input rst_n,
input [15:0] ad_data, //ad7606 采样数据
input ad_busy, //ad7606 忙标志位
input first_data, //ad7606 第一个数据标志位
output [2:0] ad_os, //ad7606 过采样倍率选择
output ad_cs, //ad7606 AD cs
output ad_rd, //ad7606 AD data read
output ad_reset, //ad7606 AD reset
output ad_convstab, //ad7606 AD convert start
input rx,
output tx
);
wire [15:0] ad_ch1;
wire [15:0] ad_ch2;
wire [15:0] ad_ch3;
wire [15:0] ad_ch4;
wire [15:0] ad_ch5;
wire [15:0] ad_ch6;
wire [15:0] ad_ch7;
wire [15:0] ad_ch8;
wire [19:0] ch1_dec;
wire [19:0] ch2_dec;
wire [19:0] ch3_dec;
wire [19:0] ch4_dec;
wire [19:0] ch5_dec;
wire [19:0] ch6_dec;
wire [19:0] ch7_dec;
wire [19:0] ch8_dec;
wire [7:0] ch1_sig;
wire [7:0] ch2_sig;
wire [7:0] ch3_sig;
wire [7:0] ch4_sig;
wire [7:0] ch5_sig;
wire [7:0] ch6_sig;
wire [7:0] ch7_sig;
wire [7:0] ch8_sig;
ad7606 u1(
.clk (clk),
.rst_n (rst_n),
.ad_data (ad_data),
.ad_busy (ad_busy),
.first_data (first_data),
.ad_os (ad_os),
.ad_cs (ad_cs),
.ad_rd (ad_rd),
.ad_reset (ad_reset),
.ad_convstab (ad_convstab),
.ad_ch1 (ad_ch1), //ch1 ad data 16bit
.ad_ch2 (ad_ch2), //ch2 ad data 16bit
.ad_ch3 (ad_ch3), //ch3 ad data 16bit
.ad_ch4 (ad_ch4), //ch4 ad data 16bit
.ad_ch5 (ad_ch5), //ch5 ad data 16bit
.ad_ch6 (ad_ch6), //ch6 ad data 16bit
.ad_ch7 (ad_ch7), //ch7 ad data 16bit
.ad_ch8 (ad_ch8) //ch8 ad data 16bit
);
/**********电压转换程序***********/
volt_cal u2(
.clk (clk),
.ad_reset (ad_reset),
.ad_ch1 (ad_ch1), //ch1 ad data 16bit (input)
.ad_ch2 (ad_ch2), //ch2 ad data 16bit (input)
.ad_ch3 (ad_ch3), //ch3 ad data 16bit (input)
.ad_ch4 (ad_ch4), //ch4 ad data 16bit (input)
.ad_ch5 (ad_ch5), //ch5 ad data 16bit (input)
.ad_ch6 (ad_ch6), //ch6 ad data 16bit (input)
.ad_ch7 (ad_ch7), //ch7 ad data 16bit (input)
.ad_ch8 (ad_ch8), //ch8 ad data 16bit (input)
.ch1_dec (ch1_dec), //ch1 ad voltage (output)
.ch2_dec (ch2_dec), //ch2 ad voltage (output)
.ch3_dec (ch3_dec), //ch3 ad voltage (output)
.ch4_dec (ch4_dec), //ch4 ad voltage (output)
.ch5_dec (ch5_dec), //ch5 ad voltage (output)
.ch6_dec (ch6_dec), //ch6 ad voltage (output)
.ch7_dec (ch7_dec), //ch7 ad voltage (output)
.ch8_dec (ch8_dec), //ch8 ad voltage (output)
.ch1_sig (ch1_sig), //ch1 ad 正负 (output)
.ch2_sig (ch2_sig), //ch2 ad 正负 (output)
.ch3_sig (ch3_sig), //ch3 ad 正负 (output)
.ch4_sig (ch4_sig), //ch4 ad 正负 (output)
.ch5_sig (ch5_sig), //ch5 ad 正负 (output)
.ch6_sig (ch6_sig), //ch6 ad 正负 (output)
.ch7_sig (ch7_sig), //ch7 ad 正负 (output)
.ch8_sig (ch8_sig) //ch8 ad 正负 (output)
);
/**********AD数据Uart串口发送程序***********/
uart u3(
.clk50 (clk),
.reset_n (rst_n),
.ch1_dec (ch1_dec), //ad1 BCD voltage
.ch2_dec (ch2_dec), //ad2 BCD voltage
.ch3_dec (ch3_dec), //ad3 BCD voltage
.ch4_dec (ch4_dec), //ad4 BCD voltage
.ch5_dec (ch5_dec), //ad5 BCD voltage
.ch6_dec (ch6_dec), //ad6 BCD voltage
.ch7_dec (ch7_dec), //ad7 BCD voltage
.ch8_dec (ch8_dec), //ad8 BCD voltage
.ch1_sig (ch1_sig), //ch1 ad 正负
.ch2_sig (ch2_sig), //ch2 ad 正负
// ... 以下代码略,完整源码请下载压缩包查看
228