跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言算法

基于 FPGA 的简易数据采集系统设计

一种基于 Intel Altera Cyclone IV FPGA 和 Verilog HDL 设计的简易数据采集系统。系统通过 DDS 模块产生波形,经 DAC 转换输出模拟信号,再由 ADC 采集回数字信号进行比对。设计包含按键消抖、波形选择、DDS、DAC 驱动及 ADC 驱动五个模块,采用模块化设计与状态机控制 SPI 通信。仿真与板级验证表明系统能正确生成并采集波形,实现了预期的数据一致性检测功能。

花里胡哨发布于 2026/4/6更新于 2026/9/1064 浏览
基于 FPGA 的简易数据采集系统设计

一、实验目的

本实验基于 Intel Altera Cyclone IV EP4CE6F17C8N 开发板与 Verilog HDL 语言设计简易数据采集系统。该系统需要实现 DDS 正常产生波形,通过 DAC 与 ADC 转换后的波形数据一致。为实现该目的,需进行的操作细则如下:

  1. 查阅资料,理解并掌握 DDS 运行原理。
  2. 阅读 ADC 和 DAC 芯片手册理解芯片工作原理及时序要求。
  3. 进行模块化程序设计,独立进行各个模块的代码设计和仿真调试,完成各个模块设计之后,再进行模块互联,最后测试模块互联后的顶层程序功能是否与预期设计一致。
  4. 板级测试,将通过仿真调试的程序烧录到开发板上,用 Signal Tap 联合调试,抓取输入与输出的波形数据,观察二者是否一致。

二、实验原理

本次实验原理将分为理论原理、硬件原理两部分进行阐述。

2.1 理论原理

2.1.1 DDS 基本原理

DDS(Direct Digital Synthesis)是一种用于产生可控制频率的数字信号的技术,由于其易于控制,相位连续,输出频率稳定度高,分辨率高,频率转换速度快等优点,被广泛应用于任意波形发生器。基于 DDS 技术的任意波形发生器用高速存储器作为查找表,通过高速 D/A 转换器来合成出存储在存储器内的波形。所以它不仅能产生正弦、余弦、方波、三角波和锯齿波等常见波形,而且还可以利用各种编辑手段,产生传统函数发生器所不能产生的真正意义上的任意波形。DDS 的实现原理图如下:

首先 ROM 中要存放好要显示的信号数据。然后由频率计数器一直累加,根据这个累加器的值作为 ROM 的地址,然后 DAC 根据 ROM 输出的数据输出相应的电压值,即波形。DDS 可以通过改变频率控制字和相位控制字,控制 ROM 的初始地址和 ROM 地址改变的时间间隔,间接控制输出波形的形状。

2.1.2 SPI 协议原理

SPI(Serial Peripheral Interface)是一种串行外设接口,是一种同步、高速、全双工通信总线,用于在数字系统之间进行通信。SPI 只需要四根端口线即可,能节约引脚,同时有利于 PCB 的布局。正是出于这种简单易用的特性,现在越来越多的芯片集成了 SPI 通信协议,如 FLASH、SD 卡等,本次设计中所使用到的 ADC 和 DAC 芯片也都集成了 SPI 通信协议。一般有四根端口线,分别是:SCLK(同步时钟线)、MOSI(主设备输出/从设备输入线)、MISO(主设备输入/从设备输出线)、CS_N(片选信号)。SPI 主从机通信原理图如下:

文章配图

SPI 通信的基本原理是,主设备通过在时钟信号的边沿(上升沿或下降沿)上发送数据到 MOSI 线,同时从设备在另一个时钟边沿上将响应数据发送到 MISO 线。通信开始时,主设备选择一个或多个从设备,拉低相应的 SS 线。通信结束后,主设备释放 CS_N 线。

SPI 支持四种通信模式,其通信模式的设置由 CPOL(时钟极性)和 CPHA(时钟相位)来决定的。四种通信模式如下:

文章配图

CPOL 决定时钟的空闲电平,CPOL=0 时,SCLK 空闲为低电平;CPOL=1 时,SCLK 空闲为高电平。CPHA 决定采样的时钟边沿(奇数沿/偶数沿);CPHA=0,采样的时钟边沿为奇数沿;CPHA=1,采样的时钟边沿为偶数沿。

2.2 硬件原理

2.2.1 DAC 基本原理

DAC 转换基本原理是:将输入的数字量按权的大小,通过电阻网络转化为模拟量,再通过加法电路,转换为与数字量成比例的模拟量。实际上就是二进制转换为十进制的过程。 DAC 基本组成包括,锁存器、电子开关、基准源、权电阻网络和求和电路。各个组件的功能如下表所示:

