分享

ADC和DAC芯片使用FPGA调试总结

 西北望msm66g9f 2019-06-21

AD和DA调试总结

一、ADC芯片调试

1.ADC芯片功能理解

ADC,模数转换器,功能是把模拟电压转换成数字量,把要测的电压那根线,连接到ADC的用来测电压的引脚上,ADC模块就会检测到这个电压,并且自动的转换成一个数字,我们读出这个数字,就知道这个数字和电压的对应关系。每个独立的ADC芯片都有一个分辨率指标,一般分辨率有8位,10位,12位,16位,24位等。8位分辨率的最大值就是255,范围是0~255,那么16位就是65536,范围就是0~65535。

用俩款芯片进行举例:AD9467和AD9640。

ADC9467:

是一款16位的采样率在250MSPS,芯片结构图如下。VIN+/VIN-是模拟的输入,clk+/clk-是对模拟信号进行采样的时钟。D15+/D15-~D0+/D0-为转换出来的数据,DCO+/DCO-为转换后根据数据出来的时钟信号。

芯片根据电压的转换进行模拟到数字的转换。下图中一个DCO时钟周期采样得到16位有效数据,在芯片手册中可以读到从AD9467被锁定的数据信号必须在DCO的上升沿和下降沿双倍速率的抓取。参看Figure2图中所画。

根据上图我们在FPGA程序中将一组数据引脚 利用IBUFDS原语将数据进行差分转单端,在利用IDDR将单端信号打成双倍数据的结果分发下去,例如引脚0的被分到位号0和8,引脚1被分到位号1和9。但实际0引脚位号应被分到0和1,则在外层模块 再将数据位置颠倒过来。将8对引脚都按下述代码转换。


将DCO的时钟信号进行下述代码处理。进来的DCO差分信号先利用IBUFGDS进行差分转单端,随后进行BUFIO原语这个原语是IO驱动专用原语,随后在进入BUFR原语中,这个原语主要去驱动相邻BANK内采样引脚。得到的时钟信号作为采样16位数据的跟随时钟。

在将数据和时钟都进行转换后将该数据和时钟存入FIFO,用FPGA内部的相同速率的时钟进行读取,为了使数据和FPGA内部时钟对齐。

在上段代码得到的165位信号W_AdcDout进行位置的颠倒。如下代码

上述代码中做了位置的颠倒,在Figure2图可以看到顺序D15 ,D14,那么在原语IDDR中Q1是D15,Q2是D14,那么上述这段代码就是将顺序排序,可以发现在最高位位置处进行了一次取反,原因在下图。

上图中AD9467输出的数据格式是偏移二进制,我们在FPGA内部使用需要转换成二进制补码的形式,由于偏移二进制转换成二进制补码的方式就是最高位取反,则上述代码中最高位取反得到相应的二进制补码形式,就可以在FPGA中使用了。如果用信号源给AD信号,那么可以看到相应的正弦波信号。

AD9640:

ad9640是一款14位模数转换器,是一款双端口的AD芯片。

直接看芯片结构

上图中VIN+a/VIN-a和VIN+b/VIN-b是A和B 俩个采样端口,利用clk+/clk-时钟进行采样。

图中的clk+/clk-就是对模拟信号进行采样,CHA/B DATA是A和B俩组转换后的数据DCOA和DCOB是俩组数据对应的时钟,在图中可以看到一个时钟周期正好可以直接对数据进行采样。在下图中可以看到芯片默认的数据输出就是偏移二进制的形式,那么将最高位取反就可以得到FPGA所能使用的二进制补码形式。


根据上面信息可以将AD9640采样的数据和对用的DCO时钟存入FIFO,在用同样速率的时钟读取,随后将最高位取反得到二进制补码的形式。

AD采样有可能有溢出,利用逻辑检测正数的最大值(16'h7fff)和负数的最小值,在一段时间内出现个数。将检测次数和溢出次数进行上报,进行调试放大器的值的依据。如下图,每次使能后开始计数 并且将俩个计数器进行上报。

2.DAC芯片功能理解

DAC是数字模拟转换器,是一种将数字信号转换为模拟信号的设备(以电流、电压或电荷的形式)。DAC的位数越高,信号失真就越小。

AD9122:

是一款双通道、 16位、高动态范围数模转换器(DAC),提供1200 MSPS采样速率,可以产生最高达奈奎斯特频率的多载波。


图中D15P~D0p和D15N~D0N是要送到DA的数据,DCI是上述数据所跟随的时钟信号。在字节和半字的模式下FRAME是选择将数据发送至哪一个通道。IOUT1P和IOUT1N是1通道的输出,IOUT2P和IOUT2N是2通道的输出。DACCLKP和DACACLKN是内部所要使用的时钟信号,还可以用REFCLKP和RECLKN时钟去经过芯片内部的倍频去供芯片所用。但是DACCLK的频率值就是REFCLK经过倍频后的频率值,要么就是DACCLK直接给过来,要么就是利用REFCLK经过锁相环倍频。

数据格式可以通过内部寄存器进行配置,由于我们FPGA内部DDS产生的数据就是二进制补码的形式,那么我们在该寄存器的设置时就采用二进制补码形式。

对于输入数据模式有三种样式,我们选用了字接口模式,从上图可以看到该数据采用了双倍速率时钟下进行发送。一个时钟周期内将IQ俩路的信号打成DDR形式。那么代码如下。

上述模块中clk_in_int_buf的时钟是96M 那么上下沿采样去采D1和D2俩路数据(也是96M),那么得到的data_out_to_pins_predelay的速率就是192M。此时就会发现发给DA的数据格式和下图一致。上图中SAME_EDGE是数据在同时出现在数据线上,而OPPOSITE_EDGE表示数据出现在反相沿,D1早于D2半个时钟周期。上升采D1,下降沿采D2。


上图中DCI为96M,DATA为192M

上述代码的顶层如下,在输入32Bit时,将实部和虚部拼接输入。

在模块中例如ODDR的输入

DATA_OUT_FROM_DEVICE[pin_count]和DATA_OUT_FROM_DEVICE[sys_w + pin_count]是将实部和虚部的最高位(假设pin_count为7)数据取出打成一个DDR形式的数据再利用OBUFDS将数据打成差分信号给到物理接口上去。同样对于时钟的操作也是如此,如下图。

其中CLK_IN是96M时钟,上下沿对0和1采样,那么得到的clk_fwd_out就是96MHZ

DAC5672:

是一款双端口14位,最大采样率为275MSPS的模数转换器。

图中DA和DB是俩个端口的数据输入,CLKA和CLKB是A和B俩个端口对应的时钟信号。

从上图中可以看到该芯片要求输入数据的格式是偏移二进制形式。

从上图可以看出俩个通道的数据在CLKA和CLKB的时钟下驱动。

那么代码部分就是将输入数据的最高位取反从二进制补码形式转换成要求的偏移二进制形式,将数据连接至相应的物理引脚即可。

总结:

芯片文档主要关心芯片的输入输出样式,其次关心数据格式,再次关心数据模式。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多