Vhdl HDLs中的组合循环

Vhdl HDLs中的组合循环,vhdl,verilog,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答案也很好) 这是必要的,但还不够。上述所有情况都是正确的,但00=>01也是正确的。事实上,当r1=r2

这只是一个实验,我正试图让我的大脑思考

我有两个寄存器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答案也很好)

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


有没有办法在w1的作业中不包含r2就得到我想要的结果,反之亦然?(并且不引入新变量)。基本上只是为了确保在一个布线周期中,w1被拉高,w2被拉低?

不,我认为没有额外的布线/信号,没有你的交叉依赖,没有干净的方法来做到这一点

顺便说一句,您的“循环线路”通常被称为组合回路,避免这种情况是一种很好的做法

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

  • 同样,即使您的模拟是正常的,并且您的合成工具允许这样做,也应该避免组合循环。

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

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


    这一变化将修正你的比赛状态;尽管如上所述,但要小心组合逻辑造成的巨大限制。

    另一个常见名称是组合循环。不管怎样,它们都不是一个好主意。我能问你为什么不想在W1的公式中包含R2,而它显然是R2的函数吗?“我想不出有什么好的理由来解释这个问题。”蒂姆·朗回答说:我正试图编写一个纯粹基于反馈循环的数独解算器。寄存器代表初始的谜题值,导线形成一个反馈回路,消除未解决单元中的潜在值。简化为2x1数独:我们知道solved1=r1 |!可能2,可能2=r2 |!解算1,同上。我有一个迭代工作的解决方案,消除了“可能”的连线,只是做了一些类似于
    r1的事情。显然,完整的数独问题有更多的变量和更多的相互依赖性,所以跟随它们回到原点并将其内联,我甚至不知道这是否可能。因此无法将寄存器包含在电线公式中。是的,完整的数独解算器将非常复杂,但我看不出仅使用这样的电线就可以实现(如果这是您的最终目标,它在硅/fpga中永远不会工作)。如果你有一个没有时钟的反馈回路,那么你就不能保证任何导线在任何时候的状态。电路中的不同电线以不同的速度运行,几乎不可能以高水平组织任何东西。也许你能把“w”改成一个寄存器,然后把它计时几次迭代,在你的反馈中迭代直到达到平衡吗?@Tim,这是一个,有时有效,但有时无效(即使在同一个谜题上),也就是说,反馈循环中存在一些非确定性,wap26已经建立了。这是一个通常在6-7个刻度内有效的方法(假设这个难题可以通过简单的消去法解决)。第三种方法是只使用电线,我想是将一次迭代的输出反馈到第二次迭代,以此类推,但我们必须确定迭代的数量;10个就够了。
    
    assign w1 = r1 | !w2;
    assign w2 = r2 | !w1;