基于千兆以太网的 ADC 采集

基于千兆以太网的 ADC 采集 - 第一部分,Vivado、ADC 开发

FPGA 系列的 blog 用来记录作为一个 FPGA 初学者的过程,绝大部分内容参考 小梅哥 的 FPGA PL 侧开发教程。记录的目的主要还是为了梳理思路,也算是一个初学者的思考路程吧,希望能给到同样是初学者的朋友们一些帮助

这个项目的背景主要是为了预研的电磁笔项目,想用 FPGA 搭一个电磁笔信号的采集系统;不过后来越做越觉得有趣,立个 flag 希望未来可以基于 FPGA 做一个自己的 SDR 平台 :)

回到正文吧,这个采集系统就是两部分组成,一部分是 ADC 采集,另一部分是以太网传输,就类似于 hackrf 一样,剩下的就准备放到 PC 侧,通过 python 接收以太网数据再去做信号处理。不过也有可能后期会把一些算法处理放在 FPGA 侧,这样可以减少一些 PC 侧的处理负担。另外也因为软件基础的匮乏,只想做 PL 侧的部分,不涉及到 PS 侧的开发,通过 python 在 PC 端去替代 PS 侧的一系功能,看起来也许是个可行的选项。通过这段时间的摸索,FPGA 的开发思路确实和软件开发截然不同,好在日常工作中的芯片验证涉及了不少数字电路逻辑的验证,也算是为 FPGA 的开发做了一点点基础吧。

我们就先直接从 ADC 的 FPGA 开发讲起来;ADC 的选型采用的是 ADI 的 AD7606C-16, 支持 8路 16bits 1Msps 的采样率;选择这个型号也没什么特别,主要是因为通道数多、参考资料多,后面如果电磁笔或 SDR 平台需要更高的采样率,再做拓展。ADC 的 FPGA 开发主要就是实现一个模块来实现控制 AD7606C 所需的硬件接口,而硬件接口最重要的就是时序,所以首先是通读 AD7606C 的 datasheet,把这颗芯片工作所需的时序关系画出来:

AD7606C 的 datasheet 可以在小梅哥的论坛上很方便的下载:https://www.corecourse.cn/forum.php?mod=viewthread&tid=28681

AD7606C 的 PIN 脚很直接,除了 ANALOG 通道和电源 PIN,剩下的就是控制相关 PIN 了,我们先看看有哪些控制 PIN,以及有哪些是和 AD7606C 采样时序相关的:

  • OS0 OS1 OS2: DI,这几个 pin 用来控制过采样率,过采样可以提升 ENOB,但由于我们的应用要求最高的采样率,因此不需要任何过采样,这几个 DI PIN 可以全部为 0
  • PAR_n/SER_SEL: DI, 这个 pin 用来选择 ADC 采样结果输出是通过串口还是并口给到 FPGA 侧;这个在 AD7606C 的硬件板子上是做的跳帽可选,因此不需要 FPGA 通过 IO 控制,我们为了最高的采样率,选择并口的控制方式
  • STBY_n:DI,