第二讲:组合逻辑基础——布尔代数基本定律、德摩根定律、逻辑表达式化简
各位同学,欢迎来到第二讲。今天咱们聊聊组合逻辑的数学基础——布尔代数。
说实话,我刚入行那会儿,觉得布尔代数就是一堆公式,背下来就行了。后来做项目才发现,这东西要是理解不透,写出来的RTL代码又臭又长,综合出来的面积大得吓人。嗯,今天咱们就把这块地基打牢。
2.1 布尔代数的基本定律
布尔代数,说白了就是0和1的数学。它跟普通代数不一样,变量只有两种取值:0(假)和1(真)。
我习惯把基本定律分成三组来记,这样不容易乱。
2.1.1 基本运算定律
| 定律名称 | 表达式(与运算) | 表达式(或运算) |
|---|---|---|
| 0-1律 | A · 0 = 0 | A + 1 = 1 |
| 自等律 | A · 1 = A | A + 0 = A |
| 互补律 | A · Ā = 0 | A + Ā = 1 |
| 重叠律 | A · A = A | A + A = A |
| 双重否定律 | Ā̅ = A | |
这些定律看着简单,但用起来特别顺手。举个例子,A + 1 = 1这条,我在做数据选择器时经常用到——某个输入固定为高电平,直接简化掉一个或门。
2.1.2 交换律、结合律、分配律
这三条跟普通代数很像,但分配律有个小坑。
- 交换律:A · B = B · A,A + B = B + A
- 结合律:(A · B) · C = A · (B · C),(A + B) + C = A + (B + C)
- 分配律:A · (B + C) = A·B + A·C(这个跟代数一样)
- 分配律(或对与):A + B·C = (A + B)·(A + C)(这个不一样!)
你想想看,普通代数里 A + B·C 是不能展开的。但在布尔代数里,它偏偏可以。为什么会这样?因为布尔代数的变量只有0和1,你可以用真值表验证一下。
2.2 德摩根定律
德摩根定律,这可是组合逻辑化简的利器。我个人觉得,它是布尔代数里最实用的定律之一。
公式很简单:
Ā · Ḃ = A + B (与非门等价于取反后的或)
Ā + Ḃ = A · B (或非门等价于取反后的与)
翻译成人话就是:把长非号拆开,与变或,或变与,每个变量取反。
我在项目中遇到过这样一个情况:一个复杂的组合逻辑,用了一堆与非门和或非门,时序怎么也跑不上去。后来我用德摩根定律把表达式重新整理了一遍,把多级逻辑变成了两级逻辑,时序立马就满足了。
2.3 逻辑表达式化简
化简的目的很明确:用最少的门实现同样的功能。面积小、功耗低、速度快。
2.3.1 代数化简法
就是利用前面讲的定律,一步步推。我常用的几个套路:
- 合并项:A·B + A·Ḃ = A·(B + Ḃ) = A
- 吸收法:A + A·B = A·(1 + B) = A
- 消去法:A + Ā·B = A + B(这个要记住,很常用)
- 配项法:A = A·(B + Ḃ),引入冗余项帮助化简
举个例子,化简 F = A·B + A·Ḃ + Ā·B:
F = A·B + A·Ḃ + Ā·B
= A·(B + Ḃ) + Ā·B (提取公因子A)
= A·1 + Ā·B (互补律)
= A + Ā·B (自等律)
= A + B (消去法)
你看,三个与门加一个或门,最后变成了一个或门。面积省了,延迟也小了。
2.3.2 卡诺图化简法
代数法靠经验,卡诺图法靠眼睛。对于变量不超过4个的逻辑,卡诺图特别直观。
基本步骤:
- 画出卡诺图,变量按格雷码排列
- 把最小项填到对应格子(1表示存在,0表示不存在)
- 圈相邻的1,圈越大越好,圈数越少越好
- 每个圈对应一个乘积项,读出化简结果
我曾经用卡诺图帮同事优化过一个7段数码管的译码器。他写了满满一页的表达式,我用卡诺图一画,发现能省掉将近40%的门。他当时就愣住了,说「原来还能这么玩」。
2.4 本章知识体系
下面这张图,把本章的核心逻辑串起来了。你看一遍,心里就有谱了。
2.5 避坑指南
最后,分享几个我踩过的坑:
- 别过度化简:有时候化简后的表达式虽然门少了,但扇出太大,反而导致时序变差。我一般会留一点冗余,保证驱动能力。
- 注意冒险竞争:化简时如果消除了某些冗余项,可能会引入静态冒险。比如
F = A·B + Ā·C化简后,当B=C=1时,A变化会产生毛刺。这时候加一个冗余项B·C就能消除。 - 卡诺图别圈错:格雷码的顺序是00→01→11→10,不是00→01→10→11。我第一次画卡诺图就栽在这个细节上。
好了,这一讲的内容就到这里。布尔代数是数字电路的数学根基,理解透了,后面学时序逻辑、状态机都会轻松很多。回去把课后习题做一遍,尤其是化简那几道,动手推一推,比光看强十倍。
可可精品资料库