3

这只是我试图围绕我的大脑进行的一个实验。

所以我有两个寄存器 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 时,它只是创建了一个没有驱动程序的电线循环,所以我认为结果是不确定的。

有没有什么方法可以得到我正在寻找的结果而不包括 r2 在 w1 的分配中,反之亦然?(并且没有引入新变量)。基本上只是为了确保在一个导线周期中,w1 被拉高而 w2 被拉低?

4

2 回答 2

7

不,我认为没有额外的电线/信号并且没有交叉依赖,没有干净的方法可以做到这一点。

顺便说一句,您的“循环线”通常被称为组合循环,避免这些是一个好习惯。

  1. 对于具有组合回路的 VHDL 模型的仿真,只要仿真器收敛到一个稳定点,即不再有信号值变化,结果是确定性的。如果信号值不断变化,那么您很可能会达到模拟器的迭代限制。我不知道 Verilog,但我认为它也是确定性的。
  2. 至于综合,工具要么拒绝此构造并引发错误,要么尝试处理此问题,这可能对时序产生非常糟糕的影响。

同样,即使您的仿真没问题并且您的综合工具允许这样做,也应该避免组合循环。

于 2012-07-04T16:15:39.060 回答
1

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

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

该更改应该可以解决您的比赛状况;尽管如上所述,但要警惕组合逻辑造成的巨大限制。

于 2012-07-05T22:48:22.713 回答