This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

dac3482 fifo 同步失败

Other Parts Discussed in Thread: DAC3482

最近在使用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都会冲突,复位后还是冲突,请各位朋友帮我分析一下原因,在线等,比较急,谢谢!

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

  • 怎么都没有人回复啊?

  • 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“

  • 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代码呢?谢谢!

  • 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

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

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

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

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

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

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

  • 您好,现在不使用内部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中没有给出相关说明,请您解释下好吗?谢谢!

  • 不要使用内部PLL,FIFO读写指针的同步源要从外面给。通常的作法,是无视PLL,以及无视PLL产生的各种信号。FIFO的写指针用FRAME,读指针用FRAME或OSTR,不需要多芯片同步就用FRAME,需要多芯片同步就用OSTR。

  • 可是我需要使用内部PLL产生一些特定的DACCLK频率怎么办呢?现在是FIFO读写都用FRAME同步,但是仍然显示冲突,另外报警寄存器5号的第9位alarm_dataclkgone也显示冲突了,请问可能是什么原因呢?谢谢!

  • 但是我需要用内部PLL产生一些特定的频率怎么办呢?我现在FIFO读写指针同步都用的是FRAME信号,还是显示冲突。

    另外报警寄存器5号显示alarm_dataclkgone也报警,请问可能是什么原因呢?谢谢!

  • PLL模式下,DACCLK作为PLL的参考时钟。按照手册图56的PLL框图所示,PLL输出的DAC时钟=REFCLK*M/N,现在REFCLK=62.5M,M=16,N=1,则PLL产生的DACCLK=1000M,预分频=7,则VCO=7GHz。但是手册图57所示,VCO的范围是3.3G到4G,你的设置明显错了,预分频应该设置为4才对。

  • 不好意思啊,之前描述有误,其实我DACCLK给的是30M哈

  • 请问FIFO报警是否也像PLL报警一样,如果版本比较老(比如我用的是100)就会存在报警不准确的问题呢?刚刚测试了下频谱是好的,另外在一次PLL明显没锁住的错误设置的情况下,FIFO反而没有报警。

  • 应该是PLL没有锁定,Pre-scalar尽量用偶数,不要用奇数。按照下图软件配置试试,硬件LPF部分就用手册建议的R=1K,C2=100nF,C1=1nF。

    另,clkdiv_sync_ena如果打开,同步源选FRAME。如果clkdiv_sync_ena打开时,发现FIFO出错或者报clock_gone,就把这个功能关掉。

  • 你好,按照你说的尝试了一下,首先把原有工程中的clkdiv_sync_ena关掉了,尝试了一下FIFO还是错误。

    之后Pre_scalar设置为8,M=8,N=1,其它参数不变,因为我测试的板子上没有外接环路滤波器,所以我限制M*P=64<120,使用的DA内部滤波器,FIFO依然冲突……

  • 在一次PLL明显没锁住的错误设置的情况下,FIFO反而没有报警。

  • DAC3482的PLL不接外部环路滤波器是错误的,因为内部并没有集成环路滤波器。这个滤波器的作用是将CP电流转化成电压,去控PLL内部的VCO,同时起低通滤波作用。如果确定使用PLL,务必要将外部环路滤波器接上,否则PLL不会锁定。

  • 对不起,搞错了,板子上式有环路滤波器的,之前没有找对位置,确认了一下参数,电容是按照标准配的,但是电阻用的是150欧姆,请问会有什么问题吗?

    另外在data sheet第47页最后一行的意思不是说P*M小于120的时候内部环路滤波器能保证锁住的嘛,在PLL的结构图上还画了的。

  • P=8,M=8,N=1,则VCO=ref*P*M/N=30M*8*8=1920M,但是内部VCO的范围在3.3G~4G,所以你这样的设置,PLL不会锁定的。

    设置P=8,M=16,N=1,将CP改为single (0x18寄存器),外部环路滤波器的电阻改为1K,再试试PLL是否锁定。

  • 你好,按照你说的设置了一下,另外电阻也改回1K了,读取FIFO还是显示冲突,另外DATACLK_gone报警,另外测量1K电阻的电压发现恒定在1.85V,我觉得PLL应该是锁住了,请问可能是什么问题呢?

  • 我将DATACLK分频后引到GPIO口上进行观测,发现DATACLK并没有消失,是报警信号错误了吗?

  • SIF_SYNC一下。另,把配置发过来一下,最好保存成记事本,左边是x00之类的地址,右边是xFFFF之类的数据。

  • 好的,请问你邮箱是多少?

  • 按手册对于word-wide data transmission的描述,数据率是480M(IQ交织),DATACLK应该是240M,看你的应用,应该是没有开内插和NCO搬频,且DACCLK是480M。你检查一下这几个速率是否正确,我的配置在附件。

  • 你好,我觉得DATA SHEET上在这段的说明是有错误的,之前没有PLL的时候,DATACLK=1/2 DACCLK,然后导致FIFO冲突且输出频率为15M(理论值是30M),后来修改为DATACLK = DACCLK FIFO就不冲突了,所以我才会那么设置。

  • 你好,我发现你的配置中并未使用PLL啊,并且有些factory use 的位设置的和默认的也不一样~

  • 我将PLL外部环路滤波器的电压使用万用表直流档测量,稳定在1.85V,我又用示波器测量该点的波形,发现峰峰值范围在30-50mv,请问这是否说明DA内部PLL已经锁住?谢谢!

  • 我现在正在使用DAC3482芯片,想请教一下其内部的FIFO作用是什么?

    FIFO读写指针分别由DATACLK和DACCLK(或其分频)来驱动,用于“缓冲”的作用,我有两种理解:

    1.只能缓冲读写指针驱动时钟的相位误差,这时候如果要保证FIFO读写指针不冲突,最后读写指针的驱动时钟应该完全一致,允许有一定的相位差。

    如果是这种情况,那么在使用DAC3482内部PLL产生DACCLK,并且因为芯片版本问题无法确定PLL是否锁住(详见寄存器5号)的情况下,一旦FIFO读写指针冲突,就找不到问题的原因了。

    2.能够缓冲读写指针驱动时钟的频率误差,即在读写指针驱动时钟速率不同的情况下,能够判断出“写满”或者“读空”,的情况,据此中断读时钟或者写时钟,从而避免FIFO冲突,使DAC3482能够在读写指针驱动时钟频率不同的情况下正常工作,如果是这样,请问要如何实现?

    请您解答一下,谢谢!

  • 你好!

    我最近也在用这款芯片,遇到了和你类似的情况,能告知一下最后怎么解决的么?

    比较着急。

    谢谢