组件功能
锁存器保存输入的数字量
电子开关被数字量控制开关,用来决定是否将某一路数字量转换为有效模拟量输出
基准源给模拟量提供参考电压
权电阻网络提供每一路数字量的比例
求和电路将每路数字量转化的模拟量按权相加

DAC 数模转换电路,基准源和权电阻网络是关键。基准源越大,可输出的模拟量的范围当然也就会越大。

2.2.2 ADC 基本原理

ADC 就是起到把连续的信号用离散的数字表达出来的功能,其在模拟信号转化为数字信号需要经过采样、保持、量化和编码的过程。常见的 ADC 有:积分型,逐次逼近型,并行/串行比较型等。ADC 的基本组成机构包括,采样器、模数转换器、数字信号处理器。其各个组件的功能如下表所示:

组件功能
采样器从模拟信号源中提取一定数量的样本值
模数转换器将采样器输出的模拟信号转换为数字信号
数字信号处理器对 ADC 输出的数字序列进行进一步处理,如滤波、放大、校正等

三、系统设计

3.1 系统整体框架设计

本次项目设计采用模块化的设计思路,将整个工程拆分成五个模块,分别为:按键消抖模块、波形选择模块、dds 模块、dac 驱动模块、adc 驱动模块,依次对五个模块逐一进行设计和仿真调试,最后组成整个简易数据采集系统。系统整体框架设计如图 3.1 所示。

文章配图

图 3.1 系统整体框架设计

3.2 模块说明

3.2.1 按键消抖模块

按键消抖有两种方法:硬件消抖和软件消抖。在需要更快的响应时间和更可靠的消抖效果时,可使用硬件消抖,在精度要求不高时可使用软件消抖。但由于硬件难以改变的原因,软件消抖被广泛运用于各个项目之中,本次项目设计采用的也是软件消抖。

软件消抖有多种算法,本次设计采用的是简单延时算法。延时算法有两种实现方式,第一种为计数器实现即每次检测到按键信号下降沿便计数 20ms;第二种为状态机实现。本项目采用简单计数器的方法实现按键消抖。

3.2.1.1 模块框图

按键消抖模块将输入的按键信号消抖,并输出一个按键按下有效信号。按键消抖模块的整体框图如下图 3.2.1 所示。

文章配图

图 3.2.1 按键消抖模块

过滤掉抖动时间需要用计数器来实现,所以模块中需要时钟和复位信号,此外还需要输入的按键信号以及消抖后按键有效的标志信号,按键消抖模块端口信号列表如表 3-2 所示。

端口信号名描述
clk时钟信号
rst_n系统复位信号
key_in[3:0]按键按下信号
key_flag[3:0]经消抖后的按键有效信号

表 3.2.2 按键消抖模块端口信号

3.2.2 波形选择模块

本设计中使用按键实现各种波形之间的切换。具体原理为,通过按键来选择使用哪一个寄存波形数据的 ROM。在设计中,我预先将提前生成好的波形数据分别存入不同的 ROM,当检测到按键输入时,根据不同的按键输入,激活相应的 ROM,用于后续波形数据的读取。

3.2.2.1 模块框图

波形选择模块,将一个按键输入对应一个波形,当识别到相应的按键输入时,输出对应的波形给 DDS 模块。波形选择模块的整体框图如下图 3.2.3 所示。

文章配图

图 3.2.3 波形选择模块

其中,输入端口 clk 为时钟信号,rst_n 为复位信号,key_flag 是按键输入信号,wave_select 是波形信号。端口信号,如下表 3.2.4 所示。

端口信号名描述
clk时钟信号
rst_n系统复位信号
key_flag[3:0]按键输入信号
wave_select[3:0]波形信号

表 3.2.4 波形选择模块端口信号

3.2.3 DDS 模块

DDS 是一种电子模块,它可以通过数字方法直接合成周期波形信号,如:正弦波、方波、锯齿波等。因此 DDS 模块只需要有对应的波形信号数据,就可以生成对应的周期波形信号并输出给 DAC 芯片。由此,根据 DDS 原理开始设计 DDS 模块。

3.2.3.1 模块框图

根据 DDS 原理,DDS 模块需要输入对应的波形数据,以及频率控制字、相位偏置和相位累加控制使能,输出波形信号和波形有效信号。DDS 模块框图如下图 3.2.5 所示。

文章配图

图 3.2.5 DDS 模块

3.2.3.2 端口信号

