摆烂新尝试

不好啦,出大事啦!隔壁的 \(\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\) 。然后我们有 递推式

\[c_n=q_n\cdot c_{n-1}+p_n\quad(n\geqslant 1) \]

递推式的值计算依赖于上一个值,因此无法并行,非常慢。但我们可以轻易地解出其 通项

\[c_n=\sum_{k=0}^{n}p_k\prod_{j=k+1}^{n}q_j \]

这样每个 \(\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\) 主的系列讲解视频,非常牛啊。此时(周五晚)他还在直播

知乎上讲解乘法器。

posted @ 2022-07-23 15:08  OneInDark  阅读(175)  评论(5编辑  收藏  举报