计算机是怎么工作的?零基础红石cpu教程【第三章-输出设备,串行通信与总线】

在上一章中,我们制作出了能对二进制设备进行加减运算的运算器。为了保存结果,我们又制作了寄存器和空间更大的内存。现在,是时候将计算结果输出给使用者了。

七段式数码管显示

最简单的输出设备可以是一排红石灯,通过逐个的亮灭来显示二进制数。在这个示例中,我们使用两位数码管来用十六进制表示数据。

为什么是十六进制?

十进制的位数增加与二进制是不同步的。例如15和16在十进制中都是两位数,但在二进制中前者是四位数1111,后者是五位数1 0000。100比99在十进制中多了一位,但在二进制中它们分别由110 0100和110 0011代表,位数是相同的。

将十进制数转换为二进制时,你必须对整个数不停的做除法,不管这个数有多大。

在十六进制中,超过9的数将用abcdef六个字母来替代。十六进制中超过16进1,也就是超过2^4进一位,对应二进制的四位。在进行进制转换时,只需要把每一位对应的二进制数写出来再放到一起。以F5为例,F(16)=1111,5=0101,因此F5用二进制表示就是1111 0101。不管要转换的数据有多长,都可以这么做。

现实中计算机显示十进制数字时,会采用一种叫做BCD码的中间编码来绕过位数的对齐问题。碍于篇幅这里就不进行详细讲解了,欢迎读者自行学习!
http://c.51hei.com/d/forum/201907/09/143012kbzhmqt2boxbxmb7.png

七段式数码管一共有七条可以点亮或熄灭的线段。不同的线段亮灭组合代表了不同的数字。数码管和二进制输入线段之间需要加入一个数码管译码器把二进制数转换为线段的亮灭组合。在Minecraft中,一种比较高效的译码器结构如下。

矩阵式译码器

在图中的设计中,七条横向贯穿的横线分别连接数码管的七条显示用线段。纵向则有16根控制线负责十位数字和六个字母

在图中的设计中,七条横向贯穿的横线分别连接数码管的七条显示用线段。纵向则有16根控制线负责十位数字和六个字母。每条纵向线段上都用有无红石火把编码了一个数字。熄灭特定控制线上的红石就可以显示指定数字。

用多路复用器控制着十六根线,在把需要转换的四位二进制数作为输入,就可以根据输入点亮指定控制线了。

多路复用器可以使用上一篇博客提到的密码门结构制作。当响应时间不重要的时候,也可以采用延时式结构来减小体积。将两个带多路复用器的译码器并排放置后,模块外观长这样:

金色与白色线为数据和部件代码的输入线。我们稍后了解这部分是如何工作的。

串行通信

传输八位的二进制数据有两种方法。最简单的方法是并行传输,直接将每一位的信号线拉过去就行。在部件内部连接时并行传输很方便,例如将一排半加器和另一排半加器连在一起。当距离较远或者要连接的部件比较多时,拉这么多线可能就不是一个好主意了。你可能在别的地方看过体积庞大的红石计算机——它们往往有大量并排放置的传输线缆,看起来十分庞大且复杂。

一种有效的减少线缆的方式是串行通信。与并行通信一次通过八根线缆传输八位数不同,串行通信在八个时刻内用同一根线传输八个信号。如图:

串行通信时,发送端和接收端按照约定好的速率逐位传输数据。有一些串行通信会使用第二根时钟线来确保同步。幸运的是,Minecraft拥有固定的“红石刻”时间,1红石刻等同于红石中继器默认状态下的延时时间,是大多数红石系统里的最小时间单位。为了让传输速度尽可能快,我们不妨将串行通信的单位时间规定为一红石刻。

串行发送器接受一个并行输入,并以串行信号的形式发送出去。它的结构如图,抬起的方块将会允许该比特位上通过信号,放下后则不会通过信号。

还记得寄存器单元提到过的红石中继器“锁定”特性吗?我们将利用这个特性做出红石接收器。接收器检测到串行型号头的“开始”脉冲后启动计时,在信号恰好通过中继器串时锁定并保存信号。

绿色输入用于重置接收器

总线设计

当只有两个器件需要通信的时候,只需要把它们的输入和输出端互相连在一起就可以了。如果部件很多,它们之间就需要用到总线来相互连接。

总线是计算机各种功能部件之间传送信息的公共通信干线。所有部件都连接到总线,总线上的数据也将被所有部件收到。总线是少数在Minecraft中比在现实中更难制作的结构。Minecraft中的用于长距离传输的红石中继器具有方向性,因此线路上的数据只能够单向流动。为了像现实中的总线那样,任意一点发送整条线都能收到特性,单向的总线需要做成环形。

在我们的设计中共有五根总线。数据总线由所有器件连接所有器件,负责传输要操作的数据。数据地址总线指示数据总线上数据的接收方。操作完成线负责在操作完成后给控制器回报一个脉冲,指示控制器继续执行下一步。剩余两条总线保留给下一节中的控制器使用。

对于所有器件,都有以下工作流程:

接收数据总线上广播的数据;检查地址总线上随后发送的目的器件地址;如果目的地址与自己的id不符,数据将被丢弃,数据总线接收器复位。如果目的地址为自己的id,接收器上的数据将会被送入内部处理。在处理完成后(例如行波进位加法器产生了结果),将会给操作回报线一个脉冲。如果有新数据产生(例如加法的结果),串行发送器会在数据总线上广播新数据。

将两个串行总线接收器连接在一起,就可以完成数据接收+检查地址。如下图。注意银色线为数据目标地址的输入端,金色为数据的输入端。

所有器件都要接收总线上的数据,并且在执行完成后告知控制器。因此它们都需要图中的接收器。你可以用结构方块将接收器保存并命名,使用时只需要放置就可以了。在下一节中,我们将使用控制器来统一控制它们并执行程序。

试一试
给寄存器,内存模块,加法器和七段式数码管加上串行收发器。并使用环形或单向总线将它们连接。、
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
洛天依九周年
颜文字
Emoji
小恐龙
花!
上一篇
下一篇