Skip to content

组合逻辑电路的设计原理

Session with Grok

通过门电路实现三位 LED 译码器 | 果冻的猿宇宙

数字逻辑电路学习指导 | 中国科学技术大学

数字设计和计算机体系结构 (RISC-V版)

Abstract

  1. 真值表是单一事实来源:表达式、卡诺图、门电路都必须与它一致;需求变了,从表改起。

  2. 表达式形式决定门级结构:SOP → 与或两级;外层 \(\overline{(\cdots)}\) → 优先 NOR/NAND。

  3. 化简是为了少门、少线:未化简的 SOP 可直接映射,但门数往往不可接受。

  4. 共享中间信号是工程习惯\(\overline{I_k}\)\(I_i \oplus I_j\) 只做一次,多段分发。

  5. 流程可复用:译码器、多路选择器、加法器等组合逻辑,均遵循「需求 → 表 → 式 → 化简 → 门 → 验证」;差别只在真值表内容与变量个数。

组合逻辑电路的输出只由当前输入决定,不含记忆元件。从需求到可仿真的门电路,有一条固定、可重复的标准流程;真值表、逻辑表达式与实际门组合之间的对应关系也是明确的——本质上是把布尔代数式翻译成硬件连线

下文以四位十六进制七段数码管译码器为贯穿实例:输入 \(I_3 I_2 I_1 I_0\) 表示 \(0\!\sim\!15\),数码管显示 \(0\!\sim\!9\);输入 \(10\!\sim\!15\) 时分别显示 A, b, C, d, E, F(共阴极,1 = 亮)。

标准设计流程

flowchart LR
  A[需求分析] --> B[真值表]
  B --> C[逻辑表达式]
  C --> D[化简]
  D --> E[门电路映射]
  E --> F[仿真验证]
  F --> G[封装子电路]
步骤 做什么 实例
1. 需求分析 明确输入/输出位数、编码方式、极性约定 4 位二进制;7 段 \(A\!\sim\!G\) + 小数点 \(H\);共阴极
2. 真值表 列出每种输入组合下各输出的 0/1 16 行 × 7 列段码
3. 逻辑表达式 对每个输出写 SOP 或 POS \(A(I_3,I_2,I_1,I_0)\)\(B(\ldots)\)、…
4. 化简 卡诺图、代数定律、异或替换 缩短积项、抽出公共子式
5. 门电路映射 按式子选门、连线、共享中间信号 NOT / XOR / AND / OR / NAND / NOR
6. 仿真验证 扫全部输入,对照字形 Logisim 扫 00001111
7. 封装(可选) 收成子电路,隐藏内部细节 hex7seg

多输出电路的要点

译码器、加法器等多输出组合逻辑:每个输出是独立的布尔函数,但实现时应主动寻找并共享 \(\overline{I_k}\)\(I_i \oplus I_j\) 等中间信号,避免每段各做一套相同的门。

卡诺图化简

逻辑函数的卡诺图化简 || 卡诺图 || 重点 || 数电 | 知乎@冰糖雪阳

画圈时满足三个原则:

  1. 圈的数量尽可能少

  2. 圈的范围尽可能大

  3. 每个圈包含的方格数必须是 \(2^n\)

依照画圈后的卡诺图,可按照如下原则写出逻辑表达式:

  • 随便找一个圈,从上到下、从左到右观察,若该字母对应的数值有变化(从0变为1、从1变为0),则将该字母从逻辑表达式中舍去,否则保留

Example

例如,有如下卡诺图:

AB\CD 00 01 11 10
00 0 0 1 0
01 0 1 1 1
11 1 1 1 1
10 0 1 1 1

画圈后如下:

即第三列和第三行的两组4个方格;加上第二行的两组横向2方格和第二列第四列的两组纵向2方格,总共6个圈,因此最后初步化简的表达式应该要有 \(6\) 项。化简思路如下:

  • 第三行的圈:完整单行,所以AB的值不变,CD的值全变,且AB的值均为 \(1\),项为 \(AB\)

  • 第三列的圈:同理,这里是完整单列,所以CD的值不变,AB的值全变,项为 \(CD\)

  • 第二行的左圈:单行,CD的值跨过 \(01\)\(11\),C的值发生变化,舍去;又因为第二行AB的值为 \(01\),因此最终的项为 \(\overline{A}BD\)

  • 以此类推,将所有的项化简后并相与,得出最后的表达式为 \(Y = AB + CD + \overline{A}BD + \overline{A}BC + A\overline{C}D + AC\overline{D}\)

  • 进一步合并同类项(如分配律、模2加法(异或)等),得出最终化简结果为 \(Y = A(B + C \oplus D) + \overline{A}B(C + D) + CD\)

