1

例如,如果您有这样的过程:

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;

如果有人可以解释时间问题,那就太好了。

4

2 回答 2

3

如果您var的 s 是变量,那么您不能明智地执行第二个选项,因为您不能跨进程使用变量(在大多数情况下,请参见下文)。如果它们实际上是信号,那么可以。

在第一个代码中 - 如果它们是变量,那么是的,它们将立即更新并且代码的第二部分将运行。

如果它们是信号,那么第二个if块将仅在下一次运行,因为信号仅在写入它们的进程结束时更新。

第二个示例代码将在第一个运行后的下一个“增量周期”中运行第二个进程,因为它对 var2 上的更改很敏感。


可以在进程之间使用变量,但必须将它们指定为shared variables。如果你用“直接”的着色变量来做这件事,你会冒着可怕的类似 Verilog 的竞争条件的风险,因为读取和更新的顺序是未定义的。

您应该使它们protected type有点像 OO,并且具有对值进行操作的方法,从而允许跨多个进程进行原子访问。

于 2012-05-21T12:11:35.940 回答
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;

初始条件:sigis1sig2is 0,所以我们只是在等待clk边缘。

当时钟沿到达时,我们进入我们看到的第一个进程,sig1分配1sig2。到目前为止一切都很简单,但是因为sig2是一个信号,所以在过程完成之前不会发生分配。比意味着当我们在下一行比较时,它会是假的(sig2现在仍然是),我们不会。然后我们结束这个过程。1sig20-- do something

现在,因为在第一个进程sig2更改值结束时,0 -> 1第二个进程将被触发(它对 敏感sig2)。它看到了sig21所以它会-- do something else的。

当下一个时钟沿到来时(并且它可能是此代码的负沿),sig2仍然1如此,所以现在我们将-- 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 如何安排事物的重要部分。

于 2012-05-20T11:32:37.897 回答