根据 DDS 模块框图,DDS 模块需要输入对应的波形数据,以及频率控制字、相位偏置和相位累加控制使能,输出波形信号和波形有效信号。DDS 模块的端口信号,如下表 3.2.6 所示。

端口信号名描述
clk时钟信号
rst_n系统复位信号
dds_endds 启动使能
wave_select[3:0]波形选择信号
phase_word[31:0]频率控制字
freq_word[7:0]相位控制字
wave_out[7:0]波形信号
wave_out_vld波形有效信号

表 3.2.6 DDS 模块端口信号

3.2.3.3 时序图设计

DDS 模块通过检测 dds_en 信号,当 dds_en 信号输入时,计数器开启条件 add_cnt 打开,计数器 cnt 加一,rom 的地址是采用 cnt 计数器的大小来改变,在本次代码设计时我们使用的是 32 位计数器,rom 采用的是 cnt 计数器的高 8 位。当输出数据改变时,输出有效信号拉高提示 DAC 模块此时传输的数据才是有效的。具体的模块时序图如下:

文章配图

3.2.4 DAC 驱动模块

查阅 DAC 芯片手册,可知本次设计所使用到的 DAC 芯片是一块三线 8 位 DAC,需要输入 SCLK、CS_N、data,其最高工作频率为 10Mhz,支持三种协议进行数据传输。本次设计采用 SPI 协议的模式 0 设计 DAC 的接口,并通过 DAC 传输时序去 DAC 芯片进行数模转换。

3.2.4.1 模块框图

将波形信号输入给 DAC 驱动模块,通过 SPI 协议将波形信号数据传输给 DAC 芯片进行数模转换。DAC 驱动模块的模块框图如下图 3.2.7 所示。

文章配图

图 3.2.7 DAC 驱动模块

3.2.4.2 端口信号

DAC 驱动模块,要通过 SPI 协议结合 DAC 传输时序传输波形数据,所以该模块需要 SPI 的三个端口信号和波形数据输入及数据传输标志。DAC 驱动模块的端口信号如下表 3.2.8 所示。

端口信号名描述
clk时钟信号
rst_n系统复位信号
din[7:0]波形数据输入
din_vld输入波形有效信号
busy数据传输忙标志
sclkDAC 同步工作时钟
cs_n片选信号
dout输出给 DAC 的波形数据信号

图 3.2.8 DAC 驱动模块端口信号

3.2.4.3 状态机设计

DAC 驱动模块的状态机分为四个状态,分别是空闲状态、准备状态、数据传输状态、数据传输结束状态。在空闲状态下,SPI 接收到数据有效时,进入准备状态,准备状态再跳转到数据传输状态;在数据传输状态,DAC 驱动模块先将原 8bit 数据按照 DAC 传输时序拼接成 16bit 数据,再由高位到低位依次发送数据,直到 16bit 数据发送完成,即完成一次数据传输,状态机跳转到 DONE(数据传输结束状态),最后跳回空闲状态,等待下一次数据传输。DAC 驱动模块的状态跳转流程图如图 3.2.9 所示。

文章配图

图 3.2.9 DAC 驱动模块状态机设计

3.2.4.4 时序图设计

DAC 驱动模块通过检测 cs_n 来检测数据传输是否开始,当 cs_n 拉低时,din_vld 拉高,DAC 开启数据传输,状态机从 IDLE->READY->TRANS,根据 DAC 手册,本次设计给予的 sclk 频率位 5Mhz,故需要对系统时钟 10 分频得到设计的 sclk;同时根据 DAC 手册,在数据传输时,需先将输入的 8bit 数据拼接成 16bit,以满足 DAC 传输时序要求,同时发送一个 busy 信号给 dds 模块,标志数据正在传输,停止数据发送,直到 busy 拉低。在数据传输完成后状态机跳转到 DONE 状态,在跳转到 IDLE 状态,等待下一次数据传输。具体的模块时序图如下:

文章配图

3.2.5 ADC 驱动模块

查阅 ADC 芯片手册,可知本次设计所使用到的 ADC 芯片是一块串行 8 位 DAC,需要输入 SCLK、CH0(输入数据信号)、CNVST,其串行传输最高工作频率为 5Mhz,支持三种协议进行数据传输。本次设计采用 SPI 协议的模式 0 设计 ADC 的接口,并通过 ADC 传输时序去 ADC 芯片进行数模转换。

3.2.5.1 模块框图

根据 ADC 芯片手册,观察 ADC 传输时序和关键参数,设计 ADC 驱动模块。ADC 驱动模块框图如下图 3.2.10 所示。

