数电-02组合逻辑
Posted _Chance_Zhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数电-02组合逻辑相关的知识,希望对你有一定的参考价值。
组合逻辑
The combinational logic serves as a fundamental and crucial topic in both digital design and RTL coding. There are several ways to view it. Firstly, it can be naturally regarded as an extension of the basic gates built by CMOS in the digital integrated circuit. From discrete math, it is an important implementation of the Boolean Algebra. In a way, it is the superset of Boolean Algebra, which contains more on the RTL design. Additionally, it is the core of the Turing Machine, from the perspective of the theory of computation. Supposing readers have prior knowledge of the CMOS gates and Boolean Algebra, this paper will introduce the combinational logic focusing on the RTL design. It will start with some basic description and then move to the design methodology. Especially, phenomena including race and the resulting hazard will be introduced, along with the possible solutions. In the end, some commonly used modules of combinational logic will be attached. This will include function description, I/O description and Verilog coding. However, it is beyond the scope of this paper to explain static time analysis and improvement methods. The reader should check books introducing complex ASIC design to find them, or simply wait for my updates.
1 简单介绍
组合逻辑的出现是比较早的, 它的思想也比较简单. 组合逻辑可以用以下方式描述
- 输出是输入的布尔函数
- 任意时刻的输出状态, 只取决于该时刻输入状态的组合, 与电路原状态无关
- 功能上无记忆性, 结构上无反馈
第一种描述指出了组合逻辑的数学模型就是布尔函数, 所以布尔代数中的各种布尔运算都可以使用, 即可以利用布尔代数中的三种化简方法(公式法, 卡诺图, Q-M法), 对组合逻辑进行化简.
第二种描述是为了说明它与后续会介绍的时序逻辑的区别, 这里强调组合逻辑的输入输出与电路原状态没有关系, 输出只是单纯的输入的布尔函数.
第三种描述是整体地对电路进行的描述, 强调组合逻辑没有记忆功能, 也没有反馈的电路结构.
2 分析与设计
电路的分析干的事情是看懂别人的电路, 表现为能说出别人电路的功能.
电路的设计干的事情是整出一个电路, 这个电路能实现自己想要的功能.
2.1 电路分析
首先是电路分析, 我们能够拿到别人设计好的一个电路图, 在布尔代数中, 我们已经知道, 电路是布尔函数的一个表现形式, 于是我们能够通过将电路图中的门替换成布尔运算符号的方法, 将电路图转化为布尔函数.
得到布尔函数后, 如果这个函数感觉比较复杂, 我们可以尝试对其进行化简 (三种化简方法), 得到最简的逻辑式子, 然后自己脑补一下, 说出它的功能. 当然, 脑补的时候, 将逻辑式子换成真值表可能会清晰一些.
2.2 电路设计
电路设计的流程是反过来的. 首先我们有一个需求, 这个需求是要实现某个功能, 我们决定使用组合逻辑完成这个功能. 于是我们先将这个功能抽象成布尔函数(或者真值表), 然后进行一定程度的化简, 最后又写成布尔函数的形式, 对应着使用逻辑门将电路图画出来.
注意, 设计的时候很可能会出现逻辑无关项, 化简的时候看情况处理为\\(0\\), 或者处理为\\(1\\)即可.
如果只实现功能的话, 电路设计依照上述的流程就足够了. 但一般给出的需求, 不仅仅只有实现某个功能. 而比较常见的需求, 此时我们称作约束, 有:
-
逻辑门的类型(一般使用NAND门完成逻辑, 因为NAND能够表示所有逻辑, 并且便宜, 还时延低)
-
逻辑的输入端子和输出端子各自的数目(fan-in & fan-out)
-
逻辑门的总数量(对应功耗和成本)
-
逻辑门的级数(对应时延)
-
...
使用布尔代数中的化简方法进行化简, 叫做逻辑的化简, 而降低逻辑门的级数被称作逻辑的优化.
这里不对上述内容进行探讨, 毕竟大学课程内的例子都是简单的组合逻辑. 之后如果有, 会是在稍微复杂点的数字逻辑设计里会涉及, 敬请期待.
3 竞争和冒险
Ref:
https://www.cnblogs.com/xianyufpga/p/13644153.html;
https://www.cnblogs.com/-9-8/p/5409862.html
3.1 概念
在组合逻辑的设计中, 我们一般关注的是布尔函数所指定的功能. 单纯从逻辑设计上来考虑, 这样是没有问题的. 但是当我们引入了组合逻辑中逻辑门的实际电路后, 就有问题产生了.
首先, 逻辑门确实会按照我们所想的, 在某种输入下输出特定的\\(0\\)或\\(1\\), 我们称之为稳态特性(Steady-state Behaviour). 但是, 由于实际电路的限制, 信号经过一个逻辑门时, 会存在一定的时延; 并且当多输入逻辑门的两(多)个输入端子同时发生变化时, 逻辑门可能会输出不正确的结果, 这称为暂态特性(Transient Behaviour).
对于暂态, 我们称
- 竞争(Race) | 门电路的两个输入同时向相反的逻辑发生跳变的现象 (输入端)
- 冒险(Hazard) | 由于竞争, 输出端可能出现尖峰信号的现象 (输出端)
- 毛刺(Glitch) | 电路中各自原因所引起的的尖峰信号
3.2 分析
组合电路中的毛刺属于暂态, 它出现的时间和宽度, 可以通过严格的metal delay和gate delay计算得出. 对于单纯的组合电路, 毛刺可能会大面积的传播. 又因为毛刺一般持续时间很短, 对于组合逻辑, 一般不会造成错误.
而对于时序逻辑, 如果有毛刺的信号被作用于锁存器的reset,clear,clock,gate端时, 会造成很严重的后果. 而当使用在寄存器的输入端时, 只要不发生在时钟沿并且影响到数据的建立时间和保持时间, 一般不会造成影响.
所以一般在较大规模的数字设计中, 因为竞争-冒险现象, 合理使用寄存器十分重要.
3.3 发现竞争和消除冒险
在数字电路课程中, 发现竞争的方法是: 使用卡诺图描述逻辑, 然后画圈圈, 如果有两个圈圈相切时, 就会发生竞争. 消除办法是, 在相切的地方再画一个圈圈, 引入冗余, 从而没有了竞争, 消除了冒险(毛刺).
另一种数字电路中提到的消除冒险(毛刺)的方法是, 在输出端并接一个小的滤波电容. 但这个办法会增加输出波形的上升下降时间, 使得波形变化, 不妥.
而在大规模数字设计中, 利用EDA可以比较容易地发现竞争现象. 而为了消除冒险(毛刺), 我们可以:
- 使用Gray编码, 从而保证一个时刻只有一个bit发生变化
- 改用寄存器采样
- 组合逻辑中加入冗余项(同上)
- 引入选通信号
还有其它类型的竞争和冒险, 之后在时序逻辑和流水线设计时会分别提到. (可直接参考这节的Ref第一个链接)
4 模块化
组合逻辑的设计虽然比较简单, 但是, 在大规模设计中, 多次地重复设计仍然会耽搁大量的时间. 于是, 我们将一些常用的组合逻辑封装成模块, 在设计时可以直接调用, 减少工作量.
接下来的每一个模块, 我们首先都会给出功能定义, 引脚说明, 然后是方框图, 时序图, 然后是最大传播延迟, 最后附上Verilog实现代码.
码制转换译码器, 编码器, 多路复用器, 数据比较器, 加法器, ALU, ...
[时间关系, 后续填坑]
以上是关于数电-02组合逻辑的主要内容,如果未能解决你的问题,请参考以下文章