如果你有这样的过程,例如:
process (clk)
if (var = '1') then
var2 = '1';
end if;
if (var2 = '1') then
//do something
end if;
end process;
第二个if语句会在下一个时钟周期执行,还是会在执行var2 ='1'后立即执行?
以下代码是否与上面的代码完全相同?
process (clk)
if (var = '1') then
var2 = '1';
end if;
end process;
process (var2)
if (var2 = '1') then
//do something
end if;
end process;
如果有人能够解释那些很棒的时间问题。
答案 0 :(得分:3)
如果你的var
是变量,那么就不能明智地做第二个选项,因为你不能跨进程使用变量(在大多数情况下,请参阅后面的内容)。如果它们实际上是信号,那么你可以。
在第一个代码中 - 如果它们是变量,那么是的,它们将立即更新,代码的第二部分将运行。
如果它们是信号,那么第二个if
块将仅在下一次运行,因为信号仅在写入它们的过程结束时更新。
第二个示例代码将在第一个代码运行后在下一个“delta cycle”中运行第二个进程,因为它对var2的更改很敏感。
你可以在进程之间使用变量,但必须将它们指定为shared variable
s。如果你使用“直线”着色变量,那么你就会冒着类似于Verilog的竞争条件的风险,因为读取和更新的顺序是不确定的。
你应该使它们成为类似于OO的protected type
,并且具有对值进行操作的方法,这些值允许访问在多个进程中是原子的。
答案 1 :(得分:2)
在您的第一段代码中 - 由于var2
是一个变量,它会立即获得新值。因此,if
语句将看到新值,//do something
将在同一时间片中发生。
(//
评论?真的吗?这是VHDL。我们使用--
)
你的第二段代码无法运作。变量的范围限定为进程,不能用于在进程之间传输值。您必须使用信号,因此规则会发生变化。请考虑以下代码:
signal sig : std_logic := 1;
signal sig2 : std_logic := 0;
process (clk)
if (sig = '1') then
sig2 <= '1';
end if;
if (sig2 = '1') then
-- do something
end if;
end process;
process (sig2)
if (sig2 = '1') then
-- do something else
end if;
end process;
初始条件:sig
为1
,sig2
为0
,因此我们只是等待clk
优势。
当时钟边缘到达时,我们进入第一个流程,我们看到sig
为1
并将1
分配给sig2
。到目前为止一切都很简单,但因为sig2
是一个信号,所以在过程完成之前不会发生任务。比起我们在下一行比较sig2
到1
时,它将是假的(sig2
现在仍然是0
),我们不会{{ 1}}。然后我们结束这个过程。
现在,因为在第一个进程-- do something
更改了值sig2
的末尾,将触发第二个进程(它对0 -> 1
敏感)。它看到sig2
为sig2
,因此1
。
当下一个时钟边缘到来时(使用此代码可能是负边缘),-- do something else
仍然是sig2
,现在我们将1
,我们将会为每个时钟边缘做到这一点。
总之,此代码的事件顺序为:
-- do something
当您理解了排序时,您将理解VHDL如何安排事情的重要部分。