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
,但由于这不是当前值的更改,因此不会导致第二个进程重新评估重新评估。我只列出了可能导致某些事情发生的作业。