F3 数字逻辑电路基础(下)

整数的机器级表示

无符号数和有符号数

无符号二进制整数(无符号数):每一个二进制位都代表真值的大小,最小为0,最大为2n12^{n}-1

有符号二进制整数(有符号数):通过1位来编码整数的符号位,剩下用于编码整数的绝对值

原码(sign-and-magnitude)

这是人类最喜欢的表示法,给数字贴个符号标签。

  • 长相: [符号位] [绝对值]
  • +7 = 0000 0111
  • -7 = 1000 0111 (只是把最高位改成 1)
  • RCA 闯关测试:
  • 正 + 正: 7 + 34。结果正确。
  • 负 + 负: -7 + (-34)。RCA 算出来是 -41 吗?不,它把符号位也当数字加了,结果错乱。
  • 正 + 负: 7 + (-7)。RCA 算出来是 -14 (1000 1110),而不是 0

☠️ 致命缺陷

想象一个时钟,指针顺时针转应该是 +1+1

  1. 断层陷阱:0000 (+0) 和 1000 (-0) 之间有个大坑。
  2. 逆行灾难:
  • 我们希望:(-4) + 1 = (-3) (数值变大)。
  • 原码实际:(-4)1100,加 1 变成 1101 (-5)。数值反而变小了!
  • 结论:原码的负数半圆,是逆着长的。

为了计算原码加法, 电路上还需要设计一个减法器, 然后根据两数符号和绝对值的情况, 选择出正确的处理结果

IC 工程师评价: 垃圾设计。如果用原码,我得先判断符号,再比较绝对值大小,再决定是用加法器还是减法器。硬件成本太高,Pass!

反码(one’s complement)

为了解决原码”负数逆行”的问题,工程师想到了按位取反。

  • 长相: 正数不变,负数全部取反。
  • +7 = 0000 0111
  • -7 = 1111 1000
  • RCA 闯关测试:
  • 正 + 正: 通过。
  • 方向修正: 现在 (-4) + 1 确实等于 (-3) 了。负数部分也是顺时针增长的。
  • 跨越 0 点失败:
  • 7 + (-7)。RCA 算出来是 1111 1111。这是啥?这是 -0
  • 更离谱的是:如果你算 7 + (-0),结果会变成 6凭空少了一个 1!

☠️ 致命缺陷

  • -0 的幽灵: 这种编码里有两个 0:0000 0000 (+0) 和 1111 1111 (-0)。
  • 数学意义不连续: 在时钟上,从 -0+0 还是有个断层。每次跨越这个断层,计算结果就会少 1

IC 工程师评价: 还要我设计电路去处理那个讨厌的 -0?还要做”循环进位”来补那个丢失的 1?麻烦,Pass!

补码(two’s complement)

想象一个挂钟。现在是 12 点。

  1. 如果你想把指针拨到 11 点,你可以逆时针拨 1 格(做减法:12 - 1)。
  2. 有没有办法通过顺时针拨动,也能指到 11 点?
  • 答案: 顺时针拨 11 格!(12 + 11 = 23,在 12 小时制的钟面上,23 就是 11)。
  • 顿悟时刻: 在有限的模数系统(Modulus)里,减去一个数 = 加上这个数的”补数”
  • 减 1 = 加 11(模 12)。
  • 在这个意义上,-1 就是 11。
  • 长相: 负数 = 反码 + 1。
  • +7 = 0000 0111
  • -7 = 1111 1001

Q:为什么是取反加一?

溢出

补码加法的溢出

补码也存在编码连续但真值不连续的边界

即最大数0b0111...111和最小数0b1000...000

溢出:计算结果超过编码表示范围

为了检查加法计算的结果是否符合数学意义,电路需要检测是否发生溢出

比较维度进位 (Carry)溢出 (Overflow)
关注者无符号数 (Unsigned)有符号数 (Signed)
含义”桶装不下了""符号变错了”
硬件信号最高位的 Carry Out最高位进位入 \oplus 进位出
典型例子255 + 1 = 0 (进位了)127 + 1 = -128 (溢出了)
RISC-V指令add, sub (也会产生,但不一定报警)add, sub (忽略); addw (可能会报)

溢出检测

