假设我有一个信号
B
,它根据信号 A
评估其值。将整个操作写在一行中很混乱,所以我想使用中间信号A_rounded
(我的实际代码比这复杂得多,所以我必须使用中间阶段)。
A_rounded <= A + shift_left(to_signed(1, 32), 28-InputFracPart);
B <= shift_right(A_rounded, 29-InputFracPart);
如果我将这些行放入时钟进程中:
process(clk)
begin
if rising_edge(clk) then
A_rounded <= A + shift_left(to_signed(1, 32), 28-InputFracPart);
B <= shift_right(A_rounded, 29-InputFracPart);
end if;
end process;
需要 2 个周期才能从
B
计算出 A
的新值。但我希望它是 1。
我能想到将其减少到 1 的唯一方法是在流程之外采取中间步骤,如下所示:
A_rounded <= A + shift_left(to_signed(1, 32), 28-InputFracPart);
process(clk)
begin
if rising_edge(clk) then
B <= shift_right(A_rounded, 29-InputFracPart);
end if;
end process;
是否有另一种方法可以在将流程内的逻辑保持在一起的同时做到这一点?
在VHDL中,如果您想在一个时钟周期内执行时钟进程内的中间计算,您可以使用变量而不是信号。变量在流程中立即更新,并且可以在同一周期中立即使用。这使您可以在流程中保持逻辑一致。
您可以这样修改代码:
process(clk)
variable A_rounded_v : signed(31 downto 0);
begin
if rising_edge(clk) then
A_rounded_v := A + shift_left(to_signed(1, 32), 28 - InputFracPart);
B <= shift_right(A_rounded_v, 29 - InputFracPart);
end if;
end process;
这里,由于
A_rounded_v
是一个变量,因此您可以计算它并立即使用它在同一时钟周期内计算B
。这样,您就可以将所有逻辑保留在进程内,并实现您想要的单周期计算。