Skip to content

Commit

Permalink
2.9.1更新
Browse files Browse the repository at this point in the history
  • Loading branch information
putianyi889 committed Oct 20, 2019
1 parent fa00f4b commit 7c14b67
Show file tree
Hide file tree
Showing 8 changed files with 400 additions and 505 deletions.
266 changes: 252 additions & 14 deletions chapters/Sources.tex

Large diffs are not rendered by default.

262 changes: 77 additions & 185 deletions chapters/chapter2.tex

Large diffs are not rendered by default.

148 changes: 33 additions & 115 deletions chapters/chapter4.tex
Original file line number Diff line number Diff line change
Expand Up @@ -192,43 +192,64 @@ \subsection{爆门}

在实际应用中,爆门经常导致电路bug,这是因为我们往往希望逻辑门在多次状态切换时可以多次激活,但实际上不会。学会了预测爆门,就可以想办法避免爆门,甚至利用爆门。

%\section{使用逻辑延迟器规避爆门}

%我们已经知道了,降频电路可以用来做二进制计数。我们还知道,


\section{逻辑延迟器}

在连接多个逻辑电路模块时,要让它们正确地合作,就需要控制它们的运行顺序。不同电路模块从输入到输出经历的逻辑帧数量不同,所以简单的接线方式可能使得一些模块在不该工作时工作,打乱电路状态。使用逻辑延迟器可以推迟一个电路模块的运行逻辑帧,使得这个电路模块在需要运行的时候才运行。

上一章讲到的换线器就可以作为逻辑延迟器,因为输出激活比输入激活晚一个逻辑帧。如果将多个换线器首尾连接,就可以控制延迟的逻辑帧数量。
上一章讲到的换线器就可以作为逻辑延迟器,因为输出激活比输入激活晚一个逻辑帧。如果将多个换线器首尾连接,就可以控制延迟的逻辑帧数量。逻辑延迟器的常见套路见\autoref{i153:156}。

\begin{figure}[!ht]
\begin{center}
\subfloat[横式]{
\label{i153}
\includegraphics{images/153.png}
}
\qquad
\subfloat[竖式]{
\label{i154}
\quad\includegraphics{images/154.png}\quad
}
\qquad
\subfloat[斜式]{
\label{i155}
\includegraphics{images/155.png}
}
\qquad
\subfloat[双竖式]{
\label{i156}
\quad\includegraphics{images/156.png}\quad
}
\subfloat[紧凑横式,利用了爆门]{
\includegraphics{images/157.png}
}
\end{center}
\caption{逻辑延迟器的不同摆法,逻辑延迟均为3个逻辑帧。}
\label{i153:156}
\end{figure}

\section{网线}
在设计大型电路时,有时会遇到需要在两地之间传递复杂信号的情况,例如在A地设置多个传感器,在B地进行处理并响应。一般来说每个信号都需要接一根线,这样一来当信号较复杂时,接线会占用非常大的空间。这是由于一根电线能传递的信号复杂度太低:一根电线只能选择激活或不激活两种状态,所以每根电线只能传递一个二进制位。

在了解了逻辑结算机制以后,我们可以使用一根电线传递多个二进制位。这个功能与现实生活中网线的功能类似,所以我们把它称为网线。因为逻辑门是对逻辑帧敏感的,我们可以将多个二进制位在不同的逻辑帧通过一根电线发送出,并在接收端将这些信息解析。归根到底,我们需要做一个编码器和一个解码器。编码器用来把多根线上的简单信号翻译为一根线上的复杂信号,解码器用来将一根线上复杂信号翻译为多根线上的简单信号。

编码器和解码器的设计取决于信号特点,因此这里不给出固定的做法,仅给出一个简单例子作参考。我们在A地放置8根火把,使用开关可以改变它们的状态;在B地放置8根火把;A地和B地之间只能通过1根线连接。我们希望在设置完A地的火把之后,触发一个开关,就可以把A地的火把状态更新到B地,即利用一根线传递八个二进制位。在发送端电路中,读者需要学习到如何利用逻辑延迟器在某个特定的逻辑帧发送信号;在接收端电路中,读者需要学习如何利用故障逻辑门判断一根线是否在某个特定的逻辑帧激活。

\begin{figure}[!ht]
\centering
\includegraphics{images/239.png}\qquad\includegraphics{images/240.png}
\caption{8个开关分别控制8个火把的状态,控制杆用来发送信号,黄线用来输出。第0个逻辑帧黄线激活,用来做启动信号,随后通过上方的逻辑延迟器,8个D锁存器依次在1\~{}8个逻辑帧激活。}
\label{i239:240}
\end{figure}

