1. 数字逻辑基础
计算机无法直接处理模拟信号。
2. 数制与编码
2.1 数的表示
首先是定点整数的表示:
整数原码():
原码的减法需要比较绝对值,用大的减小的。
整数反码():
反码的加减法直接进行,但是最高位的进位要移动到最低位上。因为运算是在模 意义下进行的,最高位进位得到的结果是 。
整数补码():
由于是在模 意义下进行的,因此直接进行加减法就可以。
然后是定点小数的表示,形如 。其中第 位表示 。
对于定点小数的补码表示,加上的就是 ,因为是在模 意义下进行的。
2.2 BCD 码
Binary-Coded Decimal,即用二进制编码十进制数,核心思想是用 4 位二进制数表示 1 位十进制数。
最常用的是 8421 BCD 吗,即取前十个二进制码,剩余六个是非法码。
余 3 码(Excess-3),是 8421 码然后每个数加上 3(0011)。
然后是 2421 码和 5421 码,分别代表每一位的权值,当 时,第一位强制为 。
2.3 可靠性编码
2.3.1 Gray Code
2.3.2 奇偶校验码
2.3.3 海明码
3. 逻辑代数
德摩根定理用于拆解取反,即 。
反演(取反):颠倒所有的 、 和 和变量得到反函数。其实就是等式两边同时取反。
对偶: 表示将所有的 、 和 颠倒,得到对偶表达式,这显然是个可逆运算。最关键的作用是 ,比如摩根律只需要一半就可以证明另一半。
3.1 逻辑函数的表示
有三种方式去表示逻辑函数:逻辑表达式,真值表,卡诺图。注意卡诺图的顺序一般是 00 01 11 10。
首先是最小项表达式(积之和),即标准与或式,写作 ,编号规则为原变量视为 ,反变量视为 。无关项以 表示。
最大项表达式(和之积),即标准或与式,写作 ,编号规则为原变量视为 ,反变量视为 。因此我们有 (摩根定律)。
同一个逻辑函数的两种表达式的编号是互补的,这是因为一些组合的编号会使得 ,集合为 ,构成了与或表达式。而其补集会使得 ,构成了 的与或表达式,然后两边取反右边由摩根律就得到了 的或与表达式。出于这个事实,拿卡诺图写或与表达式只需要找 项去写,这样就可以找到那些“编号”。
求对偶的话,换成另一种表达式,每个编号改写为 。这个也是拿定义写一下就可以。
然后是用卡诺图化简逻辑函数。找大小为 的矩形(可以跨过边界,变量取值是连续的就可以),写与或式就找全 矩形去合并,可以消掉 个变量,或与式就找全 矩形合并。
4. 组合逻辑电路
4.1 逻辑门
- 基本门:与或非。
- 复合门:与非,或非(这两个是通用门),异或,同或()。
非门后面有一个空心圈。
或门是 >= 1,异或门是 = 1,同或门是 = 或者异或门取反。
4.2 编码器
Encoder, 个输入, 个输出。任一时刻最多只有一个输入有效,电路输出该输入对应的 位二进制代码。
但这样有一个问题,任一时刻必须且只能有一个输入为 1。如果同时按下多个键,输出会错误叠加。
因此通常使用优先编码器(Priority Encoder),允许多个输入同时有效,电路只对优先级最高的有效输入进行编码。最经典的(也是一般的教学案例)就是 8 线-3 线优先编码器 74LS148。

VCC 为接正极,GND 接负极。就实际上它应该长左边那样,但在教学时我们看右边那张图来方便理解它的功能。
代表 selected,也即 enabled,低电平时 74LS148 工作。 在两片级联时有用,大概是编码时 有效,开启但不编码时 有效。
我们来看该芯片的功能表:

非常好理解,就是从 一个一个看过去,找到一个有效电平就编码这个东西。
为什么要设计成低电平有效?这是因为 TTL(Transistor-Transistor Logic)门电路有一个特点:如果输入引脚悬空,内部电路会使得它等效于接高电平。所以如果什么都不做,它自己就是高电平,那么设计成高电平无效就很合理了。
74LS148 的级联。
4.3 译码器
4.4 数据选择器
即多路开关,从多路数据中选择一路作为输出。输入的数据一般是 。同样也有一个 代表是否工作(使能)。
首先是集成 8 选 1 数据选择器 74LS151,根据 (地址线)编码选择哪个信号输出,注意输出是一组 ,不多说。
74LS153 是集成双 4 选 1 数据选择器,但是其地址线是共用的,输出总共有两个 。非常牛逼:
- 实现任意 3 变量组合逻辑函数 ,直接地址线连 然后剩下的相应连 即可。
- 内部级联变成 8 选 1,大概就是让 分别取正和取反接两个使能端 来判断开启哪个选择器。但是这样芯片就没有使能了,需要在输出之前搞一个。
- 实现 4 变量的组合逻辑函数 ,用刚才的方法让它变成 8 选 1,然后直接搞!
- To be continued…
4.5 二进制加法器
4.6 竞争与冒险
由于不同信号到达的时间有延迟,信号经过不同路径到达同一点时引发“竞争”,由此产生的尖峰脉冲叫做“冒险”或者“险象”。不产生险象的竞争叫做非临界竞争,产生险象的竞争叫做临界竞争。
突变到 的称为 态冒险或者偏 型冒险,突变到 称为 态冒险或者偏 型冒险。
静态冒险是输出有毛刺,动态冒险是本来只有 1 次变化却出现了 3 次或多次。因此有动态冒险一定有静态冒险。
如果存在 ,那么存在冒险。因此可以画出卡诺图,找出所有相切的圈(两圈相邻但不重叠),此时会产生冒险。这样把产生冒险的改变的元素的这一项时其它的元素的逻辑函数加进逻辑表达式里即可。
也可能在输出端加滤波电容,将毛刺滤掉。
5. 时序逻辑电路
组合逻辑电路是“即时的”,输出只取决于当前输入。
5.1 触发器
触发器是一种能存储一个 bit 的基本逻辑电路。
首先是基本 RS 触发器,又叫 RS 锁存器,可以由两个与非门或两个或非门交叉耦合构成。这里给出一个与非门耦合的例子,依然是低电平有效:

那么可以看出如果 那么爆炸了(所以理论上需要禁止这种情况出现,后续的改进确实避免了这一点), 则 , 则置 1, 则置 0。
电平触发式触发器(更准确地常称为“锁存器”,Latch)是这样一个电路:在控制信号(通常是时钟或使能)的某个固定电平期间,输出会“透明”地跟随输入变化,也就是说,输入变化会实时影响输出;而在另一个电平期间,输出被锁存,保持不变。
基本有四种,RS、D、JK、T。

当 时,触发器状态保持不变,否则 。电平触发式 RS 触发器存在次态不能确定(即 )和“空翻”两个问题。
空翻是电平触发型触发器共有的严重问题。同步时序电路要求“一个时钟脉冲,状态最多只变一次”。但在 CLK 有效电平期间,输入一有变化,输出立刻跟着变。RS 触发器如果不动 R S 确实不会产生空翻,但是接下来 JK 触发器会一直震荡。

D 触发器解决了 RS 触发器次态不能确定的问题。需要不变的话,直接让 。或者更标准的做法,使用一个 2 选 1 数据选择器,两个数据是要修改的内容和 。

