首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VHDL If语句

VHDL If语句
EN

Stack Overflow用户
提问于 2012-05-20 15:48:35
回答 2查看 3.3K关注 0票数 1

如果您有一个类似这样的进程,例如:

代码语言:javascript
复制
process (clk)
if (var = '1') then
   var2 = '1';
end if;

if (var2 = '1') then
   //do something
end if;
end process;

第二个if语句是在下一个时钟周期执行,还是在var2 = '1‘执行后立即执行?

下面的代码会和上面的代码做完全一样的事情吗?

代码语言:javascript
复制
process (clk)
if (var = '1') then
   var2 = '1';
end if;
end process;

process (var2)
if (var2 = '1') then
   //do something
end if;
end process;

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-21 20:11:36

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

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

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

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

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

您应该让它们成为一个有点像面向对象的protected type,它有一些方法可以对值进行操作,从而允许跨多个进程的访问是原子的。

票数 3
EN

Stack Overflow用户

发布于 2012-05-20 19:32:38

在您的第一段代码中-因为var2是一个变量,所以它将立即获得新值。因此,if语句将看到新值,并且//do something将在同一时间片中发生。

(//评论?真的?这是VHDL。我们使用--)

你的第二段代码不能工作。变量的作用域是一个进程,不能用来在进程之间传输值。您必须使用信号,因此规则会发生变化。考虑下面的代码:

代码语言:javascript
复制
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时,它将是false (现在sig2仍然是0 ),我们不会使用-- do something。然后,我们结束该过程。

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

当下一个时钟边沿到来时(这段代码可能是负边沿),sig2仍然是1,所以现在我们将-- do something,我们将对每个时钟边沿执行-- do something

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

代码语言:javascript
复制
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如何调度事情的一个重要部分。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10671705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档