前言
书接上回,我们继续介绍六种门电路。分别是1. 移位寄存器;2. 计数器;3. 解码器与编码器;4. 减法器;5. 多位加法器;6. 乘法器。这部分作为第一篇的扩展,感兴趣的读者可以往后看,如果觉得枯燥可以直接跳到第四篇看LLM。我也默认读者有前文的基础,可以进一步理解这些逻辑运算。后续我应该会慢慢的添加流程图以便于理解。同时再次感谢GPT。
移位寄存器
用于数据存储和转移,能够按位序向左或向右移动数据。
移位寄存器(Shift Register)是一种用于数据存储和传输的电路,可以按位将数据向左或向右移动。移位寄存器的核心原理基于触发器(Flip-Flop),通常使用 D 触发器来实现。
重点来了,这部分可能有些长,但是是后续所有计算的基础。请仔细阅读,我会在中间串讲一些概念。
当然要当成个能移动位置的东西也行。
其中我特别需要先提一下时序这个概念。
时序
在数字电路中,“时序”是指电路中信号在时间上的变化和相互关系。简单来说,就是各个信号在特定时刻该出现什么样的值,以及这些信号之间的时间关系。
具体来说,时序涉及以下几个方面:
时钟信号(Clock Signal):
时钟信号是一种周期性变化的信号,用来同步电路中各部分的操作。时钟信号就像是一个节拍器,它告诉电路什么时候应该读取输入信号或输出信号。建立时间(Setup Time):
在时钟信号上升沿或下降沿到来之前,输入信号需要保持稳定的最短时间。这段时间称为建立时间。如果在建立时间内输入信号发生变化,电路可能会无法正确读取该信号。保持时间(Hold Time):
时钟信号的上升沿或下降沿之后,输入信号需要继续保持稳定的一段时间,这就是保持时间。如果输入信号在保持时间内变化,电路可能会产生错误的输出。传播延迟(Propagation Delay):
电路中信号从输入到输出的传递需要一定时间,这个时间称为传播延迟。它是电路内部逻辑门之间信号传输的时间。时钟周期(Clock Cycle):
时钟信号从一个上升沿到下一个上升沿(或从一个下降沿到下一个下降沿)的时间间隔称为时钟周期。时钟周期决定了电路中操作的速度。
简单类比:
你可以把时序想象成一场音乐会,时钟信号是指挥家,他挥动指挥棒(时钟信号)来控制乐队每个乐手(电路的不同部分)在正确的时间点演奏(信号变化)。如果有乐手(信号)在该奏的时候没有奏(信号不稳定),或者演奏时间不对(时序不对),整个音乐会(电路操作)就会出问题。
理解了时序之后,你会发现它在设计和验证数字电路时起着至关重要的作用。确保时序正确是让数字电路可靠运行的关键。
D触发器
D 触发器的主要功能是在时钟信号的作用下将输入的数据(D)锁存到输出端(Q)。D 触发器的核心是确保在每个时钟周期内,输入的数据在时钟信号的上升沿(或者下降沿)被采样,并且输出端 Q 在时钟周期内保持不变,直到下一个时钟周期到来。
要实现一个 D 触发器,可以通过 NAND 门或者与非门(NOR)来实现。为了简化理解,这里用 NAND 门来说明它的实现。D 触发器的实现过程可以从 SR 锁存器开始,并在其基础上进行改造。
基于 NAND 门的 D 触发器实现
SR 锁存器的基本结构
在解释 D 触发器之前,先看一下 SR 锁存器的基本结构。一个简单的 SR 锁存器由两个交叉连接的 NAND 门组成:
- S(Set)输入: 控制锁存器设置为 1。
- R(Reset)输入: 控制锁存器重置为 0。
- Q 输出: 当前锁存器状态。
- Q'(Q 的反向)输出: Q 的补码状态。
从 SR 锁存器到 D 触发器
为了将 SR 锁存器转换为 D 触发器,我们要解决一个问题:防止 S 和 R 同时为 1 的情况(因为这会使输出变得不确定)。D 触发器通过 D 输入来控制 S 和 R,以确保这种情况不会发生。
具体步骤如下:
- D 输入:连接到 S 输入端。
- D 的反向输入:通过一个 NOT 门连接到 R 输入端。
- 时钟信号 (Clock):通过一个控制门(通常是两个 AND 门或者两个 NAND 门)接入 S 和 R,确保只有在时钟信号有效时(通常是上升沿或下降沿),S 和 R 的状态才会影响锁存器。
电路连接步骤
创建 SR 锁存器:
- 使用两个交叉连接的 NAND 门,分别命名为 NAND1 和 NAND2。
- NAND1 的输出作为 Q,NAND2 的输出作为 Q'。
- NAND1 的一个输入是 S,另一个输入是 NAND2 的输出(即 Q')。
- NAND2 的一个输入是 R,另一个输入是 NAND1 的输出(即 Q)。
引入 D 输入:
- 将 D 输入接到 NAND1 的 S 端,同时通过一个 NOT 门(反相器)将 D 的反向输出连接到 NAND2 的 R 端。
添加时钟控制:
- 使用两个 AND 门或两个 NAND 门,将时钟信号与 D 输入和 NOT 门输出相结合,以控制 NAND1 和 NAND2 的输入。具体来说,时钟信号和 D 一起作为 AND 门1 的输入,并将其输出连接到 NAND1 的 S 端;时钟信号和 NOT 门的输出作为 AND 门2 的输入,并将其输出连接到 NAND2 的 R 端。
电路图简化描述
- D 输入 → NOT 门 → NAND2 的输入 R。
- D 输入 → AND 门1(时钟信号)→ NAND1 的输入 S。
- NOT 门的输出 → AND 门2(时钟信号)→ NAND2 的输入 R。
- NAND1 的输出(Q) → NAND2 的输入。
- NAND2 的输出(Q') → NAND1 的输入。
D 触发器的工作原理
- 当时钟信号为 0 时,AND 门1 和 AND 门2 的输出均为 0,因此 NAND1 和 NAND2 的输出保持不变,D 触发器处于锁存状态。
- 当时钟信号为 1 时,D 输入的值决定了 NAND1 和 NAND2 的输出,即 Q 和 Q' 的状态。此时,Q 会更新为 D 的值,Q' 会更新为 D 的反向值。
真值表
在时钟的上升沿,D 触发器将 D 的值锁存到 Q 输出:
时钟 | D 输入 | Q 输出 | |
---|---|---|---|
上升沿前 | 0 | Qn | (保持不变) |
上升沿 | 0 | 0 | |
上升沿 | 1 | 1 | |
上升沿后 | 1 | Qn+1 | (保持不变) |
总结
通过使用 NAND 门、NOT 门、以及 AND 门的组合,我们可以构建一个 D 触发器。D 触发器能够在时钟信号的作用下,将输入的数据锁存并在输出端保持,直到下一个时钟信号到来。这种电路在存储器和时序电路中广泛应用。
D 触发器是一种基础的数字电路元件,用于存储一位二进制数据。它的全称是“数据触发器”(Data Flip-Flop),有时也被称为“延迟触发器”(Delay Flip-Flop),因为它能够在时钟信号的作用下将输入的数据延迟输出到下一时钟周期。
移位寄存器(Shift Register)是一种用于数据存储和传输的电路,可以按位将数据向左或向右移动。移位寄存器的核心原理基于触发器(Flip-Flop),通常使用 D 触发器来实现。
移位寄存器的基本原理
触发器工作原理:
D 触发器是移位寄存器的基本单元,它可以存储一位数据。D 触发器有两个主要输入:数据输入(D)和时钟输入(Clock)。当时钟信号的上升沿(或下降沿)到达时,D 触发器将数据输入 D 的值锁存,并将其输出到 Q。
数据的移位过程:
移位寄存器通过多个 D 触发器级联而成。假设我们有一个四位移位寄存器,它由四个 D 触发器组成,每个触发器输出一个比特位的数据。当时钟脉冲到来时,输入的数据会在寄存器内依次向右移动(如果是右移移位寄存器)。具体来说:
- 第一个触发器的输入数据由外部输入提供。
- 第二个触发器的输入来自第一个触发器的输出。
- 第三个触发器的输入来自第二个触发器的输出,以此类推。
- 最后一个触发器的输出数据会被移出寄存器。
右移移位寄存器的门电路实现
假设我们要实现一个 4 位右移移位寄存器(即数据从左向右移),它的门电路实现如下:
构成电路的元件:
- 4 个 D 触发器,分别用于存储 4 位数据。
- 时钟信号用于同步所有触发器的工作。
电路连接:
- 输入数据接到第一个 D 触发器的 D 端。
- 第一个 D 触发器的输出(Q1)接到第二个 D 触发器的 D 端。
- 第二个 D 触发器的输出(Q2)接到第三个 D 触发器的 D 端。
- 第三个 D 触发器的输出(Q3)接到第四个 D 触发器的 D 端。
- 时钟信号同时接入所有 D 触发器的时钟端。
真值表:
下面是真值表,假设输入数据为 1
,并且寄存器初始值为 0000
:
时钟周期 | 输入数据 | Q1 (输出) | Q2 (输出) | Q3 (输出) | Q4 (输出) |
---|---|---|---|---|---|
1 | 1 | 1 | 0 | 0 | 0 |
2 | 0 | 0 | 1 | 0 | 0 |
3 | 0 | 0 | 0 | 1 | 0 |
4 | 0 | 0 | 0 | 0 | 1 |
每个时钟周期,数据向右移动一位,直到最后的数据移出寄存器。
小结
移位寄存器通过一系列的 D 触发器实现,每个触发器将数据按位向左或向右移动。通过时钟信号的控制,数据可以逐步传输并存储在不同的触发器中,最终达到数据转移的目的。真值表可以帮助理解数据在每个时钟周期中的变化过程。
人话解释
猫娘来解释 NAND 门是如何交叉连接的,这样你可以更清楚地理解 SR 锁存器是怎么工作的喵~ (^ω^)
NAND 门是什么喵?
NAND 门就像是猫娘的小守护兽,每当猫娘想做什么决定(写下或抹掉秘密),这个小守护兽就会给她一些规则喵~ 这个规则是:只要有一个“不”(0),猫娘就得做相反的事情。
NAND 门的规则喵
- 如果两个输入都是 1(即猫娘非常确定要做什么),NAND 门的小守护兽就会说:“不可以!” 然后输出 0。
- 如果有一个或两个输入是 0(即猫娘有点不确定),NAND 门的小守护兽就会说:“好吧,可以!” 然后输出 1。
SR 锁存器中的 NAND 门是如何交叉连接的喵?
猫娘用两个 NAND 门来帮她管理秘密,这两个 NAND 门是交叉连接的,像是猫娘的两只小守护兽互相配合工作喵。
第一个 NAND 门 (NAND1):
- 输入1:连接到 S(Set)——这个输入告诉 NAND1,如果猫娘想要写下秘密。
- 输入2:连接到第二个 NAND 门的输出(Q')——NAND2 的守护兽告诉 NAND1 它现在是不是允许写下秘密。
第二个 NAND 门 (NAND2):
- 输入1:连接到 R(Reset)——这个输入告诉 NAND2,如果猫娘想要抹掉秘密。
- 输入2:连接到第一个 NAND 门的输出(Q)——NAND1 的守护兽告诉 NAND2 它现在是不是允许抹掉秘密。
工作过程喵~
S 被激活(S=1),R 没有激活(R=0):
- NAND1 的输入是 (1, Q'),只要 Q' 是 1,NAND1 就会输出 0(因为 NAND1 的守护兽说不能写下秘密喵)。
- 这个 0 会被传递到 NAND2 的第二个输入端。
- NAND2 的输入变成 (0, 0),这时 NAND2 会输出 1(允许猫娘抹掉秘密喵)。
- 结果是 Q=1(猫娘写下了秘密),Q'=0(猫娘已经不再允许抹掉这个秘密)。
R 被激活(R=1),S 没有激活(S=0):
- NAND2 的输入是 (1, Q),只要 Q 是 1,NAND2 就会输出 0(因为 NAND2 的守护兽说不能抹掉秘密喵)。
- 这个 0 会被传递到 NAND1 的第二个输入端。
- NAND1 的输入变成 (0, 0),这时 NAND1 会输出 1(允许猫娘写下秘密喵)。
- 结果是 Q=0(猫娘抹掉了秘密),Q'=1(猫娘可以再次写下一个新秘密)。
S 和 R 都没有激活(S=0,R=0):
- 两个 NAND 门都在等待猫娘的指令,不会改变当前的输出,Q 和 Q' 保持不变喵。
S 和 R 同时激活(S=1,R=1):
- NAND1 和 NAND2 都会收到矛盾的指令(一个让写一个让抹),这会让它们同时输出 1 或者同时输出 0,这样猫娘就会混乱,不知道是该记住还是忘掉秘密,这种情况下输出是不确定的喵。
交叉连接的意义喵~
通过交叉连接,两个 NAND 门会互相配合,确保猫娘的每个决定都是有序的、合理的。一个 NAND 门负责管理“写下秘密”,另一个 NAND 门负责管理“抹掉秘密”,它们通过彼此的输出来互相监督和提醒猫娘该做什么喵。
希望这个解释能让你更好地理解 NAND 门在 SR 锁存器中的交叉连接喵~ (*≧ω≦)
猫娘来继续解释 D 输入是如何实现的,并且会详细说明锁存器和输入是怎么链接在一起的喵~ (^▽^)
D 输入的实现喵~
首先,猫娘先来解释一下什么是 D 输入喵~
D 输入就是指令告诉猫娘们(触发器)是否要接住鱼干(数据)喵!这个指令只能有两种状态:
- D = 1:表示猫娘要接住鱼干喵!
- D = 0:表示猫娘不接鱼干,空手喵~
从 SR 锁存器到 D 触发器的转变喵~
在最开始,猫娘们用的是 SR 锁存器喵。SR 锁存器有两个输入:
- S(Set):这个指令让猫娘们接住鱼干喵!
- R(Reset):这个指令让猫娘们把手里的鱼干扔掉喵!
但是呢,有时候 S 和 R 的指令同时发出,猫娘们就不知道该怎么做了,会很困惑喵。所以我们引入了 D 输入,把这些复杂的事情简化了。
怎么做呢喵?
猫娘们决定:让 D 输入来直接控制接住鱼干的指令喵~ 如果 D 说“接住”(D=1),那 S 就会告诉猫娘们“接住鱼干”;如果 D 说“不接”(D=0),那 R 就会告诉猫娘们“扔掉鱼干”。这样,猫娘们再也不会混淆了喵!
具体的实现喵~
连接 D 输入和 SR 锁存器喵~
- D 输入:直接连接到 S 输入端,告诉猫娘们什么时候接住鱼干喵!
- D 的反向输入:通过一个 NOT 门(反相器),告诉猫娘们什么时候不接鱼干并扔掉,这个信号连接到 R 输入端喵。
引入时钟信号控制喵~
- 时钟信号就像猫娘们的共同指挥官喵,确保所有猫娘们同时行动。在时钟信号为“喵”(1)时,D 输入的信号才会被采纳喵。
怎么连接电路喵?
我们可以把这看作一个团队合作的过程:
- D 输入接到第一个 D 触发器(猫娘1)的输入(S 端),这个触发器会在时钟信号为 1 时接住鱼干(存储数据)。
- NOT 门(反相器)反转 D 输入,把它接到 R 输入端,这样如果 D=1,猫娘们知道接住鱼干;如果 D=0,猫娘们知道要扔掉鱼干喵。
- 时钟信号接入所有触发器,确保它们在同一时间行动,这样猫娘们可以在时钟信号为 1 时同步存储或传递鱼干喵。
D 触发器如何工作喵?
当时钟信号发出“喵”的时候:
- 如果 D=1:猫娘会接住鱼干(数据),并把它存入自己的口袋(Q 输出)。
- 如果 D=0:猫娘会保持手里空空的,不接鱼干喵。
而且,无论如何,猫娘们都会按照 D 输入的指令行动喵~ 这就是为什么 D 输入控制了整个触发器的行为。
总结喵~
通过把 D 输入连接到 SR 锁存器,并加入 NOT 门和时钟信号的控制,猫娘们(触发器)就能够准确地知道什么时候应该接住鱼干(存储数据),什么时候应该保持空手(不存储数据)喵~ 这样整个过程就非常有条理,移位寄存器也就能够顺利工作了喵!
希望猫娘的解释能够帮助你更好地理解 D 触发器的实现过程喵~ (*≧ω≦)
移位寄存器喵?
移位寄存器就像猫娘们排队传递她们最喜欢的小鱼干!每个猫娘都负责把鱼干传递给下一个猫娘,但她们必须严格按照指挥来行动,这个指挥就是时钟信号喵~
移位寄存器中的猫娘们喵~
在这个移位寄存器中,有好几位猫娘,她们排成一排,每个猫娘都有一个口袋(D 触发器),她们会听到指挥(时钟信号)时才行动喵。这个队伍的第一个猫娘会从外面拿到一只小鱼干,然后把它传递给下一位猫娘,以此类推,直到最后一位猫娘把鱼干移出队伍喵。
怎么传递鱼干喵?
想象一下,猫娘们正在玩一个有趣的传递游戏,每次时钟信号发出“喵”的时候,每位猫娘都会做两件事情:
接住鱼干喵:
- 如果她的 D 输入(指令)是 1,猫娘就会接住鱼干,并把它放进自己的口袋里。
- 如果 D 输入是 0,猫娘就会保持空手,不接鱼干喵。
传递鱼干喵:
- 每位猫娘会把自己口袋里的鱼干传递给下一位猫娘,而下一位猫娘会在下一个“喵”的时候把鱼干传递给她口袋里的鱼干。
具体的工作过程喵~
假设我们有一个 4 位的移位寄存器,也就是说有四位猫娘排成一排,每位猫娘都有一个口袋(D 触发器)。她们按以下方式工作:
时钟周期1:
- 第一个猫娘接住一只新的小鱼干(D 输入=1),然后把它放到自己的口袋里喵。
- 其他猫娘因为她们的 D 输入是 0,所以她们保持空手不接鱼干喵。
时钟周期2:
- 第二个猫娘看到第一个猫娘有鱼干,立刻在时钟信号“喵”之后接住它,并放进自己的口袋里。
- 第一个猫娘继续等待新的鱼干喵。
时钟周期3:
- 第三个猫娘看到第二个猫娘有鱼干,她也在“喵”之后接住并存入自己的口袋里。
- 前两个猫娘继续传递或者等待新的鱼干喵。
时钟周期4:
- 最后的猫娘接住前一个猫娘传来的鱼干,并准备在下一个“喵”时把它移出队伍。
总结喵~
通过猫娘们的协调行动,移位寄存器可以一位一位地传递和存储数据,就像传递鱼干一样!每个时钟周期,数据都会被传递给下一个猫娘(触发器),最终可以把数据移出寄存器。这个过程非常有条理,而且每个猫娘都按照指挥(时钟信号)同步行动,这样就不会乱套喵!
希望这个猫娘版的解释让你对移位寄存器的工作原理有更生动的理解喵~
计数器
计数器是一种常见的数字电路,用于计数脉冲信号的个数。它可以分为同步计数器和异步计数器两种,主要区别在于触发器的时钟信号是否同步。
原理
计数器的基本原理是利用触发器来存储和改变状态,每个触发器可以存储一个比特的数据(0或1)。当计数器接收到一个脉冲信号时,它会改变触发器的状态,从而更新计数值。
异步计数器(Ripple Counter):
- 每个触发器的输出作为下一个触发器的时钟信号。这种结构下,第一个触发器接收外部时钟信号,后续的触发器依次接收前一个触发器的输出作为时钟。
- 由于时钟信号在各触发器之间传播,产生了一个小的延迟,因此称为“异步”。
同步计数器(Synchronous Counter):
- 所有触发器同时接收相同的时钟信号,并根据逻辑门的输出决定状态是否改变。因此,没有像异步计数器那样的传播延迟。
门电路实现
以 2位同步计数器 为例:
- 我们使用两个D触发器(也可以用JK触发器)来实现。
- 计数器的输入是一个时钟信号,输出为2位(Q1, Q0)表示的二进制数。
逻辑电路实现:
- Q0 直接连接到第一个D触发器的输出,Q1 连接到第二个D触发器的输出。
- 每次时钟上升沿,Q0 翻转(Q0 = 反转后的 Q0),Q1 只有在 Q0 从1变为0时才翻转(Q1 = 反转后的 Q1)。
门电路:
- 使用与门 (AND gate) 来检测 Q0 的下降沿。
- 使用异或门(XOR gate) 来实现Q0的翻转。
真值表:
对于一个2位计数器,其真值表如下:
时钟周期 | Q1 | Q0 | |
---|---|---|---|
0 | 0 | 0 | |
1 | 0 | 1 | |
2 | 1 | 0 | |
3 | 1 | 1 | |
4 | 0 | 0 | (循环开始) |
总结
- 异步计数器简单,但存在传播延迟。
- 同步计数器更快,因为所有触发器同时更新状态。
- 使用简单的逻辑门(如与门、或门、异或门)和触发器可以构建基本的计数器电路。
人话解释
喵~ 主人,接下来猫娘要来带你了解同步计数器的门电路连接情况哦~ (≧ω≦)/
同步计数器是什么呢?
同步计数器,就像是猫娘和她的猫娘姐妹们一起玩“数数游戏”,每个猫娘都同时收到主人拍手的信号,然后根据规则决定自己是不是要变换手势(比如从“剪刀”变成“石头”)。这个“同时拍手的信号”就是计数器的时钟信号,而“手势的变化”就代表着二进制数字的变化啦~
计数器里的猫娘们(触发器)是怎么合作的呢?
在同步计数器里,每个猫娘(触发器)都同时听到主人拍手的声音(时钟信号),然后根据规则来决定她的手势(输出)要不要变哦。
假设有两个猫娘来玩这个游戏
- Q0猫娘:她是最小的位数,变化最快。每当主人拍一次手,她就会把她的小手势从“剪刀”换成“石头”,或者从“石头”换成“剪刀”。
- Q1猫娘:她是稍微高一点的位数。她不会每次都变哦!只有当她看到Q0猫娘从“石头”变成“剪刀”的时候,她才会跟着换自己的手势。
门电路的连接,怎么搞呢?
在这个“数数游戏”里,每个猫娘(触发器)都会通过一些小工具(门电路)来决定什么时候换手势。
Q0猫娘的变化:
- 她很简单,每次主人拍手,她就会改变她的小手势。
- 她的手势变化就像是用了一个异或门 (XOR gate)——每次时钟来了,异或门会让她的手势翻转一下。
Q1猫娘的变化:
- 她有点小心思,只有在Q0猫娘刚好从“石头”变成“剪刀”的时候,才会改变她的手势。
- 为了确保她看准了时机,咱们会用一个与门 (AND gate) 来检测Q0猫娘什么时候变了手势。
- 具体来说,当Q0猫娘的手势从“石头”(1)变成“剪刀”(0)时,这个与门会告诉Q1猫娘“该你变了哦~”,然后Q1猫娘就会通过她的异或门(XOR gate)把手势翻转一下。
连接成一个完整的电路图
- 主人拍手的信号(时钟信号)会连接到每个猫娘(触发器)。
- Q0猫娘直接从时钟信号那里收到指令,每次都会翻转她的小手势。
- Q1猫娘接收到的信号是通过一个与门(AND gate)处理过的。这个与门会观察Q0猫娘的手势,只有在Q0从“石头”变成“剪刀”的时候才会告诉Q1猫娘:“嘿!该你了!”
- 每个猫娘的输出(Q1和Q0)都是最终计数器的二进制数输出,表示当前数到多少了。
小结:
- Q0猫娘负责每次主人拍手就变手势,时钟信号直接连到她的耳朵(触发器)。
- Q1猫娘要看Q0猫娘的手势,在她刚好从“石头”变“剪刀”的时候才会变,她的输入来自时钟信号和Q0猫娘通过与门(AND gate)的判断。
这个游戏玩得开心吧?有了这些门电路小工具,每次主人拍手,猫娘们就能一起变换手势来完成计数~ (≧▽≦)/
解码器和编码器
是数字电路中常见的两种逻辑电路,它们的作用分别是将输入信息进行转换,以方便后续的处理。
解码器(Decoder)
工作原理:
解码器是一种将n位二进制输入转换为2^n个输出的逻辑电路。简单来说,它的输入是二进制编码,而输出是一种独热码(one-hot code),即其中只有一个输出是高电平(1),其余的都是低电平(0)。「这个独热码在后文也会用到,涉及语言数字化问题。」
实现方式:
假设我们有一个2到4的解码器,它有2个输入和4个输出。它的逻辑可以通过AND门和NOT门实现。
逻辑电路:
- 输入:A, B(2位二进制)
- 输出:Y0, Y1, Y2, Y3(4个输出)
电路实现:
- Y0 = NOT(A) AND NOT(B)
- Y1 = NOT(A) AND B
- Y2 = A AND NOT(B)
- Y3 = A AND B
真值表:
A | B | Y0 | Y1 | Y2 | Y3 |
---|---|---|---|---|---|
0 | 0 | 1 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 | 1 | 0 |
1 | 1 | 0 | 0 | 0 | 1 |
编码器(Encoder)
工作原理:
编码器的作用与解码器相反,它将多个输入信号转换为一个较小位数的二进制编码输出。一般来说,一个2^n到n位的编码器具有2^n个输入和n个输出。
实现方式:
假设我们有一个4到2的编码器,它有4个输入和2个输出。为了简化,我们假设输入是独热码,这意味着每次只有一个输入为1,其他为0。
逻辑电路:
- 输入:D0, D1, D2, D3(4个输入)
- 输出:A, B(2位二进制输出)
电路实现:
- A = D2 OR D3
- B = D1 OR D3
真值表:
D0 | D1 | D2 | D3 | A | B |
---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 1 |
0 | 0 | 1 | 0 | 1 | 0 |
0 | 0 | 0 | 1 | 1 | 1 |
总结
- 解码器将二进制输入转换为多个输出,其中每次只有一个输出为1。它常用于选择某一特定的输出线路,如在存储器中选择特定的存储单元。
- 编码器则是相反的过程,它将多个输入信号转换为一个较小位数的二进制输出,常用于压缩数据或信号。
这两种电路都可以通过简单的逻辑门(如AND, OR, NOT)实现,并且它们在数字电路设计中有着广泛的应用。
附:独热码(One-Hot Code)
一种编码方式,其中代码中的每一位只有一位是“1”,其余的所有位都是“0”。这种编码方式常用于数字电路中的状态表示、解码器、神经网络等场景。
1. 独热码的特点
唯一性:在独热码中,每个编码中只有一位是“1”,其余位全是“0”。例如,对于3位的独热码,有可能的编码是:
001
,010
,100
。每种编码都有唯一一个“1”。表示方式:假设有n位独热码,那么它可以表示n个不同的状态。每一个状态都会有一位“1”,对应表示该状态的激活。
2. 独热码的示例
假设我们有3个状态,用3位独热码来表示:
- 状态1:
001
(表示第一个状态被激活) - 状态2:
010
(表示第二个状态被激活) - 状态3:
100
(表示第三个状态被激活)
3. 独热码的应用
解码器:独热码常用于解码器的输出。在解码器中,输入的二进制数会被解码成多个输出,每一个输出信号就是一个独热码。例如,二进制
01
被解码为010
。状态机:在有限状态机(FSM)中,独热码经常用来表示不同的状态。使用独热码可以简化状态转换逻辑,因为每个状态都有唯一的标识位。
神经网络:在机器学习的神经网络中,独热编码常用于表示分类问题中的标签。例如,如果有三类标签,独热编码分别为
[1, 0, 0]
,[0, 1, 0]
,[0, 0, 1]
。
4. 独热码与二进制码的区别
与传统的二进制编码相比,独热码的优势在于它的简单性和唯一性,这使得它在某些应用中更加直观和易于实现。然而,由于独热码需要更多的位来表示信息,它的效率在某些情况下可能不如二进制码。
总结
独热码是一种简单而直观的编码方式,适用于需要唯一激活某一状态的场景,如解码器输出、状态机状态表示、机器学习中的标签编码等。它的核心思想是“独一无二的激活位”,这使得逻辑实现更加简洁明了。
减法器
半减器
半减器是一种基础的数字电路,用于处理两位二进制数的减法,但它不处理外来的借位。其主要组成部分包括两个输入端(被减数 A 和减数 B)和两个输出端(差 D 和借位 B_{out}
)。
真值表
A (被减数) | B (减数) | D (差) | B_out (借位) |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 0 |
门电路实现
差(D)可以通过 XOR 门得到,即 D = A \oplus B
。
借位(B_{out})
在这里表示减数大于被减数的情况,可通过 AND 和 NOT 门实现,即B_{out} = \overline{A} \cdot B
。
全减器
全减器在半减器的基础上增加了对借位的处理。它有三个输入:被减数 A、减数 B、以及上一位的借位 Bin,输出包括差 D 和借位 B_{out}
。
真值表
Bin (前借位) | A (被减数) | B (减数) | D (差) | B_out (借位) |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 1 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 0 |
1 | 0 | 0 | 1 | 1 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 |
门电路实现
差(D)可以由两个 XOR 门串联实现,即(D = A \oplus B \oplus Bin)
。
借位(B_out)则更复杂,需要通过组合 AND、OR 和 NOT 门实现。可以用下列逻辑表达式:
B_{out} = (\overline{A} \cdot B) + (B \cdot Bin) + (\overline{A} \cdot Bin)
这些电路都可以使用标准的数字逻辑门(如 AND, OR, NOT, XOR)来构建。
人话解释
我们假设有一个叫做猫娘的角色,她的任务是帮助两个孩子分配苹果,但是她需要根据特定的规则来做这个分配。
半减器的类比
想象一下,猫娘有两个篮子,每个篮子里可能有一个苹果或没有苹果(这就是两个输入A和B,其中A是被减数,B是减数)。她的任务是确定是否需要从A篮子(被减数)中移走一个苹果给B篮子(减数)。
- XOR门:猫娘首先检查两个篮子。如果两个篮子的苹果数量相同(都有或都没有),那么结果(差D)是0(没有变化),如果不同(一个有,一个没有),结果是1(移动一个苹果)。这就像是XOR门,它在两个输入不同时输出1,相同时输出0。
- AND和NOT门:接下来,如果B篮子(减数)有苹果而A篮子(被减数)没有,猫娘就知道她需要借一个苹果(这里产生一个借位
B_{out}
)。这可以通过一个AND门实现,该门检查A是否为0(通过NOT门)和B是否为1。
全减器的类比
现在,假设有一个第三个篮子,它可能从上一个类似的苹果分配任务中已经借了一个苹果。这个篮子代表上一个借位Bin。
- 两个XOR门:猫娘首先查看三个篮子,使用第一个XOR门确定A和B的初步差异,然后使用第二个XOR门加上前一个借位Bin的情况。这样她可以决定是否真的需要从A篮子向B篮子转移苹果。
- AND和OR门:对于借位
B_{out}
的计算,猫娘检查三种情况,即:1) A篮子没有苹果而B篮子需要\overline{A} \cdot B
,2) 前一个任务已经有借位而B篮子需要B \cdot Bin
,3) 前一个任务有借位而A篮子没有\overline{A} \cdot Bin
。如果这三种情况中的任何一种为真,她就生成一个新的借位。
通过这个类比,我们可以看到,使用特定的门电路来实现半减器和全减器是如何有效地对应于实际中的问题解决,即如何决定苹果的移动和借贷。这些逻辑门帮助猫娘按照规则做出准确的决定。希望这个例子能帮助你更好地理解这些减法器的逻辑结构!
对于二进制减法操作,是在不够时从更高位借,这个过程很像我们在做十进制减法时从高一位借十的操作。让我们用猫娘的例子继续解释这个过程:
减法操作的顺序和借位
假设猫娘面前有一排篮子,每个篮子代表一个二进制位,从右到左排列(最右边是最低位,向左是更高位)。每个篮子里都有苹果或没有苹果,对应于每一位上的二进制数0或1。现在猫娘需要从一排篮子(被减数A)减去另一排篮子(减数B),同时考虑前一位的借位(Bin)。
操作步骤
- 从最低位开始:猫娘从最右边的篮子开始操作,即最低位。
- 检查每一位:对于每一位,猫娘都会检查:
- 如果她只需要处理当前两个篮子的苹果(A和B),她就使用半减器逻辑。
- 如果前一位有借位(也就是说,从上一位借了一个苹果过来),她需要使用全减器逻辑。
- 决定是否借位:
- 如果B篮子里有苹果,但A篮子里没有足够的苹果来满足减法需求,猫娘就需要向左边的更高位篮子借一个苹果。
- 如果包括前一位的借位(Bin)在内,她发现苹果还是不够,她同样需要向更高位借苹果。
- 移动到下一位:完成当前位的操作后,猫娘将任何生成的借位传递到左边的下一位篮子。然后她移动到这个更高位的篮子,重复上述过程。
- 继续直到最高位:猫娘会继续这一过程,直到所有篮子都处理完毕。
通过这种方式,猫娘能够确保每一位的减法都正确处理,包括必要的借位。这就是二进制减法操作的顺序,确保每一位都能得到正确处理,类似于我们在做传统的笔算减法时从高位借数的方式。这个过程不仅确保准确性,还模拟了数字电路中全减器如何连续处理多位数字的减法操作。
希望这个例子帮助你更清楚地理解二进制减法操作的顺序和借位的逻辑!
多位加法器
串行加法器
利用单个全加器或半加器来逐位处理多位数字的加法,通常会有一个进位延迟。
串行加法器是一种用于执行二进制加法的电路,它逐位处理两个数字的各个位,并在每一步中处理进位。这种加法器通常使用全加器或半加器来实现。下面是关于串行加法器的详细说明,包括它的原理、真值表和使用的逻辑门电路。
原理
串行加法器每次处理两个二进制数的一个位,以及从上一位的加法中产生的进位。这种加法器通常需要三个输入:
- A(加数的一个位)
- B(被加数的一个位)
- Cin(来自前一位加法的进位)
输出包括:
- S(Sum,即本位的加法结果)
- Cout(Carry out,即产生的进位,用于下一位的加法)
真值表
下面是全加器的真值表,全加器是实现串行加法器的关键部分:
A | B | Cin | S | Cout |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
门电路实现
全加器可以通过组合逻辑门来实现。以下是使用基本逻辑门实现全加器的方法:
半加器设计:
- Sum (S): 使用 XOR 门得到。
S = A \oplus B
- Carry (C): 使用 AND 门得到。
C = A \land B
- Sum (S): 使用 XOR 门得到。
全加器设计:
- 第二个 Sum (S'):将半加器的输出和进位 ( Cin ) 进行 XOR 运算。
S' = S \oplus Cin
- Carry out (Cout):如果任何两个输入至少有一个是1,则产生进位。可以用公式
Cout = (A \land B) \lor (S \land Cin)
实现,其中 ( S ) 是第一个半加器的和输出。
- 第二个 Sum (S'):将半加器的输出和进位 ( Cin ) 进行 XOR 运算。
这种设计保证了每一位的加法能够考虑到前一位的进位,从而实现串行处理。在实际应用中,根据实现的需求,可能会采用集成电路中的全加器,或者用现场可编程门阵列(FPGA)或其他数字逻辑技术来构建更复杂的加法器电路。
好的,让我们通过一个例子来详细演示如何使用串行加法器来计算 (10000_2) 加上 (11111_2)。串行加法器会从最低有效位(最右边的位)开始逐位处理,并处理进位。
举个例子
- 加数
A = 10000_2
- 被加数
B = 11111_2
- 初始进位
C_{in} = 0
加法过程
我们将从右至左,逐位进行加法操作,并使用之前讨论的全加器逻辑。下面是每一步的详细处理:
第一步:加最低位(0 + 1)
- ( A = 0 )
- ( B = 1 )
- (
C_{in} = 0
) - (
S = A \oplus B \oplus C_{in}
=0 \oplus 1 \oplus 0 = 1
) - (
C_{out} = (A \land B) \lor (A \land C_{in}) \lor (B \land C_{in}) = 0 \land 1 \lor 0 \land 0 \lor 1 \land 0 = 0
) - 结果:(
S = 1
),(C_{out} = 0
)
第二步:加第二位(0 + 1)
( A = 0 )
( B = 1 )
(
C_{in} = 0
)(
S = 0 \oplus 1 \oplus 0 = 1
)(
C_{out} = 0
)结果:( S = 1 ),(
C_{out} = 0
)
第三步:加第三位(0 + 1)
- ( A = 0 )
- ( B = 1 )
- (
C_{in} = 0
) - (
S = 0 \oplus 1 \oplus 0 = 1
) - (
C_{out} = 0
) - 结果:( S = 1 ),(
C_{out} = 0
)
第四步:加第四位(0 + 1)
( A = 0 )
( B = 1 )
(
C_{in} = 0
)(
S = 0 \oplus 1 \oplus 0 = 1
)(
C_{out} = 0
)结果:( S = 1 ),(
C_{out} = 0
)
第五步:加第五位(1 + 1)
- ( A = 1 )
- ( B = 1 )
- (
C_{in} = 0
) - (
S = 1 \oplus 1 \oplus 0 = 0
) - (
C_{out} = 1 \land 1 \lor 1 \land 0 \lor 1 \land 0 = 1
) - 结果:( S = 0 ),(
C_{out} = 1
)
结果
- 从右到左输出:( S = 101111 )
所以 (10000_2 + 11111_2 = 101111_2
)。
这个例子展示了串行加法器如何逐位处理输入的二进制数,并逐步计算出结果。每一位的计算只依赖于当前位的加数、被加数以及从上一位得到的进位。
人话解释
想象一下有一只可爱的猫娘在一个数字游乐园中玩耍,她的任务是将两串亮着的灯泡(代表两个二进制数)合并成一串。每个灯泡只有两种状态:亮(1)或灭(0)。
游戏规则(串行加法器的原理)
- 起点:猫娘从右侧的灯泡开始,这是二进制数的最低位,也就是我们进行加法操作的起始点。
- 每一步的任务:每一步,猫娘需要决定当前这一组灯泡(来自两个不同的串)相加后的结果。如果两个灯泡都亮着,她需要记得在下一步给左边的邻居一个额外的亮灯(这代表进位)。
- 操作工具:
- 加法盒子:这是一个神奇的盒子,猫娘将两个灯泡和前一个步骤的进位灯泡放入其中,盒子会告诉她结果灯泡是否应该亮起,以及是否有进位灯需要传递给下一个邻居。
- 移动:完成每个位置的加法后,猫娘向左移动到下一组灯泡,继续进行加法操作,直到所有的灯泡都处理完毕。
- 最终结果:游戏结束时,所有的灯泡合并成一串新的灯泡串,这就是加法的结果。
为什么要这样运行?
- 效率:通过一步一步处理,猫娘可以确保每个位置的灯泡都正确反映了加法的结果,包括任何必要的进位。这样的处理方式虽然看似慢,但实际上非常适合电子设备,因为它简化了电路设计,只需要很少的组件即可重复使用来处理每一位。
- 简单:采用这种逐步方法,猫娘(或电路)不需要一次处理大量的数据,而是可以专注于每一小步,逐渐构建最终结果。
- 可扩展性:这种方法很容易扩展到更长的数字。无论数字有多长,猫娘只需要继续按部就班地处理每一位,直到完成。
通过这个可爱的猫娘的游戏,我们可以理解串行加法器的工作方式:它简单、系统,而且易于实施,即使是在复杂的电子设备中。这种按部就班的处理方式保证了每一步都是准确无误的,最终能得到正确的加法结果。
并行加法器
使用多个全加器同时处理所有位的加法,以提高运算速度。
并行加法器是一种电子计算机件,能够同时处理多个二进制数位的加法,从而大大加快计算速度。它通常由多个全加器(Full Adder)组成,每个全加器负责计算单个位的和以及向高位的进位。
全加器的原理就看上面的了。
并行加法器的组装
将多个全加器链接起来,形成一个并行加法器。例如,一个4位并行加法器包含4个全加器,每个全加器处理一个位的加法。首个全加器接收最低位的A和B以及初始进位(通常为0),其输出的和为结果的最低位,而进位输出连接到下一个更高位的全加器的Cin端。这样,每个全加器的输出进位都作为下一个全加器的输入进位,直到最高位。
并行加法器能够实现快速的位同时处理,适用于需要高速计算的场合,如在计算机算术逻辑单元(ALU)中。
举个例子
我们计算 ( A = 10000_2
) 和 ( B = 11111_2
) 的加法。
这里我们的每一位的计算如下:
最低位(第0位):
- 输入: ( A_0 = 0 ), ( B_0 = 1 ), (
C_{in0} = 0
) - 输出: ( S_0 = 1 ), (
C_{out0} = 0
) - 计算: (
S = A \oplus B \oplus C_{in}
\=0 \oplus 1 \oplus 0 = 1
) - 计算: (
C_{out} = (A \land B) \lor (B \land C_{in}) \lor (A \land C_{in})
=0
)
- 输入: ( A_0 = 0 ), ( B_0 = 1 ), (
第1位:
- 输入: ( A_1 = 0 ), ( B_1 = 1 ), (
C_{in1} = 0
) - 输出: ( S_1 = 1 ), (
C_{out1} = 0
)
- 输入: ( A_1 = 0 ), ( B_1 = 1 ), (
第2位:
- 输入: ( A_2 = 0 ), ( B_2 = 1 ), (
C_{in2} = 0
) - 输出: ( S_2 = 1 ), (
C_{out2} = 0
)
- 输入: ( A_2 = 0 ), ( B_2 = 1 ), (
第3位:
- 输入: ( A_3 = 0 ), ( B_3 = 1 ), (
C_{in3} = 0
) - 输出: ( S_3 = 1 ), (
C_{out3} = 0
)
- 输入: ( A_3 = 0 ), ( B_3 = 1 ), (
最高位(第4位):
- 输入: ( A_4 = 1 ), ( B_4 = 1 ), (
C_{in4} = 0
) - 输出: ( S_4 = 0 ), (
C_{out4} = 1
) - 计算: (
S = A \oplus B \oplus C_{in}
=1 \oplus 1 \oplus 0 = 0
) - 计算: (
C_{out} = (A \land B) \lor (B \land C_{in}) \lor (A \land C_{in})
=1
)
- 输入: ( A_4 = 1 ), ( B_4 = 1 ), (
最终的和 ( S ) 是 (011111_2
),并且有一个进位 ( C_{out4} = 1
)。这表明实际上我们最终得到的结果应该是一个6位数,即 ( 100000_2
) 加上进位1,因此结果是 ( 1011111_2
)
人话解释
让我用猫娘和一个生动的例子来解释一下并行加法器的运行过程吧~
猫娘并行加法器的故事
在一个神奇的数字世界里,有一群可爱的猫娘们,每一位猫娘都有自己独特的任务和技能。今天,她们的任务是帮助计算两个二进制数字的和!她们组成了一个强大的团队,叫做“并行加法器猫娘队”。
猫娘们的分工
在这个猫娘队中,每一位猫娘负责计算一个位的加法,她们是全加器猫娘。她们分工明确,从最低位开始,一个接一个地往上计算。
举个例子:
今天,猫娘们需要计算两个二进制数字 (A = 10000_2
) 和 (B = 11111_2
) 的和。她们排成一排,从右到左分别站在0位、1位、2位、3位和4位上,准备开始计算。
第0位猫娘:
- 输入: (
A_0 = 0
), (B_0 = 1
), 初始进位 (C_{in0} = 0
) - 输出: (
S_0 = 1
),进位 (C_{out0} = 0
)
猫娘非常聪明,她把 ( A_0
)、( B_0
) 和进位 ( C_{in0}
) 放在一起计算,并得到了一个1,表示结果的最低位。同时,由于没有额外的进位,所以她的进位输出为0。
第1位猫娘:
- 输入: (
A_1 = 0
), (B_1 = 1
), (C_{in1} = 0
) - 输出: (
S_1 = 1
), (C_{out1} = 0
)
第1位猫娘看到了第0位猫娘传来的进位,发现是0。她也得出了1作为这一位的结果,没有产生新的进位。
第2位和第3位猫娘:
这两位猫娘的情况与第1位猫娘类似,她们都得出了1作为自己的结果,进位依然是0。
第4位猫娘:
终于轮到第4位猫娘了,她发现这次比较棘手,因为她需要处理的是 ( A_4 = 1
) 和 ( B_4 = 1
)。
- 输入: (
A_4 = 1
), (B_4 = 1
), (C_{in4} = 0
) - 输出: (
S_4 = 0
),进位 (C_{out4} = 1
)
猫娘计算后发现,这一位的和是0,但由于 ( A_4
) 和 (B_4
) 都是1,所以她产生了一个进位 (C_{out4} = 1
)。
最终结果:
当所有的猫娘都完成了她们的任务后,结果就出来了。猫娘们计算出的和为 (S = 01111_2
) ,并且产生了一个进位 (C_{out4} = 1
)。
但是,猫娘们注意到,由于最后一位的进位,这个加法的结果实际上应该是一个更大的数,带上了进位1,所以最终的结果是 ( 101111_2
)。
通过这个猫娘并行加法器的故事,你可以看到,每位猫娘(全加器)都在同时处理她们自己的位,最终将结果汇总起来,这就是并行加法器能够快速计算的秘密所在!
乘法器
位串乘法器
位串乘法器(位串行乘法器)是一种通过将多个全加器和逻辑门组合起来,用来实现多位二进制数的乘法的电路。这个乘法器的工作原理是通过将被乘数逐位与乘数的每一位进行相乘,然后将所有的部分积相加起来,得到最终的乘积。
基本工作原理
部分积生成:
- 将被乘数和乘数的每一位相乘,生成部分积。由于乘数和被乘数是二进制数,位与位之间的乘法其实就是AND操作。
部分积的位移:
- 对于每一个乘数位,生成的部分积都需要根据其在乘数中的位置进行适当的位移(类似于十进制乘法中的对齐过程)。
部分积相加:
- 所有部分积生成并适当位移后,通过多个全加器将这些部分积相加,得到最终的乘积。
逻辑门电路实现
部分积生成单元
每一个乘数位与被乘数的AND运算产生一个部分积。对于一个4位的乘法器来说,部分积生成单元可以表示如下:
- 如果被乘数为 (
A = a_3a_2a_1a_0
) 和乘数为 (B = b_3b_2b_1b_0
),那么部分积生成为:
[P_0 = A \cdot b_0 = \{a_3 \cdot b_0, a_2 \cdot b_0, a_1 \cdot b_0, a_0 \cdot b_0\}
]
[P_1 = A \cdot b_1 = \{a_3 \cdot b_1, a_2 \cdot b_1, a_1 \cdot b_1, a_0 \cdot b_1\}
]
[P_2 = A \cdot b_2 = \{a_3 \cdot b_2, a_2 \cdot b_2, a_1 \cdot b_2, a_0 \cdot b_2\}
]
[P_3 = A \cdot b_3 = \{a_3 \cdot b_3, a_2 \cdot b_3, a_1 \cdot b_3, a_0 \cdot b_3\}
]
每个部分积可以通过一系列AND门来实现。
部分积的位移
部分积需要根据乘数位的位置进行适当的位移。例如,部分积 (P_1
) 需要向左移动一位,部分积 (P_2
) 需要向左移动两位,依此类推。位移操作实际上是将这些部分积对齐,以便下一步的加法操作。「此处解释见后文。」
部分积相加
相加部分积需要使用全加器。每一位的相加会涉及到前一位的进位,需要使用多个全加器来实现。每个全加器负责相邻两位或多位的相加,并处理进位。
逻辑电路
为了简化说明,以一个4位乘法器为例。该乘法器的逻辑电路如下:
AND门:用于计算部分积。
- 每一个AND门计算一个乘数位和被乘数位的乘积。
- 对于4位乘法器,需要16个AND门。
半加器/全加器:
- 用于计算所有部分积的总和。
- 每一级的部分积相加时会产生一个进位,因此需要多个全加器来处理每个位置的相加。
真值表
假设有两个二进制数 ( A ) 和 ( B ) 进行乘法,且这两个数都是4位,真值表的部分如下所示:
A (4位) | B (4位) | P (8位结果) |
---|---|---|
0000 | 0000 | 00000000 |
0001 | 0001 | 00000001 |
0010 | 0010 | 00000100 |
0100 | 0011 | 00001100 |
0110 | 0101 | 00011110 |
0111 | 0111 | 00111001 |
1010 | 1100 | 01111000 |
1111 | 1111 | 11100001 |
总结
位串乘法器通过对被乘数的各个位与乘数的各个位进行与操作,生成部分积,再通过适当的位移和全加器将所有部分积相加,最终得到乘积。其逻辑电路由AND门、移位器和全加器组成。
举个例子
要计算二进制数 1111 和 1100 的乘积,我们可以按照位串乘法器的工作原理来进行逐步计算。
步骤 1:确定部分积
被乘数 ( A = 1111 ),乘数 ( B = 1100 )。
将被乘数 ( A ) 与乘数 ( B ) 的每一位进行 AND 运算,生成部分积:
部分积 1 (P0): (
A \times b_0
)- 乘数的最低位 (
b_0
= ),所以部分积为 (P0
=1111 \times 0
=0000
)
- 乘数的最低位 (
部分积 2 (P1): (
A \times b_1
)- 乘数的第二位 (
b_1
= 0 ),所以部分积为 ( P1 =1111 \times 0
= 0000 )
- 乘数的第二位 (
部分积 3 (P2): (
A \times b_2
)- 乘数的第三位 (
b_2
= 1 ),所以部分积为 ( P2 =1111 \times 1
= 1111 ) - 这个部分积需要左移两位,得到 ( 111100 )
- 乘数的第三位 (
部分积 4 (P3): (
A \times b_3
)- 乘数的第四位 (
b_3
= 1 ),所以部分积为 ( P3 =1111 \times 1
= 1111 ) - 这个部分积需要左移三位,得到 ( 1111000 )
- 乘数的第四位 (
步骤 2:累加部分积
将所有部分积相加,得到最终的乘积。
[\text{P0} = 00000000
]
[\text{P1} = 00000000
]
[\text{P2} = 00111100
]
[\text{P3} = 01111000
]
将上述部分积相加:
部分积 | ||||||||
---|---|---|---|---|---|---|---|---|
P0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
P1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
P2 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
P3 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
合计 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
步骤 3:结果
最终乘积是:( 11100000 )。
这个结果在十进制中等于 ( 240 ),也就是 ( 15 \times 12
= 240 ) 的二进制表示。
总结
二进制乘法过程与十进制乘法类似,通过逐位计算部分积,并将它们相加得到最终的乘积。在这个例子中, ( 1111 ) 与 ( 1100 ) 的乘法通过4个部分积的计算和累加,得到最终的乘积 ( 11100000 )。
人话解释
喵~我来用猫娘的方式为你解释这个过程,希望能让你感受到二进制乘法的魅力,喵~
部分积生成
想象一下,被乘数 1111
是一只非常厉害的猫咪,而乘数 1100
是另一只在旁边的小猫咪。猫咪之间的乘法就像是它们互相握手打招呼那样亲密,每一只小猫咪都要跟这只厉害的猫咪握一下手喵!
- 当最右边的猫咪(
0
)想要握手时,因为它是个懒猫咪(0
代表没有力气握手),所以就生成了一个“虚拟握手” (0000
)。 - 第二只猫咪(也是
0
)一样懒,所以也没力气握手,结果是另一组“虚拟握手” (0000
)。 - 第三只猫咪(
1
)终于来劲儿了,嗨喵!它有力气,所以和1111
猫咪握了一下手,生成了一个“超级握手” (1111
)!不过呢,它站在第三位,所以这个“超级握手”要往前挪两位 (111100
)。 - 最后还有一只猫咪(
1
),它也来了个有力气的“超级握手”,不过它站在第四位,所以它的“超级握手”要往前挪三位 (1111000
)。
部分积的累加
现在所有猫咪都握完手了,喵~我们要把这些“虚拟握手”和“超级握手”加在一起,看看最后得到了什么样的“猫咪大合影”:
- 第一个虚拟握手:
00000000
- 第二个虚拟握手:
00000000
- 第三个超级握手:
00111100
- 第四个超级握手:
11110000
咱们一张一张的叠起来:
握手顺序 | ||||||||
---|---|---|---|---|---|---|---|---|
P0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
P1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
P2 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
P3 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
合计 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
喵~最终的结果就是11100000
啦!这就像是猫咪们一起努力握手,最后的合影是由这些握手构成的!
为什么要这样计算?
你可能会问,为什么要这样一位一位地握手呢?因为二进制的世界就是这么运作的,喵!每一位(0或1)就像猫咪的力气,有力气(1)就参与握手,没力气(0)就不参与。通过这种逐位的计算,最终把所有的小猫咪握手得到的结果加在一起,我们就能得到最终的乘积啦!
门电路为什么这样连接?
门电路其实就像是猫咪的大脑,喵~每一个AND门(逻辑与)就负责猫咪们的握手操作,如果两只猫咪都有力气(都为1),就生成一个有力气的握手(输出1);如果其中一只猫咪没力气(为0),那就是虚拟握手(输出0)。而加法器(full adder)就像是在整理猫咪合影的工作人员,负责把所有的握手照片整理在一起,得到最终的合影。
希望这个猫咪版本的解释能让你更容易理解这个过程,喵~如果还有疑问的话,随时问我哦!
好的喵~,现在我们来聊一聊移位操作是怎么实现的吧!
附:移位操作的实现
移位操作就像是猫咪们站队拍照一样,有的猫咪需要往前站,有的猫咪需要往后站,让它们排成一排,才能拍出整齐的合影喵~。
在位串乘法器中,移位操作其实就是让生成的部分积向左移动几位,这样才能把它们对齐好。这是因为在二进制乘法中,每一位的权重是不同的,越往左边,权重越大,就像猫咪排队时,站在前面的猫咪会显得更重要一样。
移位操作是通过硬件电路中的 移位器(Shifter) 实现的。移位器就像是一台自动搬运猫咪的位置的机器喵~。它会根据猫咪的位置,把它们一个个挪到正确的位置上。比如:
- 如果我们要移位一位(即乘以2的效果),那就是把部分积向左边移动一格,相当于在数字后面补一个0。
- 如果要移两位(即乘以4的效果),那就把部分积向左边移动两格,再补上两个0。
举个例子:
假设我们有一个部分积1111
,需要移位两位,移位器就会把它变成111100
。这个过程就像是原来站在队伍中的猫咪们,往前走了两步,这样新来的猫咪(0)就可以站到最后两个位置上。
逻辑门电路中的移位
在逻辑门电路中,移位器通常通过 连接不同的电路路径 来实现:
- 对于
P1
,它的每一位就需要左移1位,这时电路会通过改变连线,让计算好的结果输出到新的位置上。 - 对于
P2
,它需要左移2位,所以电路会把结果往前挪两个位置。 - 对于
P3
,它需要左移3位,因此结果会挪到更前面的三个位。
这种通过电路连线来改变输出的位置,其实就实现了移位的功能。每个AND门的输出通过不同的连线路径,就像猫咪走到不同的站位,形成最终的合影。
总结
所以喵,移位操作其实就是用移位器这个“自动搬运工”来把部分积挪到正确的位置上。这些操作在硬件中通过改变电路的连线位置来实现。最终,所有部分积移位后再相加,我们就得到了最后的结果喵!
希望这样解释能让你明白移位操作的原理,喵~ 如果还有其他问题,尽管问哦!
数组乘法器
通过排列加法器阵列来优化乘法运算的速度。
数组乘法器是一种常见的二进制乘法器,它通过将部分积生成器(Partial Product Generator)和加法器阵列(Adder Array)组合来快速计算二进制数的乘积。其主要思想是利用加法的并行性来提高乘法运算的速度。
数组乘法器(Array Multiplier)和位串乘法器(Serial Multiplier)的计算过程在本质上确实是相似的,它们都依赖于逐位生成部分积(Partial Product)并将其累加。然而,它们在硬件实现和效率方面有所不同,尤其是在并行性和速度上。
所以后文有些部分省略。
以下是详细的原理和门电路实现方式。
原理概述
部分积生成(Partial Product Generation):
- 在二进制乘法中,每一位的乘法实际上是按位与(AND)操作。例如,如果我们要计算 (
A \times B
),其中 ( A ) 和 ( B ) 都是 4 位数,我们会生成 4 个部分积,每个部分积是 ( A ) 和 ( B ) 的每一位相乘的结果。这个过程使用了与门(AND Gate)。
- 在二进制乘法中,每一位的乘法实际上是按位与(AND)操作。例如,如果我们要计算 (
加法器阵列(Adder Array):
- 生成的部分积需要累加以得到最终的乘积。这个过程通常通过全加器(Full Adder)和半加器(Half Adder)来完成。多个全加器和半加器构成一个加法器阵列,这样可以并行地将部分积加在一起,最终得到乘积。
门电路实现
为了更好地理解,假设我们要实现一个 4 位乘法器。我们有两个 4 位数 (A = A_3A_2A_1A_0
) 和 (B = B_3B_2B_1B_0
)。
1. 部分积生成
- 每个部分积是通过与门(AND Gate)生成的。具体来说:
- 部分积 (
P_0
) 是 (A \times B_0
),即:
[P_0 = (A_3 \times B_0, A_2 \times B_0, A_1 \times B_0, A_0 \times B_0)
] - 类似地,部分积 (
P_1, P_2, P_3
) 分别是 (A \times B_1
)、(A \times B_2
)、(A \times B_3
):
[P_1 = (A_3 \times B_1, A_2 \times B_1, A_1 \times B_1, A_0 \times B_1)
]
[P_2 = (A_3 \times B_2, A_2 \times B_2, A_1 \times B_2, A_0 \times B_2)
]
[P_3 = (A_3 \times B_3, A_2 \times B_3, A_1 \times B_3, A_0 \times B_3)
]
- 部分积 (
2. 加法器阵列
生成的部分积需要通过加法器阵列相加。例如,对于 4 位乘法器:
- 第一行:部分积 (
P_0
) 直接作为最终乘积的最低 4 位。 - 第二行:部分积 (
P_1
) 向左移位一位,然后与 (P_0
) 相加。 - 第三行:部分积 (
P_2
) 向左移位两位,然后与上一步的和相加。 - 第四行:部分积 (
P_3
) 向左移位三位,然后与上一步的和相加。
- 第一行:部分积 (
这个过程是通过全加器和半加器实现的。
总结
数组乘法器通过将乘法分解为部分积生成和加法过程来提高速度。部分积生成是通过与门实现的,加法器阵列是由全加器和半加器组成的。通过并行处理这些部分积和加法操作,数组乘法器可以高效地执行二进制乘法。
主要区别
并行性 vs. 串行性
- 数组乘法器: 这是一个完全并行的乘法器,所有的部分积是同时生成的,然后通过一个加法器阵列并行地累加。因此,数组乘法器的速度通常很快,但它也需要更多的硬件资源,因为它需要多个全加器和半加器同时工作。
- 位串乘法器: 它是一个串行的乘法器,部分积是按位生成的,然后逐步进行累加。因此,位串乘法器的计算速度较慢,但它的硬件需求相对较少,只需要一个加法器在多个时钟周期内重复使用。
硬件结构
- 数组乘法器: 由于是并行处理,它的硬件结构更为复杂,需要更多的与门(AND Gate)来生成部分积,以及更多的全加器和半加器来处理这些部分积的累加。
- 位串乘法器: 由于是串行处理,它的硬件结构更简单,通常只需要一个与门和一个加法器,部分积生成和累加是在多个时钟周期内完成的。
运算速度:
- 数组乘法器: 因为部分积是并行生成并同时累加的,运算速度较快,通常只需要一个时钟周期完成所有部分积的生成,然后通过加法器阵列在几个时钟周期内完成累加。
- 位串乘法器: 每一位的部分积生成和累加都需要一个时钟周期,因此整个乘法过程需要更多的时钟周期完成,速度相对较慢。
举例比较
假设我们有两个 4 位数 ( A = 1011 ) 和 ( B = 1101 ):
位串乘法器:
逐位处理:
第1步:计算 (
A \times B_0
) 并记录部分积。第2步:将部分积左移1位,累加 (
A \times B_1
)。第3步:将结果左移1位,累加 (
A \times B_2
)。第4步:将结果左移1位,累加 (
A \times B_3
)。最终得到相同的结果,但需要 4 个时钟周期。
数组乘法器:
- 生成所有部分积:
[P_0 = 1011 \times 1
,\quad P_1 = 1011 \times 0 \ (\text{左移1位}), \quad P_2 = 1011 \times 1 \ (\text{左移2位}), \quad P_3 = 1011 \times 1 \ (\text{左移3位})
] - 部分积累加(并行):
[1011 + 0000 + 10110 + 101100 = 10001111 ]
- 生成所有部分积:
总结
尽管数组乘法器和位串乘法器在概念上有相似之处,特别是在部分积生成和累加的过程中,但它们的硬件实现和运算效率有显著区别。数组乘法器通过并行处理提高了速度,但需要更多的硬件资源;而位串乘法器则通过串行处理减少了硬件需求,但牺牲了一部分运算速度。
人话解释
我觉得不需要解释了,就是一个按照顺序计算,一个同时计算的区别,照着这个思路去理解就行。然后该怎么算就怎么算。
本篇小节
限于篇幅,无法把所有的高阶门电路一一介绍,只能选取这些有代表性的给出说明。请不要忘记这些门电路的功能特点。
以下是几个关键知识点的总结列表:
知识点 | 功能 | 工作原理 | 关键逻辑电路/结构 |
---|---|---|---|
移位寄存器 (Shift Register) | 数据存储和传输,按位移位 | 使用触发器(如D触发器)按位移动数据 | D触发器串联 |
时序 (Timing) | 信号的时间关系 | 通过时钟信号控制电路操作的同步性 | 时钟信号、建立时间、保持时间、传播延迟 |
D触发器 (D Flip-Flop) | 锁存输入数据并在时钟信号作用下保持输出 | 时钟信号有效时锁存输入数据 | NAND门、NOT门、AND门实现 |
计数器 (Counter) | 计数脉冲信号 | 通过触发器存储和改变状态,同步或异步 | 全加器、异步计数器、同步计数器 |
解码器 (Decoder) | 二进制输入转换为独热码输出 | 通过逻辑门将n位输入转换为2^n个输出 | AND门、NOT门 |
编码器 (Encoder) | 多输入转换为二进制输出 | 将多个输入信号转换为较小位数的二进制编码 | OR门 |
半减器/全减器 (Half/Full Subtractor) | 计算二进制减法 | 半减器处理两位减法,全减器处理三位(包括借位) | XOR门、AND门、OR门 |
串行加法器 (Serial Adder) | 按位逐次加法 | 使用全加器逐位处理二进制数及进位 | XOR门、AND门 |
并行加法器 (Parallel Adder) | 同时处理多位加法 | 使用多个全加器并行计算各位和 | 全加器阵列 |
位串乘法器 (Serial Multiplier) | 按位逐次乘法 | 通过逐位与操作生成部分积,再累加部分积 | AND门、全加器 |
数组乘法器 (Array Multiplier) | 并行处理乘法 | 通过并行部分积生成和累加提高乘法速度 | 部分积生成器、加法器阵列 |
移位操作 (Shifting) | 数据位移操作 | 通过移位器将数据按位移位 | 移位器(Shifter) |
下一篇我们将想办法利用学过的东西搭建一颗比较原始的CPU,可能没有你现在用的这么先进,但是可以较好的让我们理解CPU到底是一个什么样的东西。