摆烂新尝试
不好啦,出大事啦!隔壁的 \(\sf yspm\) 的娱乐方式已经进化为下象棋了,你 \(\sf OneInDark\) 资深摆烂人还在看逼乎?逊!
于是有了此种摆法。这是 \(\rm beta\) 版本,如果有任何意见,可以向 \(\sf OneInDark\) 提供改进建议。
\(\rm MOSFET\)
在 \(\text{Si}\) 里掺杂 \(\text{P}\),价电子“太多”,有自由的负电荷,称为 \(N\;(\rm negative)\) 型掺杂。而掺杂 \(\text{B}\) 就有自由的正电荷,称为 \(P\;(\rm positive)\) 型掺杂。
在同一块 \(\text{Si}\) 里,一半 \(N\) 型一半 \(P\) 型掺杂,则 \(N\) 型掺杂区的负电荷填充到 \(P\) 型掺杂区,使得 \(P\) 型掺杂区显负电性,电场产生。直到电场力足以阻止所有自由负电荷移动,此时中部出现“耗尽层”(没有电荷移动)。
考虑上面的结构与电池相连,电池施加电场。若该电场和内建电场方向相同,只会让耗尽层扩大(就更加断路了),所以无电流。若方向相反,电池电场将内建电场抵消,则电荷可以突破耗尽层,就有电流。这就是 二极管,电流只能从 \(P\) 流向 \(N\) 。注意电流方向和电子方向相反。
利用外部电压形成电场促使二极管内的电荷重新分布,我们可以变化 \(N,P\) 的分布,并因此获得 用电压控制的开关,即 \(\rm MOSFET\) 。
逻辑门电路
令高电平为 \(1\),低电平为 \(0\),则上面的 \(\rm MOSFET\) 就是 \(\rm if\) 语句,可以实现 非门。结合串联,天生的逻辑与,就可以实现逻辑判断。
然后可以得到 \(\text{and, or, xor}\) 电路。由于我没学透,这些不细讲。
加法器
半加法器(\(\text{half adder}\))
输入 \(a,b\in\{0,1\}\),输出 \(s=(a{+}b)\bmod 2\) 和 \(c_{out}=\lfloor{a+b\over 2}\rfloor\) 。
Comment. 后文也统一用 \(c\;(\text{carry})\) 表示进位值,用 \(s\;(\text{sum})\) 表示“本位值”。
显然令 \(s=a\oplus b\) 以及 \(c=a\operatorname{bitand}b\) 就好。
Comment. 为了方便叙述,后文可能用乘法 \(ab\) 代表 \(a\operatorname{bitand}b\),因为二者在数学计算上是相等的(但是电路实现逻辑是 与门
),以及在已知二者不同时为 \(1\) 的条件下用加法代替 或门
。
全加法器(\(\text{full adder}\))
输入 \(a,b,c_{in}\in\{0,1\}\),输出 \(s=(a{+}b{+}c_{in})\bmod 2\) 和 \(c_{out}\) 。
事实上就是两个 半加法器
的叠加,令 \(s=(a\oplus b\oplus c_{in})\) 以及 \(c_{out}=(a\cdot b)+(a\oplus b)\cdot c_{in}\) 即可。
注意这里我们假设是 \(a,b\) 先做了 半加法器
,意义何在?见后文。
超前进位加法器(\(\text{CLA}\))
全称是 \(\text{carry lookahead adder}\) 。
现代 \(\rm CPU\) 可以进行并行计算,因此减少计算的轮数非常关键。
假设我们在计算 \(a\) 和 \(b\) 的和,其二进制表示(从低位到高位)分别用 \(\{a\},\{b\}\) 表示。用 \(\{c\}\) 表示每个 全加法器
应当给出的 \(c\),即该位上的进位。
记 \(p_i:=a_i\cdot b_i\) 与 \(q_i:=a_i\oplus b_i\),首先 \(c_0=p_i\) 。然后我们有 递推式
递推式的值计算依赖于上一个值,因此无法并行,非常慢。但我们可以轻易地解出其 通项
这样每个 \(\rm bit\) 都是自己算自己的,就可以完全并行了(理想情况下)。
对了,我们还要给出 \(\{s\}\) 。可以 \(s_n=p_n\oplus c_{n-1}\) 并行计算,只在 \(\{c\}\) 求出之后多用 \(1\) 时钟周期。
进位保存加法器(\(\text{CSA}\))
全称为 \(\text{carry save adder}\) 。
全加法器
因为其输入输出量的特点,可以被称为 \(3:2\text{ compressor}\),直观来说,它把三个数的和变成了两个数的和。最重要的是:它在每个 \(\rm bit\) 上是独立的。
按:怎么理解 \(3\to 2\) 相比于 \(2\to 1\) 简单很多呢?我猜,压缩率 \(150\%\) 是比压缩率 \(200\%\) 更简单的。但我也说不清😖
因此,我们总是输入三个数,并输出两个数,这就是 \(\text{CSA}\) 。
乘法器
乘法最后还是归结于加法,即每个 \(b\) 的 \(\rm bit\) 所得到的 \(a\) 相加。实际上,若 \(a,b\) 的 \(\rm bit\) 可以直接访问,则 \(1\) 个时钟周期就得到了 \(n\) 个数的每个 \(\rm bit\),现在的目标就是把它们加起来。
首先,必然要采用并行计算。其次,要坚持使用 \(\text{compressor}\),因为它相当利于并行。然而 \(3:2\text{ compressor}\) 的效率不够高,我们还可以造 \(6:3\text{ compressor}\) 来进一步优化。
按:就像 全加法器
就是两个 半加法器
,\(6:3\text{ compressor}\) 就是两个 \(3:2\text{ compressor}\) 的优化版。为什么倍增总是能让效率变高呢?
可是我不会 \(6:3\text{ compressor}\),他喵的。问兔兔好不好。
摆烂的途径
\(B\) 站某 \(\rm up\) 主的系列讲解视频,非常牛啊。此时(周五晚)他还在直播。
知乎上讲解乘法器。
如果这篇文章对你有帮助,那么作者是:OneInDark,原文在:https://www.cnblogs.com/OneInDark/p/16512083.html,否则我也不知道这是谁的文章。