仔细观察上方的卡诺图不难发现,这个逻辑表达式的对应电路实际上就是用于检测四位输入中是否存在两个及以上为 \(1\) 的情况,即用于检测四位输入中是否存在重复的 \(1\)

逻辑表达式与门电路的映射规律

表达式中的运算 逻辑门 备注
\(\overline{X}\) 非门 NOT 常先做一路 \(\overline{I_3}\!\sim\!\overline{I_0}\) 供全局复用
\(X \cdot Y\) 与门 AND 多输入与门 = 多个 2 输入与级联
\(X + Y\) 或门 OR 多输入或门同理
\(\overline{X \cdot Y}\) 与非 NAND 常比「与 + 非」更省门
\(\overline{X + Y}\) 或非 NOR 同上
\(X \oplus Y\) 异或 XOR 化简后常用,门数往往更少
积之和 SOP 与门层或门层 先各最小项做与,再或在一起
和之积 POS 或门层与门层 先各最大项做或,再与在一起

读表达式的习惯:从最内层(变量、取反、异或)往外层(与、或、整体取反)搭门;最外层是 \(\overline{(\cdots)}\) 时,可直接用 NAND / NOR 一次完成,而不必先做出内层再单独加 NOT。

实例:四位十六进制七段数码管译码器设计流程

1. 需求分析

七段管段位(\(H\) 为小数点,由 \(P\) 直接控制,不参与译码):

    A
  F   B
    G
  E   C
    D   H
项目 约定
输入 \(I_3 I_2 I_1 I_0\)\(I_3\) 为最高位),外加小数点 \(P\)
输出 \(A, B, C, D, E, F, G\)(段选),\(H = P\)
显示 000010010910101111A, b, C, d, E, F
极性 共阴极:1 = 亮段

2. 真值表

\(0\!\sim\!7\)三位译码器表 相同(此时 \(I_3=0\))。\(8\!\sim\!F\) 如下(\(b,d\) 用小写,以免与 80 混淆):

字符 \(I_3\) \(I_2\) \(I_1\) \(I_0\) \(A\) \(B\) \(C\) \(D\) \(E\) \(F\) \(G\)
8 1 0 0 0 1 1 1 1 1 1 1
9 1 0 0 1 1 1 1 1 0 1 1
A 1 0 1 0 1 1 1 0 1 1 1
b 1 0 1 1 0 0 1 1 1 1 1
C 1 1 0 0 1 0 0 1 1 1 0
d 1 1 0 1 0 1 1 1 1 0 1
E 1 1 1 0 1 0 0 1 1 1 1
F 1 1 1 1 1 0 0 0 1 1 1

每一列(如 \(A\))都是四变量布尔函数 \(A(I_3,I_2,I_1,I_0)\) 在 16 种输入下的取值。

3. 逻辑表达式

每一个输出单独处理:

  • 1 的行 → 写 SOP(最小项之和):\(S = \sum m_i\)

  • 0 的行 → 先写 \(\overline{S}\) 的 SOP,再整体取反(往往更短)

\(A\) 段为例\(A=0\) 只在 1, 4, b, d0001, 0100, 1011, 1101),先写 \(\overline{A}\)

\[ \begin{aligned} \overline{A} &= \overline{I_3}\,\overline{I_1}\,I_0 + \overline{I_3}\,I_2\,\overline{I_0} + I_3\,\overline{I_2}\,I_1\,I_0 + I_3\,I_2\,\overline{I_1}\,I_0 \end{aligned} \]

\(B\) 段为例\(B=0\)5, 6, b, C, E, F,项较多;也可对 \(B=1\) 的 10 行写 SOP 再化简。化简前不必强求异或形式,先保证与真值表一致。

4. 化简

通用化简流程

每一个输出独立做一遍(\(A\)\(B\) 的真值表不同,不能共用一张卡诺图):

  1. 选画 0 还是画 1:统计该段在 16 行中为 0 / 1 的行数,少的那一类填入卡诺图(圈选更少、往往更快)。

  2. 画四变量卡诺图:行标 \(I_3 I_2\)、列标 \(I_1 I_0\),均按格雷码排列 00 → 01 → 11 → 10;相邻格(含首尾相接)才能合并。

  3. 圈选:用尽可能大的 2 的幂次块覆盖所有目标格;每块对应一个积项(块内为 0 的变量取反,为 1 的保留,变化的位不写入)。

  4. 写表达式:各积项用 +(或)连接,得到 SOP;若第 1 步画的是 0,则得到 \(\overline{S}\),最后整体取反得 \(S\)

  5. 代数化简(可选):用分配律、德摩根定律、\(X \oplus Y = X\overline{Y} + \overline{X}Y\) 等把积项收成更短的形式(常出现异或,便于少门)。

  6. 核对:用 16 种输入逐行对照真值表。