跨越不连续边界分为两种情况:

  1. 在正数部分往顺时针方向拨动指针, 跨越到负数部分(两个正数相加,结果为负数)
  2. 在负数部分往逆时针方向拨动指针, 跨越到正数部分(两个负数相加,结果为正数)
方法一:符号位判别法 (双符号位逻辑)

这是最符合人类直觉的判断方法。 核心逻辑:只有”正+正”或”负+负”才可能溢出。“正+负”永远不会溢出。

如果满足以下条件,就是溢出:

  1. 输入同号AABB 的符号位相同。
  2. 结果异号:结果 SS 的符号位与 AA (或 BB) 不同。

逻辑表达式: 设 SA,SB,SSS_A, S_B, S_S 分别为 A, B, Sum 的符号位 (最高位)。 Overflow=(SASBSS)+(SASBSS)\text{Overflow} = (S_A \cdot S_B \cdot \overline{S_S}) + (\overline{S_A} \cdot \overline{S_B} \cdot S_S)

  • 第一项:两个负数相加,变成了正数 (下溢)。
  • 第二项:两个正数相加,变成了负数 (上溢)。
方法二:进位异或法 (单符号位逻辑) —— 工程最常用

这是在硬件电路设计(包括 CPU ALU 设计)中最简单、最常用的方法,因为它不需要去检查整个结果,只需要看最后两个进位信号

核心逻辑: 观察最高位(符号位)全加器的两个进位信号:

  1. Cin_MSBC_{in\_MSB}进入最高位的进位(即次高位向最高位的进位)。
  2. Cout_MSBC_{out\_MSB}走出最高位的进位(即最高位向更高位的进位)。

判定公式Overflow=Cin_MSBCout_MSB\text{Overflow} = C_{in\_MSB} \oplus C_{out\_MSB} (即:如果这两个进位信号不一样,就是溢出)

时序逻辑电路

组合逻辑电路的输出完全由当前输入决定

新需求:如何实现电子表中新的秒数=旧的秒数+1?

通过时序逻辑电路实现可以存储状态的电路

交叉配对反相器(Cross-Coupled Inverters)

交叉配对反相器

1. 核心结构(长什么样?)

  • 两个反相器 (NOT Gate) 组成。
  • 连接方式:首尾相连(第一个的输出接第二个的输入,第二个的输出接第一个的输入)。

2. 核心功能(干什么用?)

  • 它是数字电路中 “记忆” 的最小单元。
  • 学术名称:双稳态电路 (Bistable Circuit)
  • 能力:可以存储 1 bit 的数据(存0或存1)。

3. 运行逻辑(怎么理解?)

  • 关键词:正反馈 (Positive Feedback) / 自锁 (Self-locking)
  • 逻辑推演
  • 假设输入是 1 \to 经过第一级变成 0 \to 经过第二级变回 1。
  • 结论:输出 = 输入 (Q=QQ = Q)。信号自己”咬住”了自己,不需要外界维持也能保持状态。

4. 三种状态(考点)

  • 稳态 1Q=1,Qˉ=0Q=1, \bar{Q}=0(稳定,锁住信息 “1”)。
  • 稳态 2Q=0,Qˉ=1Q=0, \bar{Q}=1(稳定,锁住信息 “0”)。
  • 亚稳态/非稳态QQQˉ\bar{Q} 同时为 0 或同时为 1。
  • 特点:逻辑上矛盾,实际上极不稳定。现实电路中会因为微小的干扰瞬间”坍缩”回上面两种稳态之一。

SR锁存器

SR锁存器

Set(置位) Reset(复位)锁存器,其中S和R用于控制锁存器的状态

R (Reset) 端:连接在 Q 输出的那一侧。

  • (给 1 就把 Q 变成 0)

S (Set) 端:连接在 Qˉ\bar{Q} 输出的那一侧。

  • (给 1 就把 Qˉ\bar{Q} 变成 0 \to 逼迫 Q 变成 1)
SRQ
00保持
010
101
11禁止

D锁存器

D锁存器

避免亚稳态

D为输入数据

WE为写使能(Write Enable)

  • 写使能有效时,将D的当前值写入锁存器

  • 写使能无效时,锁存器保持不变

WEDSRQ
0000保持
0100保持
10010
11101

用与非门搭建的D锁存器

与非门D锁存器

面积更小

