If statement VHDL If语句

If statement VHDL If语句,if-statement,vhdl,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;

例如,如果您有这样一个过程:

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;

如果有人能解释一下计时问题,那就太好了。

在您的第一段代码中-因为
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;

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

在您的第一段代码中-因为
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;

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

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

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

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

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


您可以在进程之间使用变量,但必须将它们指定为
sharedvariable
s。如果您使用“直接”shaed变量执行此操作,您将面临可怕的Verilog类竞争条件的风险,因为读取和更新的顺序尚未定义


您应该将它们设置为
受保护类型
,这有点像OO,并且具有对值进行操作的方法,这些值允许跨多个进程进行原子访问。

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

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

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

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


您可以在进程之间使用变量,但必须将它们指定为
共享变量
s。如果您使用“直接”shaed变量,则由于读取和更新的顺序未定义,您将面临可怕的Verilog竞争条件的风险


您应该将它们设置为
受保护类型
,这有点像OO,并且有一些方法可以对值进行操作,这些值允许跨多个进程进行原子化访问。

嗨,谢谢您的回答,我现在明白了。但是由于sig您是对的。它将继续被指定为
1
,但这与c不同当前值它不会导致第二个进程重新评估。我只列出了可能导致某些事情发生的赋值。嗨,谢谢你的回答,我现在明白了。但是因为sig你是对的。它将持续被赋值
1
,但由于这不是当前值的更改,因此不会导致第二个进程重新评估重新评估。我只列出了可能导致某些事情发生的作业。