SOP 与 POS

1 得积之和(SOP)→ 与门层 + 或门层;圈 0 得和之积(POS)→ 或门层 + 与门层。本例中 \(A\)\(C\) 等「为 0 的行更少」,故先求 \(\overline{S}\) 再取反。

A段化简

\(A=0\) 仅在 1, 4, b, d0001, 0100, 1011, 1101),共 4 格,画 \(A=0\) 的卡诺图:

\(I_3 I_2 \setminus I_1 I_0\) 00 01 11 10
00 1 0 1 1
01 0 1 1 1
11 1 0 1 1
10 1 1 0 1

圈选(粗体为 \(A=0\)):

  • 圈 100010100):\(I_3\)\(I_1\) 固定为 0\(I_2\)\(I_0\) 相反 → \(\overline{I_3}\,\overline{I_1}\,(I_2 \oplus I_0)\)
  • 圈 210111101):\(I_3\)\(I_0\) 固定为 1\(I_2\)\(I_1\) 相反 → \(I_3\,I_0\,(I_2 \oplus I_1)\)

于是

\[ \overline{A} = \overline{I_3}\,\overline{I_1}\,(I_2 \oplus I_0) + I_3\,I_0\,(I_2 \oplus I_1) \]
\[ A = \overline{\overline{I_3}\,\overline{I_1}\,(I_2 \oplus I_0) + I_3\,I_0\,(I_2 \oplus I_1)} \]

(对比三位:无 \(I_3\) 时只剩圈 1,即 \(A = \overline{\overline{I_1}(I_2 \oplus I_0)}\)。)

B段化简

\(B=0\) 有 6 行,\(B=1\) 有 10 行,改画 \(B=1\)

\(I_3 I_2 \setminus I_1 I_0\) 00 01 11 10
00 1 1 1 1
01 1 0 0 1
11 0 1 0 0
10 1 1 0 1

圈选示例:

  • 圈 10000, 0100, 1000):\(I_2=0\)\(I_0=0\)\(\overline{I_2}\,\overline{I_0}\)

  • 圈 21001, 1101 等):\(I_0=1\)\(I_3 \oplus I_1 = 1\)\(I_0\,(I_3 \oplus I_1)\)

  • 圈 3(与 \(A\) 低半区同形):\(\overline{I_3}\,\overline{I_1}\,(I_2 \oplus I_0)\)

合并得

\[ B = \overline{I_2}\,\overline{I_0} + I_0\,(I_3 \oplus I_1) + \overline{I_3}\,\overline{I_1}\,(I_2 \oplus I_0) \]

C段化简

\(C=0\) 仅在 2, C, E, F0010, 1100, 1110, 1111),共 4 格,画 \(C=0\) 的卡诺图:

\(I_3 I_2 \setminus I_1 I_0\) 00 01 11 10
00 1 1 1 0
01 1 1 1 1
11 0 1 0 0
10 1 1 1 1

圈选(粗体为 \(C=0\)):

  • 圈 10010 单独):\(I_3 I_2 I_1 I_0 = 0010\)\(\overline{I_3}\,\overline{I_2}\,I_1\,\overline{I_0}\)

  • 圈 21100, 1110):\(I_3=1\)\(I_2=1\)\(I_0=0\)\(I_1\) 变 → \(I_3\,I_2\,\overline{I_0}\)

  • 圈 31110, 1111):\(I_3=1\)\(I_2=1\)\(I_1=1\)\(I_0\) 变 → \(I_3\,I_2\,I_1\)

于是

\[ \overline{C} = \overline{I_3}\,\overline{I_2}\,I_1\,\overline{I_0} + I_3\,I_2\,\overline{I_0} + I_3\,I_2\,I_1 = \overline{I_3}\,\overline{I_2}\,I_1\,\overline{I_0} + I_3\,I_2\,(\overline{I_0} + I_1) \]
\[ C = \overline{\overline{I_3}\,\overline{I_2}\,I_1\,\overline{I_0} + I_3\,I_2\,(\overline{I_0} + I_1)} \]

D段化简

\(D=0\)1, 4, 7, A, F0001, 0100, 0111, 1010, 1111),共 5 格,画 \(D=0\) 的卡诺图:

