[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_sum
到 result
。我希望有以下顺序:
- 观察到第一个时钟边沿。
0.0 + 0.5
评估了 n 次。进程中特定信号的最终分配优先,因此这些结果中的最后一个 (0.5
) 被安排。此时 array_sum
仍然是 0.0
。
- 计划为
result
分配此值 0.0
。
- 进程结束;预定的信号分配现在开始。
- 观察到下一个时钟边沿。
0.5 + 0.5
评估了 n 次。这些结果中的最后一个 (1.0
) 已安排。此时 array_sum
仍然是 0.5
。
- 给
result
赋值0.5
。
- 进程结束;预定的信号分配现在开始。
等等。然后我希望 result
在每个后续时钟边沿上继续增加 0.5
。
我编写了一个对浮点数组的内容求和的过程。该数组的长度为 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_sum
到 result
。我希望有以下顺序:
- 观察到第一个时钟边沿。
0.0 + 0.5
评估了 n 次。进程中特定信号的最终分配优先,因此这些结果中的最后一个 (0.5
) 被安排。此时array_sum
仍然是0.0
。 - 计划为
result
分配此值0.0
。 - 进程结束;预定的信号分配现在开始。
- 观察到下一个时钟边沿。
0.5 + 0.5
评估了 n 次。这些结果中的最后一个 (1.0
) 已安排。此时array_sum
仍然是0.5
。 - 给
result
赋值0.5
。 - 进程结束;预定的信号分配现在开始。
等等。然后我希望 result
在每个后续时钟边沿上继续增加 0.5
。