VHDL等待多个信号

时间:2013-01-30 15:54:41

标签: vhdl hdl modelsim

signal a:bit:='1'; signal b:bit:='0'; signal c:bit:='0';
begin
  process
  variable d:bit:='0';
    begin
    if (a='1')or(b='0') then a <= inertial not d after 1ns;
  else a<=inertial not c after 1.5ns;
    end if;
    d := a and b;
  b <= inertial (b)nand(a or d) after 1ns;          
  wait on a,b,c;end process;
  c <= a and b after 1ns;
end Behavioral;

如果a和b同时改变它们的值,前者为2ns

,会发生什么

这个过程会触发2次吗?

如果确实如此,那么应该将哪些值用于a,b,如果我们要通过a事件的过程,那么b信号是在那时改变了,还是当b再次运行时它会被改变?

1ns后声明c&lt; = a和b;在这个过程之外,它如何与之相关?如果之后没有,它将只是一个AND单位,没有延迟。

2 个答案:

答案 0 :(得分:2)

wait on a,b,c;

在delta周期期间等待其中一个信号进行事务处理。

如果发生了两个或全部&#34;激活&#34;,它对模拟器没有任何影响,它仍然会退出等待。它赢了&#34;拯救&#34;来自当前delta周期的剩余信号的交易并将它们转发。

答案 1 :(得分:1)

我希望你理解这个过程不会正确合成!

对于触发一次或两次的过程,这将取决于a或b上的事件是否出现在相同的增量循环中。向流程添加Report语句并查找。

因为进程通过延迟语句驱动A和B,所以我希望两个赋值都在相同的delta周期内运行;时间步长的第一个增量,所以我希望它能被触发一次。

现在,如果您引入了一个新信号“e”并将其从过程中驱逐而不是“b”,并在过程外添加了信号赋值b <= e;,那么您已将delta循环延迟引入“b”然后这个过程应该醒来两次。

语句c <= a and b after 1ns;本质上是对a和b敏感的单独进程,因此它应该以相同的方式工作。

您可能会发现this answer有助于理解增量循环模型。