TI中文支持网
TI专业的中文技术问题搜集分享网站

dac3482 fifo 同步失败

最近在使用DAC3482芯片,使用AD9517提供DACCLK P/N(30M),然后使用3482内部PLL产生480M的DACCLK,相关分频器M=16,N=1,OSTR=30M;另外使用AD9517产生240M时钟信号作为FPGA芯片的时钟输入,在FPGA内部以其为参考时钟,使用IP核产生480M(clk_pll,作为数据产生模块的驱动时钟,因为3482是在DATACLK的上升沿和下降沿均进行数据采样,所以设置为DATACLK的2倍)、240M(DATACLK,输出到3482芯片)、10M(SCLK,配置3482寄存器的串口驱动时钟,输出到3482)  这3个时钟。 FIFO使用双同步源模式,相关的32号寄存器使用默认值,根据DATASHEET第44页的说明,FRAME使用DATACLK的16分频;
        刚开始提供DACCLK,DATACLK,SCLK,clk_pll,输入数据位全0,配置完所有寄存器之后拉高TXENABLE信号,输入数据变为正弦信号,同时给SYNC信号一个上升沿用于同步3482内部的PLL。

        在以上配置和时序的情况下,每次FIFO都会冲突,复位后还是冲突,请各位朋友帮我分析一下原因,在线等,比较急,谢谢!

rongbin guo:

查了一下相关资料,说是有个校正算法,读出寄存器报警状态,对读写指针位置做相应偏移,想请问下具体怎么实现啊?需要操作什么寄存器吗?求回答!谢谢!

rongbin guo:

回复 rongbin guo:

怎么都没有人回复啊?

Decapton Wang:

1. FRAME使用DATACLK的16分频可能有问题,手册45页图51,FRAME需要领先DATACLK一段时间,同时FRAME和DATA是边沿对齐的,你检查一下。

2. 所以现在FIFO写指针的同步源是FRAME,读指针是OSTR,PLL的同步源是SYNC?FRAME和OSTR来自不同的时钟域,FIFO还是有可能乱掉。两个办法,一是把读指针也用FRAME做同步源,反正你也不做多片DAC的输出同步,OSTR也就无所谓了;或者是用SIF_SYNC,给一个异步的同步信号强制同步一下FIFO读写指针,或许也有帮助。

3. FIFO offset和LVDS data/clk delay可能需要调一下。

4. DAC3482的产品文件夹里有应用手册啊,里面讲得很全,你去官网下载“DAC348x Device Configuration and Synchronization“

rongbin guo:

回复 Decapton Wang:

1.FRAME现在使用的是clk_pll(fpga产生数据的驱动时钟)的32分频,因此和DATA边沿是能够对其的,并且能够领先DATACLK一段时间,做了这个修改后还是显示FIFO冲突。2.是的。关于方法一,我修改为单同步源模式,FIFO冲突,另外最后是要在多个DAC片上输出同步的,因此现在需要在一片DAC上实现双同步源模式。关于方法二,我将读写指针同步源都设置为SIF_SYNC(寄存器32写8801),之后对寄存器31先写1142再写1140,FIFO冲突。4.您说的这篇文档我已经下载下来了,根据17页图19写了一个校正算法,偏移值的变化是通过给寄存器9号的15:13位写不同的值来实现的,这点没有错误吧?然而我将sdio上的串口配置数据抓出来是发现这个偏移值并未按照我设置的逻辑变化,我是将FIFO报警信号读出(寄存器5号13:11)存到寄存器变量里进行判断,然后修改FIFO偏移值的,原因可能是读出的报警信号不对,请问如何将串口数据存到寄存器变量里呢?3.请问这两个变量需要如何调呢?5.最后需要把所有同步源关掉吗?您那里有没有配置的相关verilog代码呢?谢谢!

Decapton Wang:

回复 rongbin guo:

1. 我之前在评估板上测试时,input pointer sync source是FRAME,output pointer sync source是OSTR。个人理解,SIF_SYNC可以当成一个异步FIFO复位源,你可以试试在寄存器31写1142->1140->1142。

2. 寄存器9的15:13就是FIFO offset,LVDS delay的寄存器地址是0x24。

3. 没必要关掉同步源。你可以去下面链接下载EVM GUI软件,用这个软件可以直接产生寄存器地址和寄存器值。

http://www.ti.com/tool/dac3482evm

rongbin guo:

回复 Decapton Wang:

1.按照您说的方式实验了下,还是显示冲突……能帮我分析下原因吗?谢谢!

Decapton Wang:

回复 rongbin guo:

多片同步的话,OSTR和DACCLK应该从时钟芯片产生,走等长线送到各个DAC。我觉得你还是先调通一版单同步源的,再去尝试多同步源。

你从FPGA送一组数据过来,比如送个单音信号。DAC FIFO的读写指针先同时用FRAME同步,然后看输出频谱是否混乱。如果频谱干净,单FIFO出错,那么就去调LVDS delay和FIFO offset。如果频谱混乱,把Alarm寄存器回读一下,看看有哪些位报警了。

rongbin guo:

回复 Decapton Wang:

谢谢!之前在双同步源模式下测试过输出波形,输入给的是一个单音信号,输出也是一个频率稳定的单音信号,接到频谱仪上进行测试,发现频谱干净,相位噪声大概-60dbm,接下来我打算逐个测试不同的fifo_offset的值。昨天晚上进入iotest模式测试了一下,读报警寄存器4号发现每一位都是错误的,这说明哪里有问题呢?请帮我分析下,谢谢!

Decapton Wang:

回复 rongbin guo:

从FPGA发数据,DAC输出频谱正常,FIFO报警,这种情况调一下FIFO offset和LVDS delay,一般都能解决。实在解决不了,保证输出频谱正常即可。

iotest需要现在0x01寄存器里使能一下,你有没有使能啊?你的test pattern发的是什么?

rongbin guo:

回复 Decapton Wang:

您好,现在不使用内部PLL,改为外部提供480M的DACCLK,同时DATACLK改为480M,FIFO不冲突了,原来DATA SHEET上第43页的说明有误。

但是我现在使用内部PLL,用内部PLL产生DACCLK(480M),M=16,N=1,DACCLK=62.5M,预分频系数为7,就显示FIFO冲突了,修改了fifo_offset也不起作用,我是用DDS产生的fout=50M的单音信号,输出波形在时域上看没啥问题,但是接到频谱仪上发现在50M处有大概5M的带宽。

我判断PLL应该没有锁住,但是因为芯片版本较老(版本号为100),寄存器5中的pll_alarm不能准确报警,也不大确定是否锁住。

另外我怀疑是同步的问题,PLL需要SYNC提供同步信号,但是在DATA SHEET中没有给出相关说明,请您解释下好吗?谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » dac3482 fifo 同步失败
分享到: 更多 (0)