在A地,我们需要在8个逻辑帧中依次触发对应的D触发器,把信号发送出去(\autoref{i239:240})。

\begin{figure}[!ht]
\centering
\includegraphics{images/241.png}\qquad\includegraphics{images/242.png}
\caption{接收到黄线(在第0个逻辑帧)的激活时开始工作。上方的逻辑延迟器依次在1\~{}8个逻辑帧将下方对应的有效逻辑灯点亮,对应逻辑帧时如果黄线激活,那么下方对应的火把被激活。第9个逻辑帧复位。}
\label{i241:242}
\end{figure}

在B地,我们需要把各个逻辑帧的输入提取出来,然后分别输出给8个火把(\autoref{i241:242})。

以上的装置虽然使用了很多逻辑门,但是当AB两地距离较远时,使用这些逻辑门总比使用8根电线连接AB两地要好。

\section{普通逻辑门的逻辑同步}
对于有数电基础的玩家,刚涉及泰拉瑞亚电路时会遇到各种各样的爆门。而通过各种各样教学视频入门的“外行”反而不容易遇到这样的问题。

Expand Down Expand Up @@ -257,38 +278,6 @@ \section{普通逻辑门的逻辑同步}

导致这个爆门的原因是红线比蓝线早一个逻辑帧,解决起来也很简单,那就是在红线上做一个逻辑延迟,让红线和蓝线在同一个逻辑帧激活(\autoref{fig18})。

\section{爆门}

当一个逻辑门在逻辑结算中尝试激活多次时就会引起爆门。引起爆门的方式有多种(\autoref{i150:152})。

\begin{figure}[!ht]
\begin{center}
\subfloat[]{
\label{i150}
\includegraphics[width=0.32\textwidth]{images/150.png}
}
\subfloat[]{
\label{i151}
\includegraphics[width=0.32\textwidth]{images/151.png}
}
\subfloat[]{
\label{i152}
\includegraphics[width=0.32\textwidth]{images/152.png}
}
\end{center}
\caption{可能引起爆门的三种原因。\protect\subref{i150}一个普通逻辑门的不同逻辑灯在不同逻辑帧激活;\protect\subref{i151}一个普通逻辑门的一个逻辑灯在多个不同逻辑帧激活;\protect\subref{i152}一个故障逻辑灯在多个不同逻辑帧激活。}
\label{i150:152}
\end{figure}

爆门只是一个机制,并非bug,所以它也有可以应用的价值。例如,使用爆门可以将横式的逻辑延迟器体积大大缩小(\autoref{i157})。

\begin{figure}[!ht]
\centering
\includegraphics{images/157.png}
\caption{改进的横式逻辑延迟器}
\label{i157}
\end{figure}

\section{状态表示与激活表示}

泰拉瑞亚电路中的信号有两种表示方式:状态表示和激活表示。状态表示一般是显式的,即肉眼可以直接通过电路元件的状态读出其要表示的信息,例如亮表示1,灭表示0。激活表示是隐式的,激活表示1,不激活表示0。因为激活对于任何有显示效果的物品(像素盒除外)都只能改变其状态,因此想读出激活的信息,就需要在电路元件激活前和激活后的状态之间比较,状态变化的是1,状态不变的是0。这种读法显然是不方便的。
Expand Down Expand Up @@ -324,7 +313,7 @@ \subsection{状态表示转为激活表示}

\subsection{激活表示转为状态表示}

激活转状态,需要将激活转变为点亮,不激活转变为熄灭。电路设计时需要特别注意“不激活”时的响应,因为按照电路原理,不激活时是不会有用电器响应的。如果要响应“不激活”,就必须在某个时间令电路执行不激活时的响应,即事前置0(\autoref{i173:176})或事后置0
激活转状态,需要将激活转变为点亮,不激活转变为熄灭。电路设计时需要特别注意“不激活”时的响应,因为按照电路原理,不激活时是不会有用电器响应的。如果要响应“不激活”,就必须在某个时间令电路执行不激活时的响应,\autoref{i173:176}。

\begin{figure}[!ht]
\begin{center}
Expand All @@ -342,10 +331,6 @@ \subsection{激活表示转为状态表示}
\label{i173:176}
\end{figure}

事前置0使用置0电路,在电路运行时先将火把置0,然后若输入激活,则火把变为1,否则火把保持为0,就完成了激活转状态的功能。

