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

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大很多

             

Cherry Zhou:

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

,

Cherry Zhou:

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

,

wells:

谢谢回复,

刚才做的实验:

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?

,

Cherry Zhou:

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

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

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

wells 说:

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

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

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

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

,

wells:

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

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

3、 PIPELINE_EN 没有使能

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

,

Cherry Zhou:

好的感谢您提供的信息。

请问下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 来实现,从而在必要时禁用计数和复位 / 恢复。您看下您这边能不能添加。

,

wells:

新的实验数据

我将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向上计数 已经留有足够的时间

 

,

Cherry Zhou:

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

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

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

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

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F280025C: CLB HLC 模块 读取计数器值,MOV C0,R3不正确
分享到: 更多 (0)