物理 关于如何尝试使用数电构建计算器
不讲我的世界和图灵完备!游戏仅为演示载体!!!
更新日期:2026.4.6
有问题可以在评论区提问,我看到了会回答的。
本贴是该贴的续集,由于本人的pad论坛被删,只能通过出续集改到O-box区。
警告:阅读本贴需要一定数电基础,建议先学习该贴再尝试理解本贴!
(我布线不是特别好,别杠,谢谢!)
Node02:输入
在基础计算单元完成的前提下,我们需要考虑将我们的数据输入计算器。
2.1:映射法
将每一个数字(左边的4个按键,这里以0~3,即使用分别表示1和2的两条信号线,下1上2适配上贴的加法器做范例)映射到每一条信号线上,随后锁存,防呆防傻,在计算完成后可以通过复位按钮(最右边按钮)取消锁存。(最左边的对应0的按钮只是占位,实际上并不接入电路)

全局俯视图
2.1.1:映射部分
很明显很简单,最上层是锁存信号线无需在意,俯视图中靠上的部分才是映射的核心,按下按钮时解锁放置于信号线(中间横穿的两根线)上方的红石火把向下激活信号线。

映射部分俯视图

映射部分前视图(懒不想再隔离一层了,其实前面隔一格再加一个墙,按钮位置不变,中间用中继器链接就可以了)
2.1.2:锁存区
该区域比较复杂,请量力而行,仅作科普,如无必要,请勿过多占用学习时间。
俯视图左上角连接映射区的上层信号线,高电平意味着需要激活锁存。
左上角的两个红石中继器负责锁存锁存信号(套娃),左下的活塞(灰色和黄色的)和标靶(红白相间的)负责复位,活塞失去信号后拉开标靶,断开锁存锁存信号的信号(说明这其实是正反馈系统),上方深灰色方块下方的锁存模块(两组浅灰色红石中继器)失去锁存信号,停止锁存,信号归零;正中间的两个中继器中右边那个将左右两个信号线输出时间对齐,左边中继器传输锁存信号到显示器,灯亮代表正在锁存,灯灭代表未在锁存/复位已完成

锁存处理区俯视图

复位部分前视图(中间的是锁存指示灯)
2.2 拨号法
显然,上文的映射法无法满足4位十进制的“大数”的计算,这时我们就要考虑新的方法——存储法!
本区域只是看起来复杂,实际上受限于游戏空间单位大小才显得复杂,实际上就是将
1 2 3
4 5 6
7 8 9
0
映射到
0 1 2 3 4 5 6 7 8 9
的数据线上即可。

拨号盘正面

拨号盘区域俯视图
Node03:计算(此部分后线路复杂,改用图灵完备演示)
考虑一个计算器,上面是不是有一个显示屏(即缓存区)?本方法与它相同,通过输入十进制数字后将其转换为bcd码再转换为bin码计算(bcd就是每一个十进制的数字对应一个4位2进制的码,例如358对应0011 0101 1000。bin码就是二进制码)。
小贴士:S=1位开关 OR=或门 AND=与门 MUX=选通器
SHL=将输入左移n位 N=1位取反 ON=输出高电平 SWC=8/16/32/64位开关
模块左边有一个端口,右边有多个端口且有多个白色向右三角形的是分线器,
模块左边有多个端口,右边有一个端口且仅有一个白色向右三角形的是合线器
ADD=全加器 NEG=求其相反数 MUL=乘法器 DIV=除法器
3.1:10进制数字线转bcd

如图。简单的映射关系。
思考:1,2,3,4,5,6,7,8,9分别会连接到哪条信号线上
3.2:bcd转bin(16->64线给我搞疯了)

获得了bcd码之后,我们要把它转换为bin码以便乘除法的计算,所以我们可以选择简单粗暴的a=a*10+b的方法,寄存器保存了a,在输入一个新数之后将a*10(即将a左移1位和3位后相加)和b(新数)相加,得到新的a,这个a就是当前输入的数的bin码了。
思考:为什么作为bcd码的b可以直接加到bin码的a上?
3.3:计算引擎
布线有点史(没精力再拆自己堆的屎山了,反正认真学的人应该看得懂线的走向吧)
本区域可以分为左右两块区域。
左半边是两个数的存储区域,(最左有一个红标一入一出元件是延迟线,与本区域无关;最上面还有一个两入一出的元件,那个是1bit存储器)但我们没必要存储两个数,事实上一个就够了,所以我们通过一个1bit存储器标记现在导入的是第几个数,存储了0则说明是第1个数,需要被存放于1bit存储器下方的那个32bit存储器;反之则意味着计算条件齐备,可以开始计算,于是输入值被导入下信号总线,同时上方寄存器读取,值导入上信号总线。
右边则是通过左下引来的四根信号线选择正确的计算模块进行运算,除法模块前面的选通器是为了防止不开启时输入0做除数报错,现实可以删除。
思考:真的需要4根线来选择正确的计算模块吗?最少需要多少?(警告:在同一周期内,可以单独导入一个值,但也可以在导入一个值后计算)