蓝冠招商《Q374919》在使用过程代码创建组合逻辑时,蓝冠招商 需要小心地定义通过逻辑的所有路径。如果我们不这样做,我们可能会无意中在我们的设计中制造障碍。这些门闩会破坏我们的模拟结果、定时结果和区域结果。
上个月,我们学习了如何使用过程代码创建复杂的组合逻辑。我们看到,通过在程序过程中创建自己的逻辑,可以用加法器节省相当大的空间。本周,我们将研究组合程序可能产生的副作用——意外锁存。
意外的锁闩是不好的。除了使狗狗嚎叫,导致儿童哭泣,弯曲您的脊椎,它们将在您的RTL和门级模拟之间创建仿真不匹配,在您的FPGA中占用额外的空间,并搞砸您的时间分析。您确实不希望在设计中出现意外锁存。
当我们忘记处理组合代码中所有可能的条件时,合成工具会创建意外的锁存。让我们看一个意外锁存的例子。这种设计应该采用8位输入,蓝冠官网 并对其进行递增或递减。我们有一个增量信号让我们增加数据,一个递减信号让我们减少数据。但是我们忘记了增量和减量都不增加的情况:
就这样,在你所谓的组合逻辑中间有一个大的锁存器。这个锁存出现是因为我们忘记描述inc和dec都很低的情况。因为我们没有告诉我们的逻辑,如果两个信号都很低,会发生什么,合成工具被迫在这些情况下保存那个值,因此我们有一个闩锁,由两个信号的OR控制。
注意,我们确实指定了两个信号都很高的情况。这是因为我们的IF语句具有优先级。如果inc信号是高的,那么dec从未检查。合成工具在这里做了一点巧妙的设计。它只使用inc作为加法器的控制,它依赖于这样一个事实,蓝冠注册 即一个低的dec信号会在锁存器上阻止一个递减的输出。
那么我们如何解决这个问题呢?我们指定dec低的其他情况。因为dec只在inc低的情况下被检查,这处理的情况都是低的。正如我们在下面看到的,这删除了闩锁并返回到组合逻辑。
有意的门闩
如果我们想要锁定我们的数据呢?我们能忽略组合逻辑中所有的状态吗?答案是肯定的,但有一个警告。考虑下面的ALU。如果op是“11”,我们希望这个ALU保持它的值。所以我们创建了下面的case语句:
乍一看,这是完美的。我们得到了我们想要的东西,一个MUX输入一个锁存器,锁存器是由两个op信号相加控制的。但是,这里有一个问题。我们的门闩没有复位。这意味着门级模拟和RTL模拟不能匹配。锁存器要么在开始时包含X而不被清除,要么它将包含一个默认的门值,比如0。在任何一种情况下,如果我们想要确认它的行为,这个设计都会遇到麻烦。