HDL中的组合循环

时间:2012-07-04 15:57:02

标签: vhdl verilog

这只是我试图包裹大脑的实验。

所以我有两个寄存器r1 r2和两根电线w1 w2。我想要的是,如果两个r都是1,则两个w应该是1.如果一个r是1,则相应的w应该是1而另一个应该是0.如果两个r都是0,则w1应该是1,w2应该是0

11 => 11

10 =大于10

01 => 01

00 =大于10

需要注意的是,我希望w1的分配不直接包含r2,反之亦然。所以,我有(例如在Verilog中 - VHDL答案也会非常好)

assign w1 = r1 | !w2;
assign w2 = r2 | !w1;

这是必要但不充分的。以上所有情况都是正确的,但00 => 01也是如此。事实上,当r1 = r2 = 0时,它只是创建了一个没有驱动程序的导线循环,所以我认为结果是不确定的。

有没有办法得到我正在寻找的结果,而不是在w1的赋值中包含r2,反之亦然? (并且不引入新变量)。基本上只是为了确保在线周期中,w1被拉高并且w2被拉低?

2 个答案:

答案 0 :(得分:7)

不,我认为如果没有额外的电线/信号且没有交叉依赖性,就没有干净的方法。

顺便说一句,你的“周期性电线”通常被称为组合循环,避免这些是一种好习惯。

  1. 对于具有组合环的VHDL模型的仿真,如果模拟器收敛到稳定点,即不再有信号值变化,则结果是确定性的。如果信号值不断变化,那么您可能会达到模拟器的迭代限制。我不知道Verilog,但我认为它也是确定性的。
  2. 至于综合,工具要么拒绝这个构造并引发错误,要么尝试处理这个问题,可能会对时间产生非常糟糕的影响。
  3. 同样,即使您的模拟正常并且您的综合工具允许这样做,也应避免使用组合循环。

答案 1 :(得分:1)

您目前所拥有的与SR锁存器非常相似,因此它具有亚稳态(也称为竞争条件)。

从上面的真值表中看,w2应该只设置为r2。 assign w2 = r2;

这种改变应该能够解决你的竞争状况;尽管如上所述,但要警惕组合逻辑造成的大量限制。