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.

[参考译文] LMK04821:难以设置固定数字延迟

Guru**** 2529560 points
Other Parts Discussed in Thread: LMK04821

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/clock-timing-group/clock-and-timing/f/clock-timing-forum/987765/lmk04821-difficulty-setting-up-fixed-digital-delay

器件型号:LMK04821

我们正在尝试设置具有固定数字延迟的 LMK04821。 我们已按照数据表第42页所述对寄存器进行编程、切换了同步极性、但这似乎不会影响输出相位。 我们通过编程方式切换同步极性(即通过设置和取消设置0x143:5)。 同步脉冲的长度是否重要?

我们还不清楚寄存器0x101、0x109等的含义。 在第42页上,数据表声称这一点  

'在这两种延迟模式下、常规时钟分频器用替代分频值。 替代除法
值由两个值组成、DCLKoutX_DDLY_CNTH 和 DCLKoutX_DDLY_CNTL。 最小值
_CNTH/_CNTL 值为2、最大_CNTH/_CNTL 值为16。 这将产生一个最小的替代方案
将值4除以最大值32。"

但没有解释、替代除法值实际上是什么。 进行了比较  

"应遵循以下步骤:
1.设置 DCLKout0_DDLY_CNTH = 4且 DCLKout2_DDLY_CNTH = 4。 每个时钟的第一部分延迟。
2.设置 DCLKout0_DDLY_CNTL = 4且 DCLKout2_DDLY_CNTL = 5。 每个时钟的第二部分延迟……”

两个子寄存器的总和分别为8和9、而不是8。  

以下是我们的寄存器设置:50MHz 输入时钟、通道0和2上的100MHz 输出以及通道1、3上的12.5MHz 系统参考时钟。