\(I_3 I_2 \setminus I_1 I_0\) 00 01 11 10
00 1 0 1 1
01 0 1 0 1
11 1 1 0 1
10 1 1 1 0

圈选(粗体为 \(D=0\)):

  • 圈 100010100):与 \(A\) 低半区同形,\(I_3=I_1=0\)\(I_2 \oplus I_0 = 1\)\(\overline{I_3}\,\overline{I_1}\,(I_2 \oplus I_0)\)

  • 圈 201111111):\(I_2=I_1=I_0=1\)\(I_3\) 变 → \(I_2\,I_1\,I_0\)

  • 圈 31010 单独):\(I_3 I_2 I_1 I_0 = 1010\)\(I_3\,\overline{I_2}\,I_1\,\overline{I_0}\)

于是

\[ \overline{D} = \overline{I_3}\,\overline{I_1}\,(I_2 \oplus I_0) + I_2\,I_1\,I_0 + I_3\,\overline{I_2}\,I_1\,\overline{I_0} \]
\[ D = \overline{\overline{I_3}\,\overline{I_1}\,(I_2 \oplus I_0) + I_2\,I_1\,I_0 + I_3\,\overline{I_2}\,I_1\,\overline{I_0}} \]

E段化简

\(E=0\)1, 3, 4, 5, 7, 9(共 6 格),画 \(E=0\) 的卡诺图:

\(I_3 I_2 \setminus I_1 I_0\) 00 01 11 10
00 1 0 0 1
01 0 0 0 1
11 1 1 1 1
10 1 0 1 1

圈选(粗体为 \(E=0\)):

  • 圈 10001, 0011, 0101, 0111):\(I_3=0\)\(I_0=1\)\(I_2,I_1\) 变 → \(\overline{I_3}\,I_0\)

  • 圈 20100 单独):\(I_3 I_2 I_1 I_0 = 0100\)\(\overline{I_3}\,I_2\,\overline{I_1}\,\overline{I_0}\)

  • 圈 31001 单独,对应字形 9):\(I_3 I_2 I_1 I_0 = 1001\)\(I_3\,\overline{I_2}\,\overline{I_1}\,I_0\)

(圈 1 已覆盖 0101, 0111;若把 0100, 0101 再并成 \(\overline{I_3}\,I_2\,\overline{I_1}\),再与 \(\overline{I_3}\,I_0\) 用分配律整理,可写成 \(\overline{I_3}(I_0 + I_2\overline{I_1}\overline{I_0})\)。)

于是

\[ \overline{E} = \overline{I_3}\,I_0 + \overline{I_3}\,I_2\,\overline{I_1}\,\overline{I_0} + I_3\,\overline{I_2}\,\overline{I_1}\,I_0 = \overline{I_3}\,\bigl(I_0 + I_2\,\overline{I_1}\,\overline{I_0}\bigr) + I_3\,\overline{I_2}\,\overline{I_1}\,I_0 \]
\[ E = \overline{\overline{I_3}\,\bigl(I_0 + I_2\,\overline{I_1}\,\overline{I_0}\bigr) + I_3\,\overline{I_2}\,\overline{I_1}\,I_0} \]

F段化简

\(F=0\)1, 2, 3, 7, d0001, 0010, 0011, 0111, 1101),共 5 格,画 \(F=0\) 的卡诺图:

\(I_3 I_2 \setminus I_1 I_0\) 00 01 11 10
00 1 0 0 0
01 1 1 0 1
11 1 0 1 1
10 1 1 1 1

圈选(粗体为 \(F=0\)):

  • 圈 10010, 0011):\(I_3=I_2=0\)\(I_1=1\)\(I_0\) 变 → \(\overline{I_3}\,\overline{I_2}\,I_1\)

  • 圈 20001 单独):\(I_3 I_2 I_1 I_0 = 0001\)\(\overline{I_3}\,\overline{I_2}\,\overline{I_1}\,I_0\)

  • 圈 30111 单独):\(I_3 I_2 I_1 I_0 = 0111\)\(\overline{I_3}\,I_2\,I_1\,I_0\)

  • 圈 41101 单独,对应字形 d):\(I_3 I_2 I_1 I_0 = 1101\)\(I_3\,I_2\,\overline{I_1}\,I_0\)

于是

\[ \overline{F} = \overline{I_3}\,\overline{I_2}\,I_1 + \overline{I_3}\,\overline{I_2}\,\overline{I_1}\,I_0 + \overline{I_3}\,I_2\,I_1\,I_0 + I_3\,I_2\,\overline{I_1}\,I_0 \]
\[ F = \overline{\overline{I_3}\,\overline{I_2}\,I_1 + \overline{I_3}\,\overline{I_2}\,\overline{I_1}\,I_0 + \overline{I_3}\,I_2\,I_1\,I_0 + I_3\,I_2\,\overline{I_1}\,I_0} \]