事后置0既要使用置0电路也要使用置1电路。首先输入激活则激活置1电路,火把变为1,然后当电路运行结束时激活置0电路将所有其他火把置为0。要让置0电路不影响刚激活了的火把,需要使用额外的逻辑门记录本次逻辑结算中的激活状态,本质上还需要使用事前电路,因此这里不详细讨论。

\subsection{可以随机显示的十进制数显}

上一章我们做的十进制数显输入还不够自由:要么需要输入二进制,要么需要连续数字。一个完美意义下的十进制数显应该接收11个输入,前十个输入激活则显示0\~{}9的数字,最后一个输入激活则全部熄灭。
Expand All @@ -369,6 +354,7 @@ \subsection{可以随机显示的十进制数显}
\end{figure}

\section{密码门}
1

\section{随机分两组}

Expand Down Expand Up @@ -595,74 +581,6 @@ \subsection{电路优化}
\label{i148:149}
\end{figure}

\section{二进制加减法计算器}

根据计算机习惯,我们在这一节中做一个八位二进制加减法计算器。在上一章中我们学习了全加器的做法。有了全加器以后就可以做加法器,利用补码可以做减法器。

\subsection{加法器}

原理上我们选用最简单的逐位进位加法器,即计算和每一位时,接收三个输入:两个加数同一位的值,低位进位值;产生两个输出:和的这一位的值,向高位的进位。全加器就是实现这一功能的模块。

把8个全加器连接起来就可以做成一个8位的加法器(\autoref{i161:162})。每个全加器的三个输入分别接两个加数和低位全加器的进位输出,和数输出接到表示和数的火把,进位输出接到高位全加器的输入。

\begin{figure}[!ht]
\begin{center}
\subfloat{
\label{i161}
\includegraphics[width=0.45\textwidth]{images/161.png}
}
\qquad
\subfloat{
\label{i162}
\includegraphics[width=0.45\textwidth]{images/162.png}
}
\end{center}
\caption{第一排火把表示第一个加数,第二排火把表示第二个加数,最下面一排火把表示和。黄线输出使用了换线器。}
\label{i161:162}
\end{figure}

需要注意的是,这个加法器作为一个逻辑模块,使用时要注意其运行顺序。当最低位有输入时,最低位的全加器在第1个逻辑帧结算,然后剩余全加器从右到左依次在第2\~{}8个逻辑帧结算。所以作为逻辑模块时,输入要保证最低位先输入,然后每位依次延迟1个逻辑帧输入,否则可能引发爆门。

另外,这个加法器的最低位全加器没有进位输入,因此如果只做加法的话可以去掉一排逻辑灯(\autoref{i163:164})。

\begin{figure}[!ht]
\begin{center}
\subfloat{
\label{i163}
\includegraphics[width=0.45\textwidth]{images/163.png}
}
\qquad
\subfloat{
\label{i164}
\includegraphics[width=0.45\textwidth]{images/164.png}
}
\end{center}
\caption{最右边的一个全加器的第一排逻辑灯可以去掉。}
\label{i163:164}
\end{figure}

\subsection{减法器}

a-b可以通过a+b的补码来得到。一个二进制数的补码是将该数每位取反,然后+1。取反可以通过激活逻辑灯实现,+1则可以利用最低位全加器的进位输入(\autoref{i165:166})。

\begin{figure}[!ht]
\begin{center}
\subfloat{
\label{i165}
\includegraphics[width=0.45\textwidth]{images/165.png}
}
\qquad
\subfloat{
\label{i166}
\includegraphics[width=0.45\textwidth]{images/166.png}
}
\end{center}
\caption{右上火把亮表示做减法,灭表示做加法。黄线用来将减数取反,右上红线用来将结果+1。}
\label{i165:166}
\end{figure}

这里需要注意两点。第一点是取反的逻辑灯不能在同一个逻辑帧激活,而应该从低位到高位依次延迟一个逻辑帧激活,理由在加法器中已说明。第二点是给逻辑灯取反的同时不应当使减数的火把同时取反,也就是说给逻辑灯取反的电线与减数输入的电线不应当取同一个颜色。

\section{实验测定激活顺序}

\autoref{i167:168},一根电线连接开关和两个飞镖机关,右击开关时显然两个飞镖机关在同一个物理帧射出飞镖。如果在同样的距离上放两个青绿压力垫板,显然两个青绿压力垫板是在同一个物理帧激活,这就是在同一个逻辑帧发生的两个物理事件。
Expand Down
Loading

0 comments on commit 7c14b67

Please sign in to comment.