每次采样周期开始时候,数据采集模块开始采集本周期采样数据,而数据传输模块将上一周期采样数据读出并传出。
假设下方获取传输后采集数据的系统也是每个采样周期开始才读出数据,则数据读出前,将在数据采集过程中延时一个采样时钟周期,然后数据传输实际上又会延时一个采样时钟周期,最终会导致两个采样时钟周期的延时,源系统有较大优化空间。
目前测试的是200K采样率,也就是说一个采样周期时长为5us。
观察数据采集时间与数据传输时间,数据采集时间需要不到4us,而32通道数据传输需要的时间大约是500ns,两个功能的延时加起来并没有超出一个采样周期,因此,实际上有可能可以将数据采集与数据传输的功能集结到一个周期中。
将原来的数据采集传输系统的数据传输模块中,数据预处理模块逻辑进行了修改。预处理模块现在并不是依赖采样时钟信号更新数据,而是直接从上端的数据采集模块中获取ad_cap_en信号,该信号上升沿表示本次采集的数据已经全部通过SPI串口输出,此时已经可以读取采样的采集数据并进行预处理。
修改系统后,仿真测试截图如下:
如图,可以观察到,ad_cap_en信号上升沿虽然在采样周期靠后的时间段才产生脉冲信号,但是本周期剩余的时间足够将数据传输到主卡,下一采样周期开始时,主卡输出的采集数据已经是本轮采样的了。因此在目前的采样率情况下,合并数据采集与数据传输到一个采样周期内的方案可行。
之后再放大波形,检查一下数据时序是否正确。
观察可见,ad_cap_en信号上升沿到来后,首先是采集的单个通道数据ad_ch1更新,之后8个通道的集合数据ad_out_8ch更新,然后数据预处理模块中ad_data_8ch_reg将数据先寄存起来,并在之后将更新的8通道数据寄存到ad_data_8ch中用于移位处理。最后观察解码模块输出的数据ad_data_out,确实符合ad_cap_en更新后第一个通道的采集数据,可见时序正确,并没有因为时序错误导致最终读出的是上一次采样的数据。
上板测试,使用5KHz的-5~+5V正弦波作为信号源输入到ch1中,信号抓取后如图:
5KHz正弦波周期为200us,采样时钟信号频率为200KHz,周期为5us。图中信号可以观察到200个采样点总共有正弦波的5个周期,5us200=200us5,即采集功能正常。
然后转换成数字信号,深入对比数据:
图中上面是第一个通道的原始采样数据,下面的是第一个通道采样数据传输后的数据,每次数据都是在采样时钟信号上升沿时抓取,对比可见,同一周期内数据传输前后一致,数据可以在一个周期内实现数据采集传输功能。
另外,上周提到用来对比数据采集原始数据与数据传输后对应通道数据的模块,也进行了修改。现在可以控制测试的通道。然后上板测试,选择向通道1中输入信号,但是抓取通道2的数据,再对比通道2数据传输前后:
测试可见,其他通道数据同样可以在一个周期内采集并正确传输。
目前的项目工程还是基于xc7a35t板子实现的,需要将程序移植到zynq板子上面,移植过去的话程序,系统时钟设置、高速收发器配置和约束文件需要进行调整。其中,之前使用zynq板子时,已经实际测试过可以进行基本的数据传输,预期这方面的程序修改不会很复杂。
现在唯一不能完全肯定的是采集用的ad7606板卡能不能在xc7a35t板子上面应用,不过之前看官网上说明的内容,ad7606板卡可以适配米联客系列的所有板子,应该也不会有不适配的问题。
而且为了测试能否实际应用,还需要搞明白数据通过gt通道传输并解码后再如何处理。杰哥给了之前的程序,这里可以参考一下。
昨天先把数据采集内容移植过来了,也是先检查仿真,没有问题。计划是本周实现采集功能,然后下周二完成程序移植,周四之前看明白杰哥之前的程序,并将传输后的数据转换成可以发送的形式。
本文章使用limfx的vscode插件快速发布