G段化简

\(G=0\) 仅在 0, 1, 7, C0000, 0001, 0111, 1100),共 4 格,画 \(G=0\) 的卡诺图:

\(I_3 I_2 \setminus I_1 I_0\) 00 01 11 10
00 0 0 1 1
01 1 1 0 1
11 0 1 1 1
10 1 1 1 1

圈选(粗体为 \(G=0\)):

  • 圈 10000, 0001):\(I_3=I_2=I_1=0\)\(I_0\) 变 → \(\overline{I_3}\,\overline{I_2}\,\overline{I_1}\)

  • 圈 20111 单独):\(I_3 I_2 I_1 I_0 = 0111\)\(\overline{I_3}\,I_2\,I_1\,I_0\)

  • 圈 31100 单独,对应字形 C):\(I_3 I_2 I_1 I_0 = 1100\)\(I_3\,I_2\,\overline{I_1}\,\overline{I_0}\)

于是

\[ \overline{G} = \overline{I_3}\,\overline{I_2}\,\overline{I_1} + \overline{I_3}\,I_2\,I_1\,I_0 + I_3\,I_2\,\overline{I_1}\,\overline{I_0} \]
\[ G = \overline{\overline{I_3}\,\overline{I_2}\,\overline{I_1} + \overline{I_3}\,I_2\,I_1\,I_0 + I_3\,I_2\,\overline{I_1}\,\overline{I_0}} \]

化简结果

\[ \boxed{ \begin{aligned} A &= \overline{\overline{I_3}\,\overline{I_1}\,(I_2 \oplus I_0) + I_3\,I_0\,(I_2 \oplus I_1)} \\ B &= \overline{I_2}\,\overline{I_0} + I_0\,(I_3 \oplus I_1) + \overline{I_3}\,\overline{I_1}\,(I_2 \oplus I_0) \\ C &= \overline{\overline{I_3}\,\overline{I_2}\,I_1\,\overline{I_0} + I_3\,I_2\,(\overline{I_0} + I_1)} \\ D &= \overline{\overline{I_3}\,\overline{I_1}\,(I_2 \oplus I_0) + I_2\,I_1\,I_0 + I_3\,\overline{I_2}\,I_1\,\overline{I_0}} \\ E &= \overline{\overline{I_3}\,\bigl(I_0 + I_2\,\overline{I_1}\,\overline{I_0}\bigr) + I_3\,\overline{I_2}\,\overline{I_1}\,I_0} \\ F &= \overline{\overline{I_3}\,\overline{I_2}\,I_1 + \overline{I_3}\,\overline{I_2}\,\overline{I_1}\,I_0 + \overline{I_3}\,I_2\,I_1\,I_0 + I_3\,I_2\,\overline{I_1}\,I_0} \\ G &= \overline{\overline{I_3}\,\overline{I_2}\,\overline{I_1} + \overline{I_3}\,I_2\,I_1\,I_0 + I_3\,I_2\,\overline{I_1}\,\overline{I_0}} \end{aligned} } \]

对比三位情形:\(A\)\(D\) 的低半区仍含 \(\overline{I_1}(I_2 \oplus I_0)\) 形;加入 \(I_3\) 后需为 8F 补圈,式子普遍多 1–2 个积项。实现时优先复用 \(\overline{I_k}\)\(I_2 \oplus I_0\)\(I_3 \oplus I_1\)公共子式(见下一节门电路映射)。

5. 门电路映射

对照门电路与逻辑表达式的映射关系,进行搭建:

6. 仿真验证

在 Logisim 中:

  1. 接输入拨码 \(I_3\!\sim\!I_0\)\(P\),输出接七段管或探针。

  2. 依次设 00001111,核对 16 个字形。

  3. 重点检查易混组合:b/6d/0B/89/g

任一段与真值表不符,应回到该段的表达式或门连线,而不是先改真值表。

7. 封装

验证通过后,将整块电路收成子电路 hex7seg:对外管脚为 \(I_3,I_2,I_1,I_0,P\)\(A\!\sim\!H\),内部门网隐藏。上层只需关心「给二进制,得字形」,与 2-4 译码器封装 的思路一致。

若只需显示 \(0\!\sim\!9\)(BCD),可将 10101111 标为无关项再化简,电路通常更小,但非法输入的字形不保证——这是需求分析阶段就要定下的岔路,而不是实现阶段临时改表。