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.

TMS320F280025C: CLB HLC 模块 读取计数器值,MOV C0,R3不正确

Part Number: TMS320F280025C

我使用CLB的 HLC模块,碰到一些问题,请帮忙解答!

我要实现的功能是,读取Counter0的值C0写入R3,

R3减小 R1 写入 Counter1  MATCH1.

R3加上R2写入 Counter1  MATCH2.

我做了如下实验。

Counter0   MATCH1 =  90   MATCH1 =  180

R1_init = 20

R2_init = 40

HLC Event 0 (e0) = COUNTER_0.count_match1

Program0 :

                MOV C0,R3

               SUB R1,R3

              MOV_T1 R3,C1

              ADD R2,R3

             MOV_T2 R3,C1

理论计算:

在COUNTER_0.count_match1 事件,读取C0 ,C0应该等于90 (或者91)

Counter0   MATCH1 =  70   MATCH2 =  110

实测时,有时候读取C0值,不正常,比90大很多

             

  • 您好我们已收到您的问题并升级到英文论坛,如有答复将尽快回复您。谢谢!

  • 您好,您能否提供得到的示例 C0 值? 工程师怀疑可能是 HLC 事件触发器和 MOV 命令之间的一些延迟造成的,不过还需要看下您的具体数据再来确定。

  • 谢谢回复,

    刚才做的实验:

    Counter0   MATCH1 =  100   MATCH2 =  200

    R1_init = 10

    HLC Event 0 (e0) = COUNTER_0.count_match1

    Program0 :

     MOV C0,R3

    SUB R1,R3

    MOV_T1 R3,C1

    实现的功能:在COUNTER_0.count_match1 读取 C0的值,并减10,写入到C1的match1  。C1的match1 应该在90左右

    实测波形,大部情况下,都是正常的。偶尔出现异常、

    Figure 1/2 是正常的波形

    Figure 3是,异常的波形

    可否帮忙确定几个时间量:

    1、从 HLC Event 0 (e0) = COUNTER_0.count_match1 触发 ,到 Program0 : MOV C0,R3 执行需要多少时间?

    2、 HLC 的 指令周期是多少? 是不是和CLB CLK 一样 10ns?

  • 感谢您提供的信息。如果理解的没错,包含计数器 0 的 HLC 程序在大多数时间内都按预期工作,但在某些情况下会发生故障 (如figure 0 中波形的圆圈部分所示)。 是这样吗?

    如果是的话,您能否提供以下信息:

    1. 该问题是在运行程序后,定期出现还是随机发生的?
    2. 波形是否在毛刺之后的周期内受到影响? 从第一组图像来看,计数器看起来在一致运行,计数器 1 匹配值在一个周期内不会进入高电平。 但是从figure 0 看来,后续周期似乎在第一次毛刺 后被拉长。
    3. 管道模式是否已使能?

    可否帮忙确定几个时间量:

    1、从 HLC Event 0 (e0) = COUNTER_0.count_match1 触发 ,到 Program0 : MOV C0,R3 执行需要多少时间?

    2、 HLC 的 指令周期是多少? 是不是和CLB CLK 一样 10ns?

    刚开始我们以为问题是所有 C0 值读数都不正确,不过现在看来问题是 C0 值偶尔会很长。 这个时间没有相关记录,所以工程师这边需要做一些研究。 理想情况下,HLC 触发条件后的指令应在后续 CLB 时钟周期中发生,HLC 指令应每个执行一个 CLB 时钟周期。

  • 1、运行程序后,异常是随机出现的

    2、从我多次实验观察的结果,应该不是受毛刺影响而产生异常。我给出的图像出现的毛刺是由于 C0 值读取异常才导致的毛刺。

    3、 PIPELINE_EN 没有使能

    我将PIPELINE_EN  使能后,测试的结果没有改善。

  • 好的感谢您提供的信息。

    请问下Counter 0 Match2 = 200的用途是什么? Match2 值是专门用来做什么的吗?

    如果不是的话,您可能要尝试的添加以下内容:每当到达 counter0.match1 时停止Counter0计数。 像您说的,您希望 Counter1的值为 90。通过触发 counter0.match1 时停止 Counter0 值,可以确保当counter 0 值为 MOV 到 R3 时,counter 0 值将为 100,并且counter 0 不会超过 match1 值。

    可以通过将 counter0.match1 信号用于某些 LUT 和 FSM 子模块并将其连接到 counter0 的 Modex 来实现,从而在必要时禁用计数和复位 / 恢复。您看下您这边能不能添加。

  • 新的实验数据

    我将COUNTER_0 及 COUNTER_1设置成同时启动

    COUNTER_1:配置如下

    event =  COUNTER_0.count_zero  

    event_load_val = 0

    mode1 = 1

    What action should be taken on an event trigger = load

    实现的功能:

    COUNTER_0.count_zero事件产生时,加载COUNTER_1 = 0,置位COUNTER_1.mode0 = 1 ,允许COUNTER_1向上计数 (此功能由LUT FSM实现)

    COUNTER_0.count_match1事件产生时,清零COUNTER_1.mode0 = 0,停止COUNTER_1计数。

    COUNTER_0.count_match1触发 HLC  MOV C1,R3读取 C1的值。此时COUNTER_1已经停止,

    读取COUNTER_1的值应该接近 COUNTER_0.count_match1的值。

    实际测试结果,大部分时间读取是正确的,但还是随机出现异常,读取不正确。

    *** HLC  MOV C1,R3读取 C1的值 ,到下一个COUNTER_0.count_zero 重新允许COUNTER_1向上计数 已经留有足够的时间

     

  • 您好,很奇怪的是大部分时间都是正常工作的,但会错过一些匹配周期。 请问您的开发环境是什么样的? 您使用的是 LaunchPad/controlCARD 还是自定义板? 如果有自定义板子的话,可能会有什么东西影响时钟。

    您再试下以下方法:(在完成上一条评论中描述的逻辑之前)

    将匹配值改为更高的数字 (例如,让 counter0_match1 等于1000 或 2000,不要 100)。 然后按相同系数更改其他匹配值。 这可以增加匹配条件之间的时间间隔。 修改完后,您看下匹配异常发生的频率有没有更低或者根本不发生?

    通过以上方法我们可以了解最初的方法中的匹配条件是否过于频繁,以至于 HLC 无法执行该程序。