文章配图

图 3.2.10 ADC 驱动模块

3.2.5.2 端口信号

根据 ADC 芯片手册,去除电源信号端口,设计 ADC 驱动模块端口信号。ADC 驱动模块端口信号如下表 3.2.11 所示。

端口信号名描述
clk时钟信号
rst_n系统复位信号
sclkADC 工作时钟信号
cnvstADC 数模转换标志信号
dinADC 输出波形信号

表 3.2.11 ADC 驱动模块端口信号

3.2.5.3 状态机设计

ADC 驱动模块的状态机分为五个状态,分别是空闲状态、开始状态、A/D 转换状态、传输数据状态、传输完成状态。在空闲状态下,状态机自动跳转到开始状态等待开始传输条件满足,即 100ns 的延时后,跳转到 A/D 转换状态,等待 7.5us A/D 转换完成后,跳转到传输数据状态,8bit 波形数据传输完成后,跳转到传输完成状态(done),最后自动跳转到空闲状态等待下一次数据传输。ADC 驱动模块的状态跳转流程图如图 3.2.12 所示。

文章配图

图 3.2.12 ADC 驱动模块状态机设计

3.2.5.4 时序图设计

ADC 模块通过检测 cnvst 来判断当前状态及数据转换是否开始,当 cnvst 拉高 100ns 后,状态机跳转到转换状态,延时 7.5us 等待数据转换完成之后,进入数据传输状态,开始传输 8bit 数据;在数据传输完成后状态机跳转到 DONE 状态,在跳转到 IDLE 状态,等待下一次数据传输。具体的模块时序图如下:

文章配图

3.3 仿真调试

3.3.1 按键消抖

输入一个按键信号,对齐打拍后开始延时计数,如果计完 20ms 则输出一个对应的按键有效信号,反之输出 0,仿真波形如图 3.3.1 所示:

文章配图

图 3.3.1 按键消抖仿真图

3.3.2 波形信号选择模块

输入一个按键有效信号,波形选择模块输出一个对应的波形参数,用于后续波形的调用。波形选择模块的仿真波形图如下图 3.3.2 所示。

文章配图

图 3.3.2 波形信号选择仿真图

3.3.3 DDS 模块

如下图 3.3.3 所示,当 dds_en 信号拉高后,rom 地址计数器开始计数,并输出对应地址存储的数据;当 rom 地址计满后,rom 翻转,开始从高到低计数,以保证输出的波形数据正常。同时在本设计中,可以通过按键改变输入的波形数据,当按下不同的按键时,dds 会输出对应不同的波形数据;观察下图可见,该功能与设计预期相符。

文章配图 文章配图 文章配图

图 3.3.3 DDS 模块仿真

3.3.4 DAC 模块仿真调试

如下图 3.3.4 所示,DAC 驱动模块状态机跳转正常;当进入数据传输状态时,DAC 驱动模块通过 SPI 接口传输的数据与预期设计的数据一致,由此可见 DAC 驱动模块的功能设计正常。

文章配图 文章配图

图 3.3.4 DAC 驱动模块仿真

3.3.5 ADC 模块仿真调试

如下图 3.3.5 所示,ADC 模块的状态机跳转正常,各个状态所设计的跳转条件都与预期相符;当给予 ADC 模块一个模拟仿真输入时,ADC 模块正常执行数据传输采样时序,并且所得到采样数据与模拟输入的数据一致。在本次仿真调试中,给予的模拟输入数据全为 0 或 1,这样便于程序的设计及后续调试的波形观察。

文章配图 文章配图 文章配图

图 3.3.5 ADC 驱动模块仿真

3.4 板级验证与调试

3.4.1 RTL 视图

本设计中,先通过按键选择输入 DAC 模块的波形数据,再通过 DDS 模块产生对应的波形并输出给 DAC 驱动模块,DAC 驱动模块再通过 SPI 接口将数据传输给 DAC 芯片;待 DAC 处理完后,将数据再输回给 ADC 芯片,ADC 芯片对其进行模数转换重新将模拟信号转换成数字信号;最后将输入与输回的数据比较,一致则说明该设计成功。本设计的 RTL 视图如下图 3.4.1 所示。

文章配图

图 3.4.1 RTL 视图

3.4.2 上板验证

运行代码,通过 signal tap 抓取输入与输出的波形数据,如下图 3.4.2 所示。

文章配图 文章配图 文章配图 文章配图

图 3.4.2 dac2adc 波形数据

四、实验总结

