当前位置:AIGC资讯 > 数据采集 > 正文

FPGA采集AD7606串行输源码加讲解

FPGA采集AD7606串行输源码加讲解
那是2020年,在我上家公司时,由于刚接触FPGA,所以啥也不会,就被大佬安排去写一个国产FPGA的项目,其中就包含AD7606的采集,很遗憾,当时我没能搞定,后来是请了外援,此时也成了我的一个心结,如今2年过去了,虽然跳槽了,后面的项目也没有用到过AD7606,但怀着填补遗憾的想法,还是决定试试。
硬件环境:米联客的AD7606模块,如图:

其实AD7606采集非常简单,前提是你要看懂数据手册,只要数据手册看懂了。。。。
对于串行输出采样而言,数据手册有两张图最为关键:

AD7606流程时序如下:
用户拉低RESET复位AD7606,然后用户拉低CONVSTA/CONVSTB开启AD7606转换功能,然后AD7606输出BUSY给用户指示我正在转换,用户拉低CS接收AD7606输出的数据;

根据上图可知,操作AD7606船型输出采集,流程上只需3步:
第一步:拉高RESET持续至少50ns,我拉高了100ns,时间由数据手册得知,如下:

第二步:拉低CONVSTA或者CONVSTB持续最多0.5ms,注意这里是最多,所以在代码里只需一个参考时钟周期足以,比如你用的100M,一个参考时钟周期就是10ns,当然,CONVSTA和CONVSTB也可同时拉低,这样就是8个通道同时采集,时间由数据手册得知,如下:

第二步:等待BUSY为高后,拉低CS,这个BUSY是AD7606输出给用户的,表征AD转换正在进行,他有一个最大时间,我们一定要满足他的最大时间,不然人家还没转换完你就结束采集了,岂不唧唧了;那么,CS在什么时刻拉低呢?我的理解是BUSY拉高的期间CS拉低,转换时间我设的5ms,由数据手册得知,如下:

流程看完了,来看具体的采集时序:

采集时序如下:
首先用户拉低CS,并给出SCLK到AD7606,AD7606在CS为低期间,在SCLK的上升沿输出数据(但根据时序图,我感觉是SCLK高电平期间输出的),一个通道一次转换后输出16位采样数据;
既然AD7606是在SCLK上升沿输出,那么FPGA就应该在SCLK下降沿采集(或者低电平采集);
这里的SCLK频率有要求,数据手册如下:

好,手册看懂了,再来敲代码,很明显,采集流程分三步,搞个小状态机;

AD7606有8个模拟输入通道,串行输出模式下只有两个数字输出通道,每个输入通道输出16位采样数据;
DOUTA对应CH1、CH2、CH3、CH4四个输出通道;
DOUTB对应CH5、CH6、CH7、CH8四个输出通道;
因为每个输入通道输出16位采样数据,需要16个SCLK周期,所以4个输入通道输出16位采样数据,需要64个SCLK周期;那个我们需要一个计数器,计数到64时输出64位的采集数据,呢么采集到的每个通道数据对应如下:
wire [15:0] ad_ch1 = ad_out_a[63:48];
wire [15:0] ad_ch2 = ad_out_a[47:32];
wire [15:0] ad_ch3 = ad_out_a[31:16];
wire [15:0] ad_ch4 = ad_out_a[15: 0];
wire [15:0] ad_ch5 = ad_out_b[63:48];
wire [15:0] ad_ch6 = ad_out_b[47:32];
wire [15:0] ad_ch7 = ad_out_b[31:16];
wire [15:0] ad_ch8 = ad_out_b[15: 0];

代码状态机如下:

接收计数器:

接收移位寄存器

顶层:

仿真模型

仿真结果如下:

最后:整个源代码并未给出,目的是给兄弟们一个练手的机会,因为这个很简单,加之我的讲解,应该问题不大,如果你在自身尝试的基础上,实在搞不出来,可以私,我也可以给你适当的技术支持,教你怎么写。

更新时间 2023-11-08