如果您有一个类似这样的进程,例如:
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;如果有人能解释一下时间问题,那就太好了。
发布于 2012-05-21 20:11:36
如果您的var是变量,那么您不能明智地执行第二种选择,因为您不能跨进程使用变量(在大多数情况下,请参见后面的内容)。如果它们实际上是信号,那么是的,你可以。
在第一段代码中-如果它们是变量,那么是的,它们将立即更新,代码的第二部分将运行。
如果它们是信号,那么第二个if块将只在下一次运行,因为信号只在写入它们的进程结束时更新。
第二个示例代码将在第一个进程运行后的下一个“增量周期”中运行第二个进程,因为它对var2上的更改很敏感。
你可以在进程之间使用变量,但它们必须指定为shared variables。如果你使用“直接的”shaed变量这样做,你会冒着可怕的类似Verilog的竞争条件的风险,因为读取和更新的顺序是不确定的。
您应该让它们成为一个有点像面向对象的protected type,它有一些方法可以对值进行操作,从而允许跨多个进程的访问是原子的。
发布于 2012-05-20 19:32:38
在您的第一段代码中-因为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时,它将是false (现在sig2仍然是0 ),我们不会使用-- do something。然后,我们结束该过程。
现在,因为在第一个进程结束时sig2更改了值0 -> 1,第二个进程将被触发(它对sig2很敏感)。它看到sig2是1,因此它将使用-- do something else。
当下一个时钟边沿到来时(这段代码可能是负边沿),sig2仍然是1,所以现在我们将-- do something,我们将对每个时钟边沿执行-- do something。
总而言之,此代码的事件顺序为:
Clk : 0->1
Sig2 : 0->1
-- Do Something Else
Clk : 1->0
-- Do Something
Clk : 0->1
-- Do Something
Clk : 1->0
-- Do Something
Clk : 0->1
-- Do Something
.........当你理解了这种排序,你就会理解VHDL如何调度事情的一个重要部分。
https://stackoverflow.com/questions/10671705
复制相似问题