【问题标题】:[VHDL]Why the need for an auxiliary variable in sum loop[VHDL]为什么求和循环中需要一个辅助变量
【发布时间】:2016-02-28 11:18:35
【问题描述】:

我编写了一个对浮点数组的内容求和的过程。该数组的长度为 6,并且有 6 次相同的值,即 0.5。所以数组的和是3.0。

流程是这样的:

signal array_sum  : float32 := to_float(0.0);
begin
....

sum_proc:process(clk)
begin
    if(rising_edge(clk)) then
        for i in 0 to size_array - 1 loop
             array_sum <= array_sum + array_float(i);
        end loop;
    result <= array_sum;
    end if;
end process;

结果是 1.5..

但是,如果我使用辅助值,它会起作用,结果是 3.0:

sum_proc:process(clk)
    variable sum_aux : float32;
begin
    sum_aux := to_float(0.0);
    if(rising_edge(clk)) then
        for i in 0 to size_array - 1 loop
             sum_aux := sum_aux + array_float(i);
        end loop;
    result <= sum_aux;
    end if;
end process;

我似乎无法理解为什么会发生这种情况。谁能解释一下?

另外,sum_aux 初始化为 0.0 需要在 begin 内部完成,否则结果不正确。是不是因为只有begin里面的代码被执行了多次?

【问题讨论】:

    标签: loops vhdl


    【解决方案1】:

    以相反的顺序回答这些问题:

    sum_aux := to_float(0.0); 行是必需的,因为没有它,变量将保存上次进程运行时设置的值。请记住,您的总和线看起来像sum_aux := sum_aux +,所以如果没有重置,它只会变得越来越大。

    您的第一个示例不起作用,因为信号分配仅安排在下一个增量周期中进行,它们实际上并没有在到达时发生。在当前周期中所有进程都运行之后,将发生另一个增量周期。

    考虑到这一点,您的“总和”只是在安排将array_sum当前 值分配给result 之前,一直安排0.0 + 0.5 的相同添加。我希望以下顺序:

    1. 观察到第一个时钟沿。 0.0 + 0.5 评估了 n 次。进程中特定信号的最终分配优先,因此这些结果中的最后一个 (0.5) 被调度。此时array_sum 仍为0.0
    2. 计划为result 分配此值0.0
    3. 进程结束;现在进行预定的信号分配。
    4. 观察到下一个时钟沿。 0.5 + 0.5 评估了 n 次。最后一个结果 (1.0) 已安排。此时array_sum 仍为0.5
    5. result 被分配了这个值0.5
    6. 进程结束;现在进行预定的信号分配。

    等等。然后,我希望result 在随后的每个时钟沿上继续增加0.5

    【讨论】:

    • 很好的解释!非常感谢
    猜你喜欢
    • 1970-01-01
    • 2011-12-07
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2013-10-17
    • 2016-05-30
    相关资源
    最近更新 更多