数字电路 - 电路分析

This post is not yet available in English. Showing the original version.

November 5, 2025

Table of Contents
Table of Contents

卡诺图和函数标准型

布尔函数标准型

这部分主要讨论了如何用标准和规范的形式来表示逻辑问题。

1. 逻辑函数的表示方法

一个逻辑函数可以用多种形式来表示,主要有三种:

核心思想:虽然一个逻辑函数的真值表是唯一的,但其逻辑表达式和逻辑图却可以有多种形式。不同的表达式和逻辑图功能相同,但其性能(如成本、速度)可能有很大差异。因此,我们需要找到最简化的形式。


2. 标准形式

为了使逻辑函数的表示更加规范,我们引入了“标准型”或“范式”的概念,主要有两种:

标准积之和 (SOP - Sum of Products)
标准和之积 (POS - Product of Sums)
最小项与最大项的关系

最小项和最大项之间存在互补关系: mi=Mi`m_i = \overline{M_i}`

因此,一个逻辑函数的最小项之和表达式与最大项之积表达式是等价的。例如: F(X,Y,Z)=m(1,4,5,6,7)=M(0,2,3)F(X,Y,Z) = \sum m(1,4,5,6,7) = \prod M(0,2,3)


卡诺图化简

代数化简法比较复杂,卡诺图提供了一种更简单、更直观的图形化方法来简化逻辑函数。

1. 什么是卡诺图 (Karnaugh Map)?

xy + xy' = x

卡诺图是真值表的一种图形化表示,它将 n 个变量的 2ⁿ 个最小项用 2ⁿ 个小方格表示。这些方格按照特定的规则排列(格雷码顺序),使得几何上相邻的方格在逻辑上也相邻(即只有一个变量不同)。

下面是一个三变量 (X, Y, Z) 的卡诺图结构示例:

graph TD
    subgraph Z
        direction LR
        0
        1
    end
    subgraph XY
        direction TB
        00
        01
        11
        10
    end

    subgraph Karnaugh Map
        direction LR
        A[0] -- 2 --> B[6] -- 4 --> C
        D[1] -- 3 --> E[7] -- 5 --> F
    end

    style A fill:#fff,stroke:#333,stroke-width:2px
    style B fill:#fff,stroke:#333,stroke-width:2px
    style C fill:#fff,stroke:#333,stroke-width:2px
    style D fill:#fff,stroke:#333,stroke-width:2px
    style E fill:#fff,stroke:#333,stroke-width:2px
    style F fill:#fff,stroke:#333,stroke-width:2px

2. 使用卡诺图化简的步骤

