组合逻辑的设计过程中,第一个容易出现的问题是生成了环形结构。环形结构意味着设计的时候一定是把某个过程中的输出又反馈回去作为输入了。看下面这个例子。
例17.8:有环形结构的组合逻辑电路。
综合以后的电路如图17.10所示。
图17.10 组合逻辑实例综合的电路
其中,out作为输出,又反馈回去,与in3进行或运算。这样设计的组合逻辑是有问题的。我们在设计组合逻辑的时候,用通俗的话来说,就是不需要时序控制,只要输入有,输出就有。只要输入没有,输出就立刻没有。输出会在瞬间反应出来形成输出(当然要考虑一定延时)。形成环形的结构会有什么问题呢?它会导致信号的紊乱,容易出现毛刺。
所以,在设计组合逻辑的时候,要记住的第一条就是:组合逻辑电路就是一级一级地往右传递,别回头。
组合逻辑的设计过程中,第二个容易出现的问题是信号敏感列表里遗漏了一些信号。既然说到信号敏感列表,那就意味着这种语句结构指的是always语句块。看下面这个例子。
例17.9:有信号敏感列表遗漏的组合逻辑电路。
我们看上面这段代码,其实它就是个简单的组合逻辑。综合以后的电路如图17.11所示。
图17.11 信号敏感列表遗漏的组合逻辑电路综合的结果
这段代码其实就是in1和in2相异或,然后异或的结果再和in3进行与,其结果作为输出。可是,在always语句块的信号敏感列表里,遗漏了in3。这就会导致仿真和综合出现矛盾。
所以,在设计组合逻辑的时候,要记住的第二条就是:组合逻辑电路就是要把所有要在进程中读取的信号、等号右边的所有信号、条件表达式的所有信号,都要列在信号敏感列表里,别遗漏。(www.xing528.com)
组合逻辑的设计过程中,第三个容易出现的问题是生成了锁存器。组合逻辑电路里是不应该出现锁存器的。出现锁存器,它就不是组合逻辑电路了。我们先看一个包含case语句的组合逻辑电路的例子。
例17.10:包含case语句的组合逻辑电路。
它综合以后的电路如图17.12所示。
图17.12 case语句的组合逻辑综合的电路
这个例子里,我们的期望是通过in1和in2信号的组合变化,生成一个时钟脉冲。当in1或者in2有变化时,进入case语句。语句1说的是当拼接信号{in1,in2}为“00”时,输出时钟clk为低电平0;语句2说的是当拼接信号{in1,in2}为“10”时,输出时钟clk为高电平1。那么问题来了,当in1或者in2变化了,拼接信号变为“11”时,输出什么呢?信号敏感列表的值变了,此刻,确实会进入always块执行,但是case语句找不到该如何执行。于是就会保持上一刻的值。这就出现了锁存器。这就违背了我们设计该组合逻辑电路的初衷了。
那么遇到这种情况应该怎么做呢?方法就是在case语句里把该写的分支项都写完,不想写的就写到default项。case语句的所有可能性都被表述清楚了,没有含糊其辞的地方,执行时就按照分支项挑选就行。这就是组合逻辑电路应该长的样子。
我们再来看一个包含if-else复合语句的组合逻辑电路的例子。
例17.11:包含if-else复合语句的组合逻辑电路。
它综合以后的电路如图17.13所示。
图17.13 if-else复合语句的组合逻辑综合的电路
上面这个例子考虑到了拼接信号{in1,in2}的两种可能“01”和“11”,却没有考虑到其他可能性。拼接信号如果出现其他变化,就只能依靠锁存器来产生输出了。所以对于if复合语句,在使用的时候,应该把所有的可能性描述齐全。具体来说,对于这个例子,应该在语句1的下一句,添加else描述。
所以,在设计组合逻辑的时候,要记住的第三条就是:组合逻辑电路就是要在case语句和if-else语句里把所有的可能性都描述齐全,别省略。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。