Appearance
靠北,完全是预习欸 😭 所以软工学生为什么要学数字逻辑 😵
在第一章我们应该了解几个基础概念:数字系统、计数制及其转换、带符号的二进制数的代码表示以及编码。
先从数字系统讲起:
数字系统是一个能对数字信号进行加工、传递和存储的实体,它由实现各种功能的数字逻辑电路相互连接而成,例如脉冲计数电路、测控系统、计算机等等。
上面我们引入了几个新概念:数字信号和数字逻辑电路,我们来分别阐述:
引入两个前置概念:
自然界中形形色色的物理量,尽管它们的性质各异,但就其变化规律的特点而言,分为两大类。
用来表示数字量的信号叫数字信号。我们把工作在数字信号下的电子电路叫做数字电路。
反之则称为模电,幸好不用学。
我们再来对数字信号进行一个详细的阐述:
若信号的变化在时间上和数值上都是离散的,或者说断续的,则称为离散信号。离散信号的变化可以用不同的数字反映,所以又称为数字信号,简称为数字量。
例如,学生成绩记录,工厂产品统计,电路开关的状态等。
数字系统要与模拟信号发生联系时则必须经过转换电路对信号类型进行变换。
用来处理数字信号的电子线路称为数字电路。由于数字电路的各种功能是通过逻辑运算和逻辑判断来实现的,所以数字电路又称为数字逻辑电路或者逻辑电路。
逻辑运算和逻辑判断
数字电路特点有三:
这些特点便于信号的长期存储且能赋予一定的加密,通用性较强,分析工具为逻辑运算、结构简单等等。
从器件的物理特性可以分为:
从器件的逻辑特性可以分为:
这是根据一个电路是否有记忆功能来分类的。
从器件的规模可以分为:
从上到下依次为小、中、大、极大。
对组合/时序逻辑电路的详细阐述:
如果一个逻辑电路在任何时刻的稳定输出仅取决于该时刻的输入,而与电路过去的输入无关,则称为组合逻辑电路,故而不需要记忆功能。
在任何时刻的稳定输出仅取决于该时刻的输入,而与电路过去的输入无关
如果一个逻辑电路在任何时刻的稳定输出不仅取决于该时刻的输入,而且与过去的输入相关,则称为时序逻辑电路。需要一些特定的模块来进行记忆;而根据是否有统一的时钟信号进行同步则又可进一步分为同步/异步时序逻辑电路。
在任何时刻的稳定输出不仅取决于该时刻的输入,而且与过去的输入相关
对数字系统中逻辑电路的研究有俩主要任务:
逻辑分析:对一个已有的数字逻辑电路,研究它的工作性能和逻辑功能称为逻辑分析。
逻辑设计:根据提出的逻辑功能,在给定条件下构造出实现预定功能的逻辑电路称为逻辑设计,或者逻辑综合。
现在有很多种设计方法,这里按过不表。我们需要学习的应该还是传统方法。
常用的进制有二/八/十/十六几种进制,它们都是 R 进制的情况之一。
广义地说,一种进位计数制包含着基数和位权两个基本的因素
基数和位权
基数指的是计数制中所用到的数字符号的个数。在基数为 R 计数制中,包含 0、1、…、R-1 共 R 个数字符号,进位规律是"逢 R 进一"。称为 R 进位计数制,简称 R 进制。
位权是指在一种进位计数制表示的数中,用来表明不同数位上数值大小的一个固定常数。不同数位有不同的位权,某一个数位的数值等于这一位的数字符号乘上与该位对应的位权。R 进制数的位权是 R 的整数次幂。
例如,十进制数的位权是 10 的整数次幂,其个位的位权为 10^0,十位的位权是 10^1。
R 进制数 N 可以两种方法表示,举个例子 10 进制 的 123
对于其它进制也一样。
关于不同数制的四则计算这里就省略了。
在这里主要讨论三种转换:十进制和二进制之间的转换、八进制和二进制之间的转换、十六进制和二进制之间的转换。
对于二进制数转换为十进制数,直接展开到十进制;
对于十进制数转换为二进制数,应该对整数和小数分别进行处理:对于整数直接除 2 取余;
对于小数部分则乘 2 直到小数部分为 0 或者达到规定精度要求。例子如下:
如果同时包含整数和小数的十进制数,则分别转换后合并即可。
由于八进制的基本数字符号 0 ~ 7 正好和 3 位二进制数的取值 000 ~ 111 对应。所以,二进制数与八进制数之间的转换可以按位进行。
二进制数转换成八进制数:以小数点为界,分别往高、往低每 3 位为一组,最后不足 3 位时用 0 补充,然后写出每组对应的八进制字符,即为相应八进制数。
举个例子:
二进制:11100101.010 -> 八进制:345.2
相反的,八进制转为二进制也是这么做
方法和八进制和二进制之间的转换一样,举个例子:
十六进制:5A.B -> 二进制:1011010.1011
我们之前聊到数字系统中常用二进制来表示数,这被称作机器数/机器码。
常见的机器码有原码、反码和补码三种,权当复习一下:
符号位用 0 表示正,1 表示负;数值位保持不变。原码表示法又称为符号—数值表示法。
对于二进制小数,举个例子就能明白:
X = +0.1011 ; Y = -0.1011
则它们的源码分别为:
A = 0.1011 ; B = 1.1011
对于整数是一样的:
X = +1101 ; Y = -1101
它们的原码分别为:
A = 01101 ; B = 11101
由于原码的加减运算需要考虑符号和大小,需要引入反码和补码来克服这个缺点。
带符号二进制数的反码表示为:
符号位
数值位
也就是,对于一对相反数的真值,它们分别的反码,逐位都是相反数。
当我们利用反码进行真值加减法运算时,均可通过加法实现,也就是:
X - Y = X + (-Y)
运算时,符号位和数值位一样参加运算。当符号位有进位产生时,应将进位加到运算结果的最低位,才能得到最后结果。
对于符号位和上面两种一样:
用 0 表示 正
用 1 表示 负
同样的,运用补码进行加减运算时,也可以转换为加法,不过和反码有所不同:
运算时,符号位和数值位一样参加运算,若符号位有 进位产生,则应将进位丢掉后才能得到正确结果。
用 4 位二进制代码对十进制数字符号进行编码,简称为二-十进制代码,也称为 BCD 码,常见的有 8421 码、2421 码和余 3 码。
8421 码,是用 4 位二进制码表示一位十进制字符的一种有权码,4 位二进制码从高位至低位的权依次为 2^3、2^2、2^1、2^0,即为 8、4、2、1
10进制数:28 = 2进制数:11100 = 8421码:00101000
用 4 位二进制码表示一位十进制字符的另一种有权码,4 位二进制码从高位至低位的权依次为 2、4、2、1,故称为 2421 码。
2421码:1101 = 10进制数:7
2421 码和十进制数之间的转换也是按位进行的。
2421 码的特性
2421 码不具备单值性。例如,0101 和 1011 都对应十进制数字 5。为了与十进制字符一一对应,2421 码不允许出现 0101 ~ 1010 的 6 种状态。
2421 码是一种对 9 的自补代码。即一个数的 2421 码只要自身按位变反,便可得到该数对 9 的补数的 2421 码。
例如:
4 - 0100 -> 5 - 1011
是由 8421 码加上 0011 形成的一种无权码,由于它的每个字符编码比相应 8421 码多 3,故称为余 3 码。
例如,十进制字符 5 的余 3 码是 5 的 8421 码 0101 加上 0011 ,为 1000.
WARNING
为了减少或者发现代码在形成和传送过程中都可能发生的错误/提高系统的可靠性。形成了各种编码方法。下面,介绍两种常用的可靠性编码:
格雷码的特点是任意两个相邻的数,其格雷码仅有一位不同,这能避免代码形成或变换过程中产生的错误。
为什么能避免代码在形成或者变换过程中产生错误?
数字系统中,数是用电子器件的状态表示的,数据的变化即器件状态的变化。如当数据按升序或降序变化时,若采用普通二进制数,则每次增 1 或者减 1 可能引起若干位发生变化。
比如 0111 变成 1000。
当电子器件变化速度不一致时,便会产生错误代码。
而格雷码因为相邻的数只有一位不同,从根本上杜绝了这种情况的发生。
如果想要将二进制码转为格雷码可以参考下图:
而将格雷码转为二进制码,则是使用格雷码的最高位作为二进制的最高位,二进制次高位产生过程是使用二进制的高位和次高位格雷码相异或得到,其他位的值与次高位产生过程类似。
奇偶检验码是一种用来检验代码在传送过程中是否产生错误的代码。
由两部分组成:
有两种编码方式如下:
对于 8421 码的奇偶检验码:
奇偶检验码的特点
编码简单、容易实现
只有检验能力,无法纠错
只能发现任何奇数个错误,对任何偶数个错误无法处理
数字系统中处理的数据除了数字之外,还有字母、运算符号、标点符号以及其他特殊符号,人们将这些符号统称为字符。所有字符在数字系统中必须用二进制编码表示,通常将其称为字符编码。
最常见的就是 ASCII 码,它使用 7 位二进制码 表示 128 种字符:
我们将从逻辑代数/逻辑变量/逻辑运算/逻辑函数来介绍。
逻辑代数 L 是一个封闭的代数系统,它由一个逻辑变量集 K,常量 0 和 1 以及"或"、"与"、"非"三种基本运算所构成,记为L={ K, +, ·, ', 0, 1 }。该系统应满足下列公理:
L={ K, +, ·, ', 0, 1 }
具体的公理描述可见 PPT2.1 P 3~4
逻辑代数和普通代数一样,是用字母表示其值可以变化的量,即逻辑变量,在这里简称变量。所不同的是:
逻辑代数种定义了 与、或、非 三种基本运算
如果决定某一事件是否发生的多个条件中,只要有一个或一个以上条件成立,事件便可发生,则这种因果关系称之为"或"逻辑。
逻辑代数中,"或"逻辑用"或"运算描述。其运算符号为+。
+
表达式如下:
F = A + B
0 和 1 的或运算法则显然,不做赘述。
实现或运算关系的逻辑电路称为或门。例如并联开关 A、B 控制灯 F。
如果决定某一事件发生的多个条件必须同时具备,事件才能发生,则这种因果关系称之为"与"逻辑。
在逻辑代数中,"与"逻辑关系用"与"运算描述。其运算符号为·。两变量"与"运算关系可表示为:
·
F = A · B
0 和 1 的与运算法则显然,不做赘述。
实现与运算关系的逻辑电路称为与门,例如串联开关 A、B 控制灯 F。
如果某一事件的发生取决于条件的否定,即事件与事件发生的条件之间构成矛盾,则这种因果关系称为"非"逻辑。
在逻辑代数中,"非"逻辑用"非"运算描述。其运算符号为 ' (撇号) 或在变量上方加一横杠 ¯。"非"运算的逻辑关系可表示为:
'
¯
F = A'
显然,0 非等于 1,1 非等于 0.
开关 A 和灯 F 并联,可以表示为非运算关系
逻辑代数中函数的定义与普通代数中函数的定义类似, 即随自变量变化的因变量。但和普通代数中函数的概念相 比,逻辑函数具有如下特点:
逻辑函数有 3 种表示法,分别为逻辑表达式,真值表,卡诺图。
对于逻辑表达式:
对于真值表,有 n 个变量的逻辑函数,真值表有 2^n 行。
卡诺图是由表示逻辑变量所有取值组合的小方格所构成的平面图。卡诺图在函数简化问题很有用,后面会详细介绍,另外,下面是图例:
根据前面我们给出的 5 个公理,我们可以推出 8 组常见的定理:
重叠律(等幂律)
A + A = A
A · A = A
还原律(双重否定律)
(A')' = A
吸收律
A + AB = A
A(A + B) = A
冗余律
A + A'B = A + B
A(A' + B) = AB
并项律
AB + AB' = A
(A + B)(A + B') = A
反演律(德摩根定律)
(A + B)' = A' · B'
(A · B)' = A' + B'
推广的德摩根定律
(A + B + C + ...)' = A' · B' · C' ...
(A · B · C · ...)' = A' + B' + C' ...
一致性定理
AB + A'C + BC = AB + A'C
(A + B)(A' + C)(B + C) = (A + B)(A' + C)
关于一致性定理的证明如下:
逻辑代数有 3 条重要规则,即代入规则、反演规则和对偶规则。
在任何逻辑等式中,如果以一个逻辑函数(或者逻辑表达式)代替等式中的某个变量,则等式仍然成立。
例如,在 A + A' = 1 中,如果用 B+C 代替 A,则有 (B+C) + (B+C)' = 1,该等式仍然成立。
A + A' = 1
B+C
A
(B+C) + (B+C)' = 1
求一个逻辑函数 F 的反函数 F',可以遵循以下步骤:
0
1
TIP
需要注意的是,在变换时必须保持原有的运算顺序,必要时需要加括号。
例如,F = A(B+C) + D',其反函数为 F' = (A' + B'C')(D)。
F = A(B+C) + D'
F' = (A' + B'C')(D)
求一个逻辑函数 F 的对偶式 F_D,可以遵循以下步骤:
变量本身保持不变。对偶规则表明,若一个逻辑等式成立,则其对偶式也一定成立。
例如 A + 1 = 1 的对偶式是 A · 0 = 0。 A + BC = (A+B)(A+C) 的对偶式是 A(B+C) = AB+AC。
A + 1 = 1
A · 0 = 0
A + BC = (A+B)(A+C)
A(B+C) = AB+AC
实际应用中广泛采用"与非"门、"或非"门、"与或非"门、"异或"门等门电路。这些门电路输出和输入之间的逻辑关系可由 3 种基本运算构成的复合运算来描述,故通常将这种逻辑关系称为复合逻辑,相应的逻辑门则称为复合门。
"与非"逻辑是先对输入信号进行"与"运算,然后再对"与"运算的结果进行"非"运算。 其逻辑表达式为:F = (A · B)'
F = (A · B)'
"或非"逻辑是先对输入信号进行"或"运算,然后再对"或"运算的结果进行"非"运算。 其逻辑表达式为:F = (A + B)'
F = (A + B)'
"与或非"逻辑是先对某些输入信号进行"与"运算,再将这些"与"运算的结果与其他输入信号进行"或"运算,最后对整个结果进行"非"运算。 例如,两路两输入与或非门的逻辑表达式为:F = (AB + CD)'
F = (AB + CD)'
"异或"逻辑的规则是:当两个输入变量的取值不同时,输出为 1;当取值相同时,输出为 0。 其逻辑表达式为:F = A ⊕ B = A'B + AB' "异或"也称为"半加"运算。
F = A ⊕ B = A'B + AB'
"同或"逻辑的规则是:当两个输入变量的取值相同时,输出为 1;当取值不同时,输出为 0。它与"异或"逻辑互补。 其逻辑表达式为:F = A ⊙ B = A'B' + AB
F = A ⊙ B = A'B' + AB
任何一个逻辑函数,其表达式的形式都不是唯一的。下面从分析与应用的角度出发,介绍逻辑函数表达式的基本形式、标准形式及其相互转换。
由若干个"与"项(乘积项)进行"或"运算构成的表达式。 例如: F = AB + BC + AC
F = AB + BC + AC
由若干个"或"项(和项)进行"与"运算构成的表达式。 例如: F = (A+B)(B+C)(A+C)
F = (A+B)(B+C)(A+C)
为了使逻辑函数的表示具有唯一性,引入了标准形式。
例如,对于三变量函数 F(A, B, C),最小项 A'BC (m3) 只有在 A=0, B=1, C=1 时值为 1。一个函数的标准与-或表达式就是所有使其值为 1 的最小项之和。 F(A,B,C) = ∑m(i1, i2, ...)
F(A, B, C)
A'BC
A=0, B=1, C=1
F(A,B,C) = ∑m(i1, i2, ...)
例如,对于三变量函数 F(A, B, C),最大项 A+B'+C' (M3) 只有在 A=0, B=1, C=1 时值为 0。一个函数的标准或-与表达式就是所有使其值为 0 的最大项之积。 F(A,B,C) = ∏M(j1, j2, ...)
A+B'+C'
F(A,B,C) = ∏M(j1, j2, ...)
最小项与最大项的关系
同一个下标 i 的最小项 mi 和最大项 Mi 互为反函数,即 mi' = Mi。
mi' = Mi
X
(X+X')
例如,将 F = A + B'C 化为标准与-或式: F = A(B+B')(C+C') + (A+A')B'C= (AB+AB')(C+C') + AB'C + A'B'C= ABC+ABC'+AB'C+AB'C' + AB'C + A'B'C= ABC+ABC'+AB'C+AB'C' + A'B'C= ∑m(1, 4, 5, 6, 7)
F = A + B'C
F = A(B+B')(C+C') + (A+A')B'C
= (AB+AB')(C+C') + AB'C + A'B'C
= ABC+ABC'+AB'C+AB'C' + AB'C + A'B'C
= ABC+ABC'+AB'C+AB'C' + A'B'C
= ∑m(1, 4, 5, 6, 7)
XX'
(X+YZ)=(X+Y)(X+Z)
利用最小项和最大项的互补关系。 如果一个 n 变量函数 F = ∑m(i...),那么它的反函数 F' = ∑m(j...),其中 j 是在 0 到 2^n - 1 中所有未在 i 中出现的下标。 对 F' 应用德摩根定律,即可得到 F 的标准或-与表达式 F = ∏M(j...)。
F = ∑m(i...)
F' = ∑m(j...)
j
2^n - 1
i
F'
F
F = ∏M(j...)
例如,F(A,B,C) = ∑m(1, 4, 5, 6, 7),则其最大项下标为 0, 2, 3。 所以 F(A,B,C) = ∏M(0, 2, 3)。
F(A,B,C) = ∑m(1, 4, 5, 6, 7)
0, 2, 3
F(A,B,C) = ∏M(0, 2, 3)
一般来说,逻辑函数表达式越简单,设计出来的相应逻辑电路也就越简单。
我们有 3 种常用方法:代数化简法、卡诺图化简法、列表化简法。这里我们只介绍前两个方法。
代数化简法是利用逻辑代数的基本定律和定理,对逻辑表达式进行合并、吸收、消去等操作,以得到最简表达式的方法。这种方法比较灵活,但需要一定的技巧和经验,且难以判断结果是否为最简。
常用的技巧有:
(A+A')
AA'
示例: 化简逻辑函数 F = A'B'C + A'BC + AB'C
F = A'B'C + A'BC + AB'C
F = A'C(B' + B) + AB'C // 提取公因式 A'C = A'C · 1 + AB'C // B' + B = 1 = A'C + AB'C // = C(A' + AB') // 提取公因式 C = C(A' + B') // A' + AB' = A' + B' = A'C + B'C // 展开
卡诺图化简法是一种高效的图形化工具,用于简化布尔函数。它利用图形的邻接性直观地找出可以合并的最小项,从而得到最简的"与-或"表达式。对于含有 2 到 4 个变量的函数,此方法尤为直观和便捷。
卡诺图的巧妙之处在于它的布局。所有小方格都按照格雷码的顺序排列,这保证了任何两个在物理上相邻(上下、左右、甚至首尾相卷)的方格,其对应的最小项只有一个变量是不同的。
为什么逻辑相邻性很重要?
根据布尔代数的基本定理 XY + XY' = X,两个只有一个变量不同的最小项可以合并,并消去那个不同的变量。卡诺图通过将这些"逻辑相邻"的项在图中"物理相邻",使得我们可以通过"圈圈"这种直观的方式,快速完成合并与化简。
XY + XY' = X
00, 01, 11, 10
绘制与填充卡诺图:根据逻辑函数的真值表或最小项表达式,在卡诺图对应的小方格中填入"1"。函数值为"0"的方格留空即可。
圈出相邻的"1":用矩形圈包围相邻的"1"。
从圈写出最简与项:每一个圈对应一个化简后的"与"项。
合并与项:将所有从圈中得到的"与"项进行"或"运算,就得到了最终的最简"与-或"表达式。
示例: 化简 F(A,B,C) = ∑m(1, 4, 5, 6, 7)
填图:
圈"1":
m4, m5, m7, m6
m1, m5
写表达式:
m4(100), m5(101), m7(111), m6(110)
B
C
m1(001), m5(101)
B'C
最终结果: F = A + B'C
在某些实际电路中,一些输入组合永远不会出现,或者出现时输出是任意的,这些项称为无关项。
d
化简逻辑函数 F(A,B,C,D) = ∑m(0, 2, 5, 7, 8, 10, 13, 15)
F(A,B,C,D) = ∑m(0, 2, 5, 7, 8, 10, 13, 15)
m0, m2, m8, m10
m5, m7, m13, m15
m0(0000), m2(0010), m8(1000), m10(1010)
D
B'D'
m5(0101), m7(0111), m13(1101), m15(1111)
BD
最终结果: F = B'D' + BD。这实际上是变量 B 和 D 的"同或"(B ⊙ D)。
F = B'D' + BD
B ⊙ D
化简逻辑函数 F(W,X,Y,Z) = ∑m(1,3,7,11,15),其中无关项为 d(0,2,5)。
F(W,X,Y,Z) = ∑m(1,3,7,11,15)
d(0,2,5)
填图 (1 代表最小项,X 代表无关项):
圈"1" (利用"X"):
m1, m3
m0, m2
m0, m1, m2, m3
YZ
11
m3, m7, 15, 11
m0(0000), m1(0001), m2(0010), m3(0011)
W
Y
Z
W'X'
m3(0011), m7(0111), m15(1111), m11(1011)
最终结果: F = W'X' + YZ。通过利用无关项,我们得到了比不使用它们(例如,只圈 m1,m3 得到 W'X'Z)更简洁的表达式。
F = W'X' + YZ
m1,m3
W'X'Z
根据所采用的半导体器件,可将数字集成电路分为两大类:双极型集成电路和单极型集成电路(MOS 管)。
在这两大类下又能分为更多小类,这里不做阐述。
数字电路中的晶体二极管、三极管和 MOS 管等器件一般是以开关方式运用的,其工作状态相当于开关的"接通"与"断开"。由于开关频率非常高,我们需要分析其在导通和截止两种状态下的静态和动态特性。
二极管是一个 PN 结,具有单向导电性,是实现逻辑运算最基础的元件之一。
V_F
V_A > V_K
V_A ≤ V_K
I_R
三极管(以 NPN 型为例)是电流控制器件,通过控制基极(b)电流 I_B 来控制集电极(c)和发射极(e)之间的通断。
I_B
V_BE
I_C
V_CE
在数字电路中,我们驱动三极管在截止和饱和两个极端状态之间切换,以避免工作在放大区而产生不确定的逻辑电平。
V_CC
I_BS
V_CE(sat)
MOS 管是电压控制器件,通过控制栅极(G)和源极(S)之间的电压 V_GS 来控制漏极(D)和源极之间的通断。它是现代数字集成电路的核心。
V_GS
V_T
R_on
MOS 管的关键优势
实现基本和复合逻辑运算的电子电路被称为逻辑门。它们是构建任何数字系统的基础模块。在深入了解 TTL 和 CMOS 等集成电路家族之前,我们先看看如何用基础的分立元件搭建简单的逻辑门。
用二极管和电阻可以搭建最简单的"与"门和"或"门。
二极管"与"门:
R
VCC
Y = A · B
二极管"或"门:
Y = A + B
DL 电路很简单但驱动能力差且会造成电平偏移。通过在后面加一个三极管反相器,就构成了更实用的 DTL 门电路,这也是 TTL 电路的雏形。
DTL"与非"门 (NAND):
Y = (A · B · ...)'
DTL"或非"门 (NOR):
Y = (A + B)'
Y = A'
Y = (A · B)'
Y = A ⊕ B
本节将重点介绍两种主流的集成逻辑门电路技术:TTL 和 CMOS,以及一些特殊用途的门电路。
技术分类:
关键特性参数:
TTL 电路以 BJT 三极管为核心,通常使用 +5V 电源。
+5V
F = (A · B · ...)'
74LS00
CMOS 电路的核心是由一个 P-MOS 管 和一个 N-MOS 管 互补构成的单元。
V_DD
Y = Y1 · Y2 · Y3 ...
这是一个约定问题:
同一个物理电路,在正逻辑和负逻辑约定下,其逻辑功能是不同的。例如,一个正逻辑的"与非"门,在负逻辑下就是一个"或非"门。除非特殊说明,否则我们总是默认使用正逻辑。
与任何时刻的输出仅取决于该时刻输入的组合逻辑电路不同,时序逻辑电路具有记忆功能,其输出不仅取决于当前输入,还与电路之前的状态有关。实现这种记忆功能的基本单元就是触发器 (Flip-flop)。
触发器是能够存储一位 (bit) 二进制信息的最小单元。它具有两个可以自我维持的稳定状态,通常用 0 和 1 来表示。触发器有两个互补的输出端:Q 和 \overline{Q}。在输入信号的作用下,触发器可以从一个状态转换到另一个状态。我们通常将触发器在输入信号作用前的状态称为现态(用 Q^n 表示),变化后的新状态称为次态(用 Q^{n+1} 表示)。
Q
\overline{Q}
Q^n
Q^{n+1}
基本 R-S 锁存器是构成各种复杂触发器的基础,也是最简单的记忆元件。它通常由两个与非门或或非门交叉耦合而成。
这种锁存器由两个与非门交叉连接构成。它的输入端是低电平有效的,通常记为 \overline{S} (置位 Set) 和 \overline{R} (复位 Reset)。
\overline{S}
\overline{R}
\overline{S}=0
\overline{R}=1
\overline{S}=1
\overline{R}=0
Q^{n+1} = Q^n
这种锁存器的输入端是高电平有效的,记为 S 和 R。其逻辑功能与与非门锁存器类似,但触发电平相反。它的禁止状态发生在 S=1, R=1。
S
S=1, R=1
其特性方程为:(Q^{n+1} = S + \overline{R}Q^n),约束条件为 S · R = 0。
S · R = 0
基本 R-S 锁存器结构简单,但它对输入信号的变化是即时响应的,这使得在复杂系统中难以精确控制状态翻转的时刻。
为了让触发器只在特定的时刻(例如,在统一的时钟 (Clock, CLK) 信号控制下)才接收输入并改变状态,我们引入了同步触发器。
最简单的同步触发器是在基本 R-S 锁存器的输入端前增加两个控制门(与门)。只有当时钟信号 CLK=1 时,输入 S 和 R 才能影响锁存器;当 CLK=0 时,无论 S 和 R 如何变化,触发器都保持原状态。
CLK=1
CLK=0
然而,这种简单的电平触发同步方式存在"空翻" (Racing) 问题:在 CLK=1 的整个时间段内,如果输入信号 S 或 R 发生多次变化,输出 Q 也会跟着多次翻转,这使得电路的最终状态不可控。
为了解决这个问题,现代触发器采用边沿触发 (Edge-Triggered) 方式。这意味着触发器只在时钟信号的上升沿 (从 0 到 1 的瞬间) 或下降沿 (从 1 到 0 的瞬间) 才对输入进行采样并改变状态,而忽略在时钟电平保持稳定期间的任何输入变化。这确保了每个时钟周期只发生一次确定的状态转换。早期的主从触发器 (Master-Slave Flip-flop) 也是为了解决空翻问题而设计的,其效果类似于下降沿触发。
为了克服基本 R-S 触发器的输入约束和不确定性问题,人们设计出了功能更完善的触发器。
D 触发器通过在内部连接 S 和 R 输入,确保它们永远互补(S=D, R=\overline{D}),从而彻底解决了 S=R=1 的禁止状态问题。
S=D
R=\overline{D}
S=R=1
Q^{n+1} = D
J-K 触发器是功能最全面的触发器。它不仅解决了 R-S 触发器的不确定状态,还增加了一个全新的功能。
J
K
J=0, K=0
J=1, K=0
J=0, K=1
J=1, K=1
Q^{n+1} = \overline{Q^n}
Q^{n+1} = J\overline{Q^n} + \overline{K}Q^n
T 触发器是 J-K 触发器的一个简化特例,将 J 和 K 输入连接在一起,形成单个输入 T。
T
T=0
T=1
Q^{n+1} = T \oplus Q^n = T\overline{Q^n} + \overline{T}Q^n
我们将从 4 个小节来学习组合逻辑电路:
组合逻辑电路 (Combinational Logic Circuit) 是指在任何时刻,电路的稳定输出仅仅取决于该时刻的输入信号组合,而与电路过去的状态无关。简而言之,它是一个没有记忆功能的电路。
这与我们之前讨论的触发器构成的时序逻辑电路形成了鲜明对比。组合逻辑电路的基本构成单元是各种逻辑门,其结构特点是:
因此,任何一个组合逻辑电路的功能都可以用一个或一组布尔函数来完全描述。
分析是指对于一个给定的逻辑电路图,确定其逻辑功能的过程。基本步骤如下:
示例: 分析下图所示电路的功能(此处假设一个电路图): 一个电路,输入为 A, B, C。A 和 B 输入一个与门 G1,B 和 C 输入一个与门 G2,G1 和 G2 的输出再输入一个或门 G3,G3 的输出为 F。
F = (A · B) + (B · C)
设计是分析的逆过程,即根据提出的逻辑需求,设计出实现该功能的电路。这是数字系统设计的核心环节之一。
示例:设计一个三输入多数表决器 需求:有三个裁判 A, B, C。当有两个或两个以上赞成时(以'1'代表赞成),表决结果 F 为通过('1')。
写表达式 (SOP): F = A'BC + AB'C + ABC' + ABC
F = A'BC + AB'C + ABC' + ABC
卡诺图化简:
m3, m7
BC
m5, m7
AC
m6, m7
AB
画逻辑图:用三个二输入与门和一个三输入或门即可实现。
在实际的数字系统设计中,我们通常不会从最底层的逻辑门开始搭建所有东西,而是使用功能更强、已经封装好的中规模集成(MSI)电路。这些模块是构成更复杂系统的积木。下面介绍几种最核心的组合逻辑器件。
加法器是实现二进制数加法运算的电路。
半加器 (Half Adder):
C_o
S = A ⊕ B
C_o = A · B
全加器 (Full Adder):
C_i
S = A ⊕ B ⊕ C_i
C_o = AB + (A ⊕ B)C_i = AB + AC_i + BC_i
多位加法器: 将多个全加器串联起来,就可以实现多位二进制数的加法,例如,用 4 个全加器可以构成一个 4 位加法器。这种将前一级的进位输出 C_o 连接到后一级的进位输入 C_i 的方式称为行波进位加法器 (Ripple-Carry Adder)。
数字比较器用于比较两个二进制数 A 和 B 的大小。
A > B
A = B
A < B
A (A_{n-1}...A_0)
B (B_{n-1}...B_0)
Y_{A>B}
Y_{A=B}
Y_{A<B}
A=B
A_i = B_i
A>B
A_i=1
B_i=0
译码器是一种将输入的二进制代码翻译成其对应输出信号的电路。
A_{n-1}...A_0
EN
Y_0, Y_1, ..., Y_{2^n-1}
k
Y_k
编码器执行与译码器相反的操作。
I_0, I_1, ..., I_{2^n-1}
Y_{n-1}...Y_0
74LS148
数据选择器,又称多路选择器,作用是从多路输入信号中选择一路,并将其传送到唯一的输出端。
D_0, ..., D_{2^n-1}
S_{n-1}...S_0
D_k
数据分配器执行与数据选择器相反的操作。
Y_0, ..., Y_{2^n-1}
在理想的逻辑电路中,我们假设信号的传递是瞬间完成的。然而,在物理世界中,任何逻辑门和导线都存在传输延迟。当一个输入信号的变化需要通过不同延迟的路径才能到达同一个输出门时,就会发生竞争(Race)。这种竞争现象可能导致电路的输出端产生不应有的、短暂的错误信号毛刺,这种毛刺就称为险象(Hazard)。
判断方法:
A + A'
A · A'
消除方法:
定义: 与组合逻辑电路不同,时序逻辑电路在任何时刻的输出不仅取决于当前的输入信号,还取决于电路过去的状态(即它所记忆的信息)。简而言之,时序逻辑电路是具有记忆功能的电路。
通用结构: 一个时序逻辑电路通常可以看作由两部分构成:
电路的当前状态会从存储元件的输出端,通过一个反馈回路(Feedback Loop),送回到组合逻辑部分的输入端,参与下一状态和输出的决定。
特点:
根据存储电路中各触发器状态更新的同步方式,时序逻辑电路可分为两大类:
同步时序逻辑电路 (Synchronous Sequential Circuits):
异步时序逻辑电路 (Asynchronous Sequential Circuits):
本章主要讨论同步时序逻辑电路。
为了分析和设计同步时序逻辑电路,我们需要一套标准的方法来描述它的逻辑功能。
逻辑方程组:
D_A = X · Q_B
Q_A^{n+1} = D_A = X · Q_B
Y = f(Q^n, X)
Y = g(Q^n)
状态转换表 (State Table):
状态转换图 (State Diagram):
输入/输出
这三种描述方法可以相互转换,是分析和设计同步时序逻辑电路的有力工具。
分析同步时序逻辑电路,是指对于一个给定的逻辑电路图,通过一系列固定的步骤,最终确定其完整的逻辑功能。这个过程与组合逻辑电路的分析类似,但因为状态的存在而更为系统化。
其基本步骤如下:
写出逻辑方程组:根据电路图,写出两个关键的方程组:
求出状态方程:将驱动方程代入对应触发器的特性方程(例如 D 触发器的特性方程为 Q^{n+1} = D),从而得到描述电路次态与现态及外部输入之间关系的状态方程。
列出状态转换表:根据状态方程和输出方程,制作一张表格。该表格列出了电路在所有可能的现态下,针对所有可能的输入组合,其对应的次态和电路输出。这是对电路功能最精确、最无歧义的描述。
画出状态转换图:将状态转换表图形化,得到状态转换图。这使得电路的状态变迁路径和行为模式一目了然。
描述逻辑功能:通过分析状态转换图或状态转换表,用文字总结出电路的整体逻辑功能。例如:"这是一个带有使能控制的、能检测'101'序列的序列检测器"或"这是一个 2 位的同步二进制加法计数器"。
假设我们有如下电路(由两个 T 触发器构成):
Q1
Q0
T0 = EN
T1 = EN · Q0
Y1 = Q1
Y0 = Q0
让我们按照上述步骤来分析它:
状态方程: (T 触发器的特性方程为 Q^{n+1} = T ⊕ Q^n)
Q^{n+1} = T ⊕ Q^n
Q0^{n+1} = T0 ⊕ Q0^n = EN ⊕ Q0^n
Q1^{n+1} = T1 ⊕ Q1^n = (EN · Q0^n) ⊕ Q1^n
状态转换表:
状态转换图:
00
01
10
EN=0
EN=1
00 → 01 → 10 → 11 → 00
逻辑功能描述:
设计是分析的逆过程。我们从一个描述逻辑功能的说明(例如"设计一个能检测特定序列的电路")开始,目标是得到一个完整的逻辑电路图。
逻辑抽象,建立原始状态图和状态表: 这是最关键、最考验逻辑思维的一步。
状态化简 (State Minimization): 检查原始状态表中是否存在等价的状态。如果两个状态在所有可能的输入序列下,其输出都完全相同,那么它们就是等价的,可以合并为一个状态。这有助于得到最简的电路。
状态分配 (State Assignment): 用唯一的二进制码来表示每个状态。如果有个 N 个状态,则至少需要 k 个触发器,其中 2^k ≥ N。状态码的分配方式会影响最终逻辑电路的复杂度。
2^k ≥ N
选择触发器类型,求驱动方程和输出方程:
画出逻辑电路图: 根据最终的驱动方程和输出方程,画出完整的电路图,包括触发器和实现组合逻辑所需的各种门电路。
检查自启动能力 (Self-Correction): 检查电路从未使用过的状态(如果有)开始时,能否在时钟作用下最终进入正常的状态循环。如果不能,可能需要额外设计。
需求: 设计一个电路,有一个输入 X 和一个输出 Y。每当输入序列 X 中出现 "101" 时,输出 Y 就在最后一个 "1" 到来的同时输出一个时钟周期的高电平 1,否则输出 0。允许序列重叠(例如 "10101" 应被检测为两次)。
逻辑抽象与状态图:
S0
S1
S2
Y=1
状态化简: 3 个状态,功能各不相同,无等价状态可化简。
状态分配: 3 个状态需要 ceil(log2(3)) = 2 个触发器 (Q1, Q0)。
ceil(log2(3)) = 2
选择触发器,推导方程:
选择最简单的 D 触发器。其特性是 D = Q^{n+1},即 D 输入什么,下一个状态就是什么。
D = Q^{n+1}
状态/激励/输出表:
D1 = Q1' · Q0 · X'
D0 = X
Y = Q1 · Q0' · X
画出逻辑电路图:
Q1' AND Q0 AND X'
Q1 AND Q0' AND X
CLK
异步时序逻辑电路不使用统一的时钟信号,其状态的转换是由输入信号的变化直接引起的。这使得它们的行为更难分析和预测,但也赋予了它们在某些应用中潜在的速度优势。
异步电路的分析围绕着**流程表(Flow Table)**展开,它类似于同步电路的状态表,但描述的是在输入变化下,电路如何从一个稳定状态过渡到另一个稳定状态。
分析中的核心挑战是处理竞争与险象问题,这在异步电路中尤为突出和危险。
设计挑战:
优缺点:
由于上述挑战,在绝大多数数字系统中,同步设计仍然是主流和首选的方法。异步设计更多地用于一些对速度要求极高或者需要与外部异步信号接口的特定场合。
数字信号与模拟信号:
数字电路:
芯片: 通常指集成电路(IC),是将大量晶体管、电阻、电容等元件集成在一小块半导体晶片上的电子元件。是数字电路的物理实现载体。
定义: 可靠性编码是一种为了在数据形成、处理或传输过程中发现(有时甚至纠正)可能发生的错误,从而提高整个系统工作可靠性而设计的编码方案。
目的: 确保数据的完整性和准确性,抵抗噪声等外部干扰。
常见例子:
习题会做、掌握 8 个定理、了解各种图的画法就行。
核心概念: 在数字电路中,这些器件不工作在线性放大区,而是被用作高速的电子开关,只在**导通(ON/闭合)和截止(OFF/断开)**两种极端状态之间切换。
静态特性 (工作在稳定状态时):
DS
动态特性 (开关状态转换时):
t_pd
t_pHL
t_pLH
t_r
t_f
构建原理:
常用门电路符号:
集电极开路门 (Open Collector, OC):
三态门 (Tri-state, TS):
GND
A·B
A+B
A·B=1
(A·B)'
I_k
A<B
背景: 在物理电路中,逻辑门存在传输延迟。当一个输入信号的变化通过不同延迟的路径到达同一个输出门时,就会发生竞争 (Race)。这种竞争可能导致输出端产生不应有的、短暂的错误信号毛刺,即险象 (Hazard)。
A A'
A·A'
A+A'
(最原始的"记忆细胞")
(给R-S加个"定时开关")
("单输入"的R-S升级版)
(R-S的"终极进化版")
(J-K的"懒人模式")
(解决"空翻"的神器)
想象一下,你想搭一个电路,但又不想每次都用烙铁去焊一堆门电路芯片。可编程逻辑器件(PLD)就是来解决这个问题的!它就像一块可以反复擦写的电路板,你用代码告诉它你想变成什么电路,它就变成什么电路。