用大白话说就是:如果两件事,唯一的区别是一个需要条件 y,另一个需要条件 y’,那么其实条件 y 根本不重要,只要满足共同的条件 x 就行了。(即满足:xy + xy' = x

“画卡诺圈”这个动作,就是在用眼睛找出所有符合 xy + xy’ = x 这种模式的“邻居”! 每画一个圈,你就是在进行一次这样的化简,但你根本不需要动笔去算代数。

  1. 绘制卡诺图: 根据逻辑函数中的最小项,在对应的方格中标 1,其余方格标 0(或不标)。

  2. 画卡诺圈 (Grouping):

    • 将相邻的 1 方格圈起来。
    • 圈必须是矩形,且包含的 1 的数量必须是 2m`2^m` (如1, 2, 4, 8…)。
    • 目标是圈尽可能大,圈的数量尽可能少
    • 卡诺图的边界是循环的,即第一行和最后一行相邻,第一列和最后一列也相邻。
  3. 写出最简表达式:

    • 每一个卡诺圈对应一个化简后的与项
    • 找出圈内保持不变的变量,写入与项中。如果变量值为 1,则为原变量;如果为 0,则为反变量。
    • 将所有卡诺圈对应的与项相加(逻辑或),即可得到最简的“与或”表达式。

image.png

核心思想:画圈 = 目视化简

例1:最简单的横向圈 f = m₁ + m₃
  1. 填图:

    • 这是一个2变量 (A, B) 卡诺图。
    • m₁A'B (A=0, B=1),所以把 1 填在 A=0, B=1 的格子里。
    • m₃AB (A=1, B=1),所以把 1 填在 A=1, B=1 的格子里。
  2. 画圈:

    • 我们发现这两个 1 水平相邻。根据规则,相邻的 1 可以圈起来。
    • 这个圈是一个 1x2 的矩形,里面有 2¹=21,符合规则。
  3. 解读圈 (写表达式):

    • 现在问自己:“在这个圈覆盖的区域里,哪个变量的值没有变?”
    • 看变量 B: 在这个圈里,两个 1 都处在 B=1 这一行。所以 B 的值没变,一直是1。我们把它记下来:B
    • 看变量 A: 这个圈跨越了 A=0A=1 两列。所以 A 的值变了 (从0变成了1)。既然它变了,就说明它不重要,根据 xy + xy' = x 的原则,我们把它消掉
    • 结论: 这个圈化简后的结果就是 B。所以 f = m₁ + m₃ = A'B + AB = B
例2:最简单的纵向圈 f = m₀ + m₁
  1. 画圈: 这次两个 1垂直相邻的。圈起来!
  2. 解读圈:
    • 看变量 A: 两个 1 都处在 A=0 这一列。A 的值没变,一直是0。我们记下来:A'
    • 看变量 B: 圈跨越了 B=0B=1 两行。B 的值变了。消掉它!
    • 结论: 这个圈的结果就是 A'。所以 f = m₀ + m₁ = A'B' + A'B = A'
例3:最关键的“卷起来”—— 3变量卡诺图

这张图展示了卡诺图最神奇的特性:它的边界是相通的! 你可以把它想象成一个圆筒。

  1. 看左边那个3变量图:

    • 它圈了两个 1,一个在最左边的 AB=00 列,一个在最右边的 AB=10 列。
    • 它们看起来不相邻,但是!因为卡诺图是“卷起来的”,最左列和最右列其实是相邻的!
    • 为什么相邻? 我们看它们的编码:0010。是不是只有第一位(代表 A)不同?第二位(代表 B)都是 0。所以它们逻辑上是相邻的!
  2. 解读这个“卷起来的”圈:

    • 看变量 C: 两个 1 都在 C=0 这一行。C 没变,一直是0。记下来:C'
    • 看变量 A: 圈跨越了 A=0 (在 AB=00 中) 和 A=1 (在 AB=10 中) 的区域。A 变了。消掉!
    • 看变量 B: 在 AB=00 中 B 是0,在 AB=10 中 B 也是0。B 没变,一直是0。记下来:B'
    • 结论: 这个圈的结果是 B'C'
例4:大圈的威力 —— 4变量卡诺图

这张图展示了画圈的核心目标:圈要尽可能大,圈的数量要尽可能少!

  1. 看那个最大的 2x4 的圈:

    • 这个大圈把中间两行 (CD=01CD=11) 全都圈起来了。
    • 我们来解读它:
    • 看变量 A, B: 这个圈横跨了所有四列 (AB=00, 01, 11, 10)。所以 A 和 B 都在变。全部消掉!
    • 看变量 C, D: 这个圈覆盖了 CD=01CD=11 两行。
      • C 的值变了 (从0到1)。消掉!
      • D 的值没变,一直是1。记下来:D
    • 结论: 这个包含了8个 1 的巨大圈,最后只化简成了一个变量 D!这就是大圈的威力!
  2. 看那个 4x2 的圈:

    • 它圈住了中间两列 (AB=01AB=11)。
    • 解读它:
    • 看变量 A: AB=01 中 A 是0,AB=11 中 A 是1。A 变了。消掉!
    • 看变量 B: AB=01 中 B 是1,AB=11 中 B 也是1。B 没变,一直是1。记下来:B
    • 看变量 C, D: 圈竖着跨了所有四行。C 和 D 都在变。全部消掉!
    • 结论: 这个包含了8个 1 的圈,最后化简成了 B
总结一下“画圈”和“解读”的动作

image.png

3. 含无关项的函数化简

image.png

4. 冒险 (Hazards)


小结

  1. 逻辑表达式:

    • 标准形式(最小项之和、最大项之积)。
    • 不同的表达式形式,电路性能可能差异很大。
  2. 电路优化:

    • 卡诺图化简是核心方法,对于6变量及以下的函数非常方便有效。
    • 化简含无关项的函数时,可以利用无关项使电路进一步简化,而不改变其实际逻辑功能。
  3. 电路可靠性:

    • 最简电路经常会出现冒险现象。
    • 可以通过增加冗余项来消除冒险,以牺牲一定的简洁性换取电路的稳定性。

组合电路分析与设计

简单来说,就是学习怎么分析一个别人给你的逻辑电路,以及怎么根据需求自己设计一个逻辑电路。


什么是组合电路?

组合逻辑电路是数字电路中最基本的一种。你可以把它想象成一个“黑盒子”,它有几个输入端和几个输出端。

它的核心特点非常简单:


组合电路的分析

“分析”就像是给你一个已经搭建好的乐高模型,让你搞清楚它到底是什么,能做什么。

目标:从一个已知的电路图,推导出它的逻辑功能。

分析步骤(通用流程)

  1. 写出逻辑表达式:从电路的输入端开始,逐级向后推导,写出每个逻辑门的输出表达式,直到得到最终输出端的完整逻辑表达式。
  2. 化简或变换表达式:对得到的表达式进行化简(使用布尔代数或卡诺图),或者根据需要变换成“与或”、“或与”等标准形式。
  3. 列出真值表:根据最终的逻辑表达式,列出所有输入组合对应的输出值,形成真值表。
  4. 确定功能:观察真值表或分析逻辑关系,用语言描述出这个电路实现了什么功能。

举例:分析一个一位全加器

下面的电路有两个输出 JH

image.png

  1. 写表达式:

    • 对于 JJ = (A·B) + ((A+B)·C)
    • 对于 HH = (A+B+C) · (A·B + A·C + B·C)' + (A·B·C) (这个表达式比较复杂,可以通过化简或直接列真值表来分析)
  2. 列真值表: 通过逐一分析输入 A, B, C 的8种组合(从000到111),我们可以得到下面的真值表:

ABC (进位输入)J (进位输出)H (和)
00000
00101
01001
01110
10001
10110
11010
11111
  1. 确定功能: 观察真值表可以发现,这完全符合二进制加法规则。AB 是两个加数,C 是来自低位的进位。HA+B+C 的“和”,J 是产生的向高位的“进位”。 所以,这个电路的功能是一个一位全加器

组合电路的设计

“设计”则完全相反,是给你一个任务(比如“我要一个能比较大小的电路”),让你从零开始把它搭建出来。

image.png

目标:根据实际的逻辑需求,设计出最简单的、符合功能的逻辑电路。

image.png

设计步骤(通用流程)

  1. 逻辑抽象:

    • 搞清楚需求:明确要解决什么问题。
    • 定义输入输出:确定需要几个输入变量和几个输出变量。
    • 赋予逻辑含义:定义 01 分别代表什么状态(例如,1 代表“有故障”,0 代表“正常”)。
  2. 列出真值表:

    • 根据第一步的逻辑定义,遍历所有可能的输入组合,并写出每种情况下期望的输出值。
  3. 写出并化简逻辑表达式:

    • 从真值表中,为每一个输出变量写出它的逻辑表达式(通常先写成“最小项之和”的形式)。
    • 使用卡诺图等工具对表达式进行化简,得到最简的“与或”式。这是为了让最终的电路使用的逻辑门最少,成本最低。
  4. 画出逻辑电路图:

    • 根据化简后的逻辑表达式,使用对应的逻辑门(与门、或门、非门等)画出最终的电路图。

层次化设计方法

当电路变得非常复杂时(比如设计一个 CPU),一步到位画出所有逻辑门是不现实的。这时就需要“层次化设计”的思想。

核心思想分而治之。把一个复杂的大问题,分解成若干个简单的小问题来解决。

graph TD
    subgraph 设计流程
        direction LR
        A(自顶向下分解) --> B(自底向上实现);
    end

    subgraph 示例: 4位比较器
        C(比较两个4位数) --> D(比较两个1位数);
        D --> E(用逻辑门实现1位比较);
        E -- 组合 --> F(用4个1位比较器搭成4位比较器);
    end
  1. 自顶向下分解 (Top-Down):

    • 从最高层的功能入手(例如:设计一个4位相等比较器)。
    • 把它分解成几个功能更简单的子模块(例如:4个1位相等比较器)。
    • 如果子模块还复杂,就继续分解,直到模块足够简单,可以用基本逻辑门直接实现。
  2. 自底向上实现 (Bottom-Up):

    • 先设计和实现最底层的、最简单的模块(例如:用逻辑门搭建出1位相等比较器)。
    • 然后像搭积木一样,用这些已经实现的小模块去组装成更高级、更复杂的模块(例如:用4个1位比较器模块,连接成一个4位相等比较器)。

优点