学习 › 第 4 讲
2、3、4 变量卡诺图与无关项 X
阅读约 7 分钟 · bitGateLab 团队
用布尔代数化简是可行的,但前提是你能“看出”该用哪条定律。卡诺图把这种寻找变成了一种直观的图形练习:它把真值表排成一个方格图,相邻的格子只有一个变量不同,于是化简就变成了把若干个 1 圈起来。本文将带你学习如何画出 2、3、4 变量的卡诺图,如何正确地画圈(包括“首尾相接”的边界),以及如何利用“无关项”。
基本思想:相邻的格子只差一个变量
并项律告诉我们 AB + AB = A:只有一个变量不同的两项可以合并,那个变量随之消失。卡诺图把最小项排列成这样:任何两个有公共边的格子都满足这个条件。为此,行和列的表头不按二进制顺序 00、01、10、11 排列,而是按格雷码排列:00、01、11、10。相邻两个值之间只有一位发生变化,最后一个和第一个之间(10 和 00)也是如此。所以卡诺图表现得就像它相对的两条边粘在了一起。
2 变量和 3 变量卡诺图
两变量卡诺图有 4 个格子:A 作行,B 作列。三变量卡诺图有 8 个格子:A 作行,BC 作列,按格雷码顺序排列。每个格子里的编号表示它对应的最小项:
| A \ BC | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 0 | m0 | m1 | m3 | m2 |
| 1 | m4 | m5 | m7 | m6 |
注意 m3 和 m2 是按这个顺序排的:这是格雷码造成的结果,也是手工填图时许多错误的根源。
画圈规则
- 圈里只能有 1(或 X,后面会讲到),绝不能有 0。
- 每个圈的大小必须是 2 的幂:1、2、4、8 或 16 个格子。
- 圈必须是由相邻格子组成的矩形,跨越边界的相邻也算在内。对角相邻不算。
- 每个圈要尽可能大:含 2k 个格子的圈可以消去 k 个变量。
- 用尽可能少的圈盖住所有的 1。圈与圈之间可以重叠。
读一个圈时,逐个检查每个变量:如果它在圈内所有格子里取值都相同,它就出现在该项中(取 1 时不加横线,取 0 时加横线);如果它的取值有变化,就被消去。
例 1:三变量。化简 F(A, B, C) = Σm(1, 3, 4, 5, 7)。
| A \ BC | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 |
- 01 和 11 两列是填满的:构成一个含 4 个格子的圈(m1、m3、m5、m7)。在这个圈里 A 有变化,B 有变化,C 始终为 1。得到的项:C。
- 还剩 m4。把它与 m5(右边的邻格)圈在一起:两格中都有 A = 1,B = 0,而 C 有变化。得到的项:AB。
- F = C + AB。
验证 m6(110):C = 0,AB = 0,所以 F = 0,与卡诺图一致。
4 变量卡诺图与边界相邻
四个变量时卡诺图有 16 个格子:AB 作行,CD 作列,两者都按格雷码顺序排列。
| AB \ CD | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 00 | m0 | m1 | m3 | m2 |
| 01 | m4 | m5 | m7 | m6 |
| 11 | m12 | m13 | m15 | m14 |
| 10 | m8 | m9 | m11 | m10 |
最左一列与最右一列相邻,最上一行与最下一行相邻。因此,四个角(m0、m2、m8、m10)构成一个合法的 4 格圈:这四格中都有 B = 0 且 D = 0,所以读作 BD。
例 2:跨越边界的圈。化简 F(A, B, C, D) = Σm(0, 1, 2, 5, 8, 9, 10)。
| AB \ CD | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 00 | 1 | 1 | 0 | 1 |
| 01 | 0 | 1 | 0 | 0 |
| 11 | 0 | 0 | 0 | 0 |
| 10 | 1 | 1 | 0 | 1 |
- m0、m1、m8、m9:最上一行和最下一行(通过边界相邻)的 00、01 两列。B = 0,C = 0。得到的项:BC。
- m0、m2、m8、m10:四个角。得到的项:BD。
- 还剩 m5(0101)。它最合适的取值为 1 的邻格是 m1(0001):A = 0,C = 0,D = 1,而 B 有变化。得到的项:ACD。
- F = BC + BD + ACD。
这样就从 7 个各含 4 个文字的最小项(共 28 个文字)减少到 3 项、总共 7 个文字。
无关项(X)
有时某些输入组合永远不会出现,或者它们的输出没有任何影响。例如,在一位 BCD 码中,1010 到 1111 这些代码并不存在。在这些行上写一个 X(英文称 don't care,即无关项),并另外记作 d(...)。画圈时,每个 X 如果有助于形成更大的圈,就可以当作 1;否则可以不管它。X 从来不是必须覆盖的。
例 3:带无关项 X。化简 F(A, B, C, D) = Σm(1, 3, 7, 11, 15) + d(0, 2, 5)。
| AB \ CD | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 00 | X | 1 | 1 | X |
| 01 | 0 | X | 1 | 0 |
| 11 | 0 | 0 | 1 | 0 |
| 10 | 0 | 0 | 1 | 0 |
- CD = 11 这一列是填满的(m3、m7、m15、m11):得到项 CD。
- 还缺 m1。把 m0 和 m2 的 X 当作 1,整个最上一行就是一个 4 格圈:得到项 AB。
- F = CD + AB。
还有一个同样好的解:取 m5 的 X,把 m1、m3、m5、m7 圈在一起,得到 AD。于是 F = CD + AD。两个解都是 2 项、4 个文字,并且在所有真正有关的行上结果一致。一个函数有不止一种最简形式是很正常的。
常见错误
- 把表头按二进制(00、01、10、11)而不是格雷码排列。这样相邻格子就不再只差一个变量,画出的圈也就错了。
- 画出 3 格或 6 格的圈。只有 2 的幂才合法。
- 忘记边界相邻和四个角相邻,结果圈画得比应有的小。
- 多画一个圈,而它的格子已经全被别的圈盖住。这个圈是多余的,只会增加门的数量。
- 强迫自己把 X 都盖住。X 只在能把圈扩大时才使用。
在模拟器中试一试
卡诺图模块会按格雷码顺序排好函数、标出各个圈并写出最简表达式,这样你就可以把自己的圈法与工具给出的方案对比。
- 新建一个四变量函数,输入例 2 中的各个 1。
- 先自己在纸上画圈,写下你的结果。
- 观察卡诺图标出的圈和得到的表达式;如果与你的不同,检查一下是哪个圈没有画到最大。
- 输入例 3,把第 0、2、5 格标为 X,再观察去掉这些 X 后化简结果有何变化。
- 把结果转换成电路,改变输入,确认它与真值表一致。
练习
- 化简 F(A, B, C) = Σm(0, 2, 4, 6)。
答案
BC = 00 和 BC = 10 两列通过边界相邻,并且都是填满的。四个格子中都有 C = 0:F = C。
- 化简 F(A, B, C, D) = Σm(0, 2, 5, 7, 8, 10, 13, 15)。
答案
四个角:BD。中间的方块 m5、m7、m13、m15:BD。F = BD + BD,也就是 B 和 D 的 XNOR。
- 化简 F(A, B, C, D) = Σm(4, 5, 6, 7, 12, 13, 14, 15)。
答案
AB = 01 和 AB = 11 两行构成一个 8 格圈;只有 B 始终保持为 1。F = B。
- 当一位 BCD 码(A 为最高位)的值为 5 或更大时,应点亮某个输出。化简 F = Σm(5, 6, 7, 8, 9) + d(10, 11, 12, 13, 14, 15)。
答案
借助这些 X,AB = 11 和 AB = 10 两行构成一个 8 格圈:A。方块 m5、m7、m13、m15 给出 BD,方块 m6、m7、m14、m15 给出 BC。F = A + BD + BC = A + B(C + D)。
变量多于四五个时,卡诺图就很难读了;针对这种情况有一种列表化简的方法,即奎因-麦克拉斯基法。