数字电子学基础入门
1. 引言
在使用电子设计自动化(EDA)工具时,需要对数字电子学的众多术语和概念有深入的理解。下面将详细介绍一些基础内容,包括常见的数字表示方案、浮点数格式以及二值逻辑的符号约定。
1.1 常见数字表示方案
我们熟悉的十进制数系统是一种位置计数系统,每个数字的权重取决于其位置。在位置计数系统中,有一个基数 (B\geq2),例如十进制的 (B = 10),二进制的 (B = 2)。一个非负数字用 (w) 位表示时,其值可以通过加权和计算:
((a_{i_{MSD}}, a_{i_{MSD}-1}, a_{i_{MSD}-2}, \cdots, a_{i_{LSD}+1}, a_{i_{LSD}})
B = \sum
{i = i_{LSD}}^{i_{MSD}} a_i B^i)
其中 (i_{MSD} \geq i_{LSD}),(w = i_{MSD} - i_{LSD} + 1)。小数点用于分隔整数部分和小数部分。在二进制数中,最左边的位称为最高有效位(MSB),最右边的位称为最低有效位(LSB)。
对于有符号数,有多种表示方案,如无符号、偏移二进制、2 的补码、1 的补码和符号 - 幅度表示。以下是 4 位有符号和无符号整数的表示示例:
| 位模式 | 无符号解释 | 偏移二进制解释 | 2 的补码解释 | 1 的补码解释 | 符号 & 幅度解释 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| 1111 | 15 | 7 | -1 | [-] 0 | -7 |
| 1110 | 14 | 6 | -2 | -1 | -6 |
| 1101 | 13 | 5 | -3 | -2 | -5 |
| 1100 | 12 | 4 | -4 | -3 | -4 |
| 1011 | 11 | 3 | -5 | -4 | -3 |
| 1010 | 10 | 2 | -6 | -5 | -2 |
| 1001 | 9 | 1 | -7 | -6 | -1 |
| 1000 | 8 | 0 | -8 | -7 | [-] 0 |
| 0111 | 7 | -1 | 7 | 7 | 7 |
| 0110 | 6 | -2 | 6 | 6 | 6 |
| 0101 | 5 | -3 | 5 | 5 | 5 |
| 0100 | 4 | -4 | 4 | 4 | 4 |
| 0011 | 3 | -5 | 3 | 3 | 3 |
| 0010 | 2 | -6 | 2 | 2 | 2 |
| 0001 | 1 | -7 | 1 | 1 | 1 |
| 0000 | 0 | -8 | 0 | 0 | 0 |
需要注意的是,数字硬件只处理 0 和 1,赋予位模式意义的是人类或人类编写的软件。硬件描述语言(HDL)如 VHDL 和 SystemVerilog 为设计人员提供了各种数据类型和索引范围,以帮助他们跟踪数字格式。
1.2 浮点数格式
浮点数 (a) 用二进制编码时遵循 (a = s \cdot f \cdot 2^e),其中 (s) 是符号,(f) 是尾数,(e) 是指数。字宽 (w = 1 + #e + #f)。行业标准 IEEE 754 定义了 (w = 16)、32、64 和 128 的编码格式。
以单精度浮点数为例,占用 32 位,其中指数部分 (#e = 8),尾数部分 (#f = 23),格式为 (s\ eeee\ eeee\ \ ffff\ ffff\ ffff\ ffff\ ffff\ fff)。在编码前,数字要归一化到区间 ([1, 2)),这意味着小数点前的二进制位总是 1,因此该位不存储,称为隐藏位。
指数采用偏移二进制格式编码,偏移量为 (2^{#e - 1} - 1)。对于 (#e = 8),指数 (e) 在存储前要加 127,解码时则减 127。符号位 (s = 0) 表示正数,(s = 1) 表示负数。
然而,这种编码方案无法表示零,因为隐藏位固定为 1 不允许尾数为零。此外,还需要处理结果超出可用位表示范围的情况,以及像 (0/0)、对负数取平方根等产生未定义结果的情况,这些被称为非数字(NaN)。在 IEEE 754 标准中,特殊代码可以通过指数域全为 0 或 1 来识别。
以下是一个 8 位浮点数格式的示例:
| 位模式 | 二进制代码 | 数学解释 | 特殊含义 |
| ---- | ---- | ---- | ---- |
| 1111[1].1111 | 255 | (1 + \frac{15}{16}) | NaN |
| 1111[1].0000 | 240 | (1 + \frac{0}{16}) | 负无穷 |
| 1110[1].1111 | 239 | (1 + \frac{15}{16}) | -15.5 |
|… |… |… |… |
| 0000[1].1111 | 015 | (1 + \frac{15}{16}) | 0.2421875 |
| 0000[0].1111 | 0 | (\frac{15}{16}) | 0.1171875 |
|… |… |… |… |
| 0000[1].0000 | 000 | (1 + \frac{0}{16}) | 0.125 |
| 0000[0].0000 | 0 | (\frac{0}{16}) | 0 |
1.3 二值逻辑的符号约定
二值逻辑似乎只需要开关代数中的 0 和 1 两个符号进行数学分析,但实际上还需要另外两个逻辑值,总共四个符号:
- (0):表示逻辑零。
- (1):表示逻辑一。
- (X):表示信号的逻辑状态在分析后仍未知。
- (-):表示逻辑状态在规范中未确定,因为对电路的正常运行无关紧要,在电路设计中可以用 0 或 1 替代,称为无关项。
逻辑逆(布尔补)的数学约定是在项上加横线,例如变量 (a) 的补记为 (\overline{a})。显然,(\overline{0} = 1),(\overline{1} = 0),(\overline{\overline{a}} = a)。
2. 组合逻辑的理论背景
2.1 组合逻辑与时序逻辑的区别
如果一个数字电路在稳态条件下,其当前输出仅由当前输入决定,则该电路被称为组合电路。这种电路没有状态,也可以称为无记忆电路。与之相对的是时序逻辑,其输出不仅取决于当前输入,还取决于过去的输入值。时序电路必须在某种存储元件中保存其状态,因此也被称为状态保持或记忆电路。
2.2 组合逻辑的表示方法
2.2.1 真值表
真值表是捕获组合函数最常用的方法之一,它列出了每个输入对应的期望输出。以三个变量的真值表为例,其中包含无关项:
| (x) | (y) | (z) | (g) |
| ---- | ---- | ---- | ---- |
| 0 | 0 | 0 | 1 |
| 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | - |
| 0 | 1 | 1 | - |
| 1 | 0 | 0 | 1 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | - |
| 1 | 1 | 1 | 0 |
对于 (n) 个变量的真值表,有 (2^n) 个字段,每个字段可以填 0 或 1(无关项不增加额外的函数),因此有 (2^{2^n}) 种不同的完成方式,即 (2^{2^n}) 个不同的逻辑函数。
| (n) | 函数数量 |
| ---- | ---- |
| 1 | 4 |
| 2 | 16 |
| 3 | 256 |
| 4 | 65536 |
2.2.2 n - 立方体
将 (n) 个变量的逻辑函数映射到 (n) 维单位立方体上可以得到几何表示。这需要 (2^n) 个节点,每个节点对应一个输入值,边连接仅在一个变量上不同的节点对。例如,与上述真值表对应的 3 - 立方体表示如下:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(1(000)):::process --> B(1(001)):::process
A --> C(- (010)):::process
B --> D(- (011)):::process
C --> D
A --> E(1(100)):::process
B --> F(0(101)):::process
C --> G(- (110)):::process
D --> H(0(111)):::process
E --> F
E --> G
F --> H
G --> H
2.2.3 卡诺图
卡诺图是另一种表格格式,每个字段代表 (2^n) 个输入值之一。字段的排列方式使得在将图想象为刻在环面上时,能保留 (n) - 立方体的邻接关系。虽然已经提出了五变量和六变量的扩展,但卡诺图在超过四个变量时,其易于可视化的优点往往会丧失。与上述真值表对应的卡诺图如下:
| (yz) | (g) |
| ---- | ---- |
| 00 | 1 |
| 01 | 1 |
| 11 | - |
| 10 | - |
| 1 | 1 |
| | 0 |
| | 0 |
| | - |
2.2.4 程序代码
逻辑操作还可以使用 HDL 或其他形式语言来捕获,以下是一段与上述真值表等价的 VHDL 行为代码示例:
entity gfunction is
port (
X : in Std_Logic;
Y : in Std_Logic;
Z : in Std_Logic;
G : out Std_Logic );
end gfunction;
architecture procedural of gfunction is
begin
process (X,Y,Z)
variable temp: Std_Logic;
begin
temp := '-';
if Y='0' then temp := '1'; end if;
if X='1' and Z='1' then temp := '0'; end if;
G <= temp;
end process;
end procedural;
2.2.5 逻辑方程
真值表、卡诺图、(n) - 立方体和程序性 HDL 代码示例的共同点是,它们本质上通过枚举来指定输入到输出的映射,即从行为角度定义逻辑函数。而逻辑方程不仅定义了操作,还规定了操作的应用顺序。每个逻辑方程对应一个特定的门级电路,因此也传达了结构信息。
即使没有无关项,实现给定真值表的逻辑等价方程也有很多种。实际上,对于任何给定的逻辑函数,都存在无限多个逻辑方程和门级电路来实现它。以下是常见组合函数的示意图标:
2.3 两级逻辑
2.3.1 积之和形式
任何开关函数都可以表示为积之和(SoP)形式,其中“和”指逻辑或操作,“积”指逻辑与操作。例如:
(f = x y z \vee x y z \vee x y z \vee x y z)(规范和)
(f = x y \vee y z \vee x y z)
包含所有变量的乘积项称为最小项或基本积,仅由最小项组成的积之和表达式称为规范和。
2.3.2 和之积形式
和之积(PoS)形式与积之和形式对偶。类似地,有合取形式、最大项、基本和和规范积等概念。例如:
(f = (x \vee y \vee z) (x \vee y \vee z) (x \vee y) (x \vee y) (x \vee y \vee z))
(f = (x \vee y \vee z) (y \vee z) (x \vee y))
2.3.3 其他两级逻辑形式
积之和与和之积形式都属于两级逻辑,因为它们都使用了两级连续的或和与操作。在假设双轨逻辑的情况下,不考虑提供信号补码所需的反相器。因此,不仅上述方程,还有以下方程也属于两级逻辑:
(f = (x y) (y z) (x y z))
(f = x y z \vee y z \vee x y)
需要注意的是,(f = (x y) (y z) (x y z)) 描述的电路仅由与非门和反相器组成,可以通过对 (f = x y \vee y z \vee x y z) 应用德摩根定理和气泡推动(即将第二级门的所有输入的否定运算符移到第一级门的输出)得到。
2.4 多级逻辑
多级逻辑与两级逻辑的区别在于,逻辑方程的逻辑操作嵌套超过两级。例如:
(f = (x \vee z) y \vee x (y z))
(f = (x z \vee y) (x \vee y \vee z))
(f = x y \vee x (yz \vee yz))
即使有些方程表面上逻辑操作嵌套不超过两级,但如果包含异或函数,也属于多级逻辑,因为异或函数的存在增加了逻辑的复杂性。
2.5 逻辑函数的实现多样性
从前面的介绍可以看出,对于一个给定的组合逻辑函数,存在多种不同的表示方法和实现方式。这些不同的实现方式在电路规模、运行速度、能量消耗和制造成本等方面可能会有显著差异。
以一个具体的三变量组合函数为例,通过不同的逻辑方程可以实现相同的功能,但对应的门级电路却各不相同。下面展示了一些实现该函数的逻辑方程及对应的部分电路:
| 方程编号 | 逻辑方程 |
| ---- | ---- |
| (A.3) | (f = x y z \vee x y z \vee x y z \vee x y z) |
| (A.4) | (f = x y \vee y z \vee x y z) |
| (A.5) | (f = (x \vee y \vee z) (x \vee y \vee z) (x \vee y) (x \vee y) (x \vee y \vee z)) |
| (A.6) | (f = (x \vee y \vee z) (y \vee z) (x \vee y)) |
| (A.7) | (f = (x y) (y z) (x y z)) |
| (A.8) | (f = x y z \vee y z \vee x y) |
| (A.9) | (f = (x \vee z) y \vee x (y z)) |
| (A.10) | (f = (x z \vee y) (x \vee y \vee z)) |
| (A.11) | (f = x y \vee x (yz \vee yz)) |
| (A.12) | (未给出具体方程,但同样实现该函数) |
这些不同的方程对应的电路结构差异很大。例如,方程 (A.6)、(A.11) 和 (A.12) 对应的电路分别如下:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A[x]:::process --> B(逻辑门1):::process
C[y]:::process --> B
D[z]:::process --> B
B --> E(逻辑门2):::process
F(逻辑门3):::process --> E
G(逻辑门4):::process --> E
E --> H[f]:::process
style A fill:#fff,stroke:#000,stroke-width:1px
style C fill:#fff,stroke:#000,stroke-width:1px
style D fill:#fff,stroke:#000,stroke-width:1px
style H fill:#fff,stroke:#000,stroke-width:1px
(对应方程 (A.6) 的电路,这里只是简单示意,实际电路根据具体逻辑门确定)
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
I[x]:::process --> J(逻辑门5):::process
K[y]:::process --> J
L(逻辑门6):::process --> J
J --> M(逻辑门7):::process
N(逻辑门8):::process --> M
M --> O[f]:::process
style I fill:#fff,stroke:#000,stroke-width:1px
style K fill:#fff,stroke:#000,stroke-width:1px
style O fill:#fff,stroke:#000,stroke-width:1px
(对应方程 (A.11) 的电路,同样为简单示意)
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
P[x]:::process --> Q(逻辑门9):::process
R[y]:::process --> Q
S(逻辑门10):::process --> Q
Q --> T(逻辑门11):::process
U(逻辑门12):::process --> T
T --> V[f]:::process
style P fill:#fff,stroke:#000,stroke-width:1px
style R fill:#fff,stroke:#000,stroke-width:1px
style V fill:#fff,stroke:#000,stroke-width:1px
(对应方程 (A.12) 的电路,仅作示意)
在实际的电路设计中,工程师需要根据具体的需求和约束条件,选择最合适的实现方式。例如,如果对电路速度要求较高,可能会选择逻辑级数较少的实现方式;如果对成本比较敏感,则可能会选择使用较少逻辑门的电路结构。
2.6 两级逻辑的优势与应用
两级逻辑之所以在数字电子学早期非常流行,有以下几个重要原因:
1.
通用性
:任何逻辑函数都可以用不超过两级的逻辑操作来实现,这使得两级逻辑具有很强的通用性。
2.
手动最小化方法
:存在一些手动最小化方法,如卡诺图法和奎因 - 麦克拉斯基法,可以帮助工程师简化逻辑表达式,从而减少所需的逻辑门数量。
3.
早期对传播延迟的认识
:早期认为传播延迟直接与逻辑级数相关,因此两级逻辑在减少传播延迟方面被认为具有优势。
两级逻辑的积之和(SoP)和和之积(PoS)形式是最常见的实现方式。通过应用德摩根定理和气泡推动等方法,可以在不同的两级逻辑形式之间进行转换。例如,从积之和形式转换为仅由与非门和反相器组成的电路:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A[x]:::process --> B(与门1):::process
C[y]:::process --> B
D[z]:::process --> E(与门2):::process
F[y]:::process --> E
G(与门3):::process --> H(或门):::process
B --> H
E --> H
H --> I(输出):::process
style A fill:#fff,stroke:#000,stroke-width:1px
style C fill:#fff,stroke:#000,stroke-width:1px
style D fill:#fff,stroke:#000,stroke-width:1px
style F fill:#fff,stroke:#000,stroke-width:1px
style I fill:#fff,stroke:#000,stroke-width:1px
(积之和形式的电路示意)
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
J[x]:::process --> K(与非门1):::process
L[y]:::process --> K
M[z]:::process --> N(与非门2):::process
O[y]:::process --> N
P(与非门3):::process --> Q(与非门4):::process
K --> Q
N --> Q
Q --> R(输出):::process
style J fill:#fff,stroke:#000,stroke-width:1px
style L fill:#fff,stroke:#000,stroke-width:1px
style M fill:#fff,stroke:#000,stroke-width:1px
style O fill:#fff,stroke:#000,stroke-width:1px
style R fill:#fff,stroke:#000,stroke-width:1px
(转换后的与非门电路示意)
在实际应用中,两级逻辑常用于一些对电路复杂度要求不高、对速度和成本有一定要求的场合,如简单的控制器、译码器等。
2.7 多级逻辑的特点与适用场景
多级逻辑与两级逻辑不同,其逻辑方程的逻辑操作嵌套超过两级。多级逻辑的主要特点和适用场景如下:
1.
更高的灵活性
:多级逻辑可以通过更复杂的逻辑组合,实现一些用两级逻辑难以实现的功能。例如,在处理一些具有复杂逻辑关系的问题时,多级逻辑可以更方便地表达和实现。
2.
优化电路性能
:在某些情况下,多级逻辑可以通过合理的设计,优化电路的速度、面积和功耗等性能指标。例如,通过对逻辑操作的合理安排,可以减少关键路径上的逻辑级数,从而提高电路的运行速度。
3.
适用于复杂系统
:对于大规模的数字系统,多级逻辑可以更好地组织和管理逻辑结构,提高系统的可维护性和可扩展性。
然而,多级逻辑也存在一些缺点,如设计复杂度较高、手动优化难度大等。在实际设计中,需要根据具体情况权衡多级逻辑和两级逻辑的优缺点,选择最合适的设计方案。
3. 总结
数字电子学中的组合逻辑是一个基础且重要的领域。通过对常见数字表示方案、浮点数格式、二值逻辑符号约定的了解,我们为理解和设计数字电路奠定了基础。组合逻辑的多种表示方法和实现方式为电路设计提供了丰富的选择,但同时也需要我们根据具体的需求和约束条件进行合理的选择。
两级逻辑具有通用性和易于手动优化的优点,适用于一些简单的电路设计;而多级逻辑则在处理复杂逻辑和优化电路性能方面具有优势,适用于大规模的数字系统。在实际的电路设计过程中,工程师需要综合考虑各种因素,灵活运用这些知识和方法,以设计出满足要求的数字电路。
超级会员免费看
2851

被折叠的 条评论
为什么被折叠?



