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.
我使用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大很多
谢谢回复,
刚才做的实验:
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、从 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 无法执行该程序。