VAR 寄存器={ 
2:0x00、/* 0x0002 POWER_DOWN */
256:0x0F、/* 0x0100 CLK0设置*/
257:0x00,
259:0x00,
260:0x30,
261:0x00,
262:0x00、
263:0x11,
264:0x0F、//* 0x0108 */
265:0x00,
267:0x00,
268:0x30,
269:0x00,
270:0x00,
271:0x11、
272:0x0F,
273:0x00、
275:0x00,
276:0x00,
277:0x00、
278:0xFF、
279:0x00、
280:0x00,
281:0x55,
283:0x00,
284:0x00,
285:0x00,
286:0xFF,
287:0x00、
288:0x00,
289:0x55,
291:0x00,
292:0x00,
293:0x00,
294:0xFF、
295:0x00,
296:0x00,
297:0x55、
299:0x00,
300:0x00、
301:0x00,
302:0xFF,
303:0x00,
304:0x00,
305:0x55、
307:0x00,
308:0x00,
309:0x00、
310:0xFF,
311:0x00,
312:0x20、
313:0x03,
314:0x00,
315:0x78,
316:0x00,
317:0x00,
318:0x03,
319:0x0D,
320:0x00、
321:0x00,
322:0x00,
323:0x0B,
324:0x83、
325:0x7f,
326:0x10、
327:0x98,
328:0x0a,
329:0x02,
330:0x0a、//* 0x014a、reset_type/reset_mux */
331:0x16、
332:0x00,
333:0x00,
334:0x00、
335:0x7f,
336:0x03,
337:0x02、
338:0x00,
339:0x00,
340:0x00、//* 0x0154、CLKin0_R[7:0]、5*/
341:0x00,
342:0x04、
343:0x00,
344:0x00,
345:0x00,
346:0x01、//* 0x015A、PLL1_N[7:4]、4 */
347:0x98,
348:0x20、
349:0x00,
350:0x00、
351:0x0B、/* 0x015f PLL1_LD_TYPE、PLL1_LD_MUX;使用0x04或0x03,可以切换 LED */
352:0x00、
353:0x01、//* 0x02 */
354:0xa4、//* 0xA5 */
355:0x00,
356:0x00,
357:0x02,/*从这里,寄存器的顺序不再是单调的*/
369:0xAA,
370:0x02、
372:0x00,
380:0x15、
381:0x33、
358:0x00、
359:0x00,
360:0x03,
361:0x41、
362:0x00,
363:0x40、
364:0x00,
365:0x00,
366:0x13、//* 0x016e PLL2_LD_TYPE、PLL2_LD_MUX;0x06为开漏输出、0x04/0x03切换 LED *
371:0x00、
8189:0x00、
8190:0x00,
8191:0x53、

这里是应该设置通道0和2上的延迟的函数。 我们确信主机和时钟发生  器之间的通信是无错的、并且寄存器设置达到 LMK04821。  

异步函数 write_phase (){ 
//通道0的写入阶段、0x101
WRITE_PHASE_寄存 器(257)
等待睡眠(300)

//通道2的写入阶段、0x109
WRITE_PHASE_寄存 器(265)
等待睡眠(300)

//清除0x106
寄存器['262']= 0
WRITE_PHASE_寄存 器(262)
等待睡眠(300)

//清除0x10e
寄存器['270']= 0
WRITE_PHASE_寄存 器(270)
等待睡眠(300)

//清除0x144:0、0x144:1
寄存器['324']= 128
WRITE_PHASE_寄存 器(324)
等待睡眠(300)

//切换0x143:5
寄存器['323']= 27
WRITE_PHASE_寄存 器(323)
等待睡眠(2000)
寄存器['323']= 11
WRITE_PHASE_寄存 器(323)
等待睡眠(3000)

//设置0x106:7
寄存器['262']= 128
WRITE_PHASE_寄存 器(262)
等待睡眠(300)

//设置0x10e:7
寄存器['270']= 128
WRITE_PHASE_寄存 器(270)
等待睡眠(300)

//设置0x144:0、0x144:1
寄存器['324']= 131
WRITE_PHASE_寄存 器(324)
等待睡眠(300)

console.log ("写入的相序")
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很抱歉耽误你的时间、我们将在24小时内回复。

    此致、
    Hao

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、zvoros、

    首先、请记住、这是 固定 的数字延迟。 无论同步过程重复多少次、只要数字延迟寄存器在同步之间具有相同的值、两个输出之间的相位都应可重现为相同的偏移。

    可将替代分频值视为显式告知分频器保持输出高电平或低电平的时间。 对于固定数字延迟、这基本上不相关、因为在计算数字延迟时输出状态为静音。 但是、这对于 动态数字延迟非常重要、因为在动态数字延迟期间、输出不会被静音。 对于动态数字延迟、 可以指定输出时钟在延迟移位周期内应保持高电平/低电平的 VCO 周期数、以便 更好地控制移位周期的占空比。

    在给定的示例中、延迟值总和为8和9、这意味着第一个时钟应延迟8个 VCO 周期、第二个时钟应延迟9个 VCO 周期。 在 固定数字延迟中、您将看到的只是相对于第一个时钟、在第二个时钟启动前额外增加的单周期 VCO 延迟。 在 动态数字延迟中、您将看到第二个时钟具有单个时钟周期、其中输出在5个 VCO 周期内保持低电平、从而有效地在第二个时钟上相对于第一个时钟产生一个 VCO 周期的延迟。

    给我更多的时间来解释 您提供的寄存器写入序列;我相信我了解正在执行的操作、但我想通过在我们的实验中复制您在电路板上的编程来进行确认。 今天稍后、我将提供更新。

    此致、

    Derek Payne

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Derek、

    非常感谢您的反馈!

    [引用 userid="284549" URL"~/support/clock-and-timing/f/clock-timing-forum/987765/lmk04821-difficulty-setting-up-fixed-digital-delay/3650137 #3650137">首先,请记住这是 固定 的数字延迟。 无论同步过程重复多少次、只要数字延迟寄存器在同步之间具有相同的值、两个输出之间的相位都应可重现为相同的偏移。[/QUERP]

    这很清楚、这正是我们需要的:我们的设置是静态的、也就是说、一旦我们知道参数是什么、我们就不会更改它们。  

    我还忘记了在我的原始帖子中提到、我们正在尝试 在嵌套零延迟双环路配置中完成此操作、如图所示。 数据表的第20部分。 我们输入50MHz 基准信号、并希望生成12.5MHz 和100MHz 的基准信号。 输出应 与基准进行锁相。 我们通过12.5MHz SYSREF 关闭 PLL。  

    我们几乎可以设置所有内容、频率、SYSREF 的全局数字延迟、SYSREF 输出的本地数字延迟、器件时钟和 SYSREF 输出的本地模拟延迟。 唯一缺少的是器件时钟的本地数字延迟。 我们希望 Lo 能够将相对于 SYSREF 的相位延迟360度以上、即10ns。 仅模拟延迟就无法让我们实现这一目的。  

    我还注意到,我们原来的顺序是执行第9.3.3节中的指示。 没有可靠地工作。 我认为缺少一个步骤。 我已修改了代码、现在我们已经完成了以下操作:  

    异步函数 write_phase (){
      //通道0的写入阶段、0x101
      WRITE_PHASE_寄存 器(257)
      等待睡眠(300)

      //通道2的写入阶段、0x109
      WRITE_PHASE_寄存 器(265)
      等待睡眠(300)

      //清除0x106
      寄存器['262']= 0
      WRITE_PHASE_寄存 器(262)
      等待睡眠(300)

      //清除0x10e
      寄存器['270']= 0
      WRITE_PHASE_寄存 器(270)
      等待睡眠(300)

      //清除0x144:0、0x144:1、0x144:7
      寄存器['324']= 0
      WRITE_PHASE_寄存 器(324)
      等待睡眠(300)

      寄存器['323"]= 145
      WRITE_PHASE_寄存 器(323)
      等待睡眠(200)
      //切换0x143:5
      寄存器['323"]= 177
      WRITE_PHASE_寄存 器(323)
      等待睡眠(2000)
      寄存器['323"]= 145
      WRITE_PHASE_寄存 器(323)
      等待睡眠(3000)
      寄存器['323"]= 17
      WRITE_PHASE_寄存 器(323)
      等待睡眠(200)
      
      //设置0x106:7
      寄存器['262']= 128
      WRITE_PHASE_寄存 器(262)
      等待睡眠(300)

      //设置0x10e:7
      寄存器['270']= 128
      WRITE_PHASE_寄存 器(270)
      等待睡眠(300)

      //设置0x144:0、0x144:1、0x144:7
      寄存器['324']= 131
      WRITE_PHASE_寄存 器(324)
      等待睡眠(300)

      console.log ("写入的相序")

    因此、除了器件时钟的数字延迟外、我们还可以可靠地设置所有内容。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Zvoros、

    就我所能知、第二个序列正在正确执行一切操作来设置固定的数字延迟-当我在实验中使用不同的 CNTH/CNTL 值测试您的同步过程时、我会得到预期的器件时钟到 SYSREF 相位变化。 我确实注意到、在第一个设置块中、您将0/2输出的两个 CNTH/CNTL 寄存器都设置为0、并且您的同步过程写入这些寄存器、但不显式更新它们。 您是否在进行更新并尝试检查器件时钟相对于 SYSREF 的相位位置? 例如、如果在 CNTH+CNTL=4的情况下执行同步例程与 CNTH+CNTL=5的情况下执行同步例程、则器件时钟与 SYSREF 相位之间应存在单个 VCO 周期差异。

    此致、

    Derek Payne

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Derek、

    感谢您的回复!

    [引用 userid="284549" URL"~/support/clock-and-timing/f/clock-timing-forum/987765/lmk04821-difficulty-setting-up-fixed-digital-delay/3652413 #3652413"]I 注意到、第一个设置块中的两个针对0/2输出的 CNTH/CNTL 寄存器都设置为0、同步过程写入这些寄存器、但不显式更新它们。 [/报价]

    那么、这是否意味着一个步骤丢失了?  或者、您的意思是您没有找到寄存器['265']=...  本节中的陈述:

     //通道2的写入阶段、0x109
      WRITE_PHASE_寄存 器(265)
      等待睡眠(300)

    GUI 回调会将相应的值写入寄存器数组,因此缺少的寄存器['265']=... 语句。 以下是 LMK 上的值流、当我们要更改 DCLKout0和 DCLKout2的相位时:  

    [65928]
    [67960]
    [67072]
    [69120]
    [82944]
    [82833]
    [82865]
    [82833]
    [82705]
    [67200]
    [69248]
    [83075]

    前两 个数字是0x101和0x109寄存器、加上它们各自的值。 这些值对应136和120、即、这些值应为我们提供等于16 (8 + 8)和32 (16 + 16)个 VCO 周期的数字延迟。  

    如果我们写入、而不是上面看到的内容  

    [65894]
    [67960]
    [67072]
    [69120]
    [82944]
    [82833]
    [82865]
    [82833]
    [82705]
    [67200]
    [69248]
    [83075]

    我们应该分别得到12 (6 + 6)和32 (16 + 16)个 VCO 周期、即、如果我们测量 SDCLKout1和 DCLKout0之间的相位、我们应该会看到大约2400ps 的额外相移(我们在分频器为2的3GHz VCO 上运行)。 然而,绝对没有任何东西。

    假设第二个输出的设置无关紧要、因为我们测量 SDCLKout1和 DCLKout0之间的相位、并且我们在 SDCLKout1上触发示波器。  SDCLKout1的相位被锁定在50MHz 基准信号上、这是应该的。

    我认为、我们还可以排除 PC 和 LMK 之间的通信问题、因为所有其他设置都会导致我们预期的更改。 我知道我们正在使用定制的硬件和自己的软件、而不是评估板、但我认为我们有许多调试选项、所有这些似乎都表明我们在这方面都是正确的。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Zvoros、

    感谢您的澄清、我指的是寄存器['265']=... 部分、我很清楚、为了更改延迟、正在写入相应的寄存器。 没有缺失的步骤。

    在进行双校验时、我看不到寄存器0x139 (313)写入以更改 SYSREF_MUX 的状态。 用于对 SYSREF_MUX 进行编程的原始值是连续 SYSREF、这表明 SYSREF 分频器输出用作同步信号、而不是切换 SYNC_POL 位。 虽然过去我没有看到将 SYSREF 分频器输出用作其自身源的问题、但这似乎不是您的目的、我怀疑这可能是您问题的原因之一。 在同步过程中、如果 SYSREF_MUX 设置为0 (正常同步)、在清除0x144中的位之前、结果是否发生变化?

    此致、

    Derek Payne

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Derek、

    [引用 userid="284549" URL"~/support/clock-and-timing/f/clock-timing-forum/987765/lmk04821-difficulty-setting-up-fixed-digital-delay/3653793 #3653793"]进行双次检查时、我看不到寄存器0x139 (313)的写入操作来更改 SYSREF_MUX 的状态。 用于对 SYSREF_MUX 进行编程的原始值是连续 SYSREF、这意味着 SYSREF 分频器输出将用作同步信号、而不是切换 SYNC_POL 位。[/引用]

    我认为这是缺失的链接。 以下序列似乎实现了这一目的:  

    异步函数 write_phase (){
      //通道0的写入阶段、0x101
      WRITE_PHASE_寄存 器(257)
      等待睡眠(300)

      //通道2的写入阶段、0x109
      WRITE_PHASE_寄存 器(265)
      等待睡眠(300)

      //清除0x106
      寄存器['262']= 0
      WRITE_PHASE_寄存 器(262)
      等待睡眠(300)

      //清除0x10e
      寄存器['270']= 0
      WRITE_PHASE_寄存 器(270)
      等待睡眠(300)

      //清除0x139:0、0x139:1
      寄存器['313']= 0
      WRITE_PHASE_寄存 器(313)
      等待睡眠(300)

      //清除0x144:0、0x144:1、0x144:7
      寄存器['324']= 0
      WRITE_PHASE_寄存 器(324)
      等待睡眠(300)

      寄存器['323"]= 17  
      WRITE_PHASE_寄存 器(323)
      等待睡眠(200)
      //切换0x143:5
      寄存器['323']= 49  
      WRITE_PHASE_寄存 器(323)
      等待睡眠(2000)
      寄存器['323"]= 17  
      WRITE_PHASE_寄存 器(323)
      等待睡眠(3000)
      寄存器['323"]= 17
      WRITE_PHASE_寄存 器(323)
      等待睡眠(200)

      //设置0x106:7
      寄存器['262']= 128
      WRITE_PHASE_寄存 器(262)
      等待睡眠(300)

      //设置0x10e:7
      寄存器['270']= 128
      WRITE_PHASE_寄存 器(270)
      等待睡眠(300)

      //设置0x144:0、0x144:1、0x144:7
      寄存器['324']= 131
      WRITE_PHASE_寄存 器(324)
      等待睡眠(300)

      //设置0x139:0、0x139:1
      寄存器['313']= 3
      WRITE_PHASE_寄存 器(313)
      等待睡眠(300)


      console.log ("写入的相序")

    非常感谢您与我们的合作。  

    最棒的

    Zoltán μ A