同步电路

同步 = 步调一致(按照同一个节奏做不同的事)

所有元件的状态变化都对齐在同一个**时间基准(时钟信号的边沿)**上

复杂系统中的同步关系

一个复杂系统包含多个模块,需要考虑如何控制多个模块协同工作

需要正确实现一种同步关系:事件A在事件B之后发生

同步电路=通过全局的时钟信号实现同步关系

时钟信号是如下图所示的脉冲信号, 它在高低电平之间来回翻转, 一次高电平和一次低电平加起来称为一个周期

时钟信号示例
+--- positive edge +--- negative edge
V V
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
|   | |   | |   | |   | |   | |   | |   | |   |
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
  • 从低电平翻转为高电平,称为正边沿(positive edge)或者上升沿
  • 从高电平翻转为低电平,称为负边沿(negative edge)或者下降沿

同步电路的设计=把需要同步的事件划分到不同的周期中,由时钟信号控制这些事件的先后顺序

异步电路

通过模块之间的局部通信信号实现同步关系

同步电路设计简单,电路分析简单,但功耗较高

异步电路无时钟开销,功耗低

仅靠D锁存器无法实现同步电路的特性

WE有效时,输入的变化马上传播到输出

锁存器属于电平触发(level-triggered)的存储元件, 只要输入发生变化, 锁存器就能立即感知, 并将该变化传播到输出端.

主从式D触发器

相比之下, 我们需要一种边沿触发(edge-triggered)的存储元件, 只有信号边沿到来时, 才将输入传播到输出端

D触发器(D Flip-Flop,DFF)

D触发器

一种边沿触发的存储元件

左下方的>表示需要连接时钟信号

主从式D触发器:由两个D锁存器构成,左边为主锁存器,右边为从锁存器

D触发器的工作过程

  1. 数据准备阶段.

此时时钟信号clk处于低电平, 故主锁存器的写使能端有效, 数据信号D可从外部进入主锁存器;

但由于从锁存器的写使能端无效, 故数据信号无法传播到从锁存器, 因而整个D触发器的输出端Q保持不变.

  1. 采样阶段.

当时钟信号clk的上升沿到来时, 主锁存器的写使能端无效, 数据信号D无法从外部进入主锁存器, D的后续变化将无法对主锁存器造成影响, 从而将时钟信号上升沿到来前的外部数据D”锁”在主锁存器中.

与此同时, 从锁存器的写使能端开始有效, 主锁存器中”锁住”的数据将传播到从锁存器, 并作为整个D触发器的输出.

  1. 维持阶段.

此时时钟信号clk处于高电平, 故主锁存器的写使能端无效, 因此不受数据信号D变化的影响;

从锁存器的写使能端虽然有效, 但由于主锁存器保持不变, 故从锁存器也保持不变, 因而整个D触发器的输出端Q保持不变.

当时钟上升沿到来时, 数据被写入D触发器

D触发器是同步电路设计中的基本存储元件

带复位端的D触发器

带复位端D触发器

resetn为低电平有效的复位信号

resetn为1时,其功能与之前D触发器相同

resetn为0时,将往D触发器写入0

即使resetn为0,也需要等待上升沿到来时执行清零操作(同步复位)

下降沿的D触发器

原版 (上升沿)

  • Master 接收 CLK\overline{CLK} (低电平通)。
  • Slave 接收 CLKCLK (高电平通)。

修改版 (下降沿)

  • Master 改为接收 CLKCLK (高电平通)。
  • (这样 CLK=1 时,Master 就在采样)
  • Slave 改为接收 CLK\overline{CLK} (低电平通)。
  • (这样 CLK 变成 0 时,Slave 才开门放行)

带使能端的D触发器

  • EN有效时,选择D作为D触发器的输入
  • EN无效时,选择D触发器中存储的当前数据作为D触发器的输入(即D触发器中存储的值保持不变)

寄存器(register)

可同时读写多位的结构

由多个D触发器组成

可采用带置位端或者复位端的D触发器,实现寄存器的初始化

如依次采用DFFS,DFFR,DFFR,DFFS来构成4位寄存器,使其在电路复位后存储9(0b1001

交流与留言

这里使用无需登录的轻量评论系统。你可以留下问题、反馈、勘误或交流想法。