VHDL如果声明

时间:2012-05-20 07:48:35

标签: if-statement vhdl

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

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;

如果有人能够解释那些很棒的时间问题。

2 个答案:

答案 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;

初始条件:sig1sig20,因此我们只是等待clk优势。

当时钟边缘到达时,我们进入第一个流程,我们看到sig1并将1分配给sig2。到目前为止一切都很简单,但因为sig2是一个信号,所以在过程完成之前不会发生任务。比起我们在下一行比较sig21时,它将是假的(sig2现在仍然是0),我们不会{{ 1}}。然后我们结束这个过程。

现在,因为在第一个进程-- do something更改了值sig2的末尾,将触发第二个进程(它对0 -> 1敏感)。它看到sig2sig2,因此1

当下一个时钟边缘到来时(使用此代码可能是负边缘),-- do something else仍然是sig2,现在我们将1,我们将会为每个时钟边缘做到这一点。

总之,此代码的事件顺序为:

-- do something

当您理解了排序时,您将理解VHDL如何安排事情的重要部分。