跟杰哥交流了一下,如果要跟杰哥给的程序对接的话,主要是需要让自己传输后的采集数据转换成可以由b64_data_gen模块处理的形式。而杰哥的程序里面,ad_data_gen模块就是直接连接b64_data_gen模块的,因此,基本思路就是设计一个处理模块,将采集数据转换成ad_data_gen模块输出的形式。
复制过来ad_data_gen模块端口内容:
module ad_data_gen(
input ad_clk, // 100mhz时钟
input ad_rst, // 100mhz时钟对应的复位信号,高电平有效
input arm_cap, // 触发信号,该信号的高电平脉冲到来后开始产生模拟采集数据
input [31:0]sample_rate, // 32位采样率,设定的是32'd2_000_000,即2M
input [7:0] stream_mode, // 工作模式,为0时采样total_sample_num次后就停止采样,不为0时接收到stop_trigger信号后停止采样
input stop_trigger, // 停止触发信号
input [31:0]total_sample_num, // 每次采样次数
output led_o, // 工作状态与led关联,led亮起时表明正在模拟产生adc采样数据
output start_ad, // 高电平时表明正在模拟产生adc采集数据
// sample data output.
input ad_data_ready, // 阅读这个模块,ad_data_ready信号没有用上
output ad_data_valid, // 每次上升沿表示更新一次ad_data_32ch数据
output ad_data_32ch // 输出的32通道数据
);
再阅读原有程序,实际上真正需要关注的输出信号只有ad_data_valid与ad_data_32ch,也就是说,修改后的程序,输出信号只要实现每次采样的32通道数据移到ad_data_32ch中,每次完成后ad_data_valid来一次高电平脉冲信号即可。
但是,输入信号中还有一点需要注意,原有的程序中输出传输后的采集数据,使用的是200M时钟,而学长程序里面都是用100M时钟驱动,时钟不同步的问题需要注意到。一个解决思路是fifo,另一个解决思路是通过多级触发器实现时钟同步,相对而言后一种延时可能更小,实现起来更简洁。
这部分代码逻辑不难,就是纯粹通过移位操作实现即可。
上板抓取信号:
观察可见,ad_data_valid上升沿处,ad_data_32ch进行了更新,符合预期。
上板输入信号用的是第二个通道,观察信号,其他通道均为16'h1b10左右的值,从高位到低位数,第7个通道信号值较为特殊。由于之前已经确定采样跟传输功能没有问题,因此可以认为32通道数据ad_data_32ch是采样获得的数据。
由于旧有的数据采集传输程序写在xc7a35t板子上了,这个板子没办法将数据打包发送出去,还得要将程序移植到xczu7eg zynq的板子上。
采集方面,zynq板子也有FEP接口,根据FEP接口处理即可,因此根据两个板子FEP引脚对应着来修改约束文件即可,之后复制过来各个模块,修改模块端口,将板子导入进来即可。
向ch2传输信号,图中ch2信号符合预期。
数据传输方面,主要是两个板子用的gt不同,原来的是GTP,现在的是GTH,因此需要根据zynq板子的教程重新配置gt ip核,再移植过来原来的编码解码模块并对接即可。
再继续阅读学长代码,除了接口需要进行对接,实际上ad采样时钟信号也需要进行调整,大体上就是需要能够设定采样次数与频率。如果要测试采样次数,则需要明确采样起始点与终点,因此还是需要外部信号控制采样时钟信号上升沿,那么这时候能够满足采样需求的采样时钟信号就还是需要按照之前讲的子卡自行产生、主卡发送指令与信号来控制的模式了。
目前思路上是,主卡指令拓宽到至少9个字节,并新增指令02用于修改子卡设定的采样率与采样次数,02指令的头部一个字节即指令编号,2到5字节为采样率,6到9字节为采样次数。发送02指令后,子卡修改自己设定的采样率与采样次数,但是暂时不进行采样。
给采样时钟信号生成模块提供5个新的输入信号:
按道理起始信号应该尽可能低时延,但是一时间找不到好用的外部信号来控制,暂时想的是先临时使用串口控制来实现功能,就用01开机信号改编成外部输入的起始信号,后面测试功能可以简单一点。如果后面需要改的话,直接把begin_trigger信号连上外部控制的引脚就行了。
本文章使用limfx的vscode插件快速发布