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 无法执行该程序。