本项目实现了一个基于 FPGA 的简易数据采集系统,并可以通过按键控制输出不同的波形。本项目采用模块化设计思路,将项目分为 5 个模块,包括:按键消抖模块、波形选择模块、dds 模块、dac 驱动模块和 adc 驱动模块。

在各个模块的逐一设计的过程中,也产生了一些问题。诸如,未注意 ROM 位宽,导致频率控制字位宽设置错误,致使 ROM 未按预期时间跳转、传输数据错误;DAC 的 SPI 接口,采用模式 0 传输时,如何避免第一个数据采错;SPI 接口反馈的 busy 信号与 dds_en 信号之间如何交互传输。在认真思考过后,这些问题也逐一得到了解决。

但还是有一些问题,没有得到妥善解决。如,传输数据位宽不够,导致采样数据精度不高,波形不够平滑,可以清晰看到突起,但这是有 DAC 和 ADC 的硬件特性所决定的我们无法改变;在按键切换波形时,波形会出现一瞬间的不正常;在采样锯齿波形时,可以清晰看到采样波形与输入波形不一致,如上图 3.4.2,猜想是采样逻辑设计可能有问题,但暂未找出。正如项目名,这只是一个简易的数据采集系统,后续的项目优化方向就是逐一解决这些问题,以实现更好的数据采集。

目录

  1. 一、实验目的
  2. 二、实验原理
  3. 2.1 理论原理
  4. 2.1.1 DDS 基本原理
  5. 2.1.2 SPI 协议原理
  6. 2.2 硬件原理
  7. 2.2.1 DAC 基本原理
  8. 2.2.2 ADC 基本原理
  9. 三、系统设计
  10. 3.1 系统整体框架设计
  11. 3.2 模块说明
  12. 3.2.1 按键消抖模块
  13. 3.2.1.1 模块框图
  14. 3.2.2 波形选择模块
  15. 3.2.2.1 模块框图
  16. 3.2.3 DDS 模块
  17. 3.2.3.1 模块框图
  18. 3.2.3.2 端口信号
  19. 3.2.3.3 时序图设计
  20. 3.2.4 DAC 驱动模块
  21. 3.2.4.1 模块框图
  22. 3.2.4.2 端口信号
  23. 3.2.4.3 状态机设计
  24. 3.2.4.4 时序图设计
  25. 3.2.5 ADC 驱动模块
  26. 3.2.5.1 模块框图
  27. 3.2.5.2 端口信号
  28. 3.2.5.3 状态机设计
  29. 3.2.5.4 时序图设计
  30. 3.3 仿真调试
  31. 3.3.1 按键消抖
  32. 3.3.2 波形信号选择模块
  33. 3.3.3 DDS 模块
  34. 3.3.4 DAC 模块仿真调试
  35. 3.3.5 ADC 模块仿真调试
  36. 3.4 板级验证与调试
  37. 3.4.1 RTL 视图
  38. 3.4.2 上板验证
  39. 四、实验总结

更多推荐文章

查看全部
  • 网络安全渗透测试全流程与核心工具指南
  • 低代码平台在人事管理中的应用方案
  • AI 交互上下文溢出解决方案:会话压缩技术实现解析
  • Dify 与 MySQL 深度整合:基于 MCP 协议的数据交互实践
  • 云服务器 Linux (Ubuntu x86_64) 部署 Redroid 云手机及 ARM 转译支持
  • 前端流式输出实现详解:从原理到实践
  • 用 DeepFace 和 OpenCV 做实时情绪识别
  • 高校电动车租赁系统架构设计与实现 SpringBoot Vue MySQL
  • Llama-3.2-3B 在 Ollama 中启用 GPU 加速(CUDA/cuDNN)配置指南
  • AI 大模型公司商业化路径:主流变现模式与技术实现详解
  • OpenClaw 部署指南:Minimax/DeepSeek 模型与飞书机器人集成
  • 前端面试复盘:透过问题看技术深度与工程素养
  • Python 安装与环境配置详细教程
  • 大语言模型(LLM)基础概念、类型与应用场景详解
  • 《Agent Runtime 工程化》第十二章 二开毕业项目:12.2 方向 B:Context Budget Allocator
  • 如何入门网络安全技术与伦理规范
  • Flutter 跨平台开发学习指南:从 Dart 基础到实战项目
  • Java 中基于属性的访问控制(ABAC):动态上下文感知权限管理
  • 基于腾讯云轻量应用服务器部署 OpenClaw 并接入 IM 机器人
  • 第二届人工智能、虚拟现实与交互设计国际学术会议(AIVRID 2026)

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online