第二讲:组合逻辑基础——布尔代数基本定律、德摩根定律、逻辑表达式化简

各位同学,欢迎来到第二讲。今天咱们聊聊组合逻辑的数学基础——布尔代数。

说实话,我刚入行那会儿,觉得布尔代数就是一堆公式,背下来就行了。后来做项目才发现,这东西要是理解不透,写出来的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 代数化简法

就是利用前面讲的定律,一步步推。我常用的几个套路:

  1. 合并项:A·B + A·Ḃ = A·(B + Ḃ) = A
  2. 吸收法:A + A·B = A·(1 + B) = A
  3. 消去法:A + Ā·B = A + B(这个要记住,很常用)
  4. 配项法: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,圈越大越好,圈数越少越好
  • 每个圈对应一个乘积项,读出化简结果
核心原则:圈要覆盖所有1,每个圈必须是2的幂次方个格子(1、2、4、8...),圈可以重叠,但不能包含0。

我曾经用卡诺图帮同事优化过一个7段数码管的译码器。他写了满满一页的表达式,我用卡诺图一画,发现能省掉将近40%的门。他当时就愣住了,说「原来还能这么玩」。

2.4 本章知识体系

下面这张图,把本章的核心逻辑串起来了。你看一遍,心里就有谱了。

组合逻辑基础:知识体系 布尔代数基本定律 0-1律、自等律、互补律 德摩根定律 与非 ↔ 或非转换 逻辑表达式化简 代数法 + 卡诺图法 基本定律 • 交换律、结合律 • 分配律(注意或对与) • 吸收律、冗余律 应用场景 • 与非门 ↔ 或非门转换 • 复杂表达式简化 • 逻辑级数优化 化简方法 • 代数法:合并、吸收 • 卡诺图:圈1法 • 奎因-麦克拉斯基法 核心目标 用最少的逻辑门实现相同的功能 → 面积小、功耗低、速度快 实际项目中,化简后的电路延迟通常能降低 20% ~ 40%

2.5 避坑指南

最后,分享几个我踩过的坑:

  • 别过度化简:有时候化简后的表达式虽然门少了,但扇出太大,反而导致时序变差。我一般会留一点冗余,保证驱动能力。
  • 注意冒险竞争:化简时如果消除了某些冗余项,可能会引入静态冒险。比如 F = A·B + Ā·C 化简后,当B=C=1时,A变化会产生毛刺。这时候加一个冗余项 B·C 就能消除。
  • 卡诺图别圈错:格雷码的顺序是00→01→11→10,不是00→01→10→11。我第一次画卡诺图就栽在这个细节上。

好了,这一讲的内容就到这里。布尔代数是数字电路的数学根基,理解透了,后面学时序逻辑、状态机都会轻松很多。回去把课后习题做一遍,尤其是化简那几道,动手推一推,比光看强十倍。

可可精品资料库