这一部分将教程的代码进行了一些修改后封装为ip核,再整了个顶层代码后,上板子接上信号发生器测试了一下,可以正常显示出来信号发生器产生的波形。
封装后的ip核如图。
其中,各个引脚功能:
输入引脚:
输出引脚:
后面需要将采集到的数据通过gtp发送出去,因此重点需要理解数据采集后通过SPI传输的时钟时序与各个信号变化。
观察仿真信号波形:
以1~4路信号为例,标记为a。
可以看到,当CS信号为低电平时,每次sclk时钟周期会进行一次采集。每路信号为16位,16个时钟周期完成一路信号的采集。共4路信号,因此16*4=64个时钟周期后完成4路ADC采集。
在代码中,采样具体是通过移位操作完成的。每个时钟周期将ad_out_a_i的信号通过移位操作移入ad_out_a中,同时nbits进行一次计数。当nbits计数达到0'd64时,表明4*16位信号已经全部完成采集,ad_cap_en变为高电平。
在使用这个ip模块时,数据采集的方式可以理解成,每次ad_cap_en产生脉冲信号,ad板卡采样到的数据会完成更新。对于SPI发送过来的数据,可以借助于ad_cap_en信号,判断是否有新的数据发送过来。
需要注意,当CS信号变回低电平时,又会将新的数据移入ad_out_a中,因此只能在CS信号为高电平时读取ad_out_a。
5~8路信号同理。
感觉需要像上面这样子,还需要把其他的各个数据传输的模块中,数据怎么传输出来、传输出来的数据怎么接收,都搞明白,理清楚其中关键信号的功能,再根据这些信号的规律设计数据传输协议,才容易补全模块代码。
本文章使用limfx的vscode插件快速发布