[VHDL]为什么求和循环中需要一个辅助变量

[VHDL]Why the need for an auxiliary variable in sum loop

我编写了一个对浮点数组的内容求和的过程。该数组的长度为 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里面的代码被执行了多次?

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

sum_aux := to_float(0.0); 是必需的,因为如果没有这一行,变量将保留上次处理 运行 时设置的值。请记住,您的求和线看起来像 sum_aux := sum_aux +,因此如果不进行重置,它只会变得越来越大。

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

考虑到这一点,您的 'sum' 只是继续安排 0.0 + 0.5 的相同添加,然后安排 当前 值的分配 array_sumresult。我希望有以下顺序:

  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