将整个工程的ADC输入输出、收发器输入输出、时钟、复位等信号与FPGA引脚绑定后,进行综合、实现、生成bit流文件后,烧录到板子上进行测试。本次测试在FPGA上构建了两个UDP网络:
AD数据传输UDP网络,MAC地址为02:00:00:00:00:00
,IP地址为192.168.1.128
,端口是1234
。
UDP Echo端口网络,MAC地址为5A:51:52:53:54:55
,IP地址为192.168.1.10
,端口为8010
。主要用于与AD数据传输UDP网络构成回环网络,测试RTT时间。
电脑端采用与UDP Echo网络相同的网络参数配置,用于接收来自底板的AD数据。实际测试使用的是WireShark抓取网络包获得UDP包内的Blob数据。
AD数据传输流程如下:
上电或者复位时由于缺少目标电脑的IP地址,需要先发送ARP请求包。
采用先发送一个包含ADC、Blob生成等信息的UDP包触发ARP请求包发送。上位机检查ARP请求包的IP地址,是本机就返回ARP回复包。
AD数据传输UDP网络接收到ARP回复包后,正常进入UDP发送流程。此时触发ARP请求的UDP包会被正常发送。后续切入到AD数据发送。
ADC与组blob配置参数如下:
ADC采样率为250khz,最高2MHz。4通道全部开启,单个通道输出16bits。
组blob,设置UDP payload长度为2008,单个blob采样点长度为250点,则单个blob包含8个bytes的头部信息后长度为2008,可以在一个UDP包传递完成。这样使得一个blob仅由一个slice组成。
触发ARP请求的UDP配置包发送时间间隔为200,000,000
,乘上10ns的时基为2s。由于在没有目标电脑的MAC情况下,UDP配置包最多只能发送11 ~ 12
次,多了协议栈就不能继续接收待发送的UDP数据包,因此这个时间需要尽可能大。
采用wireshark进行抓包。设置eth.addr==02:00:00:00:00:00
,只抓取来自AD数据输出UDP网络的包。流程如下。
第一个包是broadcast ARP请求包
,采用广播的方式请求网络内部192.168.1.10
的MAC地址。
第二个包是ARP回复包
,为本机电脑的网卡MAC地址。
第三个包是触发ARP请求包的UDP数据包
,payload内容为fa0001fa00000000 1032547698badcfe
。网络传输字节方式为大端模式
,FPGA上UDP网络单次发送8个bytes
,将payload内容按大端模式排列,高为在前,低位在后,为:
第一次发送字节为000000 00 FA 01 00FA
,最高位三个字节000000
表示没有用到该部分。
第二个字节00
表示最后一个slice的采样点长度为0,
第三个字节FA
表示最后一个字节前的slice内包含的采样点长度,为250
;
第四个字节01
表示当前blob内仅包含一个slice。为其他数则表示有多个slice。
第五个部分为00FA
,表示当前blob内包含多少个采样点。由于当前blob内仅一个slice,此部分与第三个字节相等。
第二次发送的字节为fedcba9876543210
,主要作用为使得配置信息UDP包的长度满足16字节。后续需要扩展UDP配置信息包的长度,修改这部分即可。
后续全部为AD数据组成blob后发送的UDP包。一个包的数据长度为2008,与设置匹配。blob编号从0000 0001
开始向后递增。
数据包的处理采用matlab进行。wireshark导出一个包的分组字节流为txt文件,matlab读取该txt文件。
由于wireshark导出的分组字节流包含地址和字符信息,需要在matlab中去除。分组字节流中,两个空格字符间为AD传输的数据。
matlab将payload中的字节组成一个长字符串。网络传输中两个字符表示一个字节,matlab会将一个字节拆分为两个字符。对于AD数据读取,一个字节需要读取两个字符。字符统一用hex2dec
函数转换为无符号十进制
,对于包含符号位的AD数据,需要做一次转换。
前16个字符为当前UDP包内的slice和blob信息,包含blob编号,blob内采样点长度,slice编号,slice采样点长度。此部分可以修改。
后续所有字符为采样数据,按照每16个字符为一个采样点进行读取。单个采样点包含4个通道,每个通道4个字符。通道读取顺序为1-2-3-4
顺序进行。由于网络传输字节时按大端顺序
,需要对2字符组成的字节进行顺序切换,使高位在前,低位在后,后续使用hex2dec
和符号转换才能得到正确的数。转换出的结果为AD输出的16bits数对应的带符号十进制数。
绘制blobNo=0000 0001
的包,即第一个包的采样数据转换结果,如下。由于没有接信号,所有通道均没有有效的波形。ch1上仅有个位数的数据波动。ch2-ch4由于没有接对应的模拟前端电路,开始采样前存在采样端电容的充放电现象,表现为过渡过程。后续读数接近稳定。
现有ADC数据读取架构为ADC输出与数据同步的时钟,即SDO1-SDO4数据线需要在CLKOUT
驱动下读取。
CLKOUT为ADC输出到FPGA的时钟。外部时钟输入到FPGA需要消耗FPGA的GCLK
资源,即通过专用的GCLK
接口和对应的时钟处理模块后才能进入FPGA的时钟网络中,驱动其他逻辑。
FPGA资源一般按Bank
划分,对于Xilinx的FPGA,每个Bank一般提供4个GCLK输入
。目前使用的FPGA核心板上可用于传输ADC数据的bank一共3个
,总共12个GCLK
,允许12个外部时钟输入。
对于目前的ADC数据读取架构,一个时钟对应4个通道。当下的ADC数据读取架构下和ADC芯片下,12个GCLK最多可以实现48
个通道的数据读取。需要扩展通道则需要更改ADC数据读取的架构。
官方给的例程没有采用CLKOUT为数据源时钟,而是采用Altera
的PLL输出相位、占空比
均可调的时钟信号,使这些时钟信号与SDO1-SDO4的时序匹配,进行读取。以上方法存在许多问题:
Xilinx的PLL与MMCM不支持相位可调的时钟输出。
本质上同样消耗时钟资源,而且PLL资源不如GCLK资源多。
没有源时钟同步,每个ADC芯片都需要精细调整对应的读取时钟的相位、占空比
参数,极其麻烦。
DTACQ的ADC数据读取方案目前未知。目前从它们公开的资料可知,FPGA型号为XC7Z030-FBG676
,相关配置如下:
2片DDR3 DRAM,应该是仅连接到PS侧,用于Linux系统运行使用。PL侧没有任何DDR。
4个6.6Gb/s的收发器,运行5Gbps以太网。
PL侧5个bank,共20个GCLK。2M 64ch
配置为每个通道1个ADC。如果所有ADC均采用对应源时钟进行读取,则GCLK资源远远不够。推测它们的ADC模块架构如下:
FPGA输出一路源时钟和CNV信号,采用缓存芯片一分为8,驱动8个ADC。
ADC读取时采用某个ADC输出的源时钟作为数据参考时钟。这路时钟英是时序或者延时性能最差的时钟。
2M采样率最高提供64通道,1M提供192通道。1M版本的ADC采集模块上用了一个LQFP封装的Xilinx芯片,推测是Xilinx的CPLD
芯片,因为Xilinx的FPGA都是用的BGA
封装。CPLD应该完成ADC和FPGA的各种交互信息的逻辑操作。
后续如果需要增加ADC通道、ADC采样速率,需要更改ADC采集架构。
一种方法是采用推测出的DTACQ方法,采用某一路时钟作为源时钟。但是ADC源时钟时序存在漂移,会随时间、温度等因素产生变化,不容易预测。
在ADC与主FPGA间增加一个FPGA作为数据中继。多通道ADC的低速数据先被中继FPGA收集,中继FPGA再通过高速总线如多路LVDS
与主FPGA进行通信。中继FPGA会放置在采集模块附近。此方法主要是工作量大,但可以保证通信与数据质量。
大论文主要分为以下几个部分:
小论文总体结构与大论文类似,不同在于各部分填充内容不一致。
南网中文:绪论部分参考中期和开题,各个模块设计主要给处设计的原理图和状态机转换图,不会写太详细。测试结果只给线性度测试
和最大延时测试
两个结果,以及绘制一个UDP数据包采样波形图。
毕业用小论文:基本参考大论文各个部分内容,设计部分会写得简单一些,测试部分基本相同。
投期刊对面可能会问的几个问题:
整个采集装置或设备的实物图有没有?
有没有放到J-TEXT装置上连接几个诊断测试的数据波形图?
有没有配套的上位机驱动或数据读取软件?
感觉投稿小论文的时候这个采集只做到验证机的程度,不能算原型机,暂时没有达到能够实际放到装置上用的程度,可能会被卡。
等走完所内流程预计最快3月初可以投,辅导员那边说的是到5月底答辩时拿到录用通知,投期刊等5月底拿录用通知有点悬。
本文章使用limfx的vscode插件快速发布