2
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 运行时它会改变?

还有声明 c <= a and b after 1ns; 在过程之外,它如何与之后一起工作?如果没有之后,它只是一个 AND 单元,没有延迟。

4

2 回答 2

2
wait on a,b,c;

等待一个信号在增量周期内进行交易。

如果碰巧两个或全部“激活”,对模拟器没有任何影响,它仍然会退出等待。它不会在剩余信号上“保存”当前增量周期中的事务并将它们转发。

于 2013-02-01T13:39:17.363 回答
1

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

至于触发一次或两次的进程,这将取决于 a 或 b 上的事件是否发生在同一个增量周期中。在流程中添加报告语句并找出答案。

因为进程通过延迟语句驱动 A 和 B,所以我希望这两个分配在相同的增量周期中起作用;时间步长的第一个增量,所以我希望它被触发一次。

现在,如果您引入了一个新信号“e”并将其从进程中驱动而不是“b”,并b <= e;在进程外部添加了信号分配,那么您已经在“b”中引入了一个增量周期延迟,然后进程应该被唤醒两次。

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

您可能会发现此答案有助于理解增量循环模型。

于 2013-01-30T16:30:39.607 回答