JK 触发器有 ,解决了次态不稳定,但是 时会在 CLK 有效电平期间持续翻转。
把 J K 连在一起就得到了 T 触发器,即 。
5.2 同步时序电路的分析
Merly 型电路的外部输出与电路的外部输入和内部状态都有关系,因此其状态图的边有外部输入和输出。
而 Moore 型电路的外部输出只与内部状态(现态)有关系,因此其状态图的边只有外部输入,点上有输出。
5.3 同步时序电路的设计
状态化简。
对于完全给定的状态表,化简的目的是寻找“等效对”,即在所有可能的输入下,它们的输出一致,所有的次态也都相同或者等效。因此,等效具有传递性。
对于不完全给定的状态表,即某些次态或者输出不重要,化简的目的是寻找“相容对”,不一定具有传递性。
自启动:上电时,触发器随机进入某个无效状态,电路能在无外部干预的情况下进入有效状态循环。
5.4 异步时序电路的分析
这部分是功利性的复习,不要参考。
要考虑边沿的问题。如果 CP 端有小圈,那么本身是下降沿触发,按照外部时钟 进行分析,写的时候要写成 。注意是带括号的,也就是说,。注意 。
无小圈是上升沿,有 。
7. 模拟电路基础
这部分是功利性的复习,不要参考。
本征半导体(纯净的硅/锗)的原子最外层有 4 个电子。绝对零度时,电子被锁在共价键里,是绝缘体。随着温度的升高,有些电子会变成自由电子(本征激发),可以自由在晶格中有游走。电子走了之后形成带正电的空穴,之后会有电子移动到这里,就像是空穴移动了。电子和空穴都是可以参与导电“载流子”。
本征半导体的电阻率高。所以我们参入微量杂质得到杂质半导体。
- N 型半导体,掺入磷等五价元素,容易激发出自由电子,所以叫做施主原子。
- P 型半导体,掺入硼等三价元素,容易形成空穴,所以叫做受主原子。
想要产生电流,需要发生两种运动:
- 扩散运动:N 区电子多,P 区空穴多,发生扩散形成电流。
- 漂移运动:在半导体两端加上电压产生电场,电子和空穴会产生定向移动。
7.0 PN 结与二极管
因为扩散运动,在交界处,P 区留下一堆带负电的固定离子,而 N 区留下一堆带正电的固定离子,形成内建电场,方向由 N 区指向 P 区。这会产生漂移运动,当其与扩散运动平衡时,宏观上就展现没有电流流过 PN 结。
P 接正 N 接负,即正偏,使得扩散运动增强,产生较大的正向电流。对于硅管来说,当外界电压达到 0.7V 时,这堵墙就被推平了,电流畅通无阻。否则几乎没有电流。
若 P 接负 N 接正,即反偏,中间这堵墙会变宽,PN 结截止。
二极管就是一个 PN 结。流经二极管的电流和外接正向电压 的关系是 ,其中 是反向饱和电流(本征激发越强 越大,且指数级上升), 只和温度有关且随温度的增大而线性增大。
由于我们不希望 改变,因此温度升高时 变大,我们需要让 减小。
反向电压过大时,普通二极管会发生电击穿。电击穿是可逆的,只要电流有限二极管也不会损坏,但是如果电流过大就热击穿然后就烧掉了。
电击穿分为两种:
- 齐纳击穿(Zener Breakdown):耗尽层内电场极强,直接把共价键里的电子“硬生生扯断”,释放出大量的电子-空穴对,导致电流急剧上升。(通常发生在击穿电压较低的时候,比如 6V 以下)。
- 雪崩击穿(Avalanche Breakdown):少数载流子在强大的电场中被加速,像子弹一样高速撞向原子,撞出新的载流子。这些新载流子又被加速,再去撞别的原子,像滚雪球一样越滚越多,瞬间电流激增。(通常发生在击穿电压较高的时候)。
7.2 三极管
以 NPN 型三极管为例:
- 发射区 Emitter,即箭头向外的一段,掺杂浓度极高
- 基区 Base,掺杂浓度很低,极其薄
- 集电区 Collector,体积最大,用来收集电子
三极管想要放大,发射结正偏,即 b 极电压比 e 极高 0.7V;而集电结反偏,c 级电压远远高于 b 级导致从 e 级冲向 b 级的电子大部分被吸到 c 级,导致 巨大。
我们有 ,而放